tailwind-styled-v4 5.0.0 → 5.0.1

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.
Files changed (177) hide show
  1. package/CHANGELOG.md +398 -0
  2. package/LICENSE +21 -0
  3. package/README.md +532 -0
  4. package/dist/analyzer.d.mts +114 -0
  5. package/dist/analyzer.d.ts +114 -0
  6. package/dist/analyzer.js +1555 -0
  7. package/dist/analyzer.js.map +1 -0
  8. package/dist/analyzer.mjs +1544 -0
  9. package/dist/analyzer.mjs.map +1 -0
  10. package/dist/{animate.d.cts → animate.d.mts} +3 -30
  11. package/dist/animate.d.ts +3 -30
  12. package/dist/animate.js +149 -99
  13. package/dist/animate.js.map +1 -1
  14. package/dist/{animate.cjs → animate.mjs} +130 -119
  15. package/dist/animate.mjs.map +1 -0
  16. package/dist/atomic.d.mts +18 -0
  17. package/dist/atomic.d.ts +18 -0
  18. package/dist/atomic.js +191 -0
  19. package/dist/atomic.js.map +1 -0
  20. package/dist/atomic.mjs +185 -0
  21. package/dist/atomic.mjs.map +1 -0
  22. package/dist/cli.d.mts +1 -0
  23. package/dist/cli.d.ts +1 -0
  24. package/dist/cli.js +6063 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/cli.mjs +6053 -0
  27. package/dist/cli.mjs.map +1 -0
  28. package/dist/compiler.d.mts +1009 -0
  29. package/dist/compiler.d.ts +1009 -0
  30. package/dist/compiler.js +4518 -0
  31. package/dist/compiler.js.map +1 -0
  32. package/dist/compiler.mjs +4443 -0
  33. package/dist/compiler.mjs.map +1 -0
  34. package/dist/dashboard.d.mts +272 -0
  35. package/dist/dashboard.d.ts +272 -0
  36. package/dist/dashboard.js +249 -0
  37. package/dist/dashboard.js.map +1 -0
  38. package/dist/dashboard.mjs +239 -0
  39. package/dist/dashboard.mjs.map +1 -0
  40. package/dist/devtools.js +170 -157
  41. package/dist/devtools.js.map +1 -1
  42. package/dist/{devtools.cjs → devtools.mjs} +165 -166
  43. package/dist/devtools.mjs.map +1 -0
  44. package/dist/engine.d.mts +84 -0
  45. package/dist/engine.d.ts +84 -0
  46. package/dist/engine.js +3014 -0
  47. package/dist/engine.js.map +1 -0
  48. package/dist/engine.mjs +3005 -0
  49. package/dist/engine.mjs.map +1 -0
  50. package/dist/{index.d.cts → index.d.mts} +2 -2
  51. package/dist/index.d.ts +2 -2
  52. package/dist/index.js +945 -36
  53. package/dist/index.js.map +1 -1
  54. package/dist/{index.cjs → index.mjs} +899 -90
  55. package/dist/index.mjs.map +1 -0
  56. package/dist/liveTokenEngine-DYN3Zale.d.mts +34 -0
  57. package/dist/liveTokenEngine-DYN3Zale.d.ts +34 -0
  58. package/dist/{next.d.cts → next.d.mts} +2 -1
  59. package/dist/next.d.ts +2 -1
  60. package/dist/next.js +6853 -35
  61. package/dist/next.js.map +1 -1
  62. package/dist/next.mjs +7050 -0
  63. package/dist/next.mjs.map +1 -0
  64. package/dist/plugin.d.mts +90 -0
  65. package/dist/plugin.d.ts +90 -0
  66. package/dist/plugin.js +185 -0
  67. package/dist/plugin.js.map +1 -0
  68. package/dist/plugin.mjs +174 -0
  69. package/dist/plugin.mjs.map +1 -0
  70. package/dist/pluginRegistry.d.mts +83 -0
  71. package/dist/pluginRegistry.d.ts +83 -0
  72. package/dist/pluginRegistry.js +303 -0
  73. package/dist/pluginRegistry.js.map +1 -0
  74. package/dist/pluginRegistry.mjs +298 -0
  75. package/dist/pluginRegistry.mjs.map +1 -0
  76. package/dist/preset.js +9 -4
  77. package/dist/preset.js.map +1 -1
  78. package/dist/{preset.cjs → preset.mjs} +5 -14
  79. package/dist/preset.mjs.map +1 -0
  80. package/dist/rspack.d.mts +33 -0
  81. package/dist/rspack.d.ts +33 -0
  82. package/dist/rspack.js +55 -0
  83. package/dist/rspack.js.map +1 -0
  84. package/dist/rspack.mjs +45 -0
  85. package/dist/rspack.mjs.map +1 -0
  86. package/dist/runtime.d.mts +62 -0
  87. package/dist/runtime.d.ts +62 -0
  88. package/dist/runtime.js +207 -0
  89. package/dist/runtime.js.map +1 -0
  90. package/dist/runtime.mjs +188 -0
  91. package/dist/runtime.mjs.map +1 -0
  92. package/dist/runtimeCss.d.mts +65 -0
  93. package/dist/runtimeCss.d.ts +65 -0
  94. package/dist/{css.cjs → runtimeCss.js} +71 -4
  95. package/dist/runtimeCss.js.map +1 -0
  96. package/dist/{css.js → runtimeCss.mjs} +66 -5
  97. package/dist/runtimeCss.mjs.map +1 -0
  98. package/dist/scanner.d.mts +25 -0
  99. package/dist/scanner.d.ts +25 -0
  100. package/dist/scanner.js +717 -0
  101. package/dist/scanner.js.map +1 -0
  102. package/dist/scanner.mjs +703 -0
  103. package/dist/scanner.mjs.map +1 -0
  104. package/dist/shared.d.mts +85 -0
  105. package/dist/shared.d.ts +85 -0
  106. package/dist/shared.js +255 -0
  107. package/dist/shared.js.map +1 -0
  108. package/dist/shared.mjs +233 -0
  109. package/dist/shared.mjs.map +1 -0
  110. package/dist/storybookAddon.d.mts +108 -0
  111. package/dist/storybookAddon.d.ts +108 -0
  112. package/dist/storybookAddon.js +95 -0
  113. package/dist/storybookAddon.js.map +1 -0
  114. package/dist/storybookAddon.mjs +88 -0
  115. package/dist/storybookAddon.mjs.map +1 -0
  116. package/dist/svelte.d.mts +114 -0
  117. package/dist/svelte.d.ts +114 -0
  118. package/dist/svelte.js +67 -0
  119. package/dist/svelte.js.map +1 -0
  120. package/dist/svelte.mjs +59 -0
  121. package/dist/svelte.mjs.map +1 -0
  122. package/dist/testing.d.mts +185 -0
  123. package/dist/testing.d.ts +185 -0
  124. package/dist/testing.js +173 -0
  125. package/dist/testing.js.map +1 -0
  126. package/dist/testing.mjs +158 -0
  127. package/dist/testing.mjs.map +1 -0
  128. package/dist/theme.d.mts +188 -0
  129. package/dist/theme.d.ts +188 -0
  130. package/dist/theme.js +334 -0
  131. package/dist/theme.js.map +1 -0
  132. package/dist/theme.mjs +311 -0
  133. package/dist/theme.mjs.map +1 -0
  134. package/dist/types-DXr2PmGP.d.mts +31 -0
  135. package/dist/types-DXr2PmGP.d.ts +31 -0
  136. package/dist/vite.js +4181 -16
  137. package/dist/vite.js.map +1 -1
  138. package/dist/vite.mjs +4281 -0
  139. package/dist/vite.mjs.map +1 -0
  140. package/dist/vue.d.mts +89 -0
  141. package/dist/vue.d.ts +89 -0
  142. package/dist/vue.js +104 -0
  143. package/dist/vue.js.map +1 -0
  144. package/dist/vue.mjs +96 -0
  145. package/dist/vue.mjs.map +1 -0
  146. package/package.json +168 -65
  147. package/dist/animate.cjs.map +0 -1
  148. package/dist/chunk-VZEJV27B.js +0 -11
  149. package/dist/chunk-VZEJV27B.js.map +0 -1
  150. package/dist/chunk-Y5D3E72P.cjs +0 -13
  151. package/dist/chunk-Y5D3E72P.cjs.map +0 -1
  152. package/dist/css.cjs.map +0 -1
  153. package/dist/css.d.cts +0 -30
  154. package/dist/css.d.ts +0 -30
  155. package/dist/css.js.map +0 -1
  156. package/dist/devtools.cjs.map +0 -1
  157. package/dist/index.cjs.map +0 -1
  158. package/dist/next.cjs +0 -248
  159. package/dist/next.cjs.map +0 -1
  160. package/dist/preset.cjs.map +0 -1
  161. package/dist/turbopackLoader.cjs +0 -37
  162. package/dist/turbopackLoader.cjs.map +0 -1
  163. package/dist/turbopackLoader.d.cts +0 -12
  164. package/dist/turbopackLoader.d.ts +0 -12
  165. package/dist/turbopackLoader.js +0 -35
  166. package/dist/turbopackLoader.js.map +0 -1
  167. package/dist/vite.cjs +0 -138
  168. package/dist/vite.cjs.map +0 -1
  169. package/dist/webpackLoader.cjs +0 -51
  170. package/dist/webpackLoader.cjs.map +0 -1
  171. package/dist/webpackLoader.d.cts +0 -17
  172. package/dist/webpackLoader.d.ts +0 -17
  173. package/dist/webpackLoader.js +0 -49
  174. package/dist/webpackLoader.js.map +0 -1
  175. /package/dist/{devtools.d.cts → devtools.d.mts} +0 -0
  176. /package/dist/{preset.d.cts → preset.d.mts} +0 -0
  177. /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
@@ -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
@@ -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"]}