@tenphi/tasty 0.0.0-snapshot.08a6610

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 (288) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +666 -0
  3. package/dist/_virtual/_rolldown/runtime.js +8 -0
  4. package/dist/chunks/cacheKey.js +70 -0
  5. package/dist/chunks/cacheKey.js.map +1 -0
  6. package/dist/chunks/definitions.d.ts +37 -0
  7. package/dist/chunks/definitions.js +259 -0
  8. package/dist/chunks/definitions.js.map +1 -0
  9. package/dist/chunks/renderChunk.js +61 -0
  10. package/dist/chunks/renderChunk.js.map +1 -0
  11. package/dist/config.d.ts +311 -0
  12. package/dist/config.js +458 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/core/index.d.ts +32 -0
  15. package/dist/core/index.js +26 -0
  16. package/dist/debug.d.ts +204 -0
  17. package/dist/debug.js +733 -0
  18. package/dist/debug.js.map +1 -0
  19. package/dist/hooks/useGlobalStyles.d.ts +30 -0
  20. package/dist/hooks/useGlobalStyles.js +83 -0
  21. package/dist/hooks/useGlobalStyles.js.map +1 -0
  22. package/dist/hooks/useKeyframes.d.ts +56 -0
  23. package/dist/hooks/useKeyframes.js +69 -0
  24. package/dist/hooks/useKeyframes.js.map +1 -0
  25. package/dist/hooks/useProperty.d.ts +79 -0
  26. package/dist/hooks/useProperty.js +114 -0
  27. package/dist/hooks/useProperty.js.map +1 -0
  28. package/dist/hooks/useRawCSS.d.ts +53 -0
  29. package/dist/hooks/useRawCSS.js +40 -0
  30. package/dist/hooks/useRawCSS.js.map +1 -0
  31. package/dist/hooks/useStyles.d.ts +45 -0
  32. package/dist/hooks/useStyles.js +248 -0
  33. package/dist/hooks/useStyles.js.map +1 -0
  34. package/dist/index.d.ts +47 -0
  35. package/dist/index.js +33 -0
  36. package/dist/injector/index.d.ts +165 -0
  37. package/dist/injector/index.js +162 -0
  38. package/dist/injector/index.js.map +1 -0
  39. package/dist/injector/injector.d.ts +148 -0
  40. package/dist/injector/injector.js +430 -0
  41. package/dist/injector/injector.js.map +1 -0
  42. package/dist/injector/sheet-manager.d.ts +136 -0
  43. package/dist/injector/sheet-manager.js +729 -0
  44. package/dist/injector/sheet-manager.js.map +1 -0
  45. package/dist/injector/types.d.ts +144 -0
  46. package/dist/keyframes/index.js +206 -0
  47. package/dist/keyframes/index.js.map +1 -0
  48. package/dist/parser/classify.js +319 -0
  49. package/dist/parser/classify.js.map +1 -0
  50. package/dist/parser/const.js +33 -0
  51. package/dist/parser/const.js.map +1 -0
  52. package/dist/parser/lru.js +109 -0
  53. package/dist/parser/lru.js.map +1 -0
  54. package/dist/parser/parser.d.ts +25 -0
  55. package/dist/parser/parser.js +116 -0
  56. package/dist/parser/parser.js.map +1 -0
  57. package/dist/parser/tokenizer.js +69 -0
  58. package/dist/parser/tokenizer.js.map +1 -0
  59. package/dist/parser/types.d.ts +51 -0
  60. package/dist/parser/types.js +46 -0
  61. package/dist/parser/types.js.map +1 -0
  62. package/dist/pipeline/conditions.d.ts +134 -0
  63. package/dist/pipeline/conditions.js +406 -0
  64. package/dist/pipeline/conditions.js.map +1 -0
  65. package/dist/pipeline/exclusive.js +231 -0
  66. package/dist/pipeline/exclusive.js.map +1 -0
  67. package/dist/pipeline/index.d.ts +53 -0
  68. package/dist/pipeline/index.js +660 -0
  69. package/dist/pipeline/index.js.map +1 -0
  70. package/dist/pipeline/materialize.js +856 -0
  71. package/dist/pipeline/materialize.js.map +1 -0
  72. package/dist/pipeline/parseStateKey.d.ts +15 -0
  73. package/dist/pipeline/parseStateKey.js +451 -0
  74. package/dist/pipeline/parseStateKey.js.map +1 -0
  75. package/dist/pipeline/simplify.js +516 -0
  76. package/dist/pipeline/simplify.js.map +1 -0
  77. package/dist/pipeline/warnings.js +18 -0
  78. package/dist/pipeline/warnings.js.map +1 -0
  79. package/dist/plugins/okhsl-plugin.d.ts +35 -0
  80. package/dist/plugins/okhsl-plugin.js +371 -0
  81. package/dist/plugins/okhsl-plugin.js.map +1 -0
  82. package/dist/plugins/types.d.ts +76 -0
  83. package/dist/properties/index.js +236 -0
  84. package/dist/properties/index.js.map +1 -0
  85. package/dist/properties/property-type-resolver.d.ts +24 -0
  86. package/dist/properties/property-type-resolver.js +91 -0
  87. package/dist/properties/property-type-resolver.js.map +1 -0
  88. package/dist/ssr/astro.d.ts +29 -0
  89. package/dist/ssr/astro.js +65 -0
  90. package/dist/ssr/astro.js.map +1 -0
  91. package/dist/ssr/async-storage.d.ts +17 -0
  92. package/dist/ssr/async-storage.js +35 -0
  93. package/dist/ssr/async-storage.js.map +1 -0
  94. package/dist/ssr/collect-auto-properties.js +40 -0
  95. package/dist/ssr/collect-auto-properties.js.map +1 -0
  96. package/dist/ssr/collector.d.ts +85 -0
  97. package/dist/ssr/collector.js +183 -0
  98. package/dist/ssr/collector.js.map +1 -0
  99. package/dist/ssr/context.d.ts +8 -0
  100. package/dist/ssr/context.js +14 -0
  101. package/dist/ssr/context.js.map +1 -0
  102. package/dist/ssr/format-global-rules.js +22 -0
  103. package/dist/ssr/format-global-rules.js.map +1 -0
  104. package/dist/ssr/format-keyframes.js +70 -0
  105. package/dist/ssr/format-keyframes.js.map +1 -0
  106. package/dist/ssr/format-property.js +48 -0
  107. package/dist/ssr/format-property.js.map +1 -0
  108. package/dist/ssr/format-rules.js +70 -0
  109. package/dist/ssr/format-rules.js.map +1 -0
  110. package/dist/ssr/hydrate.d.ts +22 -0
  111. package/dist/ssr/hydrate.js +50 -0
  112. package/dist/ssr/hydrate.js.map +1 -0
  113. package/dist/ssr/index.d.ts +5 -0
  114. package/dist/ssr/index.js +12 -0
  115. package/dist/ssr/index.js.map +1 -0
  116. package/dist/ssr/next.d.ts +45 -0
  117. package/dist/ssr/next.js +71 -0
  118. package/dist/ssr/next.js.map +1 -0
  119. package/dist/ssr/ssr-collector-ref.js +12 -0
  120. package/dist/ssr/ssr-collector-ref.js.map +1 -0
  121. package/dist/states/index.d.ts +49 -0
  122. package/dist/states/index.js +416 -0
  123. package/dist/states/index.js.map +1 -0
  124. package/dist/static/index.d.ts +5 -0
  125. package/dist/static/index.js +5 -0
  126. package/dist/static/tastyStatic.d.ts +46 -0
  127. package/dist/static/tastyStatic.js +31 -0
  128. package/dist/static/tastyStatic.js.map +1 -0
  129. package/dist/static/types.d.ts +49 -0
  130. package/dist/static/types.js +24 -0
  131. package/dist/static/types.js.map +1 -0
  132. package/dist/styles/align.d.ts +15 -0
  133. package/dist/styles/align.js +14 -0
  134. package/dist/styles/align.js.map +1 -0
  135. package/dist/styles/border.d.ts +25 -0
  136. package/dist/styles/border.js +114 -0
  137. package/dist/styles/border.js.map +1 -0
  138. package/dist/styles/color.d.ts +14 -0
  139. package/dist/styles/color.js +23 -0
  140. package/dist/styles/color.js.map +1 -0
  141. package/dist/styles/createStyle.js +77 -0
  142. package/dist/styles/createStyle.js.map +1 -0
  143. package/dist/styles/dimension.js +97 -0
  144. package/dist/styles/dimension.js.map +1 -0
  145. package/dist/styles/display.d.ts +37 -0
  146. package/dist/styles/display.js +67 -0
  147. package/dist/styles/display.js.map +1 -0
  148. package/dist/styles/fade.d.ts +15 -0
  149. package/dist/styles/fade.js +58 -0
  150. package/dist/styles/fade.js.map +1 -0
  151. package/dist/styles/fill.d.ts +42 -0
  152. package/dist/styles/fill.js +52 -0
  153. package/dist/styles/fill.js.map +1 -0
  154. package/dist/styles/flow.d.ts +16 -0
  155. package/dist/styles/flow.js +12 -0
  156. package/dist/styles/flow.js.map +1 -0
  157. package/dist/styles/gap.d.ts +31 -0
  158. package/dist/styles/gap.js +37 -0
  159. package/dist/styles/gap.js.map +1 -0
  160. package/dist/styles/height.d.ts +17 -0
  161. package/dist/styles/height.js +20 -0
  162. package/dist/styles/height.js.map +1 -0
  163. package/dist/styles/index.d.ts +2 -0
  164. package/dist/styles/index.js +9 -0
  165. package/dist/styles/index.js.map +1 -0
  166. package/dist/styles/inset.d.ts +52 -0
  167. package/dist/styles/inset.js +150 -0
  168. package/dist/styles/inset.js.map +1 -0
  169. package/dist/styles/justify.d.ts +15 -0
  170. package/dist/styles/justify.js +14 -0
  171. package/dist/styles/justify.js.map +1 -0
  172. package/dist/styles/list.d.ts +16 -0
  173. package/dist/styles/list.js +98 -0
  174. package/dist/styles/list.js.map +1 -0
  175. package/dist/styles/margin.d.ts +24 -0
  176. package/dist/styles/margin.js +104 -0
  177. package/dist/styles/margin.js.map +1 -0
  178. package/dist/styles/outline.d.ts +29 -0
  179. package/dist/styles/outline.js +65 -0
  180. package/dist/styles/outline.js.map +1 -0
  181. package/dist/styles/padding.d.ts +24 -0
  182. package/dist/styles/padding.js +104 -0
  183. package/dist/styles/padding.js.map +1 -0
  184. package/dist/styles/predefined.d.ts +71 -0
  185. package/dist/styles/predefined.js +238 -0
  186. package/dist/styles/predefined.js.map +1 -0
  187. package/dist/styles/preset.d.ts +47 -0
  188. package/dist/styles/preset.js +126 -0
  189. package/dist/styles/preset.js.map +1 -0
  190. package/dist/styles/radius.d.ts +14 -0
  191. package/dist/styles/radius.js +51 -0
  192. package/dist/styles/radius.js.map +1 -0
  193. package/dist/styles/scrollbar.d.ts +25 -0
  194. package/dist/styles/scrollbar.js +48 -0
  195. package/dist/styles/scrollbar.js.map +1 -0
  196. package/dist/styles/shadow.d.ts +14 -0
  197. package/dist/styles/shadow.js +24 -0
  198. package/dist/styles/shadow.js.map +1 -0
  199. package/dist/styles/transition.d.ts +14 -0
  200. package/dist/styles/transition.js +158 -0
  201. package/dist/styles/transition.js.map +1 -0
  202. package/dist/styles/types.d.ts +508 -0
  203. package/dist/styles/width.d.ts +17 -0
  204. package/dist/styles/width.js +20 -0
  205. package/dist/styles/width.js.map +1 -0
  206. package/dist/tasty.d.ts +981 -0
  207. package/dist/tasty.js +206 -0
  208. package/dist/tasty.js.map +1 -0
  209. package/dist/types.d.ts +184 -0
  210. package/dist/utils/cache-wrapper.js +26 -0
  211. package/dist/utils/cache-wrapper.js.map +1 -0
  212. package/dist/utils/case-converter.js +8 -0
  213. package/dist/utils/case-converter.js.map +1 -0
  214. package/dist/utils/colors.d.ts +5 -0
  215. package/dist/utils/colors.js +9 -0
  216. package/dist/utils/colors.js.map +1 -0
  217. package/dist/utils/css-types.d.ts +7 -0
  218. package/dist/utils/dotize.d.ts +26 -0
  219. package/dist/utils/dotize.js +122 -0
  220. package/dist/utils/dotize.js.map +1 -0
  221. package/dist/utils/filter-base-props.d.ts +15 -0
  222. package/dist/utils/filter-base-props.js +45 -0
  223. package/dist/utils/filter-base-props.js.map +1 -0
  224. package/dist/utils/get-display-name.d.ts +7 -0
  225. package/dist/utils/get-display-name.js +10 -0
  226. package/dist/utils/get-display-name.js.map +1 -0
  227. package/dist/utils/hsl-to-rgb.js +38 -0
  228. package/dist/utils/hsl-to-rgb.js.map +1 -0
  229. package/dist/utils/is-dev-env.js +19 -0
  230. package/dist/utils/is-dev-env.js.map +1 -0
  231. package/dist/utils/is-valid-element-type.js +15 -0
  232. package/dist/utils/is-valid-element-type.js.map +1 -0
  233. package/dist/utils/merge-styles.d.ts +7 -0
  234. package/dist/utils/merge-styles.js +146 -0
  235. package/dist/utils/merge-styles.js.map +1 -0
  236. package/dist/utils/mod-attrs.d.ts +8 -0
  237. package/dist/utils/mod-attrs.js +21 -0
  238. package/dist/utils/mod-attrs.js.map +1 -0
  239. package/dist/utils/okhsl-to-rgb.js +296 -0
  240. package/dist/utils/okhsl-to-rgb.js.map +1 -0
  241. package/dist/utils/process-tokens.d.ts +31 -0
  242. package/dist/utils/process-tokens.js +171 -0
  243. package/dist/utils/process-tokens.js.map +1 -0
  244. package/dist/utils/resolve-recipes.d.ts +17 -0
  245. package/dist/utils/resolve-recipes.js +147 -0
  246. package/dist/utils/resolve-recipes.js.map +1 -0
  247. package/dist/utils/selector-transform.js +32 -0
  248. package/dist/utils/selector-transform.js.map +1 -0
  249. package/dist/utils/string.js +8 -0
  250. package/dist/utils/string.js.map +1 -0
  251. package/dist/utils/styles.d.ts +177 -0
  252. package/dist/utils/styles.js +730 -0
  253. package/dist/utils/styles.js.map +1 -0
  254. package/dist/utils/typography.d.ts +47 -0
  255. package/dist/utils/typography.js +43 -0
  256. package/dist/utils/typography.js.map +1 -0
  257. package/dist/utils/warnings.d.ts +16 -0
  258. package/dist/utils/warnings.js +16 -0
  259. package/dist/utils/warnings.js.map +1 -0
  260. package/dist/zero/babel.d.ts +147 -0
  261. package/dist/zero/babel.js +331 -0
  262. package/dist/zero/babel.js.map +1 -0
  263. package/dist/zero/css-writer.d.ts +45 -0
  264. package/dist/zero/css-writer.js +74 -0
  265. package/dist/zero/css-writer.js.map +1 -0
  266. package/dist/zero/extractor.d.ts +24 -0
  267. package/dist/zero/extractor.js +215 -0
  268. package/dist/zero/extractor.js.map +1 -0
  269. package/dist/zero/index.d.ts +3 -0
  270. package/dist/zero/index.js +4 -0
  271. package/dist/zero/next.d.ts +74 -0
  272. package/dist/zero/next.js +129 -0
  273. package/dist/zero/next.js.map +1 -0
  274. package/docs/adoption.md +286 -0
  275. package/docs/comparison.md +413 -0
  276. package/docs/configuration.md +242 -0
  277. package/docs/debug.md +505 -0
  278. package/docs/design-system.md +401 -0
  279. package/docs/dsl.md +540 -0
  280. package/docs/getting-started.md +201 -0
  281. package/docs/injector.md +528 -0
  282. package/docs/methodology.md +501 -0
  283. package/docs/runtime.md +291 -0
  284. package/docs/ssr.md +382 -0
  285. package/docs/styles.md +574 -0
  286. package/docs/tasty-static.md +421 -0
  287. package/package.json +209 -0
  288. package/tasty.config.ts +14 -0
@@ -0,0 +1,421 @@
1
+ # Zero Runtime Mode (tastyStatic)
2
+
3
+ `tastyStatic` is a build-time utility for generating CSS with zero runtime overhead. It's designed for static sites, no-JS websites, and performance-critical applications where you want to eliminate all runtime styling code.
4
+
5
+ ---
6
+
7
+ ## When to Use
8
+
9
+ - **Static site generation (SSG)** — Pre-render all styles at build time
10
+ - **No-JavaScript websites** — CSS works without any JS runtime
11
+ - **Performance-critical pages** — Zero runtime overhead for styling
12
+ - **Landing pages** — Minimal bundle size with pre-generated CSS
13
+
14
+ ## Requirements
15
+
16
+ The zero-runtime mode is part of the main `@tenphi/tasty` package but requires additional peer dependencies depending on your setup:
17
+
18
+ | Dependency | Version | Required for |
19
+ |---|---|---|
20
+ | `@babel/core` | >= 7.24 | Babel plugin (`@tenphi/tasty/babel-plugin`) |
21
+ | `@babel/helper-plugin-utils` | >= 7.24 | Babel plugin |
22
+ | `@babel/types` | >= 7.24 | Babel plugin |
23
+ | `jiti` | >= 2.6 | Next.js wrapper (`@tenphi/tasty/next`) when using `configFile` option |
24
+
25
+ All of these are declared as optional peer dependencies of `@tenphi/tasty`. Install only what your setup requires:
26
+
27
+ ```bash
28
+ # For any Babel-based setup (Vite, custom Babel config, etc.)
29
+ pnpm add -D @babel/core @babel/helper-plugin-utils @babel/types
30
+
31
+ # For Next.js with TypeScript config file
32
+ pnpm add -D @babel/core @babel/helper-plugin-utils @babel/types jiti
33
+ ```
34
+
35
+ ---
36
+
37
+ ## Quick Start
38
+
39
+ ### Basic Usage
40
+
41
+ ```tsx
42
+ import { tastyStatic } from '@tenphi/tasty/static';
43
+
44
+ // Define styles - returns StaticStyle object
45
+ const button = tastyStatic({
46
+ display: 'inline-flex',
47
+ padding: '2x 4x',
48
+ fill: '#purple',
49
+ color: '#white',
50
+ radius: '1r',
51
+ });
52
+
53
+ // Use in JSX - works via toString() coercion
54
+ <button className={button}>Click me</button>
55
+
56
+ // Or access className explicitly
57
+ <button className={button.className}>Click me</button>
58
+ ```
59
+
60
+ ---
61
+
62
+ ## API Reference
63
+
64
+ ### tastyStatic(styles)
65
+
66
+ Creates a `StaticStyle` object from a styles definition.
67
+
68
+ ```tsx
69
+ const card = tastyStatic({
70
+ padding: '4x',
71
+ fill: '#white',
72
+ border: true,
73
+ radius: true,
74
+ });
75
+ ```
76
+
77
+ ### tastyStatic(base, styles)
78
+
79
+ Extends an existing `StaticStyle` with additional styles. Uses `mergeStyles` internally for proper nested selector handling.
80
+
81
+ ```tsx
82
+ const button = tastyStatic({
83
+ padding: '2x 4x',
84
+ fill: '#blue',
85
+ Icon: { color: '#white' },
86
+ });
87
+
88
+ const primaryButton = tastyStatic(button, {
89
+ fill: '#purple',
90
+ Icon: { opacity: 0.8 },
91
+ });
92
+ ```
93
+
94
+ ### tastyStatic(selector, styles)
95
+
96
+ Generates global styles for a CSS selector. The call is removed from the bundle after transformation.
97
+
98
+ ```tsx
99
+ tastyStatic('body', {
100
+ fill: '#surface',
101
+ color: '#text',
102
+ preset: 't3',
103
+ });
104
+ ```
105
+
106
+ ---
107
+
108
+ ## StaticStyle Object
109
+
110
+ | Property | Type | Description |
111
+ |----------|------|-------------|
112
+ | `className` | `string` | Space-separated class names for use in JSX |
113
+ | `styles` | `Styles` | The original (or merged) styles object |
114
+ | `toString()` | `() => string` | Returns `className` for string coercion |
115
+
116
+ ---
117
+
118
+ ## Babel Plugin Configuration
119
+
120
+ ### Basic Configuration
121
+
122
+ ```javascript
123
+ // babel.config.js
124
+ module.exports = {
125
+ plugins: [
126
+ ['@tenphi/tasty/babel-plugin', {
127
+ output: 'public/tasty.css',
128
+ }]
129
+ ]
130
+ };
131
+ ```
132
+
133
+ ### With Configuration
134
+
135
+ ```javascript
136
+ module.exports = {
137
+ plugins: [
138
+ ['@tenphi/tasty/babel-plugin', {
139
+ output: 'public/tasty.css',
140
+ config: {
141
+ states: {
142
+ '@mobile': '@media(w < 768px)',
143
+ '@tablet': '@media(w < 1024px)',
144
+ '@dark': '@root(theme=dark)',
145
+ },
146
+ devMode: true,
147
+ },
148
+ }]
149
+ ]
150
+ };
151
+ ```
152
+
153
+ ### Plugin Options
154
+
155
+ | Option | Type | Default | Description |
156
+ |--------|------|---------|-------------|
157
+ | `output` | `string` | `'tasty.css'` | Path for generated CSS file |
158
+ | `configFile` | `string` | — | Absolute path to a TS/JS module that default-exports a `TastyZeroConfig` object. JSON-serializable alternative to `config` — required for Turbopack. |
159
+ | `config` | `TastyZeroConfig \| () => TastyZeroConfig` | `{}` | Inline config object or factory function. Takes precedence over `configFile`. |
160
+ | `configDeps` | `string[]` | `[]` | Absolute file paths that affect config (for cache invalidation) |
161
+ | `config.states` | `Record<string, string>` | `{}` | Predefined state aliases |
162
+ | `config.devMode` | `boolean` | `false` | Add source comments to CSS |
163
+ | `config.recipes` | `Record<string, RecipeStyles>` | `{}` | Predefined style recipes |
164
+
165
+ ---
166
+
167
+ ## Recipes
168
+
169
+ Recipes work with `tastyStatic` the same way as with runtime `tasty`:
170
+
171
+ ```javascript
172
+ // babel.config.js
173
+ module.exports = {
174
+ plugins: [
175
+ ['@tenphi/tasty/babel-plugin', {
176
+ output: 'public/tasty.css',
177
+ config: {
178
+ recipes: {
179
+ card: { padding: '4x', fill: '#surface', radius: '1r', border: true },
180
+ elevated: { shadow: '2x 2x 4x #shadow' },
181
+ },
182
+ },
183
+ }]
184
+ ]
185
+ };
186
+ ```
187
+
188
+ ```tsx
189
+ import { tastyStatic } from '@tenphi/tasty/static';
190
+
191
+ const card = tastyStatic({
192
+ recipe: 'card elevated',
193
+ color: '#text',
194
+ });
195
+
196
+ <div className={card}>Styled card</div>
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Next.js Integration
202
+
203
+ The `withTastyZero` wrapper configures both **webpack** and **Turbopack** automatically. No `--webpack` flag is needed — it works with whichever bundler Next.js uses.
204
+
205
+ ```typescript
206
+ // next.config.ts
207
+ import { withTastyZero } from '@tenphi/tasty/next';
208
+
209
+ export default withTastyZero({
210
+ output: 'public/tasty.css',
211
+ configFile: './app/tasty-zero.config.ts',
212
+ configDeps: ['./app/theme.ts'],
213
+ })({
214
+ reactStrictMode: true,
215
+ });
216
+ ```
217
+
218
+ ### `withTastyZero` Options
219
+
220
+ | Option | Type | Default | Description |
221
+ |--------|------|---------|-------------|
222
+ | `output` | `string` | `'public/tasty.css'` | Output path for CSS relative to project root |
223
+ | `enabled` | `boolean` | `true` | Enable/disable the plugin |
224
+ | `configFile` | `string` | — | Path to a TS/JS module that default-exports `TastyZeroConfig`. Recommended for Turbopack compatibility. |
225
+ | `config` | `TastyZeroConfig` | — | Inline config object. For static configs that don't change during dev. |
226
+ | `configDeps` | `string[]` | `[]` | Extra files the config depends on (for cache invalidation) |
227
+
228
+ ### Turbopack Support
229
+
230
+ Starting with Next.js 16, Turbopack is the default bundler. `withTastyZero` supports it out of the box by injecting `turbopack.rules` with `babel-loader` and JSON-serializable options.
231
+
232
+ The `configFile` option is key for Turbopack — it passes a file path (JSON-serializable) instead of a function, and the Babel plugin loads the config internally via jiti.
233
+
234
+ **Requirements**: `babel-loader` must be installed in your project:
235
+
236
+ ```bash
237
+ pnpm add babel-loader
238
+ ```
239
+
240
+ ### Including the CSS
241
+
242
+ ```tsx
243
+ // app/layout.tsx (App Router)
244
+ import '@/public/tasty.css';
245
+
246
+ // or pages/_app.tsx (Pages Router)
247
+ import '../public/tasty.css';
248
+ ```
249
+
250
+ ---
251
+
252
+ ## Vite Integration
253
+
254
+ ```typescript
255
+ // vite.config.ts
256
+ import { defineConfig } from 'vite';
257
+ import react from '@vitejs/plugin-react';
258
+
259
+ export default defineConfig({
260
+ plugins: [
261
+ react({
262
+ babel: {
263
+ plugins: [
264
+ ['@tenphi/tasty/babel-plugin', {
265
+ output: 'public/tasty.css',
266
+ config: {
267
+ states: { '@mobile': '@media(w < 768px)' },
268
+ },
269
+ }],
270
+ ],
271
+ },
272
+ }),
273
+ ],
274
+ });
275
+ ```
276
+
277
+ ---
278
+
279
+ ## Build Transformation
280
+
281
+ ### Before (Source Code)
282
+
283
+ ```tsx
284
+ import { tastyStatic } from '@tenphi/tasty/static';
285
+
286
+ const button = tastyStatic({
287
+ padding: '2x 4x',
288
+ fill: '#purple',
289
+ color: '#white',
290
+ });
291
+
292
+ tastyStatic('.heading', { preset: 'h1' });
293
+
294
+ export const Button = () => <button className={button}>Click</button>;
295
+ ```
296
+
297
+ ### After (Production Build)
298
+
299
+ ```tsx
300
+ const button = {
301
+ className: 'ts3f2a1b ts8c4d2e',
302
+ styles: { padding: '2x 4x', fill: '#purple', color: '#white' },
303
+ toString() { return this.className; }
304
+ };
305
+
306
+ export const Button = () => <button className={button}>Click</button>;
307
+ ```
308
+
309
+ ### Generated CSS (tasty.css)
310
+
311
+ ```css
312
+ /* Generated by @tenphi/tasty/zero - DO NOT EDIT */
313
+
314
+ .ts3f2a1b.ts3f2a1b {
315
+ padding: 16px 32px;
316
+ }
317
+
318
+ .ts8c4d2e.ts8c4d2e {
319
+ background: #9370db;
320
+ color: #fff;
321
+ }
322
+
323
+ .heading.heading {
324
+ font-size: 2.5rem;
325
+ font-weight: 700;
326
+ line-height: 1.2;
327
+ }
328
+ ```
329
+
330
+ ---
331
+
332
+ ## Style Extension
333
+
334
+ ```tsx
335
+ // Base button
336
+ const button = tastyStatic({
337
+ display: 'inline-flex',
338
+ padding: '2x 4x',
339
+ radius: '1r',
340
+ fill: '#gray.20',
341
+ color: '#text',
342
+ transition: 'fill 0.15s',
343
+ });
344
+
345
+ // Variants
346
+ const primaryButton = tastyStatic(button, {
347
+ fill: '#purple',
348
+ color: '#white',
349
+ });
350
+
351
+ const dangerButton = tastyStatic(button, {
352
+ fill: '#danger',
353
+ color: '#white',
354
+ });
355
+ ```
356
+
357
+ ---
358
+
359
+ ## State-based Styling
360
+
361
+ ```tsx
362
+ const card = tastyStatic({
363
+ padding: {
364
+ '': '4x',
365
+ '@mobile': '2x',
366
+ },
367
+ display: {
368
+ '': 'flex',
369
+ '@mobile': 'block',
370
+ },
371
+ });
372
+ ```
373
+
374
+ ---
375
+
376
+ ## Extending Style Types (TypeScript)
377
+
378
+ If you add custom style properties, use module augmentation so `tastyStatic` recognizes them too. See [Extending Style Types](configuration.md#extending-style-types-typescript) in the configuration docs.
379
+
380
+ ---
381
+
382
+ ## Limitations
383
+
384
+ 1. **Static values only** — All style values must be known at build time
385
+ 2. **No runtime props** — Cannot use `styleProps` or dynamic `styles` prop
386
+ 3. **No mods at runtime** — Modifiers must be defined statically
387
+ 4. **Build-time transformation required** — Babel plugin must process files
388
+
389
+ ### Workarounds
390
+
391
+ For dynamic styling needs, combine with regular CSS or CSS variables:
392
+
393
+ ```tsx
394
+ const card = tastyStatic({
395
+ padding: '4x',
396
+ fill: 'var(--card-bg, #white)',
397
+ });
398
+
399
+ <div
400
+ className={card}
401
+ style={{ '--card-bg': isActive ? '#purple' : '#white' }}
402
+ />
403
+ ```
404
+
405
+ ---
406
+
407
+ ## Best Practices
408
+
409
+ 1. **Define base styles** for common patterns, then extend for variants
410
+ 2. **Use selector mode** for global/body styles
411
+ 3. **Enable devMode** in development for easier debugging
412
+ 4. **Configure states** for consistent responsive breakpoints
413
+ 5. **Import generated CSS** early in your app entry point
414
+
415
+ ---
416
+
417
+ ## Related
418
+
419
+ - [Style DSL](dsl.md) — State maps, tokens, units, extending semantics (shared by runtime and static)
420
+ - [Runtime API](runtime.md) — Runtime styling: `tasty()` factory, component props, variants, sub-elements, hooks
421
+ - [Configuration](configuration.md) — Global configuration: tokens, recipes, custom units, and style handlers
package/package.json ADDED
@@ -0,0 +1,209 @@
1
+ {
2
+ "name": "@tenphi/tasty",
3
+ "version": "0.0.0-snapshot.08a6610",
4
+ "description": "A design-system-integrated styling system and DSL for concise, state-aware UI styling",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./static": {
16
+ "types": "./dist/static/index.d.ts",
17
+ "import": "./dist/static/index.js",
18
+ "default": "./dist/static/index.js"
19
+ },
20
+ "./babel-plugin": {
21
+ "types": "./dist/zero/babel.d.ts",
22
+ "import": "./dist/zero/babel.js",
23
+ "default": "./dist/zero/babel.js"
24
+ },
25
+ "./zero": {
26
+ "types": "./dist/zero/index.d.ts",
27
+ "import": "./dist/zero/index.js",
28
+ "default": "./dist/zero/index.js"
29
+ },
30
+ "./next": {
31
+ "types": "./dist/zero/next.d.ts",
32
+ "import": "./dist/zero/next.js",
33
+ "default": "./dist/zero/next.js"
34
+ },
35
+ "./core": {
36
+ "types": "./dist/core/index.d.ts",
37
+ "import": "./dist/core/index.js",
38
+ "default": "./dist/core/index.js"
39
+ },
40
+ "./ssr": {
41
+ "types": "./dist/ssr/index.d.ts",
42
+ "import": "./dist/ssr/index.js",
43
+ "default": "./dist/ssr/index.js"
44
+ },
45
+ "./ssr/next": {
46
+ "types": "./dist/ssr/next.d.ts",
47
+ "import": "./dist/ssr/next.js",
48
+ "default": "./dist/ssr/next.js"
49
+ },
50
+ "./ssr/astro": {
51
+ "types": "./dist/ssr/astro.d.ts",
52
+ "import": "./dist/ssr/astro.js",
53
+ "default": "./dist/ssr/astro.js"
54
+ },
55
+ "./tasty.config": "./tasty.config.ts"
56
+ },
57
+ "files": [
58
+ "dist",
59
+ "docs",
60
+ "tasty.config.ts"
61
+ ],
62
+ "sideEffects": [
63
+ "./dist/ssr/index.js",
64
+ "./dist/ssr/next.js",
65
+ "./dist/ssr/astro.js"
66
+ ],
67
+ "engines": {
68
+ "node": ">=20"
69
+ },
70
+ "scripts": {
71
+ "build": "tsdown",
72
+ "test": "vitest run",
73
+ "test:watch": "vitest",
74
+ "test:coverage": "vitest run --coverage",
75
+ "typecheck": "tsc --noEmit",
76
+ "lint": "eslint src",
77
+ "lint:fix": "eslint src --fix",
78
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
79
+ "format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
80
+ "size": "size-limit",
81
+ "prepublishOnly": "pnpm run build",
82
+ "changeset": "changeset",
83
+ "version": "changeset version",
84
+ "release": "changeset publish",
85
+ "hygiene": "pnpm lint && pnpm format:check && pnpm typecheck",
86
+ "hygiene:fix": "pnpm lint:fix && pnpm format && pnpm typecheck"
87
+ },
88
+ "repository": {
89
+ "type": "git",
90
+ "url": "git+https://github.com/tenphi/tasty.git"
91
+ },
92
+ "keywords": [
93
+ "css-in-js",
94
+ "styling",
95
+ "design-system",
96
+ "react",
97
+ "state-aware",
98
+ "zero-runtime",
99
+ "babel-plugin",
100
+ "typescript",
101
+ "dsl"
102
+ ],
103
+ "author": "Andrey Yamanov",
104
+ "license": "MIT",
105
+ "bugs": {
106
+ "url": "https://github.com/tenphi/tasty/issues"
107
+ },
108
+ "homepage": "https://github.com/tenphi/tasty#readme",
109
+ "peerDependencies": {
110
+ "@babel/core": "^7.24.0",
111
+ "@babel/helper-plugin-utils": "^7.24.0",
112
+ "@babel/types": "^7.24.0",
113
+ "jiti": "^2.6.1",
114
+ "react": "^18.0.0 || ^19.0.0"
115
+ },
116
+ "peerDependenciesMeta": {
117
+ "@babel/core": {
118
+ "optional": true
119
+ },
120
+ "@babel/helper-plugin-utils": {
121
+ "optional": true
122
+ },
123
+ "@babel/types": {
124
+ "optional": true
125
+ },
126
+ "react": {
127
+ "optional": true
128
+ },
129
+ "jiti": {
130
+ "optional": true
131
+ }
132
+ },
133
+ "dependencies": {
134
+ "csstype": "^3.1.0"
135
+ },
136
+ "devDependencies": {
137
+ "@babel/core": "^7.24.0",
138
+ "@changesets/changelog-github": "^0.5.2",
139
+ "@changesets/cli": "^2.29.8",
140
+ "@eslint/js": "^10.0.1",
141
+ "@size-limit/esbuild": "^12.0.0",
142
+ "@size-limit/file": "^12.0.0",
143
+ "@testing-library/jest-dom": "^6.9.1",
144
+ "@testing-library/react": "^16.3.2",
145
+ "@types/babel__core": "^7.20.5",
146
+ "@types/babel__helper-plugin-utils": "^7.10.3",
147
+ "@types/node": "^25.3.2",
148
+ "@types/react": "^19.0.0",
149
+ "@vitest/runner": "^4.0.18",
150
+ "eslint": "^10.0.0",
151
+ "eslint-config-prettier": "^10.1.8",
152
+ "jsdom": "^28.1.0",
153
+ "prettier": "^3.8.1",
154
+ "react": "^19.0.0",
155
+ "size-limit": "^12.0.0",
156
+ "tsdown": "^0.20.3",
157
+ "typescript": "^5.9.3",
158
+ "typescript-eslint": "^8.56.0",
159
+ "vitest": "^4.0.18"
160
+ },
161
+ "pnpm": {
162
+ "onlyBuiltDependencies": [
163
+ "esbuild"
164
+ ]
165
+ },
166
+ "packageManager": "pnpm@10.32.1",
167
+ "size-limit": [
168
+ {
169
+ "name": "main (import *)",
170
+ "path": "dist/index.js",
171
+ "import": "*",
172
+ "limit": "47 kB"
173
+ },
174
+ {
175
+ "name": "core (import *)",
176
+ "path": "dist/core/index.js",
177
+ "import": "*",
178
+ "limit": "45 kB"
179
+ },
180
+ {
181
+ "name": "static",
182
+ "path": "dist/static/index.js",
183
+ "import": "*",
184
+ "limit": "2 kB"
185
+ },
186
+ {
187
+ "name": "zero",
188
+ "path": "dist/zero/index.js",
189
+ "import": "*",
190
+ "ignore": [
191
+ "fs",
192
+ "path",
193
+ "crypto"
194
+ ],
195
+ "limit": "27 kB"
196
+ },
197
+ {
198
+ "name": "babel-plugin",
199
+ "path": "dist/zero/babel.js",
200
+ "import": "*",
201
+ "ignore": [
202
+ "fs",
203
+ "path",
204
+ "crypto"
205
+ ],
206
+ "limit": "38 kB"
207
+ }
208
+ ]
209
+ }
@@ -0,0 +1,14 @@
1
+ export default {
2
+ tokens: [
3
+ '#white',
4
+ '#black',
5
+ '#current',
6
+ '$gap',
7
+ '$radius',
8
+ '$border-width',
9
+ '$outline-width',
10
+ '$transition',
11
+ '$sharp-radius',
12
+ '$bold-font-weight',
13
+ ],
14
+ };