zyzz 0.0.27 → 0.0.29

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 (320) hide show
  1. package/binding/wasi/wasi-worker.mjs +186 -0
  2. package/binding/wasi/zyzz.wasi.cjs +2302 -0
  3. package/binding/wasi/zyzz.wasm32-wasi.wasm +0 -0
  4. package/binding/zyzz.linux-x64-gnu.node +0 -0
  5. package/dist/babel/index.d.ts.map +1 -1
  6. package/dist/babel/index.js +2 -4
  7. package/dist/babel/index.js.map +1 -1
  8. package/dist/babel/internal/Compilation.d.ts +0 -1
  9. package/dist/babel/internal/Compilation.d.ts.map +1 -1
  10. package/dist/compiler/Graph.d.ts +14 -11
  11. package/dist/compiler/Graph.d.ts.map +1 -1
  12. package/dist/compiler/Graph.js +57 -1442
  13. package/dist/compiler/Graph.js.map +1 -1
  14. package/dist/compiler/Native.d.ts +7 -9
  15. package/dist/compiler/Native.d.ts.map +1 -1
  16. package/dist/compiler/Native.js +12 -716
  17. package/dist/compiler/Native.js.map +1 -1
  18. package/dist/compiler/Source.d.ts +122 -24
  19. package/dist/compiler/Source.d.ts.map +1 -1
  20. package/dist/compiler/Source.js +10 -1113
  21. package/dist/compiler/Source.js.map +1 -1
  22. package/dist/compiler/Transform.d.ts +4 -3
  23. package/dist/compiler/Transform.d.ts.map +1 -1
  24. package/dist/compiler/Transform.js +13 -958
  25. package/dist/compiler/Transform.js.map +1 -1
  26. package/dist/compiler/internal/AtRules.d.ts +5 -1
  27. package/dist/compiler/internal/AtRules.d.ts.map +1 -1
  28. package/dist/compiler/internal/AtRules.js +12 -106
  29. package/dist/compiler/internal/AtRules.js.map +1 -1
  30. package/dist/compiler/internal/Context.d.ts +11 -0
  31. package/dist/compiler/internal/Context.d.ts.map +1 -0
  32. package/dist/compiler/internal/Context.js +11 -0
  33. package/dist/compiler/internal/Context.js.map +1 -0
  34. package/dist/compiler/internal/Results.d.ts +148 -0
  35. package/dist/compiler/internal/Results.d.ts.map +1 -0
  36. package/dist/compiler/internal/Results.js +259 -0
  37. package/dist/compiler/internal/Results.js.map +1 -0
  38. package/dist/compiler/internal/Syntax.d.ts +0 -2
  39. package/dist/compiler/internal/Syntax.d.ts.map +1 -1
  40. package/dist/compiler/internal/Syntax.js +0 -2
  41. package/dist/compiler/internal/Syntax.js.map +1 -1
  42. package/dist/compiler/internal/Wire.d.ts +17 -0
  43. package/dist/compiler/internal/Wire.d.ts.map +1 -0
  44. package/dist/compiler/internal/Wire.js +795 -0
  45. package/dist/compiler/internal/Wire.js.map +1 -0
  46. package/dist/internal/Addon.d.ts +28 -0
  47. package/dist/internal/Addon.d.ts.map +1 -0
  48. package/dist/internal/Addon.js +87 -0
  49. package/dist/internal/Addon.js.map +1 -0
  50. package/dist/internal/Authoring.d.ts.map +1 -1
  51. package/dist/internal/Authoring.js +37 -7
  52. package/dist/internal/Authoring.js.map +1 -1
  53. package/dist/internal/Configuration.d.ts +6 -1
  54. package/dist/internal/Configuration.d.ts.map +1 -1
  55. package/dist/internal/Configuration.js.map +1 -1
  56. package/dist/internal/Literal.d.ts +5 -2
  57. package/dist/internal/Literal.d.ts.map +1 -1
  58. package/dist/internal/Literal.js +7 -2
  59. package/dist/internal/Literal.js.map +1 -1
  60. package/dist/internal/Theme.d.ts +4 -0
  61. package/dist/internal/Theme.d.ts.map +1 -1
  62. package/dist/internal/Theme.js.map +1 -1
  63. package/dist/internal/Token.d.ts +2 -1
  64. package/dist/internal/Token.d.ts.map +1 -1
  65. package/dist/internal/Token.js +2 -2
  66. package/dist/internal/Token.js.map +1 -1
  67. package/dist/internal/Vlq.d.ts +14 -0
  68. package/dist/internal/Vlq.d.ts.map +1 -0
  69. package/dist/internal/Vlq.js +47 -0
  70. package/dist/internal/Vlq.js.map +1 -0
  71. package/dist/internal/Wasm.d.ts +22 -0
  72. package/dist/internal/Wasm.d.ts.map +1 -0
  73. package/dist/internal/Wasm.js +83 -0
  74. package/dist/internal/Wasm.js.map +1 -0
  75. package/dist/metro/Graph.d.ts +0 -1
  76. package/dist/metro/Graph.d.ts.map +1 -1
  77. package/dist/metro/transformer.d.ts.map +1 -1
  78. package/dist/metro/transformer.js +0 -1
  79. package/dist/metro/transformer.js.map +1 -1
  80. package/dist/next/internal/Project.d.ts.map +1 -1
  81. package/dist/next/internal/Project.js +2 -5
  82. package/dist/next/internal/Project.js.map +1 -1
  83. package/dist/node/Host.d.ts.map +1 -1
  84. package/dist/node/Host.js +0 -2
  85. package/dist/node/Host.js.map +1 -1
  86. package/dist/node/internal/Contracts.d.ts.map +1 -1
  87. package/dist/node/internal/Contracts.js +3 -7
  88. package/dist/node/internal/Contracts.js.map +1 -1
  89. package/dist/node/internal/Snapshot.d.ts +0 -1
  90. package/dist/node/internal/Snapshot.d.ts.map +1 -1
  91. package/dist/node/internal/Snapshot.js +0 -6
  92. package/dist/node/internal/Snapshot.js.map +1 -1
  93. package/dist/runtime/Composition.d.ts +2 -3
  94. package/dist/runtime/Composition.d.ts.map +1 -1
  95. package/dist/runtime/Composition.js +51 -30
  96. package/dist/runtime/Composition.js.map +1 -1
  97. package/dist/runtime/Recipe.d.ts.map +1 -1
  98. package/dist/runtime/Recipe.js +16 -12
  99. package/dist/runtime/Recipe.js.map +1 -1
  100. package/dist/styleFunction.d.ts +11 -2
  101. package/dist/styleFunction.d.ts.map +1 -1
  102. package/dist/styleFunction.js +3 -1
  103. package/dist/styleFunction.js.map +1 -1
  104. package/dist/unplugin/index.d.ts.map +1 -1
  105. package/dist/unplugin/index.js +3 -6
  106. package/dist/unplugin/index.js.map +1 -1
  107. package/dist/vite/index.d.ts +7 -0
  108. package/dist/vite/index.d.ts.map +1 -1
  109. package/dist/vite/index.js +862 -216
  110. package/dist/vite/index.js.map +1 -1
  111. package/dist/web/Css.d.ts +8 -3
  112. package/dist/web/Css.d.ts.map +1 -1
  113. package/dist/web/Css.js +5 -721
  114. package/dist/web/Css.js.map +1 -1
  115. package/dist/web/internal/Block.d.ts +0 -2
  116. package/dist/web/internal/Block.d.ts.map +1 -1
  117. package/dist/web/internal/Block.js +1 -12
  118. package/dist/web/internal/Block.js.map +1 -1
  119. package/dist/web/internal/ClassName.d.ts +23 -18
  120. package/dist/web/internal/ClassName.d.ts.map +1 -1
  121. package/dist/web/internal/ClassName.js +26 -55
  122. package/dist/web/internal/ClassName.js.map +1 -1
  123. package/dist/web/internal/Contributions.d.ts +3 -5
  124. package/dist/web/internal/Contributions.d.ts.map +1 -1
  125. package/dist/web/internal/Contributions.js +0 -45
  126. package/dist/web/internal/Contributions.js.map +1 -1
  127. package/dist/web/internal/Engine.browser.d.ts +8 -0
  128. package/dist/web/internal/Engine.browser.d.ts.map +1 -0
  129. package/dist/web/internal/Engine.browser.js +42 -0
  130. package/dist/web/internal/Engine.browser.js.map +1 -0
  131. package/dist/web/internal/Engine.d.ts +9 -0
  132. package/dist/web/internal/Engine.d.ts.map +1 -0
  133. package/dist/web/internal/Engine.js +14 -0
  134. package/dist/web/internal/Engine.js.map +1 -0
  135. package/dist/web/internal/Themes.d.ts +1 -9
  136. package/dist/web/internal/Themes.d.ts.map +1 -1
  137. package/dist/web/internal/Themes.js +3 -221
  138. package/dist/web/internal/Themes.js.map +1 -1
  139. package/dist/web/internal/Wasm.generated.d.ts +4 -0
  140. package/dist/web/internal/Wasm.generated.d.ts.map +1 -0
  141. package/dist/web/internal/Wasm.generated.js +4 -0
  142. package/dist/web/internal/Wasm.generated.js.map +1 -0
  143. package/dist/web/internal/Wire.d.ts +19 -0
  144. package/dist/web/internal/Wire.d.ts.map +1 -0
  145. package/dist/web/internal/Wire.js +387 -0
  146. package/dist/web/internal/Wire.js.map +1 -0
  147. package/package.json +20 -1
  148. package/src/babel/index.ts +2 -5
  149. package/src/babel/internal/Compilation.ts +0 -1
  150. package/src/compiler/Graph.ts +89 -1930
  151. package/src/compiler/Native.ts +18 -871
  152. package/src/compiler/Source.ts +144 -1579
  153. package/src/compiler/Transform.ts +16 -1312
  154. package/src/compiler/internal/AtRules.ts +27 -115
  155. package/src/compiler/internal/Context.ts +11 -0
  156. package/src/compiler/internal/Results.ts +406 -0
  157. package/src/compiler/internal/Syntax.ts +0 -3
  158. package/src/compiler/internal/Wire.ts +1045 -0
  159. package/src/internal/Addon.ts +118 -0
  160. package/src/internal/Authoring.ts +53 -18
  161. package/src/internal/Configuration.ts +38 -1
  162. package/src/internal/Literal.ts +7 -2
  163. package/src/internal/Theme.ts +15 -0
  164. package/src/internal/Token.ts +2 -2
  165. package/src/internal/Vlq.ts +59 -0
  166. package/src/internal/Wasm.ts +111 -0
  167. package/src/metro/transformer.ts +0 -1
  168. package/src/next/internal/Project.ts +2 -9
  169. package/src/node/Host.ts +0 -2
  170. package/src/node/internal/Contracts.ts +3 -7
  171. package/src/node/internal/Snapshot.ts +0 -8
  172. package/src/runtime/Composition.ts +48 -25
  173. package/src/runtime/Recipe.ts +21 -14
  174. package/src/styleFunction.ts +31 -2
  175. package/src/unplugin/index.ts +6 -6
  176. package/src/vite/index.ts +1157 -241
  177. package/src/web/Css.ts +12 -908
  178. package/src/web/internal/Block.ts +0 -14
  179. package/src/web/internal/ClassName.ts +52 -85
  180. package/src/web/internal/Contributions.ts +3 -59
  181. package/src/web/internal/Engine.browser.ts +51 -0
  182. package/src/web/internal/Engine.ts +17 -0
  183. package/src/web/internal/Themes.ts +3 -279
  184. package/src/web/internal/Wasm.generated.ts +3 -0
  185. package/src/web/internal/Wire.ts +466 -0
  186. package/src/web/internal/wasm.d.ts +9 -0
  187. package/dist/compiler/internal/Applications.d.ts +0 -55
  188. package/dist/compiler/internal/Applications.d.ts.map +0 -1
  189. package/dist/compiler/internal/Applications.js +0 -352
  190. package/dist/compiler/internal/Applications.js.map +0 -1
  191. package/dist/compiler/internal/ColorProfiles.d.ts +0 -3
  192. package/dist/compiler/internal/ColorProfiles.d.ts.map +0 -1
  193. package/dist/compiler/internal/ColorProfiles.js +0 -84
  194. package/dist/compiler/internal/ColorProfiles.js.map +0 -1
  195. package/dist/compiler/internal/CompositionBindings.d.ts +0 -16
  196. package/dist/compiler/internal/CompositionBindings.d.ts.map +0 -1
  197. package/dist/compiler/internal/CompositionBindings.js +0 -89
  198. package/dist/compiler/internal/CompositionBindings.js.map +0 -1
  199. package/dist/compiler/internal/Compositions.d.ts +0 -37
  200. package/dist/compiler/internal/Compositions.d.ts.map +0 -1
  201. package/dist/compiler/internal/Compositions.js +0 -494
  202. package/dist/compiler/internal/Compositions.js.map +0 -1
  203. package/dist/compiler/internal/Configurations.d.ts +0 -26
  204. package/dist/compiler/internal/Configurations.d.ts.map +0 -1
  205. package/dist/compiler/internal/Configurations.js +0 -259
  206. package/dist/compiler/internal/Configurations.js.map +0 -1
  207. package/dist/compiler/internal/Contract.d.ts +0 -30
  208. package/dist/compiler/internal/Contract.d.ts.map +0 -1
  209. package/dist/compiler/internal/Contract.js +0 -753
  210. package/dist/compiler/internal/Contract.js.map +0 -1
  211. package/dist/compiler/internal/Contributions.d.ts +0 -54
  212. package/dist/compiler/internal/Contributions.d.ts.map +0 -1
  213. package/dist/compiler/internal/Contributions.js +0 -1151
  214. package/dist/compiler/internal/Contributions.js.map +0 -1
  215. package/dist/compiler/internal/Descriptors.d.ts +0 -15
  216. package/dist/compiler/internal/Descriptors.d.ts.map +0 -1
  217. package/dist/compiler/internal/Descriptors.js +0 -192
  218. package/dist/compiler/internal/Descriptors.js.map +0 -1
  219. package/dist/compiler/internal/Dynamic.d.ts +0 -14
  220. package/dist/compiler/internal/Dynamic.d.ts.map +0 -1
  221. package/dist/compiler/internal/Dynamic.js +0 -175
  222. package/dist/compiler/internal/Dynamic.js.map +0 -1
  223. package/dist/compiler/internal/Expression.d.ts +0 -19
  224. package/dist/compiler/internal/Expression.d.ts.map +0 -1
  225. package/dist/compiler/internal/Expression.js +0 -164
  226. package/dist/compiler/internal/Expression.js.map +0 -1
  227. package/dist/compiler/internal/Functions.d.ts +0 -5
  228. package/dist/compiler/internal/Functions.d.ts.map +0 -1
  229. package/dist/compiler/internal/Functions.js +0 -191
  230. package/dist/compiler/internal/Functions.js.map +0 -1
  231. package/dist/compiler/internal/Keyframes.d.ts +0 -5
  232. package/dist/compiler/internal/Keyframes.d.ts.map +0 -1
  233. package/dist/compiler/internal/Keyframes.js +0 -51
  234. package/dist/compiler/internal/Keyframes.js.map +0 -1
  235. package/dist/compiler/internal/Names.d.ts +0 -5
  236. package/dist/compiler/internal/Names.d.ts.map +0 -1
  237. package/dist/compiler/internal/Names.js +0 -37
  238. package/dist/compiler/internal/Names.js.map +0 -1
  239. package/dist/compiler/internal/NativeBindings.d.ts +0 -72
  240. package/dist/compiler/internal/NativeBindings.d.ts.map +0 -1
  241. package/dist/compiler/internal/NativeBindings.js +0 -171
  242. package/dist/compiler/internal/NativeBindings.js.map +0 -1
  243. package/dist/compiler/internal/NativeMedia.d.ts +0 -14
  244. package/dist/compiler/internal/NativeMedia.d.ts.map +0 -1
  245. package/dist/compiler/internal/NativeMedia.js +0 -287
  246. package/dist/compiler/internal/NativeMedia.js.map +0 -1
  247. package/dist/compiler/internal/NativeVars.d.ts +0 -28
  248. package/dist/compiler/internal/NativeVars.d.ts.map +0 -1
  249. package/dist/compiler/internal/NativeVars.js +0 -160
  250. package/dist/compiler/internal/NativeVars.js.map +0 -1
  251. package/dist/compiler/internal/PackedStyles.d.ts +0 -37
  252. package/dist/compiler/internal/PackedStyles.d.ts.map +0 -1
  253. package/dist/compiler/internal/PackedStyles.js +0 -344
  254. package/dist/compiler/internal/PackedStyles.js.map +0 -1
  255. package/dist/compiler/internal/Properties.d.ts +0 -5
  256. package/dist/compiler/internal/Properties.d.ts.map +0 -1
  257. package/dist/compiler/internal/Properties.js +0 -82
  258. package/dist/compiler/internal/Properties.js.map +0 -1
  259. package/dist/compiler/internal/RecipeConditions.d.ts +0 -41
  260. package/dist/compiler/internal/RecipeConditions.d.ts.map +0 -1
  261. package/dist/compiler/internal/RecipeConditions.js +0 -82
  262. package/dist/compiler/internal/RecipeConditions.js.map +0 -1
  263. package/dist/compiler/internal/RecipePayloads.d.ts +0 -31
  264. package/dist/compiler/internal/RecipePayloads.d.ts.map +0 -1
  265. package/dist/compiler/internal/RecipePayloads.js +0 -99
  266. package/dist/compiler/internal/RecipePayloads.js.map +0 -1
  267. package/dist/compiler/internal/Recipes.d.ts +0 -32
  268. package/dist/compiler/internal/Recipes.d.ts.map +0 -1
  269. package/dist/compiler/internal/Recipes.js +0 -339
  270. package/dist/compiler/internal/Recipes.js.map +0 -1
  271. package/dist/compiler/internal/Selectors.d.ts +0 -12
  272. package/dist/compiler/internal/Selectors.d.ts.map +0 -1
  273. package/dist/compiler/internal/Selectors.js +0 -268
  274. package/dist/compiler/internal/Selectors.js.map +0 -1
  275. package/dist/compiler/internal/Static.d.ts +0 -39
  276. package/dist/compiler/internal/Static.d.ts.map +0 -1
  277. package/dist/compiler/internal/Static.js +0 -534
  278. package/dist/compiler/internal/Static.js.map +0 -1
  279. package/dist/compiler/internal/Themes.d.ts +0 -190
  280. package/dist/compiler/internal/Themes.d.ts.map +0 -1
  281. package/dist/compiler/internal/Themes.js +0 -1577
  282. package/dist/compiler/internal/Themes.js.map +0 -1
  283. package/dist/compiler/internal/Vars.d.ts +0 -33
  284. package/dist/compiler/internal/Vars.d.ts.map +0 -1
  285. package/dist/compiler/internal/Vars.js +0 -387
  286. package/dist/compiler/internal/Vars.js.map +0 -1
  287. package/dist/compiler/internal/ViewTransitions.d.ts +0 -3
  288. package/dist/compiler/internal/ViewTransitions.d.ts.map +0 -1
  289. package/dist/compiler/internal/ViewTransitions.js +0 -68
  290. package/dist/compiler/internal/ViewTransitions.js.map +0 -1
  291. package/dist/internal/Cascade.d.ts +0 -74
  292. package/dist/internal/Cascade.d.ts.map +0 -1
  293. package/dist/internal/Cascade.js +0 -210
  294. package/dist/internal/Cascade.js.map +0 -1
  295. package/src/compiler/internal/Applications.ts +0 -554
  296. package/src/compiler/internal/ColorProfiles.ts +0 -93
  297. package/src/compiler/internal/CompositionBindings.ts +0 -120
  298. package/src/compiler/internal/Compositions.ts +0 -678
  299. package/src/compiler/internal/Configurations.ts +0 -349
  300. package/src/compiler/internal/Contract.ts +0 -1028
  301. package/src/compiler/internal/Contributions.ts +0 -1561
  302. package/src/compiler/internal/Descriptors.ts +0 -242
  303. package/src/compiler/internal/Dynamic.ts +0 -275
  304. package/src/compiler/internal/Expression.ts +0 -218
  305. package/src/compiler/internal/Functions.ts +0 -206
  306. package/src/compiler/internal/Keyframes.ts +0 -62
  307. package/src/compiler/internal/Names.ts +0 -48
  308. package/src/compiler/internal/NativeBindings.ts +0 -235
  309. package/src/compiler/internal/NativeMedia.ts +0 -342
  310. package/src/compiler/internal/NativeVars.ts +0 -231
  311. package/src/compiler/internal/PackedStyles.ts +0 -473
  312. package/src/compiler/internal/Properties.ts +0 -121
  313. package/src/compiler/internal/RecipeConditions.ts +0 -139
  314. package/src/compiler/internal/RecipePayloads.ts +0 -132
  315. package/src/compiler/internal/Recipes.ts +0 -531
  316. package/src/compiler/internal/Selectors.ts +0 -339
  317. package/src/compiler/internal/Static.ts +0 -784
  318. package/src/compiler/internal/Themes.ts +0 -2398
  319. package/src/compiler/internal/Vars.ts +0 -516
  320. package/src/compiler/internal/ViewTransitions.ts +0 -82
@@ -29,39 +29,62 @@ export function create(options: create.Options) {
29
29
  ...input,
30
30
  classes: new Set(input.className.split(/\s+/).filter(Boolean)),
31
31
  }))
32
+ // Only conditional arguments select a precompiled case.
33
+ const conditional = inputs.some((input) => input.condition !== undefined)
32
34
 
33
35
  return (...entries: readonly Entry[]) => {
34
36
  let mask = 0
35
- for (const [index, input] of inputs.entries())
36
- if (input.condition !== undefined && entries[index])
37
- mask |= 1 << input.condition
37
+ if (conditional)
38
+ for (let index = 0; index < inputs.length; index++) {
39
+ const condition = inputs[index]!.condition
40
+ if (condition !== undefined && entries[index]) mask |= 1 << condition
41
+ }
38
42
  const className = options.cases?.[mask] ?? options.className
39
- const result: style.Props & Record<string, unknown> = {
40
- className,
41
- }
42
- const external: string[] = []
43
- const style: Record<string, string | number | undefined> = {}
44
- for (const [index, entry] of entries.entries()) {
43
+ // Mutable while entries merge, then returned as immutable props.
44
+ const result: {
45
+ className: string
46
+ style?: Record<string, string | number | undefined>
47
+ } & Record<string, unknown> = { className }
48
+ let attributes = false
49
+ let external: string[] | undefined
50
+ let style: Record<string, string | number | undefined> | undefined
51
+ for (let index = 0; index < entries.length; index++) {
52
+ const entry = entries[index]
45
53
  if (!entry) continue
46
54
  const input = inputs[index]!
47
- for (const owner of input.owners) {
48
- for (const attribute of owner.attributes) delete result[attribute]
49
- for (const slot of owner.slots) delete style[slot]
50
- }
51
- for (const name of entry.className.split(/\s+/))
52
- if (name && !input.classes.has(name)) external.push(name)
53
- for (const [name, value] of Object.entries(entry))
54
- if (name.startsWith('data-')) result[name] = value
55
- for (const [name, value] of Object.entries(entry.style ?? {})) {
56
- // Reinsert overwritten keys so inline shorthand/longhand ordering follows arguments.
57
- delete style[name]
58
- style[name] = value
55
+ // Owners replace only what earlier entries added, so the first contributions skip deletion.
56
+ if (attributes || style)
57
+ for (const owner of input.owners) {
58
+ if (attributes)
59
+ for (const attribute of owner.attributes) delete result[attribute]
60
+ if (style) for (const slot of owner.slots) delete style[slot]
61
+ }
62
+ // An application's own class list adds nothing beyond the composition class.
63
+ if (entry.className !== input.className)
64
+ for (const name of entry.className.split(/\s+/))
65
+ if (name && !input.classes.has(name)) (external ??= []).push(name)
66
+ for (const name in entry)
67
+ if (name.startsWith('data-') && Object.hasOwn(entry, name)) {
68
+ result[name] = entry[name as `data-${string}`]
69
+ attributes = true
70
+ }
71
+ const inline = entry.style
72
+ if (inline) {
73
+ style ??= {}
74
+ for (const name in inline) {
75
+ if (!Object.hasOwn(inline, name)) continue
76
+ // Reinsert overwritten keys so inline shorthand/longhand ordering follows arguments.
77
+ delete style[name]
78
+ style[name] = inline[name as keyof typeof inline]
79
+ }
59
80
  }
60
81
  }
61
- return {
62
- ...result,
63
- className: [className, ...external].filter(Boolean).join(' '),
64
- ...(Object.keys(style).length ? { style } : {}),
82
+ result.className = external
83
+ ? [className, ...external].filter(Boolean).join(' ')
84
+ : className || ''
85
+ if (style && Object.keys(style).length) result.style = style
86
+ return result as style.Props & {
87
+ readonly [name: `data-${string}`]: string | undefined
65
88
  }
66
89
  }
67
90
  }
@@ -37,25 +37,32 @@ export type Payload = {
37
37
  */
38
38
  export function create(options: create.Options) {
39
39
  const props = Props.create({ className: options.className })
40
- const axes = Object.keys(options.axes)
40
+ // Attribute names and defaults are fixed, so calls only read the selection.
41
+ const axes = Object.keys(options.axes).map((axis) => ({
42
+ attribute: `data-${axis}` as const,
43
+ axis,
44
+ fallback: Object.hasOwn(options.defaults, axis)
45
+ ? options.defaults[axis]
46
+ : undefined,
47
+ }))
41
48
 
42
49
  return (input: Record<string, unknown> & style.Options = {}) => {
43
50
  const overrides: style.Options = input
44
- const result: style.Props & Record<`data-${string}`, string> = {
45
- ...props(overrides),
46
- }
51
+ // Props are fresh on every call, so selection attributes extend them in place.
52
+ const result = props(overrides) as style.Props &
53
+ Record<`data-${string}`, string>
47
54
 
48
- for (const axis of axes) {
49
- const selected = Object.hasOwn(input, axis) ? input[axis] : undefined
50
- const value = (
51
- selected === undefined
52
- ? Object.hasOwn(options.defaults, axis)
53
- ? options.defaults[axis]
54
- : undefined
55
- : selected
56
- ) as string | boolean | null | undefined
55
+ for (const entry of axes) {
56
+ const selected = Object.hasOwn(input, entry.axis)
57
+ ? input[entry.axis]
58
+ : undefined
59
+ const value = (selected === undefined ? entry.fallback : selected) as
60
+ | string
61
+ | boolean
62
+ | null
63
+ | undefined
57
64
  if (value !== null && value !== undefined)
58
- result[`data-${axis}`] = String(value)
65
+ result[entry.attribute] = String(value)
59
66
  }
60
67
 
61
68
  return options.html ? Html.from(result) : result
@@ -29,9 +29,21 @@ type VariableOptions<input> = input extends {
29
29
  }
30
30
  : unknown
31
31
 
32
+ // Composition entries are static definitions or exact literal objects.
33
+ type Entries<entries> = {
34
+ readonly [index in keyof entries]: Entry<entries[index]>
35
+ }
36
+
37
+ // Distributes over mixed element unions so each member keeps its own contract.
38
+ type Entry<entry> = entry extends (...args: never) => unknown
39
+ ? style.Composable<entry>
40
+ : entry & NoInfer<Style.Accepted<entry, {}, true>> & Completion.Properties
41
+
32
42
  /**
33
43
  * Declares literal styles for source extraction. Requires a compile-time transform.
34
- * @param styles - Token-free literal CSS properties. Omit for an empty definition.
44
+ * An array composes static definitions and literal objects in order, so later entries
45
+ * win as later declarations do.
46
+ * @param styles - Token-free literal CSS properties, or an array of static definitions and literal objects. Omit for an empty definition.
35
47
  * @returns A callable style definition after source rewriting.
36
48
  * @throws {Error} When a definition needs an explicit identity and none is supplied.
37
49
  */
@@ -53,16 +65,29 @@ export function style<
53
65
  ? [options?: style.DefinitionOptions]
54
66
  : [invalid: never, unavailable: never]
55
67
  : [invalid: never, unavailable: never]
56
- ): style.Dynamic<values>
68
+ // TypeScript types a call that matches no overload with this signature. Other
69
+ // inputs leave `callback` at its constraint, so their definitions stay static.
70
+ ): ((...args: never[]) => unknown) extends callback
71
+ ? style.ReturnType
72
+ : style.Dynamic<values>
57
73
  export function style<const styles extends Record<string, unknown>>(
58
74
  styles: styles &
59
75
  NoInfer<Style.Accepted<styles, {}, true>> &
60
76
  Completion.Properties,
61
77
  options?: style.DefinitionOptions,
62
78
  ): style.ReturnType
79
+ export function style<const entries>(
80
+ styles: entries & Entries<entries>,
81
+ // Exclude non-array inputs by arity so they cannot mask object-property diagnostics.
82
+ ...options: entries extends readonly unknown[]
83
+ ? [options?: style.DefinitionOptions]
84
+ : [invalid: never, unavailable: never]
85
+ ): style.ReturnType
63
86
  export function style(
64
87
  styles?: unknown,
65
88
  options: style.DefinitionOptions = {},
89
+ // Matches the arity-gated overloads, whose invalid branches add parameters.
90
+ ..._: readonly never[]
66
91
  ): style.ReturnType {
67
92
  return Authoring.create(styles, options)
68
93
  }
@@ -73,6 +98,10 @@ type Reference = { readonly [identity]: true }
73
98
 
74
99
  /** Contracts for the literal authoring boundary. */
75
100
  export declare namespace style {
101
+ /** Accepts a static definition as a composition entry. Dynamic definitions and variants require cx. */
102
+ type Composable<entry> = entry extends Reference & (() => unknown)
103
+ ? entry
104
+ : ReturnType<Output>
76
105
  /** Stable identity for selectors and definitions that cannot be content-addressed. */
77
106
  type DefinitionOptions = { readonly id?: string | undefined }
78
107
  /** Callable compiled bindings with required scalar inputs and styling overrides. */
@@ -5,15 +5,14 @@ import * as Fs from 'node:fs/promises'
5
5
  import * as Path from 'node:path'
6
6
  import * as Reset from '../node/Reset.js'
7
7
  import * as Snapshot from '../node/internal/Snapshot.js'
8
- import * as Syntax from '../compiler/internal/Syntax.js'
9
8
  import { createUnplugin } from 'unplugin'
10
9
  import type { UnpluginBuildContext } from 'unplugin'
11
10
  import * as Graph from '../compiler/Graph.js'
12
11
  import * as AtRules from '../compiler/internal/AtRules.js'
13
12
  import * as Catalogs from '../compiler/internal/Catalogs.js'
14
13
  import * as ClassName from '../web/internal/ClassName.js'
15
- import * as Contract from '../compiler/internal/Contract.js'
16
14
  import * as Contracts from '../node/internal/Contracts.js'
15
+ import * as Results from '../compiler/internal/Results.js'
17
16
  import * as Vite from '../vite/index.js'
18
17
  import * as ThemeRules from '../web/internal/Themes.js'
19
18
 
@@ -218,10 +217,12 @@ const portable = createUnplugin<Options | undefined, false>(
218
217
  })
219
218
  if (source === undefined) return false
220
219
  contracts[file] = source
221
- const metadata = Contract.read(contracts[file]!, new Map(), file)
222
- for (const section of metadata.stylesheets) {
220
+ for (const dependency of Results.dependencies(
221
+ contracts[file]!,
222
+ file,
223
+ )) {
223
224
  let owner = file
224
- for (const specifier of section.dependency ?? []) {
225
+ for (const specifier of dependency) {
225
226
  const target = await resolve(specifier, owner)
226
227
  if (!target)
227
228
  throw new Error(
@@ -289,7 +290,6 @@ const portable = createUnplugin<Options | undefined, false>(
289
290
  const result = compiler.compile({
290
291
  [ClassName.complete]: true,
291
292
  [ThemeRules.shared]: 'all',
292
- [Syntax.cache]: snapshot.programs(modules),
293
293
  compiler: options.compiler,
294
294
  reset: options.reset ? Reset.read() : undefined,
295
295
  contracts,