@czap/core 0.1.0

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 (372) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/addressed-digest.d.ts +15 -0
  4. package/dist/addressed-digest.d.ts.map +1 -0
  5. package/dist/addressed-digest.js +35 -0
  6. package/dist/addressed-digest.js.map +1 -0
  7. package/dist/animation.d.ts +46 -0
  8. package/dist/animation.d.ts.map +1 -0
  9. package/dist/animation.js +70 -0
  10. package/dist/animation.js.map +1 -0
  11. package/dist/assembly.d.ts +25 -0
  12. package/dist/assembly.d.ts.map +1 -0
  13. package/dist/assembly.js +58 -0
  14. package/dist/assembly.js.map +1 -0
  15. package/dist/av-bridge.d.ts +74 -0
  16. package/dist/av-bridge.d.ts.map +1 -0
  17. package/dist/av-bridge.js +107 -0
  18. package/dist/av-bridge.js.map +1 -0
  19. package/dist/av-renderer.d.ts +56 -0
  20. package/dist/av-renderer.d.ts.map +1 -0
  21. package/dist/av-renderer.js +65 -0
  22. package/dist/av-renderer.js.map +1 -0
  23. package/dist/blend.d.ts +61 -0
  24. package/dist/blend.d.ts.map +1 -0
  25. package/dist/blend.js +100 -0
  26. package/dist/blend.js.map +1 -0
  27. package/dist/boundary.d.ts +154 -0
  28. package/dist/boundary.d.ts.map +1 -0
  29. package/dist/boundary.js +269 -0
  30. package/dist/boundary.js.map +1 -0
  31. package/dist/brands.d.ts +63 -0
  32. package/dist/brands.d.ts.map +1 -0
  33. package/dist/brands.js +31 -0
  34. package/dist/brands.js.map +1 -0
  35. package/dist/caps.d.ts +49 -0
  36. package/dist/caps.d.ts.map +1 -0
  37. package/dist/caps.js +73 -0
  38. package/dist/caps.js.map +1 -0
  39. package/dist/capsule.d.ts +77 -0
  40. package/dist/capsule.d.ts.map +1 -0
  41. package/dist/capsule.js +18 -0
  42. package/dist/capsule.js.map +1 -0
  43. package/dist/capsules/boundary-evaluate.d.ts +28 -0
  44. package/dist/capsules/boundary-evaluate.d.ts.map +1 -0
  45. package/dist/capsules/boundary-evaluate.js +117 -0
  46. package/dist/capsules/boundary-evaluate.js.map +1 -0
  47. package/dist/capsules/canonical-cbor.d.ts +13 -0
  48. package/dist/capsules/canonical-cbor.d.ts.map +1 -0
  49. package/dist/capsules/canonical-cbor.js +60 -0
  50. package/dist/capsules/canonical-cbor.js.map +1 -0
  51. package/dist/capsules/token-buffer.d.ts +24 -0
  52. package/dist/capsules/token-buffer.d.ts.map +1 -0
  53. package/dist/capsules/token-buffer.js +53 -0
  54. package/dist/capsules/token-buffer.js.map +1 -0
  55. package/dist/capture.d.ts +40 -0
  56. package/dist/capture.d.ts.map +1 -0
  57. package/dist/capture.js +10 -0
  58. package/dist/capture.js.map +1 -0
  59. package/dist/cbor.d.ts +33 -0
  60. package/dist/cbor.d.ts.map +1 -0
  61. package/dist/cbor.js +179 -0
  62. package/dist/cbor.js.map +1 -0
  63. package/dist/cell.d.ts +53 -0
  64. package/dist/cell.d.ts.map +1 -0
  65. package/dist/cell.js +83 -0
  66. package/dist/cell.js.map +1 -0
  67. package/dist/codec.d.ts +30 -0
  68. package/dist/codec.d.ts.map +1 -0
  69. package/dist/codec.js +25 -0
  70. package/dist/codec.js.map +1 -0
  71. package/dist/component.d.ts +52 -0
  72. package/dist/component.d.ts.map +1 -0
  73. package/dist/component.js +44 -0
  74. package/dist/component.js.map +1 -0
  75. package/dist/composable.d.ts +76 -0
  76. package/dist/composable.d.ts.map +1 -0
  77. package/dist/composable.js +221 -0
  78. package/dist/composable.js.map +1 -0
  79. package/dist/compositor-pool.d.ts +74 -0
  80. package/dist/compositor-pool.d.ts.map +1 -0
  81. package/dist/compositor-pool.js +119 -0
  82. package/dist/compositor-pool.js.map +1 -0
  83. package/dist/compositor.d.ts +90 -0
  84. package/dist/compositor.d.ts.map +1 -0
  85. package/dist/compositor.js +278 -0
  86. package/dist/compositor.js.map +1 -0
  87. package/dist/config.d.ts +72 -0
  88. package/dist/config.d.ts.map +1 -0
  89. package/dist/config.js +97 -0
  90. package/dist/config.js.map +1 -0
  91. package/dist/dag.d.ts +251 -0
  92. package/dist/dag.d.ts.map +1 -0
  93. package/dist/dag.js +450 -0
  94. package/dist/dag.js.map +1 -0
  95. package/dist/defaults.d.ts +45 -0
  96. package/dist/defaults.d.ts.map +1 -0
  97. package/dist/defaults.js +45 -0
  98. package/dist/defaults.js.map +1 -0
  99. package/dist/derived.d.ts +34 -0
  100. package/dist/derived.d.ts.map +1 -0
  101. package/dist/derived.js +101 -0
  102. package/dist/derived.js.map +1 -0
  103. package/dist/diagnostics.d.ts +77 -0
  104. package/dist/diagnostics.d.ts.map +1 -0
  105. package/dist/diagnostics.js +122 -0
  106. package/dist/diagnostics.js.map +1 -0
  107. package/dist/dirty.d.ts +55 -0
  108. package/dist/dirty.d.ts.map +1 -0
  109. package/dist/dirty.js +80 -0
  110. package/dist/dirty.js.map +1 -0
  111. package/dist/easing.d.ts +55 -0
  112. package/dist/easing.d.ts.map +1 -0
  113. package/dist/easing.js +291 -0
  114. package/dist/easing.js.map +1 -0
  115. package/dist/ecs.d.ts +105 -0
  116. package/dist/ecs.d.ts.map +1 -0
  117. package/dist/ecs.js +245 -0
  118. package/dist/ecs.js.map +1 -0
  119. package/dist/fnv.d.ts +14 -0
  120. package/dist/fnv.d.ts.map +1 -0
  121. package/dist/fnv.js +28 -0
  122. package/dist/fnv.js.map +1 -0
  123. package/dist/frame-budget.d.ts +73 -0
  124. package/dist/frame-budget.d.ts.map +1 -0
  125. package/dist/frame-budget.js +114 -0
  126. package/dist/frame-budget.js.map +1 -0
  127. package/dist/gen-frame.d.ts +102 -0
  128. package/dist/gen-frame.d.ts.map +1 -0
  129. package/dist/gen-frame.js +121 -0
  130. package/dist/gen-frame.js.map +1 -0
  131. package/dist/harness/arbitrary-from-schema.d.ts +28 -0
  132. package/dist/harness/arbitrary-from-schema.d.ts.map +1 -0
  133. package/dist/harness/arbitrary-from-schema.js +262 -0
  134. package/dist/harness/arbitrary-from-schema.js.map +1 -0
  135. package/dist/harness/cached-projection.d.ts +19 -0
  136. package/dist/harness/cached-projection.d.ts.map +1 -0
  137. package/dist/harness/cached-projection.js +39 -0
  138. package/dist/harness/cached-projection.js.map +1 -0
  139. package/dist/harness/index.d.ts +16 -0
  140. package/dist/harness/index.d.ts.map +1 -0
  141. package/dist/harness/index.js +15 -0
  142. package/dist/harness/index.js.map +1 -0
  143. package/dist/harness/policy-gate.d.ts +18 -0
  144. package/dist/harness/policy-gate.d.ts.map +1 -0
  145. package/dist/harness/policy-gate.js +46 -0
  146. package/dist/harness/policy-gate.js.map +1 -0
  147. package/dist/harness/pure-transform.d.ts +42 -0
  148. package/dist/harness/pure-transform.d.ts.map +1 -0
  149. package/dist/harness/pure-transform.js +76 -0
  150. package/dist/harness/pure-transform.js.map +1 -0
  151. package/dist/harness/receipted-mutation.d.ts +23 -0
  152. package/dist/harness/receipted-mutation.d.ts.map +1 -0
  153. package/dist/harness/receipted-mutation.js +52 -0
  154. package/dist/harness/receipted-mutation.js.map +1 -0
  155. package/dist/harness/scene-composition.d.ts +19 -0
  156. package/dist/harness/scene-composition.d.ts.map +1 -0
  157. package/dist/harness/scene-composition.js +47 -0
  158. package/dist/harness/scene-composition.js.map +1 -0
  159. package/dist/harness/site-adapter.d.ts +18 -0
  160. package/dist/harness/site-adapter.d.ts.map +1 -0
  161. package/dist/harness/site-adapter.js +38 -0
  162. package/dist/harness/site-adapter.js.map +1 -0
  163. package/dist/harness/state-machine.d.ts +19 -0
  164. package/dist/harness/state-machine.d.ts.map +1 -0
  165. package/dist/harness/state-machine.js +44 -0
  166. package/dist/harness/state-machine.js.map +1 -0
  167. package/dist/hlc.d.ts +99 -0
  168. package/dist/hlc.d.ts.map +1 -0
  169. package/dist/hlc.js +219 -0
  170. package/dist/hlc.js.map +1 -0
  171. package/dist/index.d.ts +104 -0
  172. package/dist/index.d.ts.map +1 -0
  173. package/dist/index.js +137 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/interpolate.d.ts +14 -0
  176. package/dist/interpolate.d.ts.map +1 -0
  177. package/dist/interpolate.js +31 -0
  178. package/dist/interpolate.js.map +1 -0
  179. package/dist/live-cell.d.ts +46 -0
  180. package/dist/live-cell.d.ts.map +1 -0
  181. package/dist/live-cell.js +154 -0
  182. package/dist/live-cell.js.map +1 -0
  183. package/dist/op.d.ts +58 -0
  184. package/dist/op.d.ts.map +1 -0
  185. package/dist/op.js +171 -0
  186. package/dist/op.js.map +1 -0
  187. package/dist/plan.d.ts +195 -0
  188. package/dist/plan.d.ts.map +1 -0
  189. package/dist/plan.js +211 -0
  190. package/dist/plan.js.map +1 -0
  191. package/dist/protocol.d.ts +33 -0
  192. package/dist/protocol.d.ts.map +1 -0
  193. package/dist/protocol.js +10 -0
  194. package/dist/protocol.js.map +1 -0
  195. package/dist/quantizer-types.d.ts +28 -0
  196. package/dist/quantizer-types.d.ts.map +1 -0
  197. package/dist/quantizer-types.js +9 -0
  198. package/dist/quantizer-types.js.map +1 -0
  199. package/dist/receipt.d.ts +294 -0
  200. package/dist/receipt.d.ts.map +1 -0
  201. package/dist/receipt.js +352 -0
  202. package/dist/receipt.js.map +1 -0
  203. package/dist/runtime-coordinator.d.ts +75 -0
  204. package/dist/runtime-coordinator.d.ts.map +1 -0
  205. package/dist/runtime-coordinator.js +149 -0
  206. package/dist/runtime-coordinator.js.map +1 -0
  207. package/dist/scheduler.d.ts +58 -0
  208. package/dist/scheduler.d.ts.map +1 -0
  209. package/dist/scheduler.js +109 -0
  210. package/dist/scheduler.js.map +1 -0
  211. package/dist/ship-capsule.d.ts +54 -0
  212. package/dist/ship-capsule.d.ts.map +1 -0
  213. package/dist/ship-capsule.js +142 -0
  214. package/dist/ship-capsule.js.map +1 -0
  215. package/dist/ship-manifest.d.ts +45 -0
  216. package/dist/ship-manifest.d.ts.map +1 -0
  217. package/dist/ship-manifest.js +175 -0
  218. package/dist/ship-manifest.js.map +1 -0
  219. package/dist/signal.d.ts +149 -0
  220. package/dist/signal.d.ts.map +1 -0
  221. package/dist/signal.js +277 -0
  222. package/dist/signal.js.map +1 -0
  223. package/dist/speculative.d.ts +67 -0
  224. package/dist/speculative.d.ts.map +1 -0
  225. package/dist/speculative.js +139 -0
  226. package/dist/speculative.js.map +1 -0
  227. package/dist/store.d.ts +39 -0
  228. package/dist/store.d.ts.map +1 -0
  229. package/dist/store.js +42 -0
  230. package/dist/store.js.map +1 -0
  231. package/dist/style.d.ts +119 -0
  232. package/dist/style.d.ts.map +1 -0
  233. package/dist/style.js +168 -0
  234. package/dist/style.js.map +1 -0
  235. package/dist/testing.d.ts +14 -0
  236. package/dist/testing.d.ts.map +1 -0
  237. package/dist/testing.js +14 -0
  238. package/dist/testing.js.map +1 -0
  239. package/dist/theme.d.ts +78 -0
  240. package/dist/theme.d.ts.map +1 -0
  241. package/dist/theme.js +109 -0
  242. package/dist/theme.js.map +1 -0
  243. package/dist/timeline.d.ts +45 -0
  244. package/dist/timeline.d.ts.map +1 -0
  245. package/dist/timeline.js +101 -0
  246. package/dist/timeline.js.map +1 -0
  247. package/dist/token-buffer.d.ts +43 -0
  248. package/dist/token-buffer.d.ts.map +1 -0
  249. package/dist/token-buffer.js +112 -0
  250. package/dist/token-buffer.js.map +1 -0
  251. package/dist/token.d.ts +107 -0
  252. package/dist/token.d.ts.map +1 -0
  253. package/dist/token.js +143 -0
  254. package/dist/token.js.map +1 -0
  255. package/dist/tuple.d.ts +16 -0
  256. package/dist/tuple.d.ts.map +1 -0
  257. package/dist/tuple.js +16 -0
  258. package/dist/tuple.js.map +1 -0
  259. package/dist/type-utils.d.ts +41 -0
  260. package/dist/type-utils.d.ts.map +1 -0
  261. package/dist/type-utils.js +10 -0
  262. package/dist/type-utils.js.map +1 -0
  263. package/dist/typed-ref.d.ts +50 -0
  264. package/dist/typed-ref.d.ts.map +1 -0
  265. package/dist/typed-ref.js +59 -0
  266. package/dist/typed-ref.js.map +1 -0
  267. package/dist/ui-quality.d.ts +50 -0
  268. package/dist/ui-quality.d.ts.map +1 -0
  269. package/dist/ui-quality.js +64 -0
  270. package/dist/ui-quality.js.map +1 -0
  271. package/dist/validation-error.d.ts +25 -0
  272. package/dist/validation-error.d.ts.map +1 -0
  273. package/dist/validation-error.js +32 -0
  274. package/dist/validation-error.js.map +1 -0
  275. package/dist/vector-clock.d.ts +46 -0
  276. package/dist/vector-clock.d.ts.map +1 -0
  277. package/dist/vector-clock.js +91 -0
  278. package/dist/vector-clock.js.map +1 -0
  279. package/dist/video.d.ts +62 -0
  280. package/dist/video.d.ts.map +1 -0
  281. package/dist/video.js +59 -0
  282. package/dist/video.js.map +1 -0
  283. package/dist/wasm-dispatch.d.ts +52 -0
  284. package/dist/wasm-dispatch.d.ts.map +1 -0
  285. package/dist/wasm-dispatch.js +204 -0
  286. package/dist/wasm-dispatch.js.map +1 -0
  287. package/dist/wasm-fallback.d.ts +19 -0
  288. package/dist/wasm-fallback.d.ts.map +1 -0
  289. package/dist/wasm-fallback.js +93 -0
  290. package/dist/wasm-fallback.js.map +1 -0
  291. package/dist/wire.d.ts +49 -0
  292. package/dist/wire.d.ts.map +1 -0
  293. package/dist/wire.js +201 -0
  294. package/dist/wire.js.map +1 -0
  295. package/dist/zap.d.ts +42 -0
  296. package/dist/zap.d.ts.map +1 -0
  297. package/dist/zap.js +172 -0
  298. package/dist/zap.js.map +1 -0
  299. package/package.json +71 -0
  300. package/src/addressed-digest.ts +48 -0
  301. package/src/animation.ts +103 -0
  302. package/src/assembly.ts +76 -0
  303. package/src/av-bridge.ts +161 -0
  304. package/src/av-renderer.ts +118 -0
  305. package/src/blend.ts +135 -0
  306. package/src/boundary.ts +363 -0
  307. package/src/brands.ts +86 -0
  308. package/src/caps.ts +100 -0
  309. package/src/capsule.ts +95 -0
  310. package/src/capsules/boundary-evaluate.ts +128 -0
  311. package/src/capsules/canonical-cbor.ts +60 -0
  312. package/src/capsules/token-buffer.ts +57 -0
  313. package/src/capture.ts +48 -0
  314. package/src/cbor.ts +199 -0
  315. package/src/cell.ts +130 -0
  316. package/src/codec.ts +39 -0
  317. package/src/component.ts +102 -0
  318. package/src/composable.ts +328 -0
  319. package/src/compositor-pool.ts +162 -0
  320. package/src/compositor.ts +387 -0
  321. package/src/config.ts +157 -0
  322. package/src/dag.ts +527 -0
  323. package/src/defaults.ts +60 -0
  324. package/src/derived.ts +164 -0
  325. package/src/diagnostics.ts +186 -0
  326. package/src/dirty.ts +101 -0
  327. package/src/easing.ts +334 -0
  328. package/src/ecs.ts +382 -0
  329. package/src/fnv.ts +31 -0
  330. package/src/frame-budget.ts +149 -0
  331. package/src/gen-frame.ts +229 -0
  332. package/src/harness/arbitrary-from-schema.ts +270 -0
  333. package/src/harness/cached-projection.ts +46 -0
  334. package/src/harness/index.ts +16 -0
  335. package/src/harness/policy-gate.ts +51 -0
  336. package/src/harness/pure-transform.ts +121 -0
  337. package/src/harness/receipted-mutation.ts +59 -0
  338. package/src/harness/scene-composition.ts +54 -0
  339. package/src/harness/site-adapter.ts +43 -0
  340. package/src/harness/state-machine.ts +49 -0
  341. package/src/hlc.ts +238 -0
  342. package/src/index.ts +274 -0
  343. package/src/interpolate.ts +37 -0
  344. package/src/live-cell.ts +199 -0
  345. package/src/op.ts +233 -0
  346. package/src/plan.ts +317 -0
  347. package/src/protocol.ts +49 -0
  348. package/src/quantizer-types.ts +29 -0
  349. package/src/receipt.ts +444 -0
  350. package/src/runtime-coordinator.ts +230 -0
  351. package/src/scheduler.ts +161 -0
  352. package/src/ship-capsule.ts +191 -0
  353. package/src/signal.ts +345 -0
  354. package/src/speculative.ts +186 -0
  355. package/src/store.ts +77 -0
  356. package/src/style.ts +249 -0
  357. package/src/testing.ts +14 -0
  358. package/src/theme.ts +153 -0
  359. package/src/timeline.ts +146 -0
  360. package/src/token-buffer.ts +151 -0
  361. package/src/token.ts +197 -0
  362. package/src/tuple.ts +19 -0
  363. package/src/type-utils.ts +48 -0
  364. package/src/typed-ref.ts +79 -0
  365. package/src/ui-quality.ts +105 -0
  366. package/src/validation-error.ts +34 -0
  367. package/src/vector-clock.ts +111 -0
  368. package/src/video.ts +106 -0
  369. package/src/wasm-dispatch.ts +300 -0
  370. package/src/wasm-fallback.ts +102 -0
  371. package/src/wire.ts +274 -0
  372. package/src/zap.ts +241 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * `Store<S, Msg>` — TEA-style reducer store.
3
+ *
4
+ * @module
5
+ */
6
+ import type { Stream } from 'effect';
7
+ import { Effect } from 'effect';
8
+ interface StoreShape<S, Msg> {
9
+ readonly _tag: 'Store';
10
+ readonly get: Effect.Effect<S>;
11
+ readonly changes: Stream.Stream<S>;
12
+ dispatch(msg: Msg): Effect.Effect<void>;
13
+ }
14
+ interface EffectfulStoreShape<S, Msg, E = never, R = never> {
15
+ readonly _tag: 'Store';
16
+ readonly get: Effect.Effect<S>;
17
+ readonly changes: Stream.Stream<S>;
18
+ dispatch(msg: Msg): Effect.Effect<void, E, R>;
19
+ }
20
+ /**
21
+ * Store — TEA-style state container.
22
+ * Build with an initial state and a pure `reducer(state, msg) => state`, then
23
+ * dispatch messages; the store publishes the resulting state via `changes`.
24
+ * Use `makeWithEffect` when the reducer is itself an `Effect`.
25
+ */
26
+ export declare const Store: {
27
+ /** Synchronous reducer store. */
28
+ make: <S, Msg>(initial: S, reducer: (state: S, msg: Msg) => S) => Effect.Effect<StoreShape<S, Msg>>;
29
+ /** Reducer store where state transitions are themselves `Effect`s. */
30
+ makeWithEffect: <S, Msg, E, R>(initial: S, reducer: (state: S, msg: Msg) => Effect.Effect<S, E, R>) => Effect.Effect<EffectfulStoreShape<S, Msg, E, R>>;
31
+ };
32
+ export declare namespace Store {
33
+ /** Structural shape of a synchronous store. */
34
+ type Shape<S, Msg> = StoreShape<S, Msg>;
35
+ /** Structural shape of an effectful store; adds error channel `E` and requirements `R`. */
36
+ type Effectful<S, Msg, E = never, R = never> = EffectfulStoreShape<S, Msg, E, R>;
37
+ }
38
+ export {};
39
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,MAAM,EAA8B,MAAM,QAAQ,CAAC;AAE5D,UAAU,UAAU,CAAC,CAAC,EAAE,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,UAAU,mBAAmB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;IACxD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/C;AAqCD;;;;;GAKG;AACH,eAAO,MAAM,KAAK;IAChB,iCAAiC;WA1CpB,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IA4CvG,sEAAsE;qBAhC/C,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,WAC1B,CAAC,WACD,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACtD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CA+BlD,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,+CAA+C;IAC/C,KAAY,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,2FAA2F;IAC3F,KAAY,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,mBAAmB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CACzF"}
package/dist/store.js ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `Store<S, Msg>` — TEA-style reducer store.
3
+ *
4
+ * @module
5
+ */
6
+ import { Effect, SubscriptionRef, Semaphore } from 'effect';
7
+ const _make = (initial, reducer) => Effect.gen(function* () {
8
+ const ref = yield* SubscriptionRef.make(initial);
9
+ return {
10
+ _tag: 'Store',
11
+ get: SubscriptionRef.get(ref),
12
+ changes: SubscriptionRef.changes(ref),
13
+ dispatch: (msg) => SubscriptionRef.update(ref, (state) => reducer(state, msg)),
14
+ };
15
+ });
16
+ const _makeWithEffect = (initial, reducer) => Effect.gen(function* () {
17
+ const ref = yield* SubscriptionRef.make(initial);
18
+ const mutex = yield* Semaphore.make(1);
19
+ return {
20
+ _tag: 'Store',
21
+ get: SubscriptionRef.get(ref),
22
+ changes: SubscriptionRef.changes(ref),
23
+ dispatch: (msg) => mutex.withPermits(1)(Effect.gen(function* () {
24
+ const current = yield* SubscriptionRef.get(ref);
25
+ const next = yield* reducer(current, msg);
26
+ yield* SubscriptionRef.set(ref, next);
27
+ })),
28
+ };
29
+ });
30
+ /**
31
+ * Store — TEA-style state container.
32
+ * Build with an initial state and a pure `reducer(state, msg) => state`, then
33
+ * dispatch messages; the store publishes the resulting state via `changes`.
34
+ * Use `makeWithEffect` when the reducer is itself an `Effect`.
35
+ */
36
+ export const Store = {
37
+ /** Synchronous reducer store. */
38
+ make: _make,
39
+ /** Reducer store where state transitions are themselves `Effect`s. */
40
+ makeWithEffect: _makeWithEffect,
41
+ };
42
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAgB5D,MAAM,KAAK,GAAG,CAAS,OAAU,EAAE,OAAkC,EAAqC,EAAE,CAC1G,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO;QACL,IAAI,EAAE,OAAgB;QACtB,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;QACrC,QAAQ,EAAE,CAAC,GAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;KACpF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,MAAM,eAAe,GAAG,CACtB,OAAU,EACV,OAAuD,EACL,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,OAAgB;QACtB,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;QACrC,QAAQ,EAAE,CAAC,GAAQ,EAAE,EAAE,CACrB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAClB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1C,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CACH;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,iCAAiC;IACjC,IAAI,EAAE,KAAK;IACX,sEAAsE;IACtE,cAAc,EAAE,eAAe;CAChC,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * StyleDef -- adaptive style primitive for constraint-based rendering.
3
+ *
4
+ * A style binds a base style layer to optional boundary states with
5
+ * per-state overrides and transitions. Content-addressed via FNV-1a.
6
+ *
7
+ * @module
8
+ */
9
+ import type { ContentAddress, Millis } from './brands.js';
10
+ import type { Boundary } from './boundary.js';
11
+ import type { StateUnion } from './type-utils.js';
12
+ /** Single `box-shadow` layer — compiled into a space-separated CSS value by {@link Style.tap}. */
13
+ export interface ShadowLayer {
14
+ readonly x: number;
15
+ readonly y: number;
16
+ readonly blur: number;
17
+ readonly spread?: number;
18
+ readonly color: string;
19
+ readonly inset?: boolean;
20
+ }
21
+ /**
22
+ * One layer of a {@link Style}: a flat property bag plus optional pseudo
23
+ * selectors (`:hover`, `::before`, …) and structured `box-shadow` layers.
24
+ */
25
+ export interface StyleLayer {
26
+ readonly properties: Record<string, string>;
27
+ readonly pseudo?: Record<string, Record<string, string>>;
28
+ readonly boxShadow?: readonly ShadowLayer[];
29
+ }
30
+ interface StyleDef<B extends Boundary.Shape = Boundary.Shape> {
31
+ readonly _tag: 'StyleDef';
32
+ readonly _version: 1;
33
+ readonly id: ContentAddress;
34
+ readonly boundary?: B;
35
+ readonly base: StyleLayer;
36
+ readonly states?: {
37
+ readonly [S in StateUnion<B> & string]?: StyleLayer;
38
+ };
39
+ readonly transition?: {
40
+ readonly duration: Millis;
41
+ readonly easing?: string;
42
+ readonly properties?: readonly string[];
43
+ };
44
+ }
45
+ interface StyleFactory {
46
+ make<B extends Boundary.Shape>(config: {
47
+ readonly boundary?: B;
48
+ readonly base: StyleLayer;
49
+ readonly states?: {
50
+ readonly [S in StateUnion<B> & string]?: StyleLayer;
51
+ };
52
+ readonly transition?: StyleDef['transition'];
53
+ }): StyleDef<B>;
54
+ }
55
+ /**
56
+ * Deep merge two style layers: properties spread, pseudo merge per selector, boxShadow concat.
57
+ *
58
+ * Override properties win over base. Pseudo-element selectors are merged per
59
+ * key. Box shadows are concatenated (base first, then override).
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * const base = { properties: { color: 'red', padding: '4px' } };
64
+ * const override = { properties: { color: 'blue', margin: '8px' } };
65
+ * const merged = Style.mergeLayers(base, override);
66
+ * // merged.properties === { color: 'blue', padding: '4px', margin: '8px' }
67
+ * ```
68
+ */
69
+ declare function _mergeLayers(base: StyleLayer, override: StyleLayer): StyleLayer;
70
+ /**
71
+ * Resolve a style to a flat `Record<string, string>` for the given state.
72
+ *
73
+ * Merges base layer with the state-specific override (if any), flattens
74
+ * pseudo selectors and box-shadow into the result map.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * const style = Style.make({
79
+ * base: { properties: { color: 'black' } },
80
+ * states: { dark: { properties: { color: 'white' } } },
81
+ * });
82
+ * const props = Style.tap(style, 'dark');
83
+ * // props === { color: 'white' }
84
+ * const baseProps = Style.tap(style);
85
+ * // baseProps === { color: 'black' }
86
+ * ```
87
+ */
88
+ declare function _tap(style: StyleDef, state?: string): Record<string, string>;
89
+ /**
90
+ * Style namespace -- adaptive style primitive for constraint-based rendering.
91
+ *
92
+ * Bind base styles to optional boundary states with per-state overrides and
93
+ * CSS transitions. Resolve to flat property maps for any given state.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * import { Boundary, Style } from '@czap/core';
98
+ *
99
+ * const bp = Boundary.make({ input: 'viewport.width', at: [[0, 'sm'], [768, 'lg']] });
100
+ * const style = Style.make({
101
+ * boundary: bp,
102
+ * base: { properties: { 'font-size': '14px' } },
103
+ * states: { lg: { properties: { 'font-size': '18px' } } },
104
+ * transition: { duration: Millis(200) },
105
+ * });
106
+ * const resolved = Style.tap(style, 'lg');
107
+ * // resolved === { 'font-size': '18px' }
108
+ * ```
109
+ */
110
+ export declare const Style: StyleFactory & {
111
+ tap: typeof _tap;
112
+ mergeLayers: typeof _mergeLayers;
113
+ };
114
+ export declare namespace Style {
115
+ /** Structural shape of a style definition parameterized by its governing {@link Boundary}. */
116
+ type Shape<B extends Boundary.Shape = Boundary.Shape> = StyleDef<B>;
117
+ }
118
+ export {};
119
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"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"}
package/dist/style.js ADDED
@@ -0,0 +1,168 @@
1
+ /**
2
+ * StyleDef -- adaptive style primitive for constraint-based rendering.
3
+ *
4
+ * A style binds a base style layer to optional boundary states with
5
+ * per-state overrides and transitions. Content-addressed via FNV-1a.
6
+ *
7
+ * @module
8
+ */
9
+ import { CanonicalCbor } from './cbor.js';
10
+ import { fnv1aBytes } from './fnv.js';
11
+ import { CzapValidationError } from './validation-error.js';
12
+ function deterministicId(boundary, base, states, transition) {
13
+ return fnv1aBytes(CanonicalCbor.encode({
14
+ _tag: 'StyleDef',
15
+ _version: 1,
16
+ boundaryId: boundary?.id ?? null,
17
+ base,
18
+ states: states ?? {},
19
+ transition: transition ?? null,
20
+ }));
21
+ }
22
+ /**
23
+ * Deep merge two style layers: properties spread, pseudo merge per selector, boxShadow concat.
24
+ *
25
+ * Override properties win over base. Pseudo-element selectors are merged per
26
+ * key. Box shadows are concatenated (base first, then override).
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const base = { properties: { color: 'red', padding: '4px' } };
31
+ * const override = { properties: { color: 'blue', margin: '8px' } };
32
+ * const merged = Style.mergeLayers(base, override);
33
+ * // merged.properties === { color: 'blue', padding: '4px', margin: '8px' }
34
+ * ```
35
+ */
36
+ function _mergeLayers(base, override) {
37
+ const properties = { ...base.properties, ...override.properties };
38
+ let pseudo;
39
+ if (base.pseudo || override.pseudo) {
40
+ const allSelectors = new Set([...Object.keys(base.pseudo ?? {}), ...Object.keys(override.pseudo ?? {})]);
41
+ pseudo = {};
42
+ for (const sel of allSelectors) {
43
+ pseudo[sel] = { ...base.pseudo?.[sel], ...override.pseudo?.[sel] };
44
+ }
45
+ }
46
+ let boxShadow;
47
+ if (base.boxShadow || override.boxShadow) {
48
+ boxShadow = [...(base.boxShadow ?? []), ...(override.boxShadow ?? [])];
49
+ }
50
+ return {
51
+ properties,
52
+ ...(pseudo !== undefined ? { pseudo } : {}),
53
+ ...(boxShadow !== undefined ? { boxShadow } : {}),
54
+ };
55
+ }
56
+ /**
57
+ * Resolve a style to a flat `Record<string, string>` for the given state.
58
+ *
59
+ * Merges base layer with the state-specific override (if any), flattens
60
+ * pseudo selectors and box-shadow into the result map.
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * const style = Style.make({
65
+ * base: { properties: { color: 'black' } },
66
+ * states: { dark: { properties: { color: 'white' } } },
67
+ * });
68
+ * const props = Style.tap(style, 'dark');
69
+ * // props === { color: 'white' }
70
+ * const baseProps = Style.tap(style);
71
+ * // baseProps === { color: 'black' }
72
+ * ```
73
+ */
74
+ function _tap(style, state) {
75
+ let layer = style.base;
76
+ if (state && style.states) {
77
+ const stateLayer = style.states[state];
78
+ if (stateLayer) {
79
+ layer = _mergeLayers(layer, stateLayer);
80
+ }
81
+ }
82
+ const result = { ...layer.properties };
83
+ if (layer.pseudo) {
84
+ for (const [sel, props] of Object.entries(layer.pseudo)) {
85
+ for (const [prop, val] of Object.entries(props)) {
86
+ result[`${sel}::${prop}`] = val;
87
+ }
88
+ }
89
+ }
90
+ if (layer.boxShadow && layer.boxShadow.length > 0) {
91
+ result['box-shadow'] = layer.boxShadow
92
+ .map((s) => {
93
+ const parts = [];
94
+ if (s.inset)
95
+ parts.push('inset');
96
+ parts.push(`${s.x}px`, `${s.y}px`, `${s.blur}px`);
97
+ if (s.spread !== undefined)
98
+ parts.push(`${s.spread}px`);
99
+ parts.push(s.color);
100
+ return parts.join(' ');
101
+ })
102
+ .join(', ');
103
+ }
104
+ return result;
105
+ }
106
+ /**
107
+ * Style namespace -- adaptive style primitive for constraint-based rendering.
108
+ *
109
+ * Bind base styles to optional boundary states with per-state overrides and
110
+ * CSS transitions. Resolve to flat property maps for any given state.
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * import { Boundary, Style } from '@czap/core';
115
+ *
116
+ * const bp = Boundary.make({ input: 'viewport.width', at: [[0, 'sm'], [768, 'lg']] });
117
+ * const style = Style.make({
118
+ * boundary: bp,
119
+ * base: { properties: { 'font-size': '14px' } },
120
+ * states: { lg: { properties: { 'font-size': '18px' } } },
121
+ * transition: { duration: Millis(200) },
122
+ * });
123
+ * const resolved = Style.tap(style, 'lg');
124
+ * // resolved === { 'font-size': '18px' }
125
+ * ```
126
+ */
127
+ export const Style = {
128
+ /**
129
+ * Create a new StyleDef from a configuration object.
130
+ *
131
+ * Validates that state keys match the boundary's states (if a boundary is
132
+ * provided). The resulting object is frozen and content-addressed.
133
+ *
134
+ * @example
135
+ * ```ts
136
+ * const style = Style.make({
137
+ * base: { properties: { display: 'flex', gap: '8px' } },
138
+ * });
139
+ * // style._tag === 'StyleDef'
140
+ * // style.id === 'fnv1a:...'
141
+ * ```
142
+ */
143
+ make(config) {
144
+ if (config.boundary && config.states) {
145
+ const boundaryStates = config.boundary.states;
146
+ const stateKeys = Object.keys(config.states);
147
+ for (const key of stateKeys) {
148
+ if (!boundaryStates.includes(key)) {
149
+ throw new CzapValidationError('Style.make', `state "${key}" does not match boundary states [${boundaryStates.join(', ')}]`);
150
+ }
151
+ }
152
+ }
153
+ const id = deterministicId(config.boundary, config.base, config.states, config.transition);
154
+ const def = {
155
+ _tag: 'StyleDef',
156
+ _version: 1,
157
+ id,
158
+ ...(config.boundary !== undefined ? { boundary: config.boundary } : {}),
159
+ base: config.base,
160
+ ...(config.states !== undefined ? { states: config.states } : {}),
161
+ ...(config.transition !== undefined ? { transition: config.transition } : {}),
162
+ };
163
+ return Object.freeze(def);
164
+ },
165
+ tap: _tap,
166
+ mergeLayers: _mergeLayers,
167
+ };
168
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Test-only entrypoint for `@czap/core`. Imported as `@czap/core/testing`.
3
+ *
4
+ * These helpers mutate global registry state and would be footguns in
5
+ * production code paths (an edge worker warm-start that calls
6
+ * `resetCapsuleCatalog` would silently wipe every registered capsule,
7
+ * causing dispatch to fail intermittently). They are intentionally
8
+ * partitioned off the main package entry so a consumer cannot reach
9
+ * them by importing `@czap/core` directly.
10
+ *
11
+ * @module
12
+ */
13
+ export { resetCapsuleCatalog } from './assembly.js';
14
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Test-only entrypoint for `@czap/core`. Imported as `@czap/core/testing`.
3
+ *
4
+ * These helpers mutate global registry state and would be footguns in
5
+ * production code paths (an edge worker warm-start that calls
6
+ * `resetCapsuleCatalog` would silently wipe every registered capsule,
7
+ * causing dispatch to fail intermittently). They are intentionally
8
+ * partitioned off the main package entry so a consumer cannot reach
9
+ * them by importing `@czap/core` directly.
10
+ *
11
+ * @module
12
+ */
13
+ export { resetCapsuleCatalog } from './assembly.js';
14
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * ThemeDef -- theme primitive for constraint-based adaptive rendering.
3
+ *
4
+ * A theme maps a set of token names to variant-keyed values, enabling
5
+ * coherent multi-variant token resolution. Content-addressed via FNV-1a.
6
+ *
7
+ * @module
8
+ */
9
+ import type { ContentAddress } from './brands.js';
10
+ interface ThemeDef<V extends readonly string[] = readonly string[]> {
11
+ readonly _tag: 'ThemeDef';
12
+ readonly _version: 1;
13
+ readonly id: ContentAddress;
14
+ readonly name: string;
15
+ readonly variants: V;
16
+ readonly tokens: Record<string, Record<V[number] & string, unknown>>;
17
+ readonly meta?: Record<V[number] & string, {
18
+ readonly label: string;
19
+ readonly mode: 'light' | 'dark';
20
+ }>;
21
+ }
22
+ interface ThemeFactory {
23
+ make<const V extends readonly [string, ...string[]]>(config: {
24
+ readonly name: string;
25
+ readonly variants: V;
26
+ readonly tokens: Record<string, Record<V[number] & string, unknown>>;
27
+ readonly meta?: ThemeDef<V>['meta'];
28
+ }): ThemeDef<V>;
29
+ }
30
+ /**
31
+ * Resolve all tokens for a given variant, returning a map of token name to value.
32
+ *
33
+ * Iterates the theme's token map and extracts each token's value for the
34
+ * specified variant.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const theme = Theme.make({
39
+ * name: 'brand',
40
+ * variants: ['light', 'dark'] as const,
41
+ * tokens: { bg: { light: '#fff', dark: '#111' }, fg: { light: '#000', dark: '#eee' } },
42
+ * });
43
+ * const darkTokens = Theme.tap(theme, 'dark');
44
+ * // darkTokens === { bg: '#111', fg: '#eee' }
45
+ * ```
46
+ */
47
+ declare function _tap<V extends readonly string[]>(theme: ThemeDef<V>, variant: V[number] & string): Record<string, unknown>;
48
+ /**
49
+ * Theme namespace -- theme primitive for constraint-based adaptive rendering.
50
+ *
51
+ * Map token names to variant-keyed values, enabling coherent multi-variant
52
+ * token resolution (e.g. light/dark themes). Content-addressed via FNV-1a.
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * import { Theme } from '@czap/core';
57
+ *
58
+ * const theme = Theme.make({
59
+ * name: 'brand',
60
+ * variants: ['light', 'dark'] as const,
61
+ * tokens: {
62
+ * bg: { light: '#fff', dark: '#111' },
63
+ * fg: { light: '#000', dark: '#eee' },
64
+ * },
65
+ * });
66
+ * const lightTokens = Theme.tap(theme, 'light');
67
+ * // lightTokens === { bg: '#fff', fg: '#000' }
68
+ * ```
69
+ */
70
+ export declare const Theme: ThemeFactory & {
71
+ tap: typeof _tap;
72
+ };
73
+ export declare namespace Theme {
74
+ /** Structural shape of a {@link Theme} definition, parameterized by its variant tuple `V`. */
75
+ type Shape<V extends readonly string[] = readonly string[]> = ThemeDef<V>;
76
+ }
77
+ export {};
78
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,UAAU,QAAQ,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE;IAChE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CACzG;AAED,UAAU,YAAY;IACpB,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE;QAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;KACrC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;CACjB;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAS,IAAI,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMnH;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,KAAK,EAAE,YAAY,GAAG;IACjC,GAAG,EAAE,OAAO,IAAI,CAAC;CAgDlB,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,8FAA8F;IAC9F,KAAY,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;CAClF"}
package/dist/theme.js ADDED
@@ -0,0 +1,109 @@
1
+ /**
2
+ * ThemeDef -- theme primitive for constraint-based adaptive rendering.
3
+ *
4
+ * A theme maps a set of token names to variant-keyed values, enabling
5
+ * coherent multi-variant token resolution. Content-addressed via FNV-1a.
6
+ *
7
+ * @module
8
+ */
9
+ import { CanonicalCbor } from './cbor.js';
10
+ import { fnv1aBytes } from './fnv.js';
11
+ import { CzapValidationError } from './validation-error.js';
12
+ function deterministicId(name, variants, tokens, meta) {
13
+ return fnv1aBytes(CanonicalCbor.encode({
14
+ _tag: 'ThemeDef',
15
+ _version: 1,
16
+ name,
17
+ variants,
18
+ tokens,
19
+ meta: meta ?? null,
20
+ }));
21
+ }
22
+ /**
23
+ * Resolve all tokens for a given variant, returning a map of token name to value.
24
+ *
25
+ * Iterates the theme's token map and extracts each token's value for the
26
+ * specified variant.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const theme = Theme.make({
31
+ * name: 'brand',
32
+ * variants: ['light', 'dark'] as const,
33
+ * tokens: { bg: { light: '#fff', dark: '#111' }, fg: { light: '#000', dark: '#eee' } },
34
+ * });
35
+ * const darkTokens = Theme.tap(theme, 'dark');
36
+ * // darkTokens === { bg: '#111', fg: '#eee' }
37
+ * ```
38
+ */
39
+ function _tap(theme, variant) {
40
+ const result = {};
41
+ for (const [tokenName, variantMap] of Object.entries(theme.tokens)) {
42
+ result[tokenName] = variantMap[variant];
43
+ }
44
+ return result;
45
+ }
46
+ /**
47
+ * Theme namespace -- theme primitive for constraint-based adaptive rendering.
48
+ *
49
+ * Map token names to variant-keyed values, enabling coherent multi-variant
50
+ * token resolution (e.g. light/dark themes). Content-addressed via FNV-1a.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * import { Theme } from '@czap/core';
55
+ *
56
+ * const theme = Theme.make({
57
+ * name: 'brand',
58
+ * variants: ['light', 'dark'] as const,
59
+ * tokens: {
60
+ * bg: { light: '#fff', dark: '#111' },
61
+ * fg: { light: '#000', dark: '#eee' },
62
+ * },
63
+ * });
64
+ * const lightTokens = Theme.tap(theme, 'light');
65
+ * // lightTokens === { bg: '#fff', fg: '#000' }
66
+ * ```
67
+ */
68
+ export const Theme = {
69
+ /**
70
+ * Create a new ThemeDef from a configuration object.
71
+ *
72
+ * Validates that every token has a value for each declared variant.
73
+ * The resulting object is frozen and content-addressed.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * const theme = Theme.make({
78
+ * name: 'ocean',
79
+ * variants: ['light', 'dark'] as const,
80
+ * tokens: { primary: { light: '#0066cc', dark: '#3399ff' } },
81
+ * meta: { light: { label: 'Light', mode: 'light' }, dark: { label: 'Dark', mode: 'dark' } },
82
+ * });
83
+ * // theme._tag === 'ThemeDef'
84
+ * // theme.id === 'fnv1a:...'
85
+ * ```
86
+ */
87
+ make(config) {
88
+ const variantSet = new Set(config.variants);
89
+ for (const [tokenName, variantMap] of Object.entries(config.tokens)) {
90
+ for (const variant of variantSet) {
91
+ if (!(variant in variantMap)) {
92
+ throw new CzapValidationError('Theme.make', `Token "${tokenName}" is missing value for variant "${variant}"`);
93
+ }
94
+ }
95
+ }
96
+ const id = deterministicId(config.name, config.variants, config.tokens, config.meta);
97
+ return Object.freeze({
98
+ _tag: 'ThemeDef',
99
+ _version: 1,
100
+ id,
101
+ name: config.name,
102
+ variants: config.variants,
103
+ tokens: config.tokens,
104
+ ...(config.meta !== undefined ? { meta: config.meta } : {}),
105
+ });
106
+ },
107
+ tap: _tap,
108
+ };
109
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAqB5D,SAAS,eAAe,CACtB,IAAY,EACZ,QAAW,EACX,MAA6B,EAC7B,IAAqC;IAErC,OAAO,UAAU,CACf,aAAa,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,CAAC;QACX,IAAI;QACJ,QAAQ;QACR,MAAM;QACN,IAAI,EAAE,IAAI,IAAI,IAAI;KACnB,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,IAAI,CAA8B,KAAkB,EAAE,OAA2B;IACxF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,KAAK,GAEd;IACF;;;;;;;;;;;;;;;;;OAiBG;IACH,IAAI,CAAiD,MAKpD;QACC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAA6B,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC;oBAC7B,MAAM,IAAI,mBAAmB,CAAC,YAAY,EAAE,UAAU,SAAS,mCAAmC,OAAO,GAAG,CAAC,CAAC;gBAChH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,GAAG,eAAe,CAAI,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAExF,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,UAAmB;YACzB,QAAQ,EAAE,CAAU;YACpB,EAAE;YACF,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,GAAG,EAAE,IAAI;CACV,CAAC"}