Skip to content

Commit ef5a88e

Browse files
committed
refactor: author vue component in pure typescript
1 parent c08ef7c commit ef5a88e

File tree

7 files changed

+111
-208
lines changed

7 files changed

+111
-208
lines changed

packages/vue/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
"@adhesivejs/core": "workspace:*"
4848
},
4949
"devDependencies": {
50-
"unplugin-vue": "catalog:",
5150
"vue-tsc": "catalog:"
5251
},
5352
"engines": {
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import {
2+
computed,
3+
defineComponent,
4+
h,
5+
useTemplateRef,
6+
type DefineComponent,
7+
type PropType,
8+
} from "vue";
9+
import {
10+
useAdhesive,
11+
type UseAdhesiveOptions,
12+
} from "../composables/useAdhesive.js";
13+
import type { MaybeElementOrSelectorRef } from "../utils/unrefElement.js";
14+
15+
type BaseProps = Omit<
16+
Partial<UseAdhesiveOptions>,
17+
"outerClassName" | "innerClassName" | "activeClassName" | "releasedClassName"
18+
>;
19+
20+
export interface AdhesiveContainerProps extends BaseProps {
21+
outerClass?: UseAdhesiveOptions["outerClassName"];
22+
innerClass?: UseAdhesiveOptions["innerClassName"];
23+
activeClass?: UseAdhesiveOptions["activeClassName"];
24+
releasedClass?: UseAdhesiveOptions["releasedClassName"];
25+
}
26+
27+
/**
28+
* Automatically applies sticky positioning to its content.
29+
* Internally uses the `useAdhesive` composable.
30+
*
31+
* @example
32+
* ```vue
33+
* <script setup lang="ts">
34+
* import { AdhesiveContainer } from '@adhesivejs/vue';
35+
* </script>
36+
*
37+
* <template>
38+
* <AdhesiveContainer position="top">
39+
* Content to make sticky
40+
* </AdhesiveContainer>
41+
* </template>
42+
* ```
43+
*/
44+
export const AdhesiveContainer: DefineComponent<AdhesiveContainerProps> =
45+
defineComponent({
46+
name: "AdhesiveContainer",
47+
props: {
48+
boundingRef: {
49+
type: [Object, String] as PropType<MaybeElementOrSelectorRef>,
50+
required: false,
51+
},
52+
boundingEl: {
53+
type: [Object, String] as PropType<UseAdhesiveOptions["boundingEl"]>,
54+
required: false,
55+
},
56+
enabled: {
57+
type: Boolean as PropType<boolean>,
58+
default: true,
59+
},
60+
offset: {
61+
type: Number as PropType<number>,
62+
required: false,
63+
},
64+
position: {
65+
type: String as PropType<UseAdhesiveOptions["position"]>,
66+
required: false,
67+
},
68+
zIndex: {
69+
type: Number as PropType<number>,
70+
required: false,
71+
},
72+
outerClass: {
73+
type: String as PropType<string>,
74+
required: false,
75+
},
76+
innerClass: {
77+
type: String as PropType<string>,
78+
required: false,
79+
},
80+
activeClass: {
81+
type: String as PropType<string>,
82+
required: false,
83+
},
84+
releasedClass: {
85+
type: String as PropType<string>,
86+
required: false,
87+
},
88+
},
89+
setup(props, { slots }) {
90+
const targetRef = useTemplateRef<HTMLElement>("target");
91+
92+
const options = computed<UseAdhesiveOptions>(() => ({
93+
boundingRef: props.boundingRef,
94+
boundingEl: props.boundingEl,
95+
enabled: props.enabled,
96+
offset: props.offset,
97+
position: props.position,
98+
zIndex: props.zIndex,
99+
outerClassName: props.outerClass,
100+
innerClassName: props.innerClass,
101+
activeClassName: props.activeClass,
102+
releasedClassName: props.releasedClass,
103+
}));
104+
105+
useAdhesive(targetRef, options);
106+
107+
return () => h("div", { ref: "target" }, slots.default?.());
108+
},
109+
});

packages/vue/src/components/AdhesiveContainer.vue

Lines changed: 0 additions & 72 deletions
This file was deleted.

packages/vue/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ export {
1414
} from "./composables/useAdhesive.js";
1515

1616
export {
17-
default as AdhesiveContainer,
17+
AdhesiveContainer,
1818
type AdhesiveContainerProps,
19-
} from "./components/AdhesiveContainer.vue";
19+
} from "./components/AdhesiveContainer.js";

packages/vue/tsdown.config.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import { execSync } from "node:child_process";
22
import { writeFile } from "node:fs/promises";
33
import { defineConfig } from "tsdown";
4-
import Vue from "unplugin-vue/rolldown";
54

65
export default defineConfig({
76
entry: "src/index.ts",
87
platform: "neutral",
98
exports: true,
10-
plugins: [Vue({ isProduction: true })],
11-
dts: { vue: true },
129
hooks: {
1310
"build:done": async (ctx) => {
1411
const pkg = ctx.options.pkg;

pnpm-lock.yaml

Lines changed: 0 additions & 129 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ catalog:
2828
react-dom: ^19.1.0
2929
tsdown: ^0.13.0
3030
typescript: ~5.8.3
31-
unplugin-vue: ^7.0.0
3231
vite: ^7.0.6
3332
vitest: ^3.2.4
3433
vue: ^3.5.18

0 commit comments

Comments
 (0)