tailwind-styled-v4 5.0.0 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +398 -0
- package/LICENSE +21 -0
- package/README.md +532 -0
- package/dist/analyzer.d.mts +114 -0
- package/dist/analyzer.d.ts +114 -0
- package/dist/analyzer.js +6808 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/analyzer.mjs +6798 -0
- package/dist/analyzer.mjs.map +1 -0
- package/dist/{animate.d.cts → animate.d.mts} +3 -30
- package/dist/animate.d.ts +3 -30
- package/dist/animate.js +7096 -352
- package/dist/animate.js.map +1 -1
- package/dist/animate.mjs +7482 -0
- package/dist/animate.mjs.map +1 -0
- package/dist/atomic.d.mts +18 -0
- package/dist/atomic.d.ts +18 -0
- package/dist/atomic.js +191 -0
- package/dist/atomic.js.map +1 -0
- package/dist/atomic.mjs +185 -0
- package/dist/atomic.mjs.map +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +45008 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +44980 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/compiler.d.mts +1009 -0
- package/dist/compiler.d.ts +1009 -0
- package/dist/compiler.js +4937 -0
- package/dist/compiler.js.map +1 -0
- package/dist/compiler.mjs +4862 -0
- package/dist/compiler.mjs.map +1 -0
- package/dist/dashboard.d.mts +272 -0
- package/dist/dashboard.d.ts +272 -0
- package/dist/dashboard.js +249 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/dashboard.mjs +239 -0
- package/dist/dashboard.mjs.map +1 -0
- package/dist/devtools.js +171 -158
- package/dist/devtools.js.map +1 -1
- package/dist/{devtools.cjs → devtools.mjs} +166 -167
- package/dist/devtools.mjs.map +1 -0
- package/dist/engine.d.mts +398 -0
- package/dist/engine.d.ts +398 -0
- package/dist/engine.js +19264 -0
- package/dist/engine.js.map +1 -0
- package/dist/engine.mjs +19227 -0
- package/dist/engine.mjs.map +1 -0
- package/dist/{index.d.cts → index.d.mts} +12 -5
- package/dist/index.d.ts +12 -5
- package/dist/index.js +7178 -27
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8408 -0
- package/dist/index.mjs.map +1 -0
- package/dist/liveTokenEngine-DYN3Zale.d.mts +34 -0
- package/dist/liveTokenEngine-DYN3Zale.d.ts +34 -0
- package/dist/{next.d.cts → next.d.mts} +2 -1
- package/dist/next.d.ts +2 -1
- package/dist/next.js +24027 -28
- package/dist/next.js.map +1 -1
- package/dist/next.mjs +24232 -0
- package/dist/next.mjs.map +1 -0
- package/dist/plugin.d.mts +90 -0
- package/dist/plugin.d.ts +90 -0
- package/dist/plugin.js +185 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugin.mjs +174 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/pluginRegistry.d.mts +83 -0
- package/dist/pluginRegistry.d.ts +83 -0
- package/dist/pluginRegistry.js +303 -0
- package/dist/pluginRegistry.js.map +1 -0
- package/dist/pluginRegistry.mjs +298 -0
- package/dist/pluginRegistry.mjs.map +1 -0
- package/dist/preset.js +9 -4
- package/dist/preset.js.map +1 -1
- package/dist/{preset.cjs → preset.mjs} +5 -14
- package/dist/preset.mjs.map +1 -0
- package/dist/rspack.d.mts +33 -0
- package/dist/rspack.d.ts +33 -0
- package/dist/rspack.js +66 -0
- package/dist/rspack.js.map +1 -0
- package/dist/rspack.mjs +55 -0
- package/dist/rspack.mjs.map +1 -0
- package/dist/runtime.d.mts +62 -0
- package/dist/runtime.d.ts +62 -0
- package/dist/runtime.js +455 -0
- package/dist/runtime.js.map +1 -0
- package/dist/runtime.mjs +436 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/runtimeCss.d.mts +65 -0
- package/dist/runtimeCss.d.ts +65 -0
- package/dist/{css.cjs → runtimeCss.js} +71 -4
- package/dist/runtimeCss.js.map +1 -0
- package/dist/{css.js → runtimeCss.mjs} +66 -5
- package/dist/runtimeCss.mjs.map +1 -0
- package/dist/scanner.d.mts +25 -0
- package/dist/scanner.d.ts +25 -0
- package/dist/scanner.js +5774 -0
- package/dist/scanner.js.map +1 -0
- package/dist/scanner.mjs +5760 -0
- package/dist/scanner.mjs.map +1 -0
- package/dist/shared.d.mts +85 -0
- package/dist/shared.d.ts +85 -0
- package/dist/shared.js +255 -0
- package/dist/shared.js.map +1 -0
- package/dist/shared.mjs +233 -0
- package/dist/shared.mjs.map +1 -0
- package/dist/storybookAddon.d.mts +108 -0
- package/dist/storybookAddon.d.ts +108 -0
- package/dist/storybookAddon.js +95 -0
- package/dist/storybookAddon.js.map +1 -0
- package/dist/storybookAddon.mjs +88 -0
- package/dist/storybookAddon.mjs.map +1 -0
- package/dist/svelte.d.mts +114 -0
- package/dist/svelte.d.ts +114 -0
- package/dist/svelte.js +67 -0
- package/dist/svelte.js.map +1 -0
- package/dist/svelte.mjs +59 -0
- package/dist/svelte.mjs.map +1 -0
- package/dist/testing.d.mts +185 -0
- package/dist/testing.d.ts +185 -0
- package/dist/testing.js +173 -0
- package/dist/testing.js.map +1 -0
- package/dist/testing.mjs +158 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/theme.d.mts +188 -0
- package/dist/theme.d.ts +188 -0
- package/dist/theme.js +334 -0
- package/dist/theme.js.map +1 -0
- package/dist/theme.mjs +311 -0
- package/dist/theme.mjs.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types-DXr2PmGP.d.mts +31 -0
- package/dist/types-DXr2PmGP.d.ts +31 -0
- package/dist/vite.js +29611 -17
- package/dist/vite.js.map +1 -1
- package/dist/vite.mjs +29712 -0
- package/dist/vite.mjs.map +1 -0
- package/dist/vue.d.mts +89 -0
- package/dist/vue.d.ts +89 -0
- package/dist/vue.js +104 -0
- package/dist/vue.js.map +1 -0
- package/dist/vue.mjs +96 -0
- package/dist/vue.mjs.map +1 -0
- package/package.json +170 -64
- package/dist/animate.cjs +0 -771
- package/dist/animate.cjs.map +0 -1
- package/dist/chunk-VZEJV27B.js +0 -11
- package/dist/chunk-VZEJV27B.js.map +0 -1
- package/dist/chunk-Y5D3E72P.cjs +0 -13
- package/dist/chunk-Y5D3E72P.cjs.map +0 -1
- package/dist/css.cjs.map +0 -1
- package/dist/css.d.cts +0 -30
- package/dist/css.d.ts +0 -30
- package/dist/css.js.map +0 -1
- package/dist/devtools.cjs.map +0 -1
- package/dist/index.cjs +0 -1353
- package/dist/index.cjs.map +0 -1
- package/dist/next.cjs +0 -248
- package/dist/next.cjs.map +0 -1
- package/dist/preset.cjs.map +0 -1
- package/dist/turbopackLoader.cjs +0 -37
- package/dist/turbopackLoader.cjs.map +0 -1
- package/dist/turbopackLoader.d.cts +0 -12
- package/dist/turbopackLoader.d.ts +0 -12
- package/dist/turbopackLoader.js +0 -35
- package/dist/turbopackLoader.js.map +0 -1
- package/dist/vite.cjs +0 -138
- package/dist/vite.cjs.map +0 -1
- package/dist/webpackLoader.cjs +0 -51
- package/dist/webpackLoader.cjs.map +0 -1
- package/dist/webpackLoader.d.cts +0 -17
- package/dist/webpackLoader.d.ts +0 -17
- package/dist/webpackLoader.js +0 -49
- package/dist/webpackLoader.js.map +0 -1
- /package/dist/{devtools.d.cts → devtools.d.mts} +0 -0
- /package/dist/{preset.d.cts → preset.d.mts} +0 -0
- /package/dist/{vite.d.cts → vite.d.mts} +0 -0
package/dist/vue.d.mts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { DefineComponent, Component } from 'vue';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tailwind-styled-v4 — Vue Adapter
|
|
5
|
+
*
|
|
6
|
+
* Pola seperti `createComponent` di React tapi untuk Vue 3 Composition API.
|
|
7
|
+
* Mendukung: base, variants, defaultVariants, compoundVariants.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { tw } from '@tailwind-styled/vue'
|
|
11
|
+
*
|
|
12
|
+
* const Button = tw('button', {
|
|
13
|
+
* base: 'px-4 py-2 rounded font-medium',
|
|
14
|
+
* variants: {
|
|
15
|
+
* intent: {
|
|
16
|
+
* primary: 'bg-blue-500 text-white hover:bg-blue-600',
|
|
17
|
+
* danger: 'bg-red-500 text-white hover:bg-red-600',
|
|
18
|
+
* },
|
|
19
|
+
* size: { sm: 'h-8 text-sm', md: 'h-10 text-base', lg: 'h-12 text-lg' },
|
|
20
|
+
* },
|
|
21
|
+
* defaultVariants: { intent: 'primary', size: 'md' },
|
|
22
|
+
* })
|
|
23
|
+
*
|
|
24
|
+
* // In template:
|
|
25
|
+
* // <Button intent="danger" size="lg">Delete</Button>
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
interface VueComponentConfig {
|
|
29
|
+
base?: string;
|
|
30
|
+
variants?: Record<string, Record<string, string>>;
|
|
31
|
+
compoundVariants?: Array<{
|
|
32
|
+
class: string;
|
|
33
|
+
[key: string]: any;
|
|
34
|
+
}>;
|
|
35
|
+
defaultVariants?: Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
type HtmlTagName = "div" | "section" | "article" | "aside" | "header" | "footer" | "main" | "nav" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span" | "strong" | "em" | "a" | "button" | "input" | "textarea" | "select" | "form" | "label" | "ul" | "ol" | "li" | "table" | "tr" | "th" | "td" | "thead" | "tbody" | "img" | "figure" | "figcaption" | "blockquote" | "code" | "pre" | "hr" | "br" | "dialog" | "details" | "summary";
|
|
38
|
+
/**
|
|
39
|
+
* Buat Vue component dengan Tailwind class yang terstruktur.
|
|
40
|
+
*
|
|
41
|
+
* @param tag - HTML tag atau Vue component
|
|
42
|
+
* @param config - Konfigurasi base, variants, defaultVariants
|
|
43
|
+
*/
|
|
44
|
+
declare function tw<Tag extends HtmlTagName>(tag: Tag, config?: VueComponentConfig): DefineComponent<any>;
|
|
45
|
+
/**
|
|
46
|
+
* Class variant function — returns a class string resolver.
|
|
47
|
+
* Framework-agnostic, bisa dipakai di mana saja.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* const buttonCv = cv({
|
|
51
|
+
* base: 'px-4 py-2 rounded',
|
|
52
|
+
* variants: { size: { sm: 'h-8', lg: 'h-12' } },
|
|
53
|
+
* defaultVariants: { size: 'sm' },
|
|
54
|
+
* })
|
|
55
|
+
*
|
|
56
|
+
* buttonCv({ size: 'lg' }) // 'px-4 py-2 rounded h-12'
|
|
57
|
+
*/
|
|
58
|
+
declare function cv(config: VueComponentConfig): (props?: Record<string, any>) => string;
|
|
59
|
+
/**
|
|
60
|
+
* Extend komponen Vue yang sudah ada dengan class tambahan.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* const PrimaryButton = extend(Button, 'bg-blue-500 text-white')
|
|
64
|
+
*/
|
|
65
|
+
declare function extend(component: Component, extraClasses: string): DefineComponent<any>;
|
|
66
|
+
/**
|
|
67
|
+
* Vue plugin — daftarkan `tw` sebagai global composable.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* // main.ts
|
|
71
|
+
* import { createApp } from 'vue'
|
|
72
|
+
* import { TailwindStyledPlugin } from '@tailwind-styled/vue'
|
|
73
|
+
* import App from './App.vue'
|
|
74
|
+
*
|
|
75
|
+
* createApp(App).use(TailwindStyledPlugin).mount('#app')
|
|
76
|
+
*/
|
|
77
|
+
declare const TailwindStyledPlugin: {
|
|
78
|
+
install(app: any): void;
|
|
79
|
+
};
|
|
80
|
+
declare const _default: {
|
|
81
|
+
tw: typeof tw;
|
|
82
|
+
cv: typeof cv;
|
|
83
|
+
extend: typeof extend;
|
|
84
|
+
TailwindStyledPlugin: {
|
|
85
|
+
install(app: any): void;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { type HtmlTagName, TailwindStyledPlugin, type VueComponentConfig, cv, _default as default, extend, tw };
|
package/dist/vue.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { DefineComponent, Component } from 'vue';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tailwind-styled-v4 — Vue Adapter
|
|
5
|
+
*
|
|
6
|
+
* Pola seperti `createComponent` di React tapi untuk Vue 3 Composition API.
|
|
7
|
+
* Mendukung: base, variants, defaultVariants, compoundVariants.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { tw } from '@tailwind-styled/vue'
|
|
11
|
+
*
|
|
12
|
+
* const Button = tw('button', {
|
|
13
|
+
* base: 'px-4 py-2 rounded font-medium',
|
|
14
|
+
* variants: {
|
|
15
|
+
* intent: {
|
|
16
|
+
* primary: 'bg-blue-500 text-white hover:bg-blue-600',
|
|
17
|
+
* danger: 'bg-red-500 text-white hover:bg-red-600',
|
|
18
|
+
* },
|
|
19
|
+
* size: { sm: 'h-8 text-sm', md: 'h-10 text-base', lg: 'h-12 text-lg' },
|
|
20
|
+
* },
|
|
21
|
+
* defaultVariants: { intent: 'primary', size: 'md' },
|
|
22
|
+
* })
|
|
23
|
+
*
|
|
24
|
+
* // In template:
|
|
25
|
+
* // <Button intent="danger" size="lg">Delete</Button>
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
interface VueComponentConfig {
|
|
29
|
+
base?: string;
|
|
30
|
+
variants?: Record<string, Record<string, string>>;
|
|
31
|
+
compoundVariants?: Array<{
|
|
32
|
+
class: string;
|
|
33
|
+
[key: string]: any;
|
|
34
|
+
}>;
|
|
35
|
+
defaultVariants?: Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
type HtmlTagName = "div" | "section" | "article" | "aside" | "header" | "footer" | "main" | "nav" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span" | "strong" | "em" | "a" | "button" | "input" | "textarea" | "select" | "form" | "label" | "ul" | "ol" | "li" | "table" | "tr" | "th" | "td" | "thead" | "tbody" | "img" | "figure" | "figcaption" | "blockquote" | "code" | "pre" | "hr" | "br" | "dialog" | "details" | "summary";
|
|
38
|
+
/**
|
|
39
|
+
* Buat Vue component dengan Tailwind class yang terstruktur.
|
|
40
|
+
*
|
|
41
|
+
* @param tag - HTML tag atau Vue component
|
|
42
|
+
* @param config - Konfigurasi base, variants, defaultVariants
|
|
43
|
+
*/
|
|
44
|
+
declare function tw<Tag extends HtmlTagName>(tag: Tag, config?: VueComponentConfig): DefineComponent<any>;
|
|
45
|
+
/**
|
|
46
|
+
* Class variant function — returns a class string resolver.
|
|
47
|
+
* Framework-agnostic, bisa dipakai di mana saja.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* const buttonCv = cv({
|
|
51
|
+
* base: 'px-4 py-2 rounded',
|
|
52
|
+
* variants: { size: { sm: 'h-8', lg: 'h-12' } },
|
|
53
|
+
* defaultVariants: { size: 'sm' },
|
|
54
|
+
* })
|
|
55
|
+
*
|
|
56
|
+
* buttonCv({ size: 'lg' }) // 'px-4 py-2 rounded h-12'
|
|
57
|
+
*/
|
|
58
|
+
declare function cv(config: VueComponentConfig): (props?: Record<string, any>) => string;
|
|
59
|
+
/**
|
|
60
|
+
* Extend komponen Vue yang sudah ada dengan class tambahan.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* const PrimaryButton = extend(Button, 'bg-blue-500 text-white')
|
|
64
|
+
*/
|
|
65
|
+
declare function extend(component: Component, extraClasses: string): DefineComponent<any>;
|
|
66
|
+
/**
|
|
67
|
+
* Vue plugin — daftarkan `tw` sebagai global composable.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* // main.ts
|
|
71
|
+
* import { createApp } from 'vue'
|
|
72
|
+
* import { TailwindStyledPlugin } from '@tailwind-styled/vue'
|
|
73
|
+
* import App from './App.vue'
|
|
74
|
+
*
|
|
75
|
+
* createApp(App).use(TailwindStyledPlugin).mount('#app')
|
|
76
|
+
*/
|
|
77
|
+
declare const TailwindStyledPlugin: {
|
|
78
|
+
install(app: any): void;
|
|
79
|
+
};
|
|
80
|
+
declare const _default: {
|
|
81
|
+
tw: typeof tw;
|
|
82
|
+
cv: typeof cv;
|
|
83
|
+
extend: typeof extend;
|
|
84
|
+
TailwindStyledPlugin: {
|
|
85
|
+
install(app: any): void;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { type HtmlTagName, TailwindStyledPlugin, type VueComponentConfig, cv, _default as default, extend, tw };
|
package/dist/vue.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var vue = require('vue');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
|
|
8
|
+
/* tailwind-styled-v4 v5.0.1 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
9
|
+
|
|
10
|
+
function resolveVariants(variants, props, defaults = {}) {
|
|
11
|
+
const classes = [];
|
|
12
|
+
for (const key in variants) {
|
|
13
|
+
const val = props[key] ?? defaults[key];
|
|
14
|
+
if (val !== void 0 && variants[key][String(val)]) {
|
|
15
|
+
classes.push(variants[key][String(val)]);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return classes.join(" ");
|
|
19
|
+
}
|
|
20
|
+
function resolveCompound(compounds, props) {
|
|
21
|
+
return compounds.filter((c) => {
|
|
22
|
+
const { class: _cls, ...conditions } = c;
|
|
23
|
+
return Object.entries(conditions).every(([k, v]) => props[k] === v);
|
|
24
|
+
}).map((c) => c.class).join(" ");
|
|
25
|
+
}
|
|
26
|
+
function tw(tag, config = {}) {
|
|
27
|
+
const { base = "", variants = {}, compoundVariants = [], defaultVariants = {} } = config;
|
|
28
|
+
const variantKeys = new Set(Object.keys(variants));
|
|
29
|
+
const propsDefinition = {};
|
|
30
|
+
for (const key of variantKeys) {
|
|
31
|
+
propsDefinition[key] = { type: null, default: void 0 };
|
|
32
|
+
}
|
|
33
|
+
propsDefinition["class"] = { type: null, default: void 0 };
|
|
34
|
+
return vue.defineComponent({
|
|
35
|
+
name: `TwStyled${String(tag).charAt(0).toUpperCase() + String(tag).slice(1)}`,
|
|
36
|
+
inheritAttrs: false,
|
|
37
|
+
props: propsDefinition,
|
|
38
|
+
setup(props, { attrs, slots }) {
|
|
39
|
+
const className = vue.computed(() => {
|
|
40
|
+
const variantClasses = resolveVariants(variants, props, defaultVariants);
|
|
41
|
+
const compoundClasses = resolveCompound(compoundVariants, { ...defaultVariants, ...props });
|
|
42
|
+
return tailwindMerge.twMerge(
|
|
43
|
+
base,
|
|
44
|
+
variantClasses,
|
|
45
|
+
compoundClasses,
|
|
46
|
+
props["class"],
|
|
47
|
+
attrs.class
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
return () => {
|
|
51
|
+
const filteredAttrs = {};
|
|
52
|
+
for (const key in attrs) {
|
|
53
|
+
if (!variantKeys.has(key)) {
|
|
54
|
+
filteredAttrs[key] = attrs[key];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return vue.h(tag, { ...filteredAttrs, class: className.value }, slots.default?.());
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function cv(config) {
|
|
63
|
+
return (props = {}) => {
|
|
64
|
+
const { base = "", variants = {}, compoundVariants = [], defaultVariants = {} } = config;
|
|
65
|
+
const merged = { ...defaultVariants, ...props };
|
|
66
|
+
const variantClasses = resolveVariants(variants, merged, defaultVariants);
|
|
67
|
+
const compoundClasses = resolveCompound(compoundVariants, merged);
|
|
68
|
+
return tailwindMerge.twMerge(base, variantClasses, compoundClasses, props.class);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function extend(component, extraClasses) {
|
|
72
|
+
return vue.defineComponent({
|
|
73
|
+
name: `Extended${component.name ?? "Component"}`,
|
|
74
|
+
inheritAttrs: false,
|
|
75
|
+
props: { class: { type: null, default: void 0 } },
|
|
76
|
+
setup(props, { attrs, slots }) {
|
|
77
|
+
return () => vue.h(
|
|
78
|
+
component,
|
|
79
|
+
{
|
|
80
|
+
...attrs,
|
|
81
|
+
class: tailwindMerge.twMerge(extraClasses, props["class"], attrs.class)
|
|
82
|
+
},
|
|
83
|
+
slots.default?.()
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
var TailwindStyledPlugin = {
|
|
89
|
+
install(app) {
|
|
90
|
+
app.config.globalProperties.$tw = tw;
|
|
91
|
+
app.config.globalProperties.$cv = cv;
|
|
92
|
+
app.provide("tw", tw);
|
|
93
|
+
app.provide("cv", cv);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
var src_default = { tw, cv, extend, TailwindStyledPlugin };
|
|
97
|
+
|
|
98
|
+
exports.TailwindStyledPlugin = TailwindStyledPlugin;
|
|
99
|
+
exports.cv = cv;
|
|
100
|
+
exports.default = src_default;
|
|
101
|
+
exports.extend = extend;
|
|
102
|
+
exports.tw = tw;
|
|
103
|
+
//# sourceMappingURL=vue.js.map
|
|
104
|
+
//# sourceMappingURL=vue.js.map
|
package/dist/vue.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/vue/src/index.ts"],"names":["defineComponent","computed","twMerge","h"],"mappings":";;;;;;;;;AA0FA,SAAS,eAAA,CACP,QAAA,EACA,KAAA,EACA,QAAA,GAAmC,EAAC,EAC5B;AACR,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAG,CAAA,IAAK,SAAS,GAAG,CAAA;AACtC,IAAA,IAAI,GAAA,KAAQ,UAAa,QAAA,CAAS,GAAG,EAAE,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ,KAAK,QAAA,CAAS,GAAG,EAAE,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,IACzC;AAAA,EACF;AACA,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;AAEA,SAAS,eAAA,CACP,WACA,KAAA,EACQ;AACR,EAAA,OAAO,SAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM;AACb,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,GAAG,YAAW,GAAI,CAAA;AACvC,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAA,CAAM,CAAC,MAAM,CAAC,CAAA;AAAA,EACpE,CAAC,EACA,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,KAAK,CAAA,CAClB,IAAA,CAAK,GAAG,CAAA;AACb;AAYO,SAAS,EAAA,CACd,GAAA,EACA,MAAA,GAA6B,EAAC,EACR;AACtB,EAAA,MAAM,EAAE,IAAA,GAAO,EAAA,EAAI,QAAA,GAAW,EAAC,EAAG,gBAAA,GAAmB,EAAC,EAAG,eAAA,GAAkB,EAAC,EAAE,GAAI,MAAA;AAElF,EAAA,MAAM,cAAc,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAGjD,EAAA,MAAM,kBAAsE,EAAC;AAC7E,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,MAAA,EAAU;AAAA,EAC1D;AACA,EAAA,eAAA,CAAgB,OAAO,CAAA,GAAI,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,MAAA,EAAU;AAE5D,EAAA,OAAOA,mBAAA,CAAgB;AAAA,IACrB,IAAA,EAAM,CAAA,QAAA,EAAW,MAAA,CAAO,GAAG,EAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,IAC3E,YAAA,EAAc,KAAA;AAAA,IACd,KAAA,EAAO,eAAA;AAAA,IACP,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAO,OAAM,EAAG;AAC7B,MAAA,MAAM,SAAA,GAAYC,aAAS,MAAM;AAC/B,QAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,QAAA,EAAU,KAAA,EAAO,eAAe,CAAA;AACvE,QAAA,MAAM,eAAA,GAAkB,gBAAgB,gBAAA,EAAkB,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAO,CAAA;AAC1F,QAAA,OAAOC,qBAAA;AAAA,UACL,IAAA;AAAA,UACA,cAAA;AAAA,UACA,eAAA;AAAA,UACA,MAAM,OAAO,CAAA;AAAA,UACb,KAAA,CAAM;AAAA,SACR;AAAA,MACF,CAAC,CAAA;AAED,MAAA,OAAO,MAAM;AAEX,QAAA,MAAM,gBAAqC,EAAC;AAC5C,QAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,UAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,YAAA,aAAA,CAAc,GAAG,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA;AAAA,UAChC;AAAA,QACF;AAEA,QAAA,OAAOC,KAAA,CAAE,GAAA,EAAe,EAAE,GAAG,aAAA,EAAe,KAAA,EAAO,SAAA,CAAU,KAAA,EAAM,EAAG,KAAA,CAAM,OAAA,IAAW,CAAA;AAAA,MACzF,CAAA;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAmBO,SAAS,GAAG,MAAA,EAA4B;AAC7C,EAAA,OAAO,CAAC,KAAA,GAA6B,EAAC,KAAM;AAC1C,IAAA,MAAM,EAAE,IAAA,GAAO,EAAA,EAAI,QAAA,GAAW,EAAC,EAAG,gBAAA,GAAmB,EAAC,EAAG,eAAA,GAAkB,EAAC,EAAE,GAAI,MAAA;AAClF,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,EAAM;AAC9C,IAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,QAAA,EAAU,MAAA,EAAQ,eAAe,CAAA;AACxE,IAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,gBAAA,EAAkB,MAAM,CAAA;AAChE,IAAA,OAAOD,qBAAA,CAAQ,IAAA,EAAM,cAAA,EAAgB,eAAA,EAAiB,MAAM,KAAK,CAAA;AAAA,EACnE,CAAA;AACF;AAYO,SAAS,MAAA,CAAO,WAAsB,YAAA,EAA4C;AACvF,EAAA,OAAOF,mBAAA,CAAgB;AAAA,IACrB,IAAA,EAAM,CAAA,QAAA,EAAY,SAAA,CAAkB,IAAA,IAAQ,WAAW,CAAA,CAAA;AAAA,IACvD,YAAA,EAAc,KAAA;AAAA,IACd,KAAA,EAAO,EAAE,KAAA,EAAO,EAAE,MAAM,IAAA,EAAM,OAAA,EAAS,QAAU,EAAE;AAAA,IACnD,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAO,OAAM,EAAG;AAC7B,MAAA,OAAO,MACLG,KAAA;AAAA,QACE,SAAA;AAAA,QACA;AAAA,UACE,GAAG,KAAA;AAAA,UACH,OAAOD,qBAAA,CAAQ,YAAA,EAAc,MAAM,OAAO,CAAA,EAAa,MAAM,KAAe;AAAA,SAC9E;AAAA,QACA,MAAM,OAAA;AAAU,OAClB;AAAA,IACJ;AAAA,GACD,CAAA;AACH;AAiBO,IAAM,oBAAA,GAAuB;AAAA,EAClC,QAAQ,GAAA,EAAU;AAChB,IAAA,GAAA,CAAI,MAAA,CAAO,iBAAiB,GAAA,GAAM,EAAA;AAClC,IAAA,GAAA,CAAI,MAAA,CAAO,iBAAiB,GAAA,GAAM,EAAA;AAClC,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAM,EAAE,CAAA;AACpB,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,EACtB;AACF;AAEA,IAAO,WAAA,GAAQ,EAAE,EAAA,EAAI,EAAA,EAAI,QAAQ,oBAAA","file":"vue.js","sourcesContent":["/**\n * tailwind-styled-v4 — Vue Adapter\n *\n * Pola seperti `createComponent` di React tapi untuk Vue 3 Composition API.\n * Mendukung: base, variants, defaultVariants, compoundVariants.\n *\n * @example\n * import { tw } from '@tailwind-styled/vue'\n *\n * const Button = tw('button', {\n * base: 'px-4 py-2 rounded font-medium',\n * variants: {\n * intent: {\n * primary: 'bg-blue-500 text-white hover:bg-blue-600',\n * danger: 'bg-red-500 text-white hover:bg-red-600',\n * },\n * size: { sm: 'h-8 text-sm', md: 'h-10 text-base', lg: 'h-12 text-lg' },\n * },\n * defaultVariants: { intent: 'primary', size: 'md' },\n * })\n *\n * // In template:\n * // <Button intent=\"danger\" size=\"lg\">Delete</Button>\n */\n\nimport { computed, defineComponent, h, type Component, type DefineComponent } from \"vue\"\nimport { twMerge } from \"tailwind-merge\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface VueComponentConfig {\n base?: string\n variants?: Record<string, Record<string, string>>\n compoundVariants?: Array<{ class: string; [key: string]: any }>\n defaultVariants?: Record<string, string>\n}\n\nexport type HtmlTagName =\n | \"div\"\n | \"section\"\n | \"article\"\n | \"aside\"\n | \"header\"\n | \"footer\"\n | \"main\"\n | \"nav\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"p\"\n | \"span\"\n | \"strong\"\n | \"em\"\n | \"a\"\n | \"button\"\n | \"input\"\n | \"textarea\"\n | \"select\"\n | \"form\"\n | \"label\"\n | \"ul\"\n | \"ol\"\n | \"li\"\n | \"table\"\n | \"tr\"\n | \"th\"\n | \"td\"\n | \"thead\"\n | \"tbody\"\n | \"img\"\n | \"figure\"\n | \"figcaption\"\n | \"blockquote\"\n | \"code\"\n | \"pre\"\n | \"hr\"\n | \"br\"\n | \"dialog\"\n | \"details\"\n | \"summary\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Variant resolver (sama dengan React adapter)\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction resolveVariants(\n variants: Record<string, Record<string, string>>,\n props: Record<string, any>,\n defaults: Record<string, string> = {}\n): string {\n const classes: string[] = []\n for (const key in variants) {\n const val = props[key] ?? defaults[key]\n if (val !== undefined && variants[key][String(val)]) {\n classes.push(variants[key][String(val)])\n }\n }\n return classes.join(\" \")\n}\n\nfunction resolveCompound(\n compounds: Array<{ class: string; [key: string]: any }>,\n props: Record<string, any>\n): string {\n return compounds\n .filter((c) => {\n const { class: _cls, ...conditions } = c\n return Object.entries(conditions).every(([k, v]) => props[k] === v)\n })\n .map((c) => c.class)\n .join(\" \")\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Core factory\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Buat Vue component dengan Tailwind class yang terstruktur.\n *\n * @param tag - HTML tag atau Vue component\n * @param config - Konfigurasi base, variants, defaultVariants\n */\nexport function tw<Tag extends HtmlTagName>(\n tag: Tag,\n config: VueComponentConfig = {}\n): DefineComponent<any> {\n const { base = \"\", variants = {}, compoundVariants = [], defaultVariants = {} } = config\n\n const variantKeys = new Set(Object.keys(variants))\n\n // Props definition untuk Vue — semua variant key jadi optional prop\n const propsDefinition: Record<string, { type: null; default: undefined }> = {}\n for (const key of variantKeys) {\n propsDefinition[key] = { type: null, default: undefined }\n }\n propsDefinition[\"class\"] = { type: null, default: undefined }\n\n return defineComponent({\n name: `TwStyled${String(tag).charAt(0).toUpperCase() + String(tag).slice(1)}`,\n inheritAttrs: false,\n props: propsDefinition,\n setup(props, { attrs, slots }) {\n const className = computed(() => {\n const variantClasses = resolveVariants(variants, props, defaultVariants)\n const compoundClasses = resolveCompound(compoundVariants, { ...defaultVariants, ...props })\n return twMerge(\n base,\n variantClasses,\n compoundClasses,\n props[\"class\"] as string,\n attrs.class as string\n )\n })\n\n return () => {\n // Filter out variant props — jangan diteruskan ke HTML element\n const filteredAttrs: Record<string, any> = {}\n for (const key in attrs) {\n if (!variantKeys.has(key)) {\n filteredAttrs[key] = attrs[key]\n }\n }\n\n return h(tag as string, { ...filteredAttrs, class: className.value }, slots.default?.())\n }\n },\n })\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// cv() — class variant helper (framework-agnostic, sama dengan React)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Class variant function — returns a class string resolver.\n * Framework-agnostic, bisa dipakai di mana saja.\n *\n * @example\n * const buttonCv = cv({\n * base: 'px-4 py-2 rounded',\n * variants: { size: { sm: 'h-8', lg: 'h-12' } },\n * defaultVariants: { size: 'sm' },\n * })\n *\n * buttonCv({ size: 'lg' }) // 'px-4 py-2 rounded h-12'\n */\nexport function cv(config: VueComponentConfig) {\n return (props: Record<string, any> = {}) => {\n const { base = \"\", variants = {}, compoundVariants = [], defaultVariants = {} } = config\n const merged = { ...defaultVariants, ...props }\n const variantClasses = resolveVariants(variants, merged, defaultVariants)\n const compoundClasses = resolveCompound(compoundVariants, merged)\n return twMerge(base, variantClasses, compoundClasses, props.class)\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Extend — tambahkan class ke komponen yang sudah ada\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extend komponen Vue yang sudah ada dengan class tambahan.\n *\n * @example\n * const PrimaryButton = extend(Button, 'bg-blue-500 text-white')\n */\nexport function extend(component: Component, extraClasses: string): DefineComponent<any> {\n return defineComponent({\n name: `Extended${(component as any).name ?? \"Component\"}`,\n inheritAttrs: false,\n props: { class: { type: null, default: undefined } },\n setup(props, { attrs, slots }) {\n return () =>\n h(\n component,\n {\n ...attrs,\n class: twMerge(extraClasses, props[\"class\"] as string, attrs.class as string),\n },\n slots.default?.()\n )\n },\n })\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin Vue\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Vue plugin — daftarkan `tw` sebagai global composable.\n *\n * @example\n * // main.ts\n * import { createApp } from 'vue'\n * import { TailwindStyledPlugin } from '@tailwind-styled/vue'\n * import App from './App.vue'\n *\n * createApp(App).use(TailwindStyledPlugin).mount('#app')\n */\nexport const TailwindStyledPlugin = {\n install(app: any) {\n app.config.globalProperties.$tw = tw\n app.config.globalProperties.$cv = cv\n app.provide(\"tw\", tw)\n app.provide(\"cv\", cv)\n },\n}\n\nexport default { tw, cv, extend, TailwindStyledPlugin }\n"]}
|
package/dist/vue.mjs
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { defineComponent, computed, h } from 'vue';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
|
|
4
|
+
/* tailwind-styled-v4 v5.0.1 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
|
|
5
|
+
|
|
6
|
+
function resolveVariants(variants, props, defaults = {}) {
|
|
7
|
+
const classes = [];
|
|
8
|
+
for (const key in variants) {
|
|
9
|
+
const val = props[key] ?? defaults[key];
|
|
10
|
+
if (val !== void 0 && variants[key][String(val)]) {
|
|
11
|
+
classes.push(variants[key][String(val)]);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return classes.join(" ");
|
|
15
|
+
}
|
|
16
|
+
function resolveCompound(compounds, props) {
|
|
17
|
+
return compounds.filter((c) => {
|
|
18
|
+
const { class: _cls, ...conditions } = c;
|
|
19
|
+
return Object.entries(conditions).every(([k, v]) => props[k] === v);
|
|
20
|
+
}).map((c) => c.class).join(" ");
|
|
21
|
+
}
|
|
22
|
+
function tw(tag, config = {}) {
|
|
23
|
+
const { base = "", variants = {}, compoundVariants = [], defaultVariants = {} } = config;
|
|
24
|
+
const variantKeys = new Set(Object.keys(variants));
|
|
25
|
+
const propsDefinition = {};
|
|
26
|
+
for (const key of variantKeys) {
|
|
27
|
+
propsDefinition[key] = { type: null, default: void 0 };
|
|
28
|
+
}
|
|
29
|
+
propsDefinition["class"] = { type: null, default: void 0 };
|
|
30
|
+
return defineComponent({
|
|
31
|
+
name: `TwStyled${String(tag).charAt(0).toUpperCase() + String(tag).slice(1)}`,
|
|
32
|
+
inheritAttrs: false,
|
|
33
|
+
props: propsDefinition,
|
|
34
|
+
setup(props, { attrs, slots }) {
|
|
35
|
+
const className = computed(() => {
|
|
36
|
+
const variantClasses = resolveVariants(variants, props, defaultVariants);
|
|
37
|
+
const compoundClasses = resolveCompound(compoundVariants, { ...defaultVariants, ...props });
|
|
38
|
+
return twMerge(
|
|
39
|
+
base,
|
|
40
|
+
variantClasses,
|
|
41
|
+
compoundClasses,
|
|
42
|
+
props["class"],
|
|
43
|
+
attrs.class
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
return () => {
|
|
47
|
+
const filteredAttrs = {};
|
|
48
|
+
for (const key in attrs) {
|
|
49
|
+
if (!variantKeys.has(key)) {
|
|
50
|
+
filteredAttrs[key] = attrs[key];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return h(tag, { ...filteredAttrs, class: className.value }, slots.default?.());
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function cv(config) {
|
|
59
|
+
return (props = {}) => {
|
|
60
|
+
const { base = "", variants = {}, compoundVariants = [], defaultVariants = {} } = config;
|
|
61
|
+
const merged = { ...defaultVariants, ...props };
|
|
62
|
+
const variantClasses = resolveVariants(variants, merged, defaultVariants);
|
|
63
|
+
const compoundClasses = resolveCompound(compoundVariants, merged);
|
|
64
|
+
return twMerge(base, variantClasses, compoundClasses, props.class);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function extend(component, extraClasses) {
|
|
68
|
+
return defineComponent({
|
|
69
|
+
name: `Extended${component.name ?? "Component"}`,
|
|
70
|
+
inheritAttrs: false,
|
|
71
|
+
props: { class: { type: null, default: void 0 } },
|
|
72
|
+
setup(props, { attrs, slots }) {
|
|
73
|
+
return () => h(
|
|
74
|
+
component,
|
|
75
|
+
{
|
|
76
|
+
...attrs,
|
|
77
|
+
class: twMerge(extraClasses, props["class"], attrs.class)
|
|
78
|
+
},
|
|
79
|
+
slots.default?.()
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
var TailwindStyledPlugin = {
|
|
85
|
+
install(app) {
|
|
86
|
+
app.config.globalProperties.$tw = tw;
|
|
87
|
+
app.config.globalProperties.$cv = cv;
|
|
88
|
+
app.provide("tw", tw);
|
|
89
|
+
app.provide("cv", cv);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
var src_default = { tw, cv, extend, TailwindStyledPlugin };
|
|
93
|
+
|
|
94
|
+
export { TailwindStyledPlugin, cv, src_default as default, extend, tw };
|
|
95
|
+
//# sourceMappingURL=vue.mjs.map
|
|
96
|
+
//# sourceMappingURL=vue.mjs.map
|
package/dist/vue.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/vue/src/index.ts"],"names":[],"mappings":"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","file":"vue.mjs","sourcesContent":["/**\n * tailwind-styled-v4 — Vue Adapter\n *\n * Pola seperti `createComponent` di React tapi untuk Vue 3 Composition API.\n * Mendukung: base, variants, defaultVariants, compoundVariants.\n *\n * @example\n * import { tw } from '@tailwind-styled/vue'\n *\n * const Button = tw('button', {\n * base: 'px-4 py-2 rounded font-medium',\n * variants: {\n * intent: {\n * primary: 'bg-blue-500 text-white hover:bg-blue-600',\n * danger: 'bg-red-500 text-white hover:bg-red-600',\n * },\n * size: { sm: 'h-8 text-sm', md: 'h-10 text-base', lg: 'h-12 text-lg' },\n * },\n * defaultVariants: { intent: 'primary', size: 'md' },\n * })\n *\n * // In template:\n * // <Button intent=\"danger\" size=\"lg\">Delete</Button>\n */\n\nimport { computed, defineComponent, h, type Component, type DefineComponent } from \"vue\"\nimport { twMerge } from \"tailwind-merge\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface VueComponentConfig {\n base?: string\n variants?: Record<string, Record<string, string>>\n compoundVariants?: Array<{ class: string; [key: string]: any }>\n defaultVariants?: Record<string, string>\n}\n\nexport type HtmlTagName =\n | \"div\"\n | \"section\"\n | \"article\"\n | \"aside\"\n | \"header\"\n | \"footer\"\n | \"main\"\n | \"nav\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"p\"\n | \"span\"\n | \"strong\"\n | \"em\"\n | \"a\"\n | \"button\"\n | \"input\"\n | \"textarea\"\n | \"select\"\n | \"form\"\n | \"label\"\n | \"ul\"\n | \"ol\"\n | \"li\"\n | \"table\"\n | \"tr\"\n | \"th\"\n | \"td\"\n | \"thead\"\n | \"tbody\"\n | \"img\"\n | \"figure\"\n | \"figcaption\"\n | \"blockquote\"\n | \"code\"\n | \"pre\"\n | \"hr\"\n | \"br\"\n | \"dialog\"\n | \"details\"\n | \"summary\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Variant resolver (sama dengan React adapter)\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction resolveVariants(\n variants: Record<string, Record<string, string>>,\n props: Record<string, any>,\n defaults: Record<string, string> = {}\n): string {\n const classes: string[] = []\n for (const key in variants) {\n const val = props[key] ?? defaults[key]\n if (val !== undefined && variants[key][String(val)]) {\n classes.push(variants[key][String(val)])\n }\n }\n return classes.join(\" \")\n}\n\nfunction resolveCompound(\n compounds: Array<{ class: string; [key: string]: any }>,\n props: Record<string, any>\n): string {\n return compounds\n .filter((c) => {\n const { class: _cls, ...conditions } = c\n return Object.entries(conditions).every(([k, v]) => props[k] === v)\n })\n .map((c) => c.class)\n .join(\" \")\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Core factory\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Buat Vue component dengan Tailwind class yang terstruktur.\n *\n * @param tag - HTML tag atau Vue component\n * @param config - Konfigurasi base, variants, defaultVariants\n */\nexport function tw<Tag extends HtmlTagName>(\n tag: Tag,\n config: VueComponentConfig = {}\n): DefineComponent<any> {\n const { base = \"\", variants = {}, compoundVariants = [], defaultVariants = {} } = config\n\n const variantKeys = new Set(Object.keys(variants))\n\n // Props definition untuk Vue — semua variant key jadi optional prop\n const propsDefinition: Record<string, { type: null; default: undefined }> = {}\n for (const key of variantKeys) {\n propsDefinition[key] = { type: null, default: undefined }\n }\n propsDefinition[\"class\"] = { type: null, default: undefined }\n\n return defineComponent({\n name: `TwStyled${String(tag).charAt(0).toUpperCase() + String(tag).slice(1)}`,\n inheritAttrs: false,\n props: propsDefinition,\n setup(props, { attrs, slots }) {\n const className = computed(() => {\n const variantClasses = resolveVariants(variants, props, defaultVariants)\n const compoundClasses = resolveCompound(compoundVariants, { ...defaultVariants, ...props })\n return twMerge(\n base,\n variantClasses,\n compoundClasses,\n props[\"class\"] as string,\n attrs.class as string\n )\n })\n\n return () => {\n // Filter out variant props — jangan diteruskan ke HTML element\n const filteredAttrs: Record<string, any> = {}\n for (const key in attrs) {\n if (!variantKeys.has(key)) {\n filteredAttrs[key] = attrs[key]\n }\n }\n\n return h(tag as string, { ...filteredAttrs, class: className.value }, slots.default?.())\n }\n },\n })\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// cv() — class variant helper (framework-agnostic, sama dengan React)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Class variant function — returns a class string resolver.\n * Framework-agnostic, bisa dipakai di mana saja.\n *\n * @example\n * const buttonCv = cv({\n * base: 'px-4 py-2 rounded',\n * variants: { size: { sm: 'h-8', lg: 'h-12' } },\n * defaultVariants: { size: 'sm' },\n * })\n *\n * buttonCv({ size: 'lg' }) // 'px-4 py-2 rounded h-12'\n */\nexport function cv(config: VueComponentConfig) {\n return (props: Record<string, any> = {}) => {\n const { base = \"\", variants = {}, compoundVariants = [], defaultVariants = {} } = config\n const merged = { ...defaultVariants, ...props }\n const variantClasses = resolveVariants(variants, merged, defaultVariants)\n const compoundClasses = resolveCompound(compoundVariants, merged)\n return twMerge(base, variantClasses, compoundClasses, props.class)\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Extend — tambahkan class ke komponen yang sudah ada\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extend komponen Vue yang sudah ada dengan class tambahan.\n *\n * @example\n * const PrimaryButton = extend(Button, 'bg-blue-500 text-white')\n */\nexport function extend(component: Component, extraClasses: string): DefineComponent<any> {\n return defineComponent({\n name: `Extended${(component as any).name ?? \"Component\"}`,\n inheritAttrs: false,\n props: { class: { type: null, default: undefined } },\n setup(props, { attrs, slots }) {\n return () =>\n h(\n component,\n {\n ...attrs,\n class: twMerge(extraClasses, props[\"class\"] as string, attrs.class as string),\n },\n slots.default?.()\n )\n },\n })\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plugin Vue\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Vue plugin — daftarkan `tw` sebagai global composable.\n *\n * @example\n * // main.ts\n * import { createApp } from 'vue'\n * import { TailwindStyledPlugin } from '@tailwind-styled/vue'\n * import App from './App.vue'\n *\n * createApp(App).use(TailwindStyledPlugin).mount('#app')\n */\nexport const TailwindStyledPlugin = {\n install(app: any) {\n app.config.globalProperties.$tw = tw\n app.config.globalProperties.$cv = cv\n app.provide(\"tw\", tw)\n app.provide(\"cv\", cv)\n },\n}\n\nexport default { tw, cv, extend, TailwindStyledPlugin }\n"]}
|