tailwind-styled-v4 4.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 (194) 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.mts +46 -0
  11. package/dist/animate.d.ts +41 -112
  12. package/dist/animate.js +792 -235
  13. package/dist/animate.js.map +1 -1
  14. package/dist/animate.mjs +782 -0
  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.cts → compiler.d.mts} +503 -210
  29. package/dist/compiler.d.ts +503 -210
  30. package/dist/compiler.js +1549 -566
  31. package/dist/compiler.js.map +1 -1
  32. package/dist/{compiler.cjs → compiler.mjs} +1476 -627
  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 +336 -211
  41. package/dist/devtools.js.map +1 -1
  42. package/dist/{devtools.cjs → devtools.mjs} +331 -220
  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} +75 -4
  51. package/dist/index.d.ts +75 -4
  52. package/dist/index.js +1341 -149
  53. package/dist/index.js.map +1 -1
  54. package/dist/index.mjs +2162 -0
  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.mts +55 -0
  59. package/dist/next.d.ts +30 -20
  60. package/dist/next.js +6947 -149
  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.d.cts → preset.d.mts} +29 -2
  77. package/dist/preset.d.ts +29 -2
  78. package/dist/preset.js +318 -21
  79. package/dist/preset.js.map +1 -1
  80. package/dist/preset.mjs +414 -0
  81. package/dist/preset.mjs.map +1 -0
  82. package/dist/rspack.d.mts +33 -0
  83. package/dist/rspack.d.ts +33 -0
  84. package/dist/rspack.js +55 -0
  85. package/dist/rspack.js.map +1 -0
  86. package/dist/rspack.mjs +45 -0
  87. package/dist/rspack.mjs.map +1 -0
  88. package/dist/runtime.d.mts +62 -0
  89. package/dist/runtime.d.ts +62 -0
  90. package/dist/runtime.js +207 -0
  91. package/dist/runtime.js.map +1 -0
  92. package/dist/runtime.mjs +188 -0
  93. package/dist/runtime.mjs.map +1 -0
  94. package/dist/runtimeCss.d.mts +65 -0
  95. package/dist/runtimeCss.d.ts +65 -0
  96. package/dist/runtimeCss.js +188 -0
  97. package/dist/runtimeCss.js.map +1 -0
  98. package/dist/runtimeCss.mjs +173 -0
  99. package/dist/runtimeCss.mjs.map +1 -0
  100. package/dist/scanner.d.mts +25 -0
  101. package/dist/scanner.d.ts +25 -0
  102. package/dist/scanner.js +717 -0
  103. package/dist/scanner.js.map +1 -0
  104. package/dist/scanner.mjs +703 -0
  105. package/dist/scanner.mjs.map +1 -0
  106. package/dist/shared.d.mts +85 -0
  107. package/dist/shared.d.ts +85 -0
  108. package/dist/shared.js +255 -0
  109. package/dist/shared.js.map +1 -0
  110. package/dist/shared.mjs +233 -0
  111. package/dist/shared.mjs.map +1 -0
  112. package/dist/storybookAddon.d.mts +108 -0
  113. package/dist/storybookAddon.d.ts +108 -0
  114. package/dist/storybookAddon.js +95 -0
  115. package/dist/storybookAddon.js.map +1 -0
  116. package/dist/storybookAddon.mjs +88 -0
  117. package/dist/storybookAddon.mjs.map +1 -0
  118. package/dist/svelte.d.mts +114 -0
  119. package/dist/svelte.d.ts +114 -0
  120. package/dist/svelte.js +67 -0
  121. package/dist/svelte.js.map +1 -0
  122. package/dist/svelte.mjs +59 -0
  123. package/dist/svelte.mjs.map +1 -0
  124. package/dist/testing.d.mts +185 -0
  125. package/dist/testing.d.ts +185 -0
  126. package/dist/testing.js +173 -0
  127. package/dist/testing.js.map +1 -0
  128. package/dist/testing.mjs +158 -0
  129. package/dist/testing.mjs.map +1 -0
  130. package/dist/{theme.d.cts → theme.d.mts} +18 -11
  131. package/dist/theme.d.ts +18 -11
  132. package/dist/theme.js +205 -19
  133. package/dist/theme.js.map +1 -1
  134. package/dist/theme.mjs +311 -0
  135. package/dist/theme.mjs.map +1 -0
  136. package/dist/types-DXr2PmGP.d.mts +31 -0
  137. package/dist/types-DXr2PmGP.d.ts +31 -0
  138. package/dist/vite.d.mts +51 -0
  139. package/dist/vite.d.ts +35 -6
  140. package/dist/vite.js +4254 -57
  141. package/dist/vite.js.map +1 -1
  142. package/dist/vite.mjs +4281 -0
  143. package/dist/vite.mjs.map +1 -0
  144. package/dist/vue.d.mts +89 -0
  145. package/dist/vue.d.ts +89 -0
  146. package/dist/vue.js +104 -0
  147. package/dist/vue.js.map +1 -0
  148. package/dist/vue.mjs +96 -0
  149. package/dist/vue.mjs.map +1 -0
  150. package/package.json +173 -67
  151. package/dist/animate.cjs +0 -252
  152. package/dist/animate.cjs.map +0 -1
  153. package/dist/animate.d.cts +0 -117
  154. package/dist/astTransform-ua-eapqs.d.cts +0 -41
  155. package/dist/astTransform-ua-eapqs.d.ts +0 -41
  156. package/dist/compiler.cjs.map +0 -1
  157. package/dist/css.cjs +0 -71
  158. package/dist/css.cjs.map +0 -1
  159. package/dist/css.d.cts +0 -45
  160. package/dist/css.d.ts +0 -45
  161. package/dist/css.js +0 -62
  162. package/dist/css.js.map +0 -1
  163. package/dist/devtools.cjs.map +0 -1
  164. package/dist/index.cjs +0 -1058
  165. package/dist/index.cjs.map +0 -1
  166. package/dist/next.cjs +0 -268
  167. package/dist/next.cjs.map +0 -1
  168. package/dist/next.d.cts +0 -45
  169. package/dist/plugins.cjs +0 -396
  170. package/dist/plugins.cjs.map +0 -1
  171. package/dist/plugins.d.cts +0 -231
  172. package/dist/plugins.d.ts +0 -231
  173. package/dist/plugins.js +0 -381
  174. package/dist/plugins.js.map +0 -1
  175. package/dist/preset.cjs +0 -129
  176. package/dist/preset.cjs.map +0 -1
  177. package/dist/theme.cjs +0 -154
  178. package/dist/theme.cjs.map +0 -1
  179. package/dist/turbopackLoader.cjs +0 -2689
  180. package/dist/turbopackLoader.cjs.map +0 -1
  181. package/dist/turbopackLoader.d.cts +0 -22
  182. package/dist/turbopackLoader.d.ts +0 -22
  183. package/dist/turbopackLoader.js +0 -2681
  184. package/dist/turbopackLoader.js.map +0 -1
  185. package/dist/vite.cjs +0 -105
  186. package/dist/vite.cjs.map +0 -1
  187. package/dist/vite.d.cts +0 -22
  188. package/dist/webpackLoader.cjs +0 -2670
  189. package/dist/webpackLoader.cjs.map +0 -1
  190. package/dist/webpackLoader.d.cts +0 -24
  191. package/dist/webpackLoader.d.ts +0 -24
  192. package/dist/webpackLoader.js +0 -2662
  193. package/dist/webpackLoader.js.map +0 -1
  194. /package/dist/{devtools.d.cts → devtools.d.mts} +0 -0
package/package.json CHANGED
@@ -1,97 +1,203 @@
1
1
  {
2
2
  "name": "tailwind-styled-v4",
3
- "version": "4.0.0",
4
- "description": "Zero-config, zero-runtime, compiler-driven Tailwind styling — tw.div, variants, RSC-aware",
3
+ "version": "5.0.1",
4
+ "description": "PRO Engine: styled-components + Tailwind CSS v4, zero-runtime compile, variant system, responsive props, plugin ecosystem",
5
5
  "author": "Dictionar32",
6
6
  "license": "MIT",
7
- "type": "module",
8
- "main": "./dist/index.cjs",
9
- "module": "./dist/index.js",
10
- "types": "./dist/index.d.ts",
7
+ "keywords": [
8
+ "tailwind",
9
+ "tailwindcss",
10
+ "styled-components",
11
+ "css-in-js",
12
+ "variants",
13
+ "cva",
14
+ "stitches",
15
+ "panda-css",
16
+ "twin.macro",
17
+ "react",
18
+ "next.js",
19
+ "vite",
20
+ "zero-runtime",
21
+ "typescript",
22
+ "shadcn",
23
+ "radix",
24
+ "headless-ui"
25
+ ],
26
+ "homepage": "https://github.com/Dictionar32/tailwind-styled-v4.1.2",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/Dictionar32/tailwind-styled-v4.1.2.git"
30
+ },
31
+ "bugs": {
32
+ "url": "https://github.com/Dictionar32/tailwind-styled-v4.1.2/issues"
33
+ },
34
+ "readme": "README.md",
35
+ "main": "dist/index.js",
36
+ "module": "dist/index.mjs",
37
+ "types": "dist/index.d.ts",
38
+ "files": [
39
+ "dist",
40
+ "README.md",
41
+ "CHANGELOG.md",
42
+ "LICENSE"
43
+ ],
11
44
  "exports": {
12
45
  ".": {
13
- "types": "./dist/index.d.ts",
14
- "import": "./dist/index.js",
15
- "require": "./dist/index.cjs",
16
- "default": "./dist/index.js"
46
+ "types": "./dist/index.d.ts",
47
+ "import": "./dist/index.mjs",
48
+ "require": "./dist/index.js"
49
+ },
50
+ "./compiler": {
51
+ "types": "./dist/compiler.d.ts",
52
+ "import": "./dist/compiler.mjs",
53
+ "require": "./dist/compiler.js"
54
+ },
55
+ "./animate": {
56
+ "types": "./dist/animate.d.ts",
57
+ "import": "./dist/animate.mjs",
58
+ "require": "./dist/animate.js"
59
+ },
60
+ "./scanner": {
61
+ "types": "./dist/scanner.d.ts",
62
+ "import": "./dist/scanner.mjs",
63
+ "require": "./dist/scanner.js"
64
+ },
65
+ "./engine": {
66
+ "types": "./dist/engine.d.ts",
67
+ "import": "./dist/engine.mjs",
68
+ "require": "./dist/engine.js"
69
+ },
70
+ "./theme": {
71
+ "types": "./dist/theme.d.ts",
72
+ "import": "./dist/theme.mjs",
73
+ "require": "./dist/theme.js"
74
+ },
75
+ "./preset": {
76
+ "types": "./dist/preset.d.ts",
77
+ "import": "./dist/preset.mjs",
78
+ "require": "./dist/preset.js"
79
+ },
80
+ "./cli": {
81
+ "types": "./dist/cli.d.ts",
82
+ "import": "./dist/cli.mjs",
83
+ "require": "./dist/cli.js"
84
+ },
85
+ "./analyzer": {
86
+ "types": "./dist/analyzer.d.ts",
87
+ "import": "./dist/analyzer.mjs",
88
+ "require": "./dist/analyzer.js"
89
+ },
90
+ "./shared": {
91
+ "types": "./dist/shared.d.ts",
92
+ "import": "./dist/shared.mjs",
93
+ "require": "./dist/shared.js"
94
+ },
95
+ "./runtime": {
96
+ "types": "./dist/runtime.d.ts",
97
+ "import": "./dist/runtime.mjs",
98
+ "require": "./dist/runtime.js"
99
+ },
100
+ "./runtime-css": {
101
+ "types": "./dist/runtime-css.d.ts",
102
+ "import": "./dist/runtime-css.mjs",
103
+ "require": "./dist/runtime-css.js"
104
+ },
105
+ "./plugin": {
106
+ "types": "./dist/plugin.d.ts",
107
+ "import": "./dist/plugin.mjs",
108
+ "require": "./dist/plugin.js"
109
+ },
110
+ "./plugin-registry": {
111
+ "types": "./dist/plugin-registry.d.ts",
112
+ "import": "./dist/plugin-registry.mjs",
113
+ "require": "./dist/plugin-registry.js"
17
114
  },
18
115
  "./next": {
19
- "types": "./dist/next.d.ts",
20
- "import": "./dist/next.js",
21
- "require": "./dist/next.cjs"
116
+ "types": "./dist/next.d.ts",
117
+ "import": "./dist/next.mjs",
118
+ "require": "./dist/next.js"
22
119
  },
23
120
  "./vite": {
24
- "types": "./dist/vite.d.ts",
25
- "import": "./dist/vite.js",
26
- "require": "./dist/vite.cjs"
121
+ "types": "./dist/vite.d.ts",
122
+ "import": "./dist/vite.mjs",
123
+ "require": "./dist/vite.js"
27
124
  },
28
- "./compiler": {
29
- "types": "./dist/compiler.d.ts",
30
- "import": "./dist/compiler.js",
31
- "require": "./dist/compiler.cjs"
125
+ "./rspack": {
126
+ "types": "./dist/rspack.d.ts",
127
+ "import": "./dist/rspack.mjs",
128
+ "require": "./dist/rspack.js"
32
129
  },
33
- "./preset": {
34
- "types": "./dist/preset.d.ts",
35
- "import": "./dist/preset.js",
36
- "require": "./dist/preset.cjs"
130
+ "./vue": {
131
+ "types": "./dist/vue.d.ts",
132
+ "import": "./dist/vue.mjs",
133
+ "require": "./dist/vue.js"
37
134
  },
38
- "./css": {
39
- "types": "./dist/css.d.ts",
40
- "import": "./dist/css.js",
41
- "require": "./dist/css.cjs"
135
+ "./svelte": {
136
+ "types": "./dist/svelte.d.ts",
137
+ "import": "./dist/svelte.mjs",
138
+ "require": "./dist/svelte.js"
42
139
  },
43
- "./plugins": {
44
- "types": "./dist/plugins.d.ts",
45
- "import": "./dist/plugins.js",
46
- "require": "./dist/plugins.cjs"
140
+ "./testing": {
141
+ "types": "./dist/testing.d.ts",
142
+ "import": "./dist/testing.mjs",
143
+ "require": "./dist/testing.js"
47
144
  },
48
- "./devtools": {
49
- "types": "./dist/devtools.d.ts",
50
- "import": "./dist/devtools.js",
51
- "require": "./dist/devtools.cjs"
145
+ "./storybook-addon": {
146
+ "types": "./dist/storybook-addon.d.ts",
147
+ "import": "./dist/storybook-addon.mjs",
148
+ "require": "./dist/storybook-addon.js"
52
149
  },
53
- "./animate": {
54
- "types": "./dist/animate.d.ts",
55
- "import": "./dist/animate.js",
56
- "require": "./dist/animate.cjs"
150
+ "./devtools": {
151
+ "types": "./dist/devtools.d.ts",
152
+ "import": "./dist/devtools.mjs",
153
+ "require": "./dist/devtools.js"
57
154
  },
58
- "./theme": {
59
- "types": "./dist/theme.d.ts",
60
- "import": "./dist/theme.js",
61
- "require": "./dist/theme.cjs"
155
+ "./atomic": {
156
+ "types": "./dist/atomic.d.ts",
157
+ "import": "./dist/atomic.mjs",
158
+ "require": "./dist/atomic.js"
62
159
  },
63
- "./package.json": "./package.json"
160
+ "./dashboard": {
161
+ "types": "./dist/dashboard.d.ts",
162
+ "import": "./dist/dashboard.mjs",
163
+ "require": "./dist/dashboard.js"
164
+ }
64
165
  },
65
- "files": [
66
- "dist",
67
- "README.md",
68
- "CHANGELOG.md",
69
- "LICENSE"
70
- ],
71
- "sideEffects": false,
72
- "engines": { "node": ">=18" },
73
- "dependencies": {
74
- "tailwind-merge": "^3",
75
- "postcss": "^8"
166
+ "scripts": {
167
+ "build": "tsup",
168
+ "build:packages": "tsup",
169
+ "build:rust": "cd native && cargo build --release",
170
+ "dev": "tsup --watch",
171
+ "test": "node --test 'packages/*/test/*.test.mjs'",
172
+ "check": "biome format --write && node scripts/lint.mjs && tsc --noEmit",
173
+ "lint": "biome check --write ."
76
174
  },
77
175
  "peerDependencies": {
78
176
  "react": ">=18",
79
177
  "react-dom": ">=18"
80
178
  },
81
- "peerDependenciesOptional": {
82
- "tailwindcss": "^4",
83
- "@tailwindcss/postcss": "^4"
179
+ "peerDependenciesMeta": {
180
+ "react": {
181
+ "optional": true
182
+ },
183
+ "react-dom": {
184
+ "optional": true
185
+ }
84
186
  },
85
187
  "devDependencies": {
86
- "@tailwind-styled/animate": "*",
87
- "@types/node": "^20",
188
+ "@biomejs/biome": "^2.4.7",
189
+ "@types/node": "^20.19.37",
88
190
  "@types/react": "^19",
191
+ "next": "^16.2.1",
192
+ "oxlint": "^1.56.0",
193
+ "tailwind-merge": "^3.5.0",
89
194
  "tsup": "^8",
90
- "typescript": "^5"
195
+ "typescript": "^5",
196
+ "vue": "^3.5.30"
91
197
  },
92
- "scripts": {
93
- "build": "tsup",
94
- "dev": "tsup --watch",
95
- "clean": "rm -rf dist"
198
+ "optionalDependencies": {
199
+ "oxc-minify": "^0.120.0",
200
+ "oxc-parser": "^0.120.0",
201
+ "oxc-transform": "^0.120.0"
96
202
  }
97
- }
203
+ }
package/dist/animate.cjs DELETED
@@ -1,252 +0,0 @@
1
- 'use strict';
2
-
3
- /* tailwind-styled-v4 v4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
4
-
5
- // ../animate/src/index.ts
6
- var TW_TO_CSS = {
7
- // Opacity
8
- "opacity-0": "opacity: 0",
9
- "opacity-5": "opacity: 0.05",
10
- "opacity-10": "opacity: 0.1",
11
- "opacity-20": "opacity: 0.2",
12
- "opacity-25": "opacity: 0.25",
13
- "opacity-30": "opacity: 0.3",
14
- "opacity-40": "opacity: 0.4",
15
- "opacity-50": "opacity: 0.5",
16
- "opacity-60": "opacity: 0.6",
17
- "opacity-70": "opacity: 0.7",
18
- "opacity-75": "opacity: 0.75",
19
- "opacity-80": "opacity: 0.8",
20
- "opacity-90": "opacity: 0.9",
21
- "opacity-95": "opacity: 0.95",
22
- "opacity-100": "opacity: 1",
23
- // Translate Y
24
- "translate-y-0": "transform: translateY(0px)",
25
- "translate-y-0.5": "transform: translateY(0.125rem)",
26
- "translate-y-1": "transform: translateY(0.25rem)",
27
- "translate-y-2": "transform: translateY(0.5rem)",
28
- "translate-y-3": "transform: translateY(0.75rem)",
29
- "translate-y-4": "transform: translateY(1rem)",
30
- "translate-y-6": "transform: translateY(1.5rem)",
31
- "translate-y-8": "transform: translateY(2rem)",
32
- "-translate-y-1": "transform: translateY(-0.25rem)",
33
- "-translate-y-2": "transform: translateY(-0.5rem)",
34
- "-translate-y-4": "transform: translateY(-1rem)",
35
- "-translate-y-8": "transform: translateY(-2rem)",
36
- // Translate X
37
- "translate-x-0": "transform: translateX(0px)",
38
- "translate-x-1": "transform: translateX(0.25rem)",
39
- "translate-x-2": "transform: translateX(0.5rem)",
40
- "translate-x-4": "transform: translateX(1rem)",
41
- "-translate-x-1": "transform: translateX(-0.25rem)",
42
- "-translate-x-2": "transform: translateX(-0.5rem)",
43
- "-translate-x-4": "transform: translateX(-1rem)",
44
- // Scale
45
- "scale-0": "transform: scale(0)",
46
- "scale-50": "transform: scale(0.5)",
47
- "scale-75": "transform: scale(0.75)",
48
- "scale-90": "transform: scale(0.9)",
49
- "scale-95": "transform: scale(0.95)",
50
- "scale-100": "transform: scale(1)",
51
- "scale-105": "transform: scale(1.05)",
52
- "scale-110": "transform: scale(1.1)",
53
- "scale-125": "transform: scale(1.25)",
54
- "scale-150": "transform: scale(1.5)",
55
- // Rotate
56
- "rotate-0": "transform: rotate(0deg)",
57
- "rotate-1": "transform: rotate(1deg)",
58
- "rotate-2": "transform: rotate(2deg)",
59
- "rotate-3": "transform: rotate(3deg)",
60
- "rotate-6": "transform: rotate(6deg)",
61
- "rotate-12": "transform: rotate(12deg)",
62
- "rotate-45": "transform: rotate(45deg)",
63
- "rotate-90": "transform: rotate(90deg)",
64
- "rotate-180": "transform: rotate(180deg)",
65
- "-rotate-1": "transform: rotate(-1deg)",
66
- "-rotate-2": "transform: rotate(-2deg)",
67
- "-rotate-6": "transform: rotate(-6deg)",
68
- "-rotate-12": "transform: rotate(-12deg)",
69
- "-rotate-45": "transform: rotate(-45deg)",
70
- "-rotate-90": "transform: rotate(-90deg)",
71
- // Blur
72
- "blur-none": "filter: blur(0)",
73
- "blur-sm": "filter: blur(4px)",
74
- blur: "filter: blur(8px)",
75
- "blur-md": "filter: blur(12px)",
76
- "blur-lg": "filter: blur(16px)",
77
- "blur-xl": "filter: blur(24px)",
78
- "blur-2xl": "filter: blur(40px)",
79
- "blur-3xl": "filter: blur(64px)"
80
- };
81
- function classesToCss(classes) {
82
- const parts = classes.split(/\s+/).filter(Boolean);
83
- const transforms = [];
84
- const others = [];
85
- for (const cls of parts) {
86
- const css = TW_TO_CSS[cls];
87
- if (!css) continue;
88
- if (css.startsWith("transform:")) {
89
- transforms.push(css.replace("transform: ", ""));
90
- } else {
91
- others.push(css);
92
- }
93
- }
94
- const result = [...others];
95
- if (transforms.length > 0) {
96
- result.push(`transform: ${transforms.join(" ")}`);
97
- }
98
- return result.join("; ");
99
- }
100
- var _animCounter = 0;
101
- function genAnimId(name) {
102
- if (name) return `tw-${name.replace(/[^a-zA-Z0-9]/g, "-")}`;
103
- return `tw-anim-${++_animCounter}`;
104
- }
105
- var _animRegistry = /* @__PURE__ */ new Map();
106
- function getAnimationRegistry() {
107
- return _animRegistry;
108
- }
109
- function compileAnimation(opts) {
110
- const {
111
- from,
112
- to,
113
- duration = 300,
114
- easing = "ease-out",
115
- delay = 0,
116
- fill = "both",
117
- iterations = 1,
118
- direction = "normal",
119
- name
120
- } = opts;
121
- const animId = genAnimId(
122
- name != null ? name : `${from.replace(/\s+/g, "-")}-${to.replace(/\s+/g, "-")}`.slice(0, 30)
123
- );
124
- if (_animRegistry.has(animId)) {
125
- return _animRegistry.get(animId);
126
- }
127
- const fromCss = classesToCss(from);
128
- const toCss = classesToCss(to);
129
- const keyframesCss = [
130
- `@keyframes ${animId} {`,
131
- fromCss ? ` from { ${fromCss} }` : ` from {}`,
132
- toCss ? ` to { ${toCss} }` : ` to {}`,
133
- `}`
134
- ].join("\n");
135
- const iterStr = iterations === "infinite" ? "infinite" : String(iterations);
136
- const animationCss = [
137
- `animation-name: ${animId}`,
138
- `animation-duration: ${duration}ms`,
139
- `animation-timing-function: ${easing}`,
140
- `animation-delay: ${delay}ms`,
141
- `animation-fill-mode: ${fill}`,
142
- `animation-iteration-count: ${iterStr}`,
143
- `animation-direction: ${direction}`
144
- ].join("; ");
145
- const className = animId;
146
- const compiled = { className, keyframesCss, animationCss };
147
- _animRegistry.set(animId, compiled);
148
- return compiled;
149
- }
150
- function animate(opts) {
151
- const compiled = compileAnimation(opts);
152
- if (typeof document !== "undefined") {
153
- const styleId = `__tw_anim_${compiled.className}`;
154
- if (!document.getElementById(styleId)) {
155
- const style = document.createElement("style");
156
- style.id = styleId;
157
- style.textContent = `${compiled.keyframesCss}
158
- .${compiled.className}{${compiled.animationCss}}`;
159
- document.head.appendChild(style);
160
- }
161
- }
162
- return compiled.className;
163
- }
164
- function keyframes(name, stops) {
165
- const animId = genAnimId(name);
166
- if (_animRegistry.has(animId)) {
167
- return animId;
168
- }
169
- const stopLines = Object.entries(stops).map(([stop, classes]) => {
170
- const css = classesToCss(classes);
171
- return ` ${stop} { ${css} }`;
172
- }).join("\n");
173
- const keyframesCss = `@keyframes ${animId} {
174
- ${stopLines}
175
- }`;
176
- if (typeof document !== "undefined") {
177
- const styleId = `__tw_kf_${animId}`;
178
- if (!document.getElementById(styleId)) {
179
- const style = document.createElement("style");
180
- style.id = styleId;
181
- style.textContent = keyframesCss;
182
- document.head.appendChild(style);
183
- }
184
- }
185
- _animRegistry.set(animId, {
186
- className: animId,
187
- keyframesCss,
188
- animationCss: `animation-name: ${animId}`
189
- });
190
- return animId;
191
- }
192
- var animations = {
193
- fadeIn: animate({ from: "opacity-0", to: "opacity-100", duration: 200 }),
194
- fadeOut: animate({ from: "opacity-100", to: "opacity-0", duration: 200 }),
195
- slideUp: animate({
196
- from: "opacity-0 translate-y-4",
197
- to: "opacity-100 translate-y-0",
198
- duration: 300
199
- }),
200
- slideDown: animate({
201
- from: "opacity-0 -translate-y-4",
202
- to: "opacity-100 translate-y-0",
203
- duration: 300
204
- }),
205
- slideLeft: animate({
206
- from: "opacity-0 translate-x-4",
207
- to: "opacity-100 translate-x-0",
208
- duration: 300
209
- }),
210
- slideRight: animate({
211
- from: "opacity-0 -translate-x-4",
212
- to: "opacity-100 translate-x-0",
213
- duration: 300
214
- }),
215
- scaleIn: animate({
216
- from: "opacity-0 scale-95",
217
- to: "opacity-100 scale-100",
218
- duration: 200,
219
- easing: "cubic-bezier(0.16,1,0.3,1)"
220
- }),
221
- scaleOut: animate({ from: "opacity-100 scale-100", to: "opacity-0 scale-95", duration: 150 }),
222
- blurIn: animate({ from: "opacity-0 blur-sm", to: "opacity-100 blur-none", duration: 300 }),
223
- bounceIn: animate({
224
- from: "opacity-0 scale-50",
225
- to: "opacity-100 scale-100",
226
- duration: 400,
227
- easing: "cubic-bezier(0.34,1.56,0.64,1)"
228
- }),
229
- spinIn: animate({
230
- from: "opacity-0 rotate-180 scale-50",
231
- to: "opacity-100 rotate-0 scale-100",
232
- duration: 400,
233
- easing: "cubic-bezier(0.16,1,0.3,1)"
234
- })
235
- };
236
- function extractAnimationCss() {
237
- const lines = [];
238
- for (const [, compiled] of _animRegistry) {
239
- lines.push(compiled.keyframesCss);
240
- lines.push(`.${compiled.className} { ${compiled.animationCss} }`);
241
- }
242
- return lines.join("\n\n");
243
- }
244
-
245
- exports.animate = animate;
246
- exports.animations = animations;
247
- exports.compileAnimation = compileAnimation;
248
- exports.extractAnimationCss = extractAnimationCss;
249
- exports.getAnimationRegistry = getAnimationRegistry;
250
- exports.keyframes = keyframes;
251
- //# sourceMappingURL=animate.cjs.map
252
- //# sourceMappingURL=animate.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../animate/src/index.ts"],"names":[],"mappings":"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","file":"animate.cjs","sourcesContent":["/**\n * tailwind-styled-v4 — Animation DSL\n *\n * Compile-time animation system. Define animations dengan Tailwind class,\n * compiler generate @keyframes — nol runtime, nol JS overhead.\n *\n * Usage:\n *\n * // Cara 1: .animate() chaining pada tw component\n * const FadeIn = tw.div.animate({\n * from: \"opacity-0 translate-y-2\",\n * to: \"opacity-100 translate-y-0\",\n * duration: 300,\n * easing: \"ease-out\"\n * })\n *\n * // Cara 2: standalone animate() utility\n * const fadeIn = animate({\n * from: \"opacity-0 scale-95\",\n * to: \"opacity-100 scale-100\",\n * duration: 200,\n * })\n * const Box = tw.div`${fadeIn}`\n *\n * // Cara 3: preset animations\n * const Card = tw.div`${animations.fadeIn} ${animations.slideUp}`\n *\n * // Cara 4: tw.keyframes() custom\n * const spin = tw.keyframes(\"spin\", {\n * \"0%\": \"rotate-0\",\n * \"100%\": \"rotate-180\",\n * })\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface AnimateOptions {\n /** Tailwind classes for animation start state */\n from: string\n /** Tailwind classes for animation end state */\n to: string\n /** Duration in ms. Default: 300 */\n duration?: number\n /** CSS easing. Default: \"ease-out\" */\n easing?: string\n /** Delay in ms. Default: 0 */\n delay?: number\n /** Fill mode. Default: \"both\" */\n fill?: \"none\" | \"forwards\" | \"backwards\" | \"both\"\n /** Iteration count. Default: 1 */\n iterations?: number | \"infinite\"\n /** Direction. Default: \"normal\" */\n direction?: \"normal\" | \"reverse\" | \"alternate\" | \"alternate-reverse\"\n /** Animation name override (auto-generated from from+to if not set) */\n name?: string\n}\n\nexport interface KeyframesDefinition {\n [stop: string]: string // \"0%\": \"opacity-0 translate-y-2\"\n}\n\nexport interface CompiledAnimation {\n /** CSS animation class name to apply */\n className: string\n /** @keyframes CSS to inject */\n keyframesCss: string\n /** animation CSS shorthand */\n animationCss: string\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Tailwind class → CSS property mapping\n// (for compile-time keyframe generation)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst TW_TO_CSS: Record<string, string> = {\n // Opacity\n \"opacity-0\": \"opacity: 0\",\n \"opacity-5\": \"opacity: 0.05\",\n \"opacity-10\": \"opacity: 0.1\",\n \"opacity-20\": \"opacity: 0.2\",\n \"opacity-25\": \"opacity: 0.25\",\n \"opacity-30\": \"opacity: 0.3\",\n \"opacity-40\": \"opacity: 0.4\",\n \"opacity-50\": \"opacity: 0.5\",\n \"opacity-60\": \"opacity: 0.6\",\n \"opacity-70\": \"opacity: 0.7\",\n \"opacity-75\": \"opacity: 0.75\",\n \"opacity-80\": \"opacity: 0.8\",\n \"opacity-90\": \"opacity: 0.9\",\n \"opacity-95\": \"opacity: 0.95\",\n \"opacity-100\": \"opacity: 1\",\n\n // Translate Y\n \"translate-y-0\": \"transform: translateY(0px)\",\n \"translate-y-0.5\": \"transform: translateY(0.125rem)\",\n \"translate-y-1\": \"transform: translateY(0.25rem)\",\n \"translate-y-2\": \"transform: translateY(0.5rem)\",\n \"translate-y-3\": \"transform: translateY(0.75rem)\",\n \"translate-y-4\": \"transform: translateY(1rem)\",\n \"translate-y-6\": \"transform: translateY(1.5rem)\",\n \"translate-y-8\": \"transform: translateY(2rem)\",\n \"-translate-y-1\": \"transform: translateY(-0.25rem)\",\n \"-translate-y-2\": \"transform: translateY(-0.5rem)\",\n \"-translate-y-4\": \"transform: translateY(-1rem)\",\n \"-translate-y-8\": \"transform: translateY(-2rem)\",\n\n // Translate X\n \"translate-x-0\": \"transform: translateX(0px)\",\n \"translate-x-1\": \"transform: translateX(0.25rem)\",\n \"translate-x-2\": \"transform: translateX(0.5rem)\",\n \"translate-x-4\": \"transform: translateX(1rem)\",\n \"-translate-x-1\": \"transform: translateX(-0.25rem)\",\n \"-translate-x-2\": \"transform: translateX(-0.5rem)\",\n \"-translate-x-4\": \"transform: translateX(-1rem)\",\n\n // Scale\n \"scale-0\": \"transform: scale(0)\",\n \"scale-50\": \"transform: scale(0.5)\",\n \"scale-75\": \"transform: scale(0.75)\",\n \"scale-90\": \"transform: scale(0.9)\",\n \"scale-95\": \"transform: scale(0.95)\",\n \"scale-100\": \"transform: scale(1)\",\n \"scale-105\": \"transform: scale(1.05)\",\n \"scale-110\": \"transform: scale(1.1)\",\n \"scale-125\": \"transform: scale(1.25)\",\n \"scale-150\": \"transform: scale(1.5)\",\n\n // Rotate\n \"rotate-0\": \"transform: rotate(0deg)\",\n \"rotate-1\": \"transform: rotate(1deg)\",\n \"rotate-2\": \"transform: rotate(2deg)\",\n \"rotate-3\": \"transform: rotate(3deg)\",\n \"rotate-6\": \"transform: rotate(6deg)\",\n \"rotate-12\": \"transform: rotate(12deg)\",\n \"rotate-45\": \"transform: rotate(45deg)\",\n \"rotate-90\": \"transform: rotate(90deg)\",\n \"rotate-180\": \"transform: rotate(180deg)\",\n \"-rotate-1\": \"transform: rotate(-1deg)\",\n \"-rotate-2\": \"transform: rotate(-2deg)\",\n \"-rotate-6\": \"transform: rotate(-6deg)\",\n \"-rotate-12\": \"transform: rotate(-12deg)\",\n \"-rotate-45\": \"transform: rotate(-45deg)\",\n \"-rotate-90\": \"transform: rotate(-90deg)\",\n\n // Blur\n \"blur-none\": \"filter: blur(0)\",\n \"blur-sm\": \"filter: blur(4px)\",\n blur: \"filter: blur(8px)\",\n \"blur-md\": \"filter: blur(12px)\",\n \"blur-lg\": \"filter: blur(16px)\",\n \"blur-xl\": \"filter: blur(24px)\",\n \"blur-2xl\": \"filter: blur(40px)\",\n \"blur-3xl\": \"filter: blur(64px)\",\n}\n\n// Multi-transform classes need merging\nfunction classesToCss(classes: string): string {\n const parts = classes.split(/\\s+/).filter(Boolean)\n const transforms: string[] = []\n const others: string[] = []\n\n for (const cls of parts) {\n const css = TW_TO_CSS[cls]\n if (!css) continue\n\n if (css.startsWith(\"transform:\")) {\n transforms.push(css.replace(\"transform: \", \"\"))\n } else {\n others.push(css)\n }\n }\n\n const result = [...others]\n if (transforms.length > 0) {\n result.push(`transform: ${transforms.join(\" \")}`)\n }\n\n return result.join(\"; \")\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Animation ID generator\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _animCounter = 0\nfunction genAnimId(name?: string): string {\n if (name) return `tw-${name.replace(/[^a-zA-Z0-9]/g, \"-\")}`\n return `tw-anim-${++_animCounter}`\n}\n\n// Global registry of generated animations (for CSS extraction)\nconst _animRegistry = new Map<string, CompiledAnimation>()\n\nexport function getAnimationRegistry(): Map<string, CompiledAnimation> {\n return _animRegistry\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Core: compile animation options → CSS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Compile AnimateOptions into CSS animation + @keyframes.\n *\n * Called at build time by the compiler, or at runtime in dev mode.\n */\nexport function compileAnimation(opts: AnimateOptions): CompiledAnimation {\n const {\n from,\n to,\n duration = 300,\n easing = \"ease-out\",\n delay = 0,\n fill = \"both\",\n iterations = 1,\n direction = \"normal\",\n name,\n } = opts\n\n const animId = genAnimId(\n name ?? `${from.replace(/\\s+/g, \"-\")}-${to.replace(/\\s+/g, \"-\")}`.slice(0, 30)\n )\n\n // Already compiled — return cached\n if (_animRegistry.has(animId)) {\n return _animRegistry.get(animId)!\n }\n\n const fromCss = classesToCss(from)\n const toCss = classesToCss(to)\n\n const keyframesCss = [\n `@keyframes ${animId} {`,\n fromCss ? ` from { ${fromCss} }` : ` from {}`,\n toCss ? ` to { ${toCss} }` : ` to {}`,\n `}`,\n ].join(\"\\n\")\n\n const iterStr = iterations === \"infinite\" ? \"infinite\" : String(iterations)\n const animationCss = [\n `animation-name: ${animId}`,\n `animation-duration: ${duration}ms`,\n `animation-timing-function: ${easing}`,\n `animation-delay: ${delay}ms`,\n `animation-fill-mode: ${fill}`,\n `animation-iteration-count: ${iterStr}`,\n `animation-direction: ${direction}`,\n ].join(\"; \")\n\n const className = animId\n\n const compiled: CompiledAnimation = { className, keyframesCss, animationCss }\n _animRegistry.set(animId, compiled)\n\n return compiled\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public API: animate()\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate an animation class string to use in tw template literals.\n *\n * @example\n * const fadeIn = animate({ from: \"opacity-0\", to: \"opacity-100\", duration: 200 })\n * const Box = tw.div`${fadeIn} p-4 bg-white`\n */\nexport function animate(opts: AnimateOptions): string {\n const compiled = compileAnimation(opts)\n\n // In browser: inject keyframes into <style> if not already present\n if (typeof document !== \"undefined\") {\n const styleId = `__tw_anim_${compiled.className}`\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\")\n style.id = styleId\n style.textContent = `${compiled.keyframesCss}\\n.${compiled.className}{${compiled.animationCss}}`\n document.head.appendChild(style)\n }\n }\n\n return compiled.className\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// tw.keyframes() — custom multi-stop keyframes\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Define a custom keyframe animation with multiple stops.\n *\n * @example\n * const pulse = tw.keyframes(\"pulse\", {\n * \"0%, 100%\": \"opacity-100 scale-100\",\n * \"50%\": \"opacity-50 scale-95\",\n * })\n * const Dot = tw.div`${pulse} w-4 h-4 rounded-full bg-blue-500`\n */\nexport function keyframes(name: string, stops: KeyframesDefinition): string {\n const animId = genAnimId(name)\n\n if (_animRegistry.has(animId)) {\n return animId\n }\n\n const stopLines = Object.entries(stops)\n .map(([stop, classes]) => {\n const css = classesToCss(classes)\n return ` ${stop} { ${css} }`\n })\n .join(\"\\n\")\n\n const keyframesCss = `@keyframes ${animId} {\\n${stopLines}\\n}`\n\n // Inject in browser\n if (typeof document !== \"undefined\") {\n const styleId = `__tw_kf_${animId}`\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\")\n style.id = styleId\n style.textContent = keyframesCss\n document.head.appendChild(style)\n }\n }\n\n _animRegistry.set(animId, {\n className: animId,\n keyframesCss,\n animationCss: `animation-name: ${animId}`,\n })\n\n return animId\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Preset animations — ready to use\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Collection of ready-to-use animation class strings.\n *\n * @example\n * const Card = tw.div`${animations.fadeIn} p-4 bg-white`\n * const Modal = tw.div`${animations.scaleIn} fixed inset-0`\n */\nexport const animations = {\n fadeIn: animate({ from: \"opacity-0\", to: \"opacity-100\", duration: 200 }),\n fadeOut: animate({ from: \"opacity-100\", to: \"opacity-0\", duration: 200 }),\n slideUp: animate({\n from: \"opacity-0 translate-y-4\",\n to: \"opacity-100 translate-y-0\",\n duration: 300,\n }),\n slideDown: animate({\n from: \"opacity-0 -translate-y-4\",\n to: \"opacity-100 translate-y-0\",\n duration: 300,\n }),\n slideLeft: animate({\n from: \"opacity-0 translate-x-4\",\n to: \"opacity-100 translate-x-0\",\n duration: 300,\n }),\n slideRight: animate({\n from: \"opacity-0 -translate-x-4\",\n to: \"opacity-100 translate-x-0\",\n duration: 300,\n }),\n scaleIn: animate({\n from: \"opacity-0 scale-95\",\n to: \"opacity-100 scale-100\",\n duration: 200,\n easing: \"cubic-bezier(0.16,1,0.3,1)\",\n }),\n scaleOut: animate({ from: \"opacity-100 scale-100\", to: \"opacity-0 scale-95\", duration: 150 }),\n blurIn: animate({ from: \"opacity-0 blur-sm\", to: \"opacity-100 blur-none\", duration: 300 }),\n bounceIn: animate({\n from: \"opacity-0 scale-50\",\n to: \"opacity-100 scale-100\",\n duration: 400,\n easing: \"cubic-bezier(0.34,1.56,0.64,1)\",\n }),\n spinIn: animate({\n from: \"opacity-0 rotate-180 scale-50\",\n to: \"opacity-100 rotate-0 scale-100\",\n duration: 400,\n easing: \"cubic-bezier(0.16,1,0.3,1)\",\n }),\n} as const\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Extract all animation CSS (for build-time injection)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get all compiled animation CSS to inject into a stylesheet.\n * Called by the CSS extraction engine at build time.\n */\nexport function extractAnimationCss(): string {\n const lines: string[] = []\n for (const [, compiled] of _animRegistry) {\n lines.push(compiled.keyframesCss)\n lines.push(`.${compiled.className} { ${compiled.animationCss} }`)\n }\n return lines.join(\"\\n\\n\")\n}\n"]}