@prestack/thread-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/CHANGELOG.md +348 -0
  2. package/dist/attach.d.ts +1 -0
  3. package/dist/attach.js +1 -0
  4. package/dist/ui/animations/anm_appear.d.ts +16 -0
  5. package/dist/ui/animations/anm_appear.js +10 -0
  6. package/dist/ui/animations/anm_blur_in.d.ts +22 -0
  7. package/dist/ui/animations/anm_blur_in.js +16 -0
  8. package/dist/ui/animations/anm_blur_out.d.ts +22 -0
  9. package/dist/ui/animations/anm_blur_out.js +16 -0
  10. package/dist/ui/animations/anm_dismiss.d.ts +22 -0
  11. package/dist/ui/animations/anm_dismiss.js +16 -0
  12. package/dist/ui/animations/anm_drop.d.ts +22 -0
  13. package/dist/ui/animations/anm_drop.js +16 -0
  14. package/dist/ui/animations/anm_fall.d.ts +22 -0
  15. package/dist/ui/animations/anm_fall.js +16 -0
  16. package/dist/ui/animations/anm_flash.d.ts +19 -0
  17. package/dist/ui/animations/anm_flash.js +16 -0
  18. package/dist/ui/animations/anm_glow.d.ts +16 -0
  19. package/dist/ui/animations/anm_glow.js +14 -0
  20. package/dist/ui/animations/anm_lift.d.ts +16 -0
  21. package/dist/ui/animations/anm_lift.js +14 -0
  22. package/dist/ui/animations/anm_nudge.d.ts +16 -0
  23. package/dist/ui/animations/anm_nudge.js +14 -0
  24. package/dist/ui/animations/anm_pop_in.d.ts +29 -0
  25. package/dist/ui/animations/anm_pop_in.js +20 -0
  26. package/dist/ui/animations/anm_pop_out.d.ts +29 -0
  27. package/dist/ui/animations/anm_pop_out.js +20 -0
  28. package/dist/ui/animations/anm_press.d.ts +19 -0
  29. package/dist/ui/animations/anm_press.js +10 -0
  30. package/dist/ui/animations/anm_pulse.d.ts +20 -0
  31. package/dist/ui/animations/anm_pulse.js +11 -0
  32. package/dist/ui/animations/anm_rise.d.ts +22 -0
  33. package/dist/ui/animations/anm_rise.js +16 -0
  34. package/dist/ui/animations/anm_shake.d.ts +23 -0
  35. package/dist/ui/animations/anm_shake.js +11 -0
  36. package/dist/ui/animations/anm_slide_in_left.d.ts +22 -0
  37. package/dist/ui/animations/anm_slide_in_left.js +16 -0
  38. package/dist/ui/animations/anm_slide_in_right.d.ts +22 -0
  39. package/dist/ui/animations/anm_slide_in_right.js +16 -0
  40. package/dist/ui/animations/anm_slide_out_left.d.ts +22 -0
  41. package/dist/ui/animations/anm_slide_out_left.js +16 -0
  42. package/dist/ui/animations/anm_slide_out_right.d.ts +22 -0
  43. package/dist/ui/animations/anm_slide_out_right.js +16 -0
  44. package/dist/ui/animations/anm_spin.d.ts +16 -0
  45. package/dist/ui/animations/anm_spin.js +10 -0
  46. package/dist/ui/animations/anm_swell.d.ts +16 -0
  47. package/dist/ui/animations/anm_swell.js +14 -0
  48. package/dist/ui/animations/anm_wobble.d.ts +27 -0
  49. package/dist/ui/animations/anm_wobble.js +22 -0
  50. package/dist/ui/animations/anm_zoom_in.d.ts +22 -0
  51. package/dist/ui/animations/anm_zoom_in.js +16 -0
  52. package/dist/ui/animations/anm_zoom_out.d.ts +22 -0
  53. package/dist/ui/animations/anm_zoom_out.js +16 -0
  54. package/dist/ui/animations.d.ts +59 -0
  55. package/dist/ui/animations.js +227 -0
  56. package/dist/ui/attach.d.ts +3 -0
  57. package/dist/ui/attach.js +497 -0
  58. package/dist/ui/charts.d.ts +32 -0
  59. package/dist/ui/charts.js +35 -0
  60. package/dist/ui/checked.d.ts +19 -0
  61. package/dist/ui/checked.js +3 -0
  62. package/dist/ui/collector.d.ts +32 -0
  63. package/dist/ui/collector.js +75 -0
  64. package/dist/ui/compositions.d.ts +21 -0
  65. package/dist/ui/compositions.js +305 -0
  66. package/dist/ui/consent.d.ts +22 -0
  67. package/dist/ui/consent.js +44 -0
  68. package/dist/ui/content.d.ts +9 -0
  69. package/dist/ui/content.js +11 -0
  70. package/dist/ui/contrast.d.ts +3 -0
  71. package/dist/ui/contrast.js +23 -0
  72. package/dist/ui/controls.d.ts +14 -0
  73. package/dist/ui/controls.js +2 -0
  74. package/dist/ui/disclosure.d.ts +14 -0
  75. package/dist/ui/disclosure.js +2 -0
  76. package/dist/ui/dismiss-layer.d.ts +14 -0
  77. package/dist/ui/dismiss-layer.js +66 -0
  78. package/dist/ui/door.d.ts +40 -0
  79. package/dist/ui/door.js +100 -0
  80. package/dist/ui/drag.d.ts +82 -0
  81. package/dist/ui/drag.js +212 -0
  82. package/dist/ui/elements/accordion.d.ts +12 -0
  83. package/dist/ui/elements/accordion.js +16 -0
  84. package/dist/ui/elements/accordion.works.d.ts +22 -0
  85. package/dist/ui/elements/accordion.works.js +44 -0
  86. package/dist/ui/elements/aspect-ratio.d.ts +10 -0
  87. package/dist/ui/elements/aspect-ratio.js +9 -0
  88. package/dist/ui/elements/aspect-ratio.works.d.ts +2 -0
  89. package/dist/ui/elements/aspect-ratio.works.js +3 -0
  90. package/dist/ui/elements/avatar.d.ts +11 -0
  91. package/dist/ui/elements/avatar.js +10 -0
  92. package/dist/ui/elements/avatar.works.d.ts +4 -0
  93. package/dist/ui/elements/avatar.works.js +16 -0
  94. package/dist/ui/elements/badge.d.ts +11 -0
  95. package/dist/ui/elements/badge.js +10 -0
  96. package/dist/ui/elements/badge.works.d.ts +5 -0
  97. package/dist/ui/elements/badge.works.js +6 -0
  98. package/dist/ui/elements/bars.d.ts +14 -0
  99. package/dist/ui/elements/bars.js +17 -0
  100. package/dist/ui/elements/bars.works.d.ts +12 -0
  101. package/dist/ui/elements/bars.works.js +20 -0
  102. package/dist/ui/elements/box.d.ts +12 -0
  103. package/dist/ui/elements/box.js +11 -0
  104. package/dist/ui/elements/breadcrumb.d.ts +10 -0
  105. package/dist/ui/elements/breadcrumb.js +12 -0
  106. package/dist/ui/elements/breadcrumb.works.d.ts +7 -0
  107. package/dist/ui/elements/breadcrumb.works.js +21 -0
  108. package/dist/ui/elements/button.d.ts +17 -0
  109. package/dist/ui/elements/button.js +16 -0
  110. package/dist/ui/elements/button.works.d.ts +17 -0
  111. package/dist/ui/elements/button.works.js +34 -0
  112. package/dist/ui/elements/column.d.ts +9 -0
  113. package/dist/ui/elements/column.js +8 -0
  114. package/dist/ui/elements/consent.d.ts +13 -0
  115. package/dist/ui/elements/consent.js +21 -0
  116. package/dist/ui/elements/consent.works.d.ts +41 -0
  117. package/dist/ui/elements/consent.works.js +79 -0
  118. package/dist/ui/elements/donut.d.ts +13 -0
  119. package/dist/ui/elements/donut.js +16 -0
  120. package/dist/ui/elements/donut.works.d.ts +11 -0
  121. package/dist/ui/elements/donut.works.js +28 -0
  122. package/dist/ui/elements/each.d.ts +14 -0
  123. package/dist/ui/elements/each.js +9 -0
  124. package/dist/ui/elements/each.works.d.ts +3 -0
  125. package/dist/ui/elements/each.works.js +68 -0
  126. package/dist/ui/elements/empty.d.ts +9 -0
  127. package/dist/ui/elements/empty.js +12 -0
  128. package/dist/ui/elements/field.d.ts +16 -0
  129. package/dist/ui/elements/field.js +15 -0
  130. package/dist/ui/elements/field.works.d.ts +17 -0
  131. package/dist/ui/elements/field.works.js +45 -0
  132. package/dist/ui/elements/funnel.d.ts +14 -0
  133. package/dist/ui/elements/funnel.js +17 -0
  134. package/dist/ui/elements/funnel.works.d.ts +12 -0
  135. package/dist/ui/elements/funnel.works.js +23 -0
  136. package/dist/ui/elements/gauge.d.ts +12 -0
  137. package/dist/ui/elements/gauge.js +15 -0
  138. package/dist/ui/elements/gauge.works.d.ts +11 -0
  139. package/dist/ui/elements/gauge.works.js +31 -0
  140. package/dist/ui/elements/glyph.d.ts +10 -0
  141. package/dist/ui/elements/glyph.js +9 -0
  142. package/dist/ui/elements/glyph.works.d.ts +5 -0
  143. package/dist/ui/elements/glyph.works.js +16 -0
  144. package/dist/ui/elements/grid.d.ts +9 -0
  145. package/dist/ui/elements/grid.js +8 -0
  146. package/dist/ui/elements/heatmap.d.ts +15 -0
  147. package/dist/ui/elements/heatmap.js +17 -0
  148. package/dist/ui/elements/heatmap.works.d.ts +11 -0
  149. package/dist/ui/elements/heatmap.works.js +11 -0
  150. package/dist/ui/elements/hit-box.d.ts +19 -0
  151. package/dist/ui/elements/hit-box.js +15 -0
  152. package/dist/ui/elements/hit-box.works.d.ts +87 -0
  153. package/dist/ui/elements/hit-box.works.js +451 -0
  154. package/dist/ui/elements/image.d.ts +10 -0
  155. package/dist/ui/elements/image.js +9 -0
  156. package/dist/ui/elements/line-chart.d.ts +13 -0
  157. package/dist/ui/elements/line-chart.js +16 -0
  158. package/dist/ui/elements/line-chart.works.d.ts +12 -0
  159. package/dist/ui/elements/line-chart.works.js +27 -0
  160. package/dist/ui/elements/link.d.ts +12 -0
  161. package/dist/ui/elements/link.js +15 -0
  162. package/dist/ui/elements/link.works.d.ts +10 -0
  163. package/dist/ui/elements/link.works.js +15 -0
  164. package/dist/ui/elements/media.d.ts +11 -0
  165. package/dist/ui/elements/media.js +22 -0
  166. package/dist/ui/elements/menu.d.ts +12 -0
  167. package/dist/ui/elements/menu.js +18 -0
  168. package/dist/ui/elements/menu.works.d.ts +50 -0
  169. package/dist/ui/elements/menu.works.js +100 -0
  170. package/dist/ui/elements/money.d.ts +10 -0
  171. package/dist/ui/elements/money.js +9 -0
  172. package/dist/ui/elements/money.works.d.ts +4 -0
  173. package/dist/ui/elements/money.works.js +4 -0
  174. package/dist/ui/elements/pagination.d.ts +11 -0
  175. package/dist/ui/elements/pagination.js +12 -0
  176. package/dist/ui/elements/pagination.works.d.ts +5 -0
  177. package/dist/ui/elements/pagination.works.js +15 -0
  178. package/dist/ui/elements/progress.d.ts +11 -0
  179. package/dist/ui/elements/progress.js +11 -0
  180. package/dist/ui/elements/progress.works.d.ts +2 -0
  181. package/dist/ui/elements/progress.works.js +6 -0
  182. package/dist/ui/elements/radio-group.d.ts +15 -0
  183. package/dist/ui/elements/radio-group.js +16 -0
  184. package/dist/ui/elements/radio-group.works.d.ts +10 -0
  185. package/dist/ui/elements/radio-group.works.js +22 -0
  186. package/dist/ui/elements/row.d.ts +9 -0
  187. package/dist/ui/elements/row.js +8 -0
  188. package/dist/ui/elements/scatter.d.ts +13 -0
  189. package/dist/ui/elements/scatter.js +15 -0
  190. package/dist/ui/elements/scatter.works.d.ts +11 -0
  191. package/dist/ui/elements/scatter.works.js +24 -0
  192. package/dist/ui/elements/select.d.ts +13 -0
  193. package/dist/ui/elements/select.js +11 -0
  194. package/dist/ui/elements/select.works.d.ts +4 -0
  195. package/dist/ui/elements/select.works.js +3 -0
  196. package/dist/ui/elements/separator.d.ts +10 -0
  197. package/dist/ui/elements/separator.js +9 -0
  198. package/dist/ui/elements/skeleton.d.ts +8 -0
  199. package/dist/ui/elements/skeleton.js +9 -0
  200. package/dist/ui/elements/slider.d.ts +14 -0
  201. package/dist/ui/elements/slider.js +10 -0
  202. package/dist/ui/elements/slider.works.d.ts +4 -0
  203. package/dist/ui/elements/slider.works.js +3 -0
  204. package/dist/ui/elements/sparkline.d.ts +10 -0
  205. package/dist/ui/elements/sparkline.js +15 -0
  206. package/dist/ui/elements/sparkline.works.d.ts +10 -0
  207. package/dist/ui/elements/sparkline.works.js +19 -0
  208. package/dist/ui/elements/spinner.d.ts +9 -0
  209. package/dist/ui/elements/spinner.js +12 -0
  210. package/dist/ui/elements/stack.d.ts +9 -0
  211. package/dist/ui/elements/stack.js +8 -0
  212. package/dist/ui/elements/stat.d.ts +12 -0
  213. package/dist/ui/elements/stat.js +10 -0
  214. package/dist/ui/elements/stat.works.d.ts +3 -0
  215. package/dist/ui/elements/stat.works.js +10 -0
  216. package/dist/ui/elements/surface.d.ts +9 -0
  217. package/dist/ui/elements/surface.js +15 -0
  218. package/dist/ui/elements/surface.works.d.ts +7 -0
  219. package/dist/ui/elements/surface.works.js +4 -0
  220. package/dist/ui/elements/table.d.ts +13 -0
  221. package/dist/ui/elements/table.js +16 -0
  222. package/dist/ui/elements/table.works.d.ts +11 -0
  223. package/dist/ui/elements/table.works.js +15 -0
  224. package/dist/ui/elements/tabs.d.ts +12 -0
  225. package/dist/ui/elements/tabs.js +16 -0
  226. package/dist/ui/elements/tabs.works.d.ts +25 -0
  227. package/dist/ui/elements/tabs.works.js +53 -0
  228. package/dist/ui/elements/text.d.ts +13 -0
  229. package/dist/ui/elements/text.js +9 -0
  230. package/dist/ui/elements/textarea.d.ts +14 -0
  231. package/dist/ui/elements/textarea.js +11 -0
  232. package/dist/ui/elements/textarea.works.d.ts +4 -0
  233. package/dist/ui/elements/textarea.works.js +3 -0
  234. package/dist/ui/elements/time.d.ts +11 -0
  235. package/dist/ui/elements/time.js +14 -0
  236. package/dist/ui/elements/time.works.d.ts +11 -0
  237. package/dist/ui/elements/time.works.js +16 -0
  238. package/dist/ui/elements/toggle.d.ts +11 -0
  239. package/dist/ui/elements/toggle.js +10 -0
  240. package/dist/ui/elements/toggle.works.d.ts +4 -0
  241. package/dist/ui/elements/toggle.works.js +3 -0
  242. package/dist/ui/elements/tooltip.d.ts +12 -0
  243. package/dist/ui/elements/tooltip.js +15 -0
  244. package/dist/ui/elements/tooltip.works.d.ts +28 -0
  245. package/dist/ui/elements/tooltip.works.js +54 -0
  246. package/dist/ui/elements/value.d.ts +12 -0
  247. package/dist/ui/elements/value.js +9 -0
  248. package/dist/ui/elements/value.works.d.ts +4 -0
  249. package/dist/ui/elements/value.works.js +4 -0
  250. package/dist/ui/elements.d.ts +1143 -0
  251. package/dist/ui/elements.js +68 -0
  252. package/dist/ui/focus-scope.d.ts +7 -0
  253. package/dist/ui/focus-scope.js +109 -0
  254. package/dist/ui/fonts.d.ts +103 -0
  255. package/dist/ui/fonts.js +243 -0
  256. package/dist/ui/generators/dev.d.ts +2 -0
  257. package/dist/ui/generators/dev.js +61 -0
  258. package/dist/ui/generators/elements.d.ts +31 -0
  259. package/dist/ui/generators/elements.js +520 -0
  260. package/dist/ui/generators/i18n.d.ts +5 -0
  261. package/dist/ui/generators/i18n.js +264 -0
  262. package/dist/ui/generators/icons.d.ts +1 -0
  263. package/dist/ui/generators/icons.js +187 -0
  264. package/dist/ui/generators/react.d.ts +26 -0
  265. package/dist/ui/generators/react.js +218 -0
  266. package/dist/ui/generators/routes.d.ts +11 -0
  267. package/dist/ui/generators/routes.js +597 -0
  268. package/dist/ui/generators/show.d.ts +1 -0
  269. package/dist/ui/generators/show.js +231 -0
  270. package/dist/ui/generators/styles.d.ts +1 -0
  271. package/dist/ui/generators/styles.js +502 -0
  272. package/dist/ui/generators/variants.d.ts +12 -0
  273. package/dist/ui/generators/variants.js +162 -0
  274. package/dist/ui/i18n/catalogs/en.d.ts +172 -0
  275. package/dist/ui/i18n/catalogs/en.js +148 -0
  276. package/dist/ui/i18n/format.d.ts +13 -0
  277. package/dist/ui/i18n/format.js +161 -0
  278. package/dist/ui/i18n/locales.d.ts +9 -0
  279. package/dist/ui/i18n/locales.js +20 -0
  280. package/dist/ui/i18n/parse.d.ts +45 -0
  281. package/dist/ui/i18n/parse.js +249 -0
  282. package/dist/ui/i18n/translator.d.ts +10 -0
  283. package/dist/ui/i18n/translator.js +22 -0
  284. package/dist/ui/i18n/types.d.ts +33 -0
  285. package/dist/ui/i18n/types.js +9 -0
  286. package/dist/ui/icons.d.ts +67 -0
  287. package/dist/ui/icons.js +249 -0
  288. package/dist/ui/islands/map.d.ts +33 -0
  289. package/dist/ui/islands/map.js +44 -0
  290. package/dist/ui/localizations.d.ts +33 -0
  291. package/dist/ui/localizations.js +51 -0
  292. package/dist/ui/makers/message.d.ts +1 -0
  293. package/dist/ui/makers/message.js +230 -0
  294. package/dist/ui/material.d.ts +83 -0
  295. package/dist/ui/material.js +95 -0
  296. package/dist/ui/materials/mat_bordered.d.ts +22 -0
  297. package/dist/ui/materials/mat_bordered.js +12 -0
  298. package/dist/ui/materials/mat_ceramic.d.ts +22 -0
  299. package/dist/ui/materials/mat_ceramic.js +12 -0
  300. package/dist/ui/materials/mat_clay.d.ts +22 -0
  301. package/dist/ui/materials/mat_clay.js +12 -0
  302. package/dist/ui/materials/mat_elevated.d.ts +32 -0
  303. package/dist/ui/materials/mat_elevated.js +23 -0
  304. package/dist/ui/materials/mat_flat.d.ts +50 -0
  305. package/dist/ui/materials/mat_flat.js +33 -0
  306. package/dist/ui/materials/mat_glass.d.ts +32 -0
  307. package/dist/ui/materials/mat_glass.js +19 -0
  308. package/dist/ui/materials/mat_lit.d.ts +22 -0
  309. package/dist/ui/materials/mat_lit.js +12 -0
  310. package/dist/ui/materials/mat_moulded.d.ts +16 -0
  311. package/dist/ui/materials/mat_moulded.js +10 -0
  312. package/dist/ui/materials.d.ts +56 -0
  313. package/dist/ui/materials.js +175 -0
  314. package/dist/ui/modes.d.ts +25 -0
  315. package/dist/ui/modes.js +25 -0
  316. package/dist/ui/navigation.d.ts +3 -0
  317. package/dist/ui/navigation.js +24 -0
  318. package/dist/ui/positioning.d.ts +24 -0
  319. package/dist/ui/positioning.js +48 -0
  320. package/dist/ui/presented.d.ts +10 -0
  321. package/dist/ui/presented.js +81 -0
  322. package/dist/ui/provider.d.ts +31 -0
  323. package/dist/ui/provider.js +104 -0
  324. package/dist/ui/render-loop.d.ts +12 -0
  325. package/dist/ui/render-loop.js +94 -0
  326. package/dist/ui/roving-focus.d.ts +15 -0
  327. package/dist/ui/roving-focus.js +143 -0
  328. package/dist/ui/screens.d.ts +17 -0
  329. package/dist/ui/screens.js +112 -0
  330. package/dist/ui/scroll-lock.d.ts +2 -0
  331. package/dist/ui/scroll-lock.js +24 -0
  332. package/dist/ui/series.d.ts +9 -0
  333. package/dist/ui/series.js +67 -0
  334. package/dist/ui/signals.d.ts +120 -0
  335. package/dist/ui/signals.js +286 -0
  336. package/dist/ui/styleguide.d.ts +27 -0
  337. package/dist/ui/styleguide.js +138 -0
  338. package/dist/ui/styleguides.d.ts +11 -0
  339. package/dist/ui/styleguides.js +299 -0
  340. package/dist/ui/themes.d.ts +5 -0
  341. package/dist/ui/themes.js +16 -0
  342. package/dist/ui/token.d.ts +16 -0
  343. package/dist/ui/token.js +37 -0
  344. package/dist/ui/tokens/shadow.d.ts +6 -0
  345. package/dist/ui/tokens/shadow.js +17 -0
  346. package/dist/ui/tokens.d.ts +180 -0
  347. package/dist/ui/tokens.js +200 -0
  348. package/dist/ui/validators.d.ts +37 -0
  349. package/dist/ui/validators.js +184 -0
  350. package/dist/ui/variant.d.ts +122 -0
  351. package/dist/ui/variant.js +201 -0
  352. package/dist/ui/variants/var_avatar-round.d.ts +23 -0
  353. package/dist/ui/variants/var_avatar-round.js +13 -0
  354. package/dist/ui/variants/var_bubble-me.d.ts +21 -0
  355. package/dist/ui/variants/var_bubble-me.js +13 -0
  356. package/dist/ui/variants/var_bubble-them.d.ts +18 -0
  357. package/dist/ui/variants/var_bubble-them.js +12 -0
  358. package/dist/ui/variants/var_button-border.d.ts +116 -0
  359. package/dist/ui/variants/var_button-border.js +75 -0
  360. package/dist/ui/variants/var_button-cta.d.ts +116 -0
  361. package/dist/ui/variants/var_button-cta.js +75 -0
  362. package/dist/ui/variants/var_button-destructive-ghost.d.ts +113 -0
  363. package/dist/ui/variants/var_button-destructive-ghost.js +71 -0
  364. package/dist/ui/variants/var_button-destructive.d.ts +116 -0
  365. package/dist/ui/variants/var_button-destructive.js +75 -0
  366. package/dist/ui/variants/var_button-fill.d.ts +116 -0
  367. package/dist/ui/variants/var_button-fill.js +75 -0
  368. package/dist/ui/variants/var_button-ghost.d.ts +113 -0
  369. package/dist/ui/variants/var_button-ghost.js +71 -0
  370. package/dist/ui/variants/var_button-glass.d.ts +84 -0
  371. package/dist/ui/variants/var_button-glass.js +54 -0
  372. package/dist/ui/variants/var_button-normal.d.ts +116 -0
  373. package/dist/ui/variants/var_button-normal.js +75 -0
  374. package/dist/ui/variants/var_button-quiet.d.ts +119 -0
  375. package/dist/ui/variants/var_button-quiet.js +73 -0
  376. package/dist/ui/variants/var_card.d.ts +30 -0
  377. package/dist/ui/variants/var_card.js +16 -0
  378. package/dist/ui/variants/var_chip.d.ts +18 -0
  379. package/dist/ui/variants/var_chip.js +12 -0
  380. package/dist/ui/variants/var_choice.d.ts +26 -0
  381. package/dist/ui/variants/var_choice.js +14 -0
  382. package/dist/ui/variants/var_framed.d.ts +11 -0
  383. package/dist/ui/variants/var_framed.js +9 -0
  384. package/dist/ui/variants/var_glyph-plain.d.ts +14 -0
  385. package/dist/ui/variants/var_glyph-plain.js +10 -0
  386. package/dist/ui/variants/var_input.d.ts +61 -0
  387. package/dist/ui/variants/var_input.js +42 -0
  388. package/dist/ui/variants/var_link-inline.d.ts +39 -0
  389. package/dist/ui/variants/var_link-inline.js +28 -0
  390. package/dist/ui/variants/var_list-row.d.ts +47 -0
  391. package/dist/ui/variants/var_list-row.js +33 -0
  392. package/dist/ui/variants/var_rule.d.ts +11 -0
  393. package/dist/ui/variants/var_rule.js +9 -0
  394. package/dist/ui/variants/var_skeleton-block.d.ts +17 -0
  395. package/dist/ui/variants/var_skeleton-block.js +11 -0
  396. package/dist/ui/variants/var_spinner-turning.d.ts +17 -0
  397. package/dist/ui/variants/var_spinner-turning.js +11 -0
  398. package/dist/ui/variants/var_stat-tile.d.ts +18 -0
  399. package/dist/ui/variants/var_stat-tile.js +12 -0
  400. package/dist/ui/variants/var_tab-bar.d.ts +24 -0
  401. package/dist/ui/variants/var_tab-bar.js +14 -0
  402. package/dist/ui/variants/var_tap-target.d.ts +33 -0
  403. package/dist/ui/variants/var_tap-target.js +24 -0
  404. package/dist/ui/variants.d.ts +174 -0
  405. package/dist/ui/variants.js +50 -0
  406. package/dist/ui/wrappers.d.ts +128 -0
  407. package/dist/ui/wrappers.js +220 -0
  408. package/package.json +16 -0
@@ -0,0 +1,1143 @@
1
+ export declare const ELEMENTS: {
2
+ readonly id: "element";
3
+ readonly at: "thread/ui/elements.ts";
4
+ readonly files: "ui/*.tsx";
5
+ readonly describes: "An interface part, and function only: what it does, what it carries and which signals it raises, never how it looks and never markup a person writes. Its look is a variant it wears, its wording arrives as a message key rather than as words, and `thread elements` writes its file from this row, so the file is never typed. Every part this framework ships is listed here, an app adds its own to the same list, and a row that goes missing breaks the build, because what the framework offers is not an app’s to withdraw. A thing made of parts already listed here is a composition, not a new element.";
6
+ readonly version: 1;
7
+ readonly cites: readonly [{
8
+ readonly on: "2026-08-31";
9
+ readonly said: "elements does not hold anything that can render anything, its functionality only . only our compiler can translate things into proper css and html and only at build time do we produce a renderable result.";
10
+ }, {
11
+ readonly on: "2026-08-29";
12
+ readonly said: "CLI actually generates the tsx file, and you MUST give the file its body, properly.";
13
+ }];
14
+ readonly declares: readonly [{
15
+ readonly id: "accordion";
16
+ readonly at: "thread/ui/elements/accordion.tsx";
17
+ readonly by: "thread elements";
18
+ readonly runs: "thread elements --own --check";
19
+ readonly tag: "div";
20
+ readonly keeps: true;
21
+ readonly works: "./accordion.works.ts";
22
+ readonly carries: {
23
+ readonly items: "parting";
24
+ readonly initial: "ordering";
25
+ readonly exclusive: "flag";
26
+ readonly onChange: "choosing";
27
+ };
28
+ readonly places: {
29
+ readonly section: {
30
+ readonly tag: "div";
31
+ readonly each: "items";
32
+ readonly by: "id";
33
+ readonly gives: "section";
34
+ readonly holds: "header region";
35
+ };
36
+ readonly header: {
37
+ readonly tag: "button";
38
+ readonly gives: "header";
39
+ readonly shows: "label";
40
+ };
41
+ readonly region: {
42
+ readonly tag: "div";
43
+ readonly gives: "region";
44
+ readonly shows: "inside";
45
+ };
46
+ };
47
+ readonly describes: "Sections that open one at a time, for long material somebody reads part of.";
48
+ }, {
49
+ readonly id: "aspect-ratio";
50
+ readonly at: "thread/ui/elements/aspect-ratio.tsx";
51
+ readonly by: "thread elements";
52
+ readonly runs: "thread elements --own --check";
53
+ readonly tag: "div";
54
+ readonly arranges: true;
55
+ readonly carries: {
56
+ readonly ratio: "count";
57
+ };
58
+ readonly measures: readonly ["ratio"];
59
+ readonly works: "./aspect-ratio.works.ts";
60
+ readonly sets: {
61
+ readonly aspectRatio: "ratio";
62
+ };
63
+ readonly describes: "A slot that keeps its proportions whatever width it gets, so a loading picture reserves its room.";
64
+ }, {
65
+ readonly id: "avatar";
66
+ readonly at: "thread/ui/elements/avatar.tsx";
67
+ readonly by: "thread elements";
68
+ readonly runs: "thread elements --own --check";
69
+ readonly tag: "span";
70
+ readonly reads: "picture";
71
+ readonly carries: {
72
+ readonly labelKey: "naming";
73
+ readonly src: "picture";
74
+ readonly initials: "words";
75
+ };
76
+ readonly works: "./avatar.works.ts";
77
+ readonly places: {
78
+ readonly picture: {
79
+ readonly tag: "img";
80
+ readonly shows: "src";
81
+ };
82
+ readonly lettering: {
83
+ readonly shows: "lettering";
84
+ };
85
+ };
86
+ readonly describes: "A person or an organisation as a small picture, falling back to initials when there is no image.";
87
+ }, {
88
+ readonly id: "badge";
89
+ readonly at: "thread/ui/elements/badge.tsx";
90
+ readonly by: "thread elements";
91
+ readonly runs: "thread elements --own --check";
92
+ readonly tag: "span";
93
+ readonly carries: {
94
+ readonly labelKey: "wording";
95
+ readonly count: "count";
96
+ readonly max: "count";
97
+ };
98
+ readonly works: "./badge.works.ts";
99
+ readonly describes: "A short status word attached to something else. For counts and states, never for an action.";
100
+ }, {
101
+ readonly id: "bars";
102
+ readonly at: "thread/ui/elements/bars.tsx";
103
+ readonly by: "thread elements";
104
+ readonly runs: "thread elements --own --check";
105
+ readonly tag: "div";
106
+ readonly reads: "picture";
107
+ readonly keeps: true;
108
+ readonly works: "./bars.works.ts";
109
+ readonly carries: {
110
+ readonly rows: "listing";
111
+ readonly by: "ruling";
112
+ readonly value: "ruling";
113
+ readonly format: "words";
114
+ readonly titleKey: "titling";
115
+ };
116
+ readonly places: {
117
+ readonly bar: {
118
+ readonly each: "rows";
119
+ readonly by: "by";
120
+ readonly marks: "sized";
121
+ readonly holds: "label amount";
122
+ };
123
+ readonly label: {
124
+ readonly shows: "label";
125
+ };
126
+ readonly amount: {
127
+ readonly shows: "amount";
128
+ };
129
+ };
130
+ readonly describes: "Quantities compared across categories. The default when the horizontal axis is not time.";
131
+ }, {
132
+ readonly id: "box";
133
+ readonly at: "thread/ui/elements/box.tsx";
134
+ readonly by: "thread elements";
135
+ readonly runs: "thread elements --own --check";
136
+ readonly tag: "div";
137
+ readonly arranges: true;
138
+ readonly reads: "grouping";
139
+ readonly raises: readonly ["scrolling"];
140
+ readonly carries: {
141
+ readonly labelKey: "titling";
142
+ };
143
+ readonly describes: "The declared `div`. Groups children, optionally as a landmark region, and optionally scrolls. A box that scrolls raises `scrolling`, which a variant may dress; naming one makes it a group, and leaving it unnamed leaves it a box.";
144
+ }, {
145
+ readonly id: "breadcrumb";
146
+ readonly at: "thread/ui/elements/breadcrumb.tsx";
147
+ readonly by: "thread elements";
148
+ readonly runs: "thread elements --own --check";
149
+ readonly tag: "nav";
150
+ readonly called: "nav.breadcrumb";
151
+ readonly works: "./breadcrumb.works.ts";
152
+ readonly carries: {
153
+ readonly map: "mapping";
154
+ readonly current: "ruling";
155
+ };
156
+ readonly places: {
157
+ readonly step: {
158
+ readonly tag: "Link.linkInline";
159
+ readonly each: "steps";
160
+ readonly by: "id";
161
+ readonly gives: "crumb";
162
+ };
163
+ };
164
+ readonly describes: "The trail back up from wherever somebody is, derived from the route rather than assembled by hand.";
165
+ }, {
166
+ readonly id: "button";
167
+ readonly at: "thread/ui/elements/button.tsx";
168
+ readonly by: "thread elements";
169
+ readonly runs: "thread elements --own --check";
170
+ readonly tag: "button";
171
+ readonly keeps: true;
172
+ readonly works: "./button.works.tsx";
173
+ readonly wires: "wires";
174
+ readonly carries: {
175
+ readonly label: "wording";
176
+ readonly with: "holding";
177
+ readonly icon: "words";
178
+ readonly shows: "words";
179
+ readonly type: "words";
180
+ readonly disabled: "flag";
181
+ readonly loading: "flag";
182
+ readonly dispatch: "words";
183
+ readonly input: "holding";
184
+ readonly navigateTo: "words";
185
+ readonly onPress: "doing";
186
+ };
187
+ readonly places: {
188
+ readonly symbol: {
189
+ readonly when: "iconed";
190
+ readonly shows: "symbol";
191
+ readonly display: "layout-flex";
192
+ readonly alignItems: "align-centre";
193
+ };
194
+ readonly wording: {
195
+ readonly when: "worded";
196
+ readonly shows: "wording";
197
+ };
198
+ };
199
+ readonly describes: "A press that runs a declared workflow or goes to a declared screen. The only way to start either from a tap.";
200
+ }, {
201
+ readonly id: "column";
202
+ readonly at: "thread/ui/elements/column.tsx";
203
+ readonly by: "thread elements";
204
+ readonly runs: "thread elements --own --check";
205
+ readonly tag: "div";
206
+ readonly describes: "Children stacked top to bottom. The vertical arrangement, and the default shape of a form.";
207
+ readonly arranges: true;
208
+ readonly sets: {
209
+ readonly display: "layout-flex";
210
+ readonly flexDirection: "flow-down";
211
+ readonly gap: "space-3";
212
+ };
213
+ }, {
214
+ readonly id: "consent";
215
+ readonly at: "thread/ui/elements/consent.tsx";
216
+ readonly by: "thread elements";
217
+ readonly runs: "thread elements --own --check";
218
+ readonly keeps: true;
219
+ readonly works: "./consent.works.tsx";
220
+ readonly carries: {
221
+ readonly decision: "judging";
222
+ readonly onDecide: "judged";
223
+ readonly policyKey: "noting";
224
+ readonly preselected: "ordering";
225
+ };
226
+ readonly places: {
227
+ readonly panel: {
228
+ readonly tag: "Box.card";
229
+ readonly holds: "body";
230
+ };
231
+ readonly body: {
232
+ readonly tag: "Column";
233
+ readonly holds: "title policy list actions";
234
+ };
235
+ readonly title: {
236
+ readonly tag: "Text";
237
+ readonly gives: "title";
238
+ };
239
+ readonly policy: {
240
+ readonly tag: "Text";
241
+ readonly when: "hasPolicy";
242
+ readonly gives: "policy";
243
+ };
244
+ readonly list: {
245
+ readonly tag: "Column";
246
+ readonly holds: "category";
247
+ };
248
+ readonly category: {
249
+ readonly tag: "Box";
250
+ readonly each: "categories";
251
+ readonly by: "id";
252
+ readonly holds: "words switch fixed";
253
+ };
254
+ readonly words: {
255
+ readonly tag: "Column";
256
+ readonly holds: "label describe";
257
+ };
258
+ readonly label: {
259
+ readonly tag: "Text";
260
+ readonly gives: "label";
261
+ };
262
+ readonly describe: {
263
+ readonly tag: "Text";
264
+ readonly gives: "describe";
265
+ };
266
+ readonly switch: {
267
+ readonly tag: "Toggle.input";
268
+ readonly when: "optional";
269
+ readonly gives: "chooser";
270
+ };
271
+ readonly fixed: {
272
+ readonly tag: "Text";
273
+ readonly when: "required";
274
+ readonly gives: "fixed";
275
+ };
276
+ readonly actions: {
277
+ readonly tag: "Box";
278
+ readonly holds: "withdraw decline accept accept-all";
279
+ };
280
+ readonly withdraw: {
281
+ readonly tag: "Button.buttonQuiet";
282
+ readonly when: "withdrawable";
283
+ readonly gives: "withdraw";
284
+ };
285
+ readonly decline: {
286
+ readonly tag: "Button.buttonBorder";
287
+ readonly gives: "decline";
288
+ };
289
+ readonly accept: {
290
+ readonly tag: "Button.buttonBorder";
291
+ readonly gives: "accept";
292
+ };
293
+ readonly 'accept-all': {
294
+ readonly tag: "Button.buttonFill";
295
+ readonly gives: "acceptAll";
296
+ };
297
+ };
298
+ readonly describes: "The complete permission-to-collect surface, with every declared category and its decision.";
299
+ }, {
300
+ readonly id: "donut";
301
+ readonly at: "thread/ui/elements/donut.tsx";
302
+ readonly by: "thread elements";
303
+ readonly runs: "thread elements --own --check";
304
+ readonly tag: "svg";
305
+ readonly reads: "picture";
306
+ readonly keeps: true;
307
+ readonly works: "./donut.works.ts";
308
+ readonly carries: {
309
+ readonly rows: "listing";
310
+ readonly by: "ruling";
311
+ readonly value: "ruling";
312
+ readonly titleKey: "titling";
313
+ };
314
+ readonly places: {
315
+ readonly slice: {
316
+ readonly tag: "circle";
317
+ readonly each: "rows";
318
+ readonly by: "by";
319
+ readonly gives: "slice";
320
+ };
321
+ };
322
+ readonly describes: "Parts of one whole, for a handful of slices. Beyond that the reading is worse than a bar.";
323
+ }, {
324
+ readonly id: "each";
325
+ readonly at: "thread/ui/elements/each.tsx";
326
+ readonly by: "thread elements";
327
+ readonly runs: "thread elements --own --check";
328
+ readonly works: "./each.works.tsx";
329
+ readonly carries: {
330
+ readonly rows: "anything";
331
+ readonly by: "ruling";
332
+ readonly children: "drawing";
333
+ readonly settles: "words";
334
+ readonly paced: "words";
335
+ };
336
+ readonly describes: "One rendered thing per row of data. The construct that replaces mapping over an array by hand.";
337
+ }, {
338
+ readonly id: "empty";
339
+ readonly at: "thread/ui/elements/empty.tsx";
340
+ readonly by: "thread elements";
341
+ readonly runs: "thread elements --own --check";
342
+ readonly always: readonly ["empty"];
343
+ readonly tag: "div";
344
+ readonly describes: "What a surface says when its read answered with nothing. Never the same rendering as still loading.";
345
+ }, {
346
+ readonly id: "field";
347
+ readonly at: "thread/ui/elements/field.tsx";
348
+ readonly by: "thread elements";
349
+ readonly runs: "thread elements --own --check";
350
+ readonly tag: "label";
351
+ readonly keeps: true;
352
+ readonly works: "./field.works.ts";
353
+ readonly carries: {
354
+ readonly name: "ruling";
355
+ readonly validator: "ruling";
356
+ readonly labelKey: "wording";
357
+ readonly value: "words";
358
+ readonly onValue: "picking";
359
+ readonly context: "holding";
360
+ readonly autocomplete: "words";
361
+ readonly disabled: "flag";
362
+ };
363
+ readonly places: {
364
+ readonly caption: {
365
+ readonly shows: "labelKey";
366
+ };
367
+ readonly entry: {
368
+ readonly tag: "input";
369
+ readonly gives: "entry";
370
+ };
371
+ readonly fault: {
372
+ readonly reads: "alarm";
373
+ readonly shows: "fault";
374
+ };
375
+ };
376
+ readonly describes: "One value being typed, governed entirely by the validator it names — keyboard, mask, limit and message.";
377
+ }, {
378
+ readonly id: "funnel";
379
+ readonly at: "thread/ui/elements/funnel.tsx";
380
+ readonly by: "thread elements";
381
+ readonly runs: "thread elements --own --check";
382
+ readonly tag: "div";
383
+ readonly reads: "picture";
384
+ readonly keeps: true;
385
+ readonly works: "./funnel.works.ts";
386
+ readonly carries: {
387
+ readonly rows: "listing";
388
+ readonly by: "ruling";
389
+ readonly value: "ruling";
390
+ readonly format: "words";
391
+ readonly titleKey: "titling";
392
+ };
393
+ readonly places: {
394
+ readonly stage: {
395
+ readonly each: "rows";
396
+ readonly by: "by";
397
+ readonly marks: "sized";
398
+ readonly holds: "label amount";
399
+ };
400
+ readonly label: {
401
+ readonly shows: "label";
402
+ };
403
+ readonly amount: {
404
+ readonly shows: "amount";
405
+ };
406
+ };
407
+ readonly describes: "Fall-off between ordered stages, with the drop at each step derived rather than supplied.";
408
+ }, {
409
+ readonly id: "gauge";
410
+ readonly at: "thread/ui/elements/gauge.tsx";
411
+ readonly by: "thread elements";
412
+ readonly runs: "thread elements --own --check";
413
+ readonly tag: "svg";
414
+ readonly reads: "picture";
415
+ readonly keeps: true;
416
+ readonly works: "./gauge.works.ts";
417
+ readonly carries: {
418
+ readonly value: "count";
419
+ readonly min: "count";
420
+ readonly max: "count";
421
+ readonly labelKey: "naming";
422
+ };
423
+ readonly places: {
424
+ readonly track: {
425
+ readonly tag: "path";
426
+ readonly gives: "track";
427
+ };
428
+ readonly needle: {
429
+ readonly tag: "path";
430
+ readonly gives: "needle";
431
+ };
432
+ };
433
+ readonly describes: "A single quantity against a target, where the reading is how far along rather than how much.";
434
+ }, {
435
+ readonly id: "grid";
436
+ readonly at: "thread/ui/elements/grid.tsx";
437
+ readonly by: "thread elements";
438
+ readonly runs: "thread elements --own --check";
439
+ readonly tag: "div";
440
+ readonly describes: "Children arranged, and nothing more. Its tracks are not something a row can state — the style guide binds no track property, deliberately — so this sets nothing and a caller that wants a set of equal panels wraps a `Row` instead. Kept, and its sentence made true, because the one it carried promised tracks it has never laid out: “as many equal tracks as the container allows”, on a row with no `sets` at all.";
441
+ readonly arranges: true;
442
+ }, {
443
+ readonly id: "heatmap";
444
+ readonly at: "thread/ui/elements/heatmap.tsx";
445
+ readonly by: "thread elements";
446
+ readonly runs: "thread elements --own --check";
447
+ readonly tag: "div";
448
+ readonly reads: "picture";
449
+ readonly keeps: true;
450
+ readonly works: "./heatmap.works.ts";
451
+ readonly carries: {
452
+ readonly rows: "listing";
453
+ readonly by: "ruling";
454
+ readonly x: "ruling";
455
+ readonly y: "ruling";
456
+ readonly value: "words";
457
+ readonly titleKey: "titling";
458
+ };
459
+ readonly places: {
460
+ readonly cell: {
461
+ readonly each: "rows";
462
+ readonly by: "by";
463
+ readonly marks: "sized";
464
+ };
465
+ };
466
+ readonly describes: "Density across two axes, for when the pattern matters more than any single cell.";
467
+ }, {
468
+ readonly id: "hit-box";
469
+ readonly at: "thread/ui/elements/hit-box.tsx";
470
+ readonly by: "thread elements";
471
+ readonly runs: "thread elements --own --check";
472
+ readonly tag: "div";
473
+ readonly arranges: true;
474
+ readonly keeps: true;
475
+ readonly works: "./hit-box.works.tsx";
476
+ readonly wires: "wires";
477
+ readonly carries: {
478
+ readonly gesture: "ruling";
479
+ readonly tuning: "tuning";
480
+ readonly axis: "words";
481
+ readonly grabs: "subjecting";
482
+ readonly accepts: "ordering";
483
+ readonly collects: "subjecting";
484
+ readonly dwell: "count";
485
+ readonly moves: "flag";
486
+ readonly onDrop: "doing";
487
+ readonly dispatch: "words";
488
+ readonly input: "holding";
489
+ };
490
+ readonly sets: {
491
+ readonly display: "layout-block";
492
+ readonly touchAction: "touch";
493
+ readonly userSelect: "pick";
494
+ readonly visibility: "shown";
495
+ readonly position: "flow";
496
+ };
497
+ readonly measures: readonly ["touch", "pick", "shown", "flow", "width", "height", "carry", "grip"];
498
+ readonly places: {
499
+ readonly carried: {
500
+ readonly tag: "div";
501
+ readonly shows: "carried";
502
+ readonly position: "position-pinned";
503
+ readonly left: "space-0";
504
+ readonly top: "space-0";
505
+ readonly width: "width";
506
+ readonly height: "height";
507
+ readonly transform: "carry";
508
+ readonly transformOrigin: "grip";
509
+ readonly pointerEvents: "reach-through";
510
+ readonly userSelect: "picking-off";
511
+ readonly zIndex: "layer-carried";
512
+ readonly willChange: "readying-movement";
513
+ };
514
+ };
515
+ readonly describes: "A region that claims a gesture, composed with anything and declared by nothing. Put it where the grab should be, not on the element.";
516
+ }, {
517
+ readonly id: "glyph";
518
+ readonly at: "thread/ui/elements/glyph.tsx";
519
+ readonly by: "thread elements";
520
+ readonly runs: "thread elements --own --check";
521
+ readonly carries: {
522
+ readonly name: "ruling";
523
+ readonly labelKey: "noting";
524
+ };
525
+ readonly works: "./glyph.works.tsx";
526
+ readonly describes: "A semantic pictogram — `close`, `search` — resolved from whichever set the design chose at build time. It is laid out rather than left inline, because an `svg` that is left inline stands on a text baseline: the line it sits on keeps a descender's worth of room under the drawing, so the drawing rides above the middle of whatever holds it and the wording beside it reads as sitting lower. Measured 2026-09-03 in `thread-palette-lab`: a 24px symbol in a 28px box, its centre 2.00px above the row's and the wording's 0.36px below — 2.36px apart, the same amount everywhere, on every icon in the app.";
527
+ readonly sets: {
528
+ readonly display: "layout-flex";
529
+ };
530
+ }, {
531
+ readonly id: "image";
532
+ readonly at: "thread/ui/elements/image.tsx";
533
+ readonly by: "thread elements";
534
+ readonly runs: "thread elements --own --check";
535
+ readonly carries: {
536
+ readonly src: "source";
537
+ readonly altKey: "naming";
538
+ };
539
+ readonly tag: "img";
540
+ readonly describes: "A picture with alternative wording, for photographs and artwork rather than for interface symbols.";
541
+ }, {
542
+ readonly id: "line-chart";
543
+ readonly at: "thread/ui/elements/line-chart.tsx";
544
+ readonly by: "thread elements";
545
+ readonly runs: "thread elements --own --check";
546
+ readonly tag: "svg";
547
+ readonly reads: "picture";
548
+ readonly keeps: true;
549
+ readonly works: "./line-chart.works.ts";
550
+ readonly carries: {
551
+ readonly rows: "listing";
552
+ readonly by: "words";
553
+ readonly value: "ruling";
554
+ readonly titleKey: "titling";
555
+ };
556
+ readonly places: {
557
+ readonly line: {
558
+ readonly tag: "polyline";
559
+ readonly each: "lines";
560
+ readonly by: "group";
561
+ readonly gives: "drawing";
562
+ };
563
+ };
564
+ readonly describes: "A quantity over time, with axes. The chart for a trend somebody will read values off.";
565
+ }, {
566
+ readonly id: "link";
567
+ readonly at: "thread/ui/elements/link.tsx";
568
+ readonly by: "thread elements";
569
+ readonly runs: "thread elements --own --check";
570
+ readonly tag: "a";
571
+ readonly keeps: true;
572
+ readonly shows: "labelKey";
573
+ readonly carries: {
574
+ readonly navigateTo: "ruling";
575
+ readonly labelKey: "wording";
576
+ readonly is: "styling";
577
+ };
578
+ readonly works: "./link.works.ts";
579
+ readonly describes: "Wording that carries somebody to a declared screen. A press that navigates and does not act.";
580
+ }, {
581
+ readonly id: "media";
582
+ readonly at: "thread/ui/elements/media.tsx";
583
+ readonly by: "thread elements";
584
+ readonly runs: "thread elements --own --check";
585
+ readonly tag: {
586
+ readonly by: "as";
587
+ readonly image: "img";
588
+ readonly video: "video";
589
+ readonly audio: "audio";
590
+ readonly file: "a";
591
+ };
592
+ readonly carries: {
593
+ readonly as: "words";
594
+ readonly src: "source";
595
+ readonly altKey: "naming";
596
+ };
597
+ readonly describes: "Whatever a media or file value turns out to be — a picture, a clip, a document — rendered by its kind.";
598
+ }, {
599
+ readonly id: "menu";
600
+ readonly at: "thread/ui/elements/menu.tsx";
601
+ readonly by: "thread elements";
602
+ readonly runs: "thread elements --own --check";
603
+ readonly tag: "span";
604
+ readonly keeps: true;
605
+ readonly works: "./menu.works.tsx";
606
+ readonly dresses: "opener";
607
+ readonly measures: readonly ["x", "y"];
608
+ readonly carries: {
609
+ readonly labelKey: "wording";
610
+ readonly items: "listing";
611
+ readonly side: "words";
612
+ };
613
+ readonly places: {
614
+ readonly opener: {
615
+ readonly tag: "button";
616
+ readonly gives: "opener";
617
+ readonly shows: "labelKey";
618
+ };
619
+ readonly portal: {
620
+ readonly tag: "Presented";
621
+ readonly gives: "portal";
622
+ readonly holds: "layer";
623
+ };
624
+ readonly layer: {
625
+ readonly tag: "div";
626
+ readonly gives: "listing";
627
+ readonly holds: "row";
628
+ readonly position: "position-lifted";
629
+ readonly left: "x";
630
+ readonly top: "y";
631
+ };
632
+ readonly row: {
633
+ readonly tag: "MenuRow";
634
+ readonly each: "items";
635
+ readonly by: "labelKey";
636
+ readonly gives: "row";
637
+ };
638
+ };
639
+ readonly describes: "Actions revealed on demand from a trigger, with keyboard traversal and dismissal already handled.";
640
+ }, {
641
+ readonly id: "money";
642
+ readonly at: "thread/ui/elements/money.tsx";
643
+ readonly by: "thread elements";
644
+ readonly runs: "thread elements --own --check";
645
+ readonly carries: {
646
+ readonly value: "amount";
647
+ readonly is: "styling";
648
+ };
649
+ readonly works: "./money.works.ts";
650
+ readonly describes: "An amount with its currency, formatted for the locale. Never a number and a symbol concatenated.";
651
+ }, {
652
+ readonly id: "pagination";
653
+ readonly at: "thread/ui/elements/pagination.tsx";
654
+ readonly by: "thread elements";
655
+ readonly runs: "thread elements --own --check";
656
+ readonly tag: "nav";
657
+ readonly called: "nav.pagination";
658
+ readonly works: "./pagination.works.ts";
659
+ readonly carries: {
660
+ readonly map: "mapping";
661
+ readonly sequence: "ordering";
662
+ readonly current: "ruling";
663
+ };
664
+ readonly places: {
665
+ readonly step: {
666
+ readonly tag: "Link.linkInline";
667
+ readonly each: "steps";
668
+ readonly by: "id";
669
+ readonly gives: "step";
670
+ };
671
+ };
672
+ readonly describes: "Movement between pages of a long result, for when scrolling to the end is not reasonable.";
673
+ }, {
674
+ readonly id: "progress";
675
+ readonly at: "thread/ui/elements/progress.tsx";
676
+ readonly by: "thread elements";
677
+ readonly runs: "thread elements --own --check";
678
+ readonly tag: "div";
679
+ readonly reads: "progress";
680
+ readonly carries: {
681
+ readonly value: "count";
682
+ readonly target: "count";
683
+ readonly labelKey: "naming";
684
+ };
685
+ readonly measures: readonly ["fraction", "span"];
686
+ readonly works: "./progress.works.ts";
687
+ readonly places: {
688
+ readonly bar: {
689
+ readonly width: "span";
690
+ };
691
+ };
692
+ readonly describes: "Work advancing toward a known end. The determinate half of what a spinner shows.";
693
+ }, {
694
+ readonly id: "radio-group";
695
+ readonly at: "thread/ui/elements/radio-group.tsx";
696
+ readonly by: "thread elements";
697
+ readonly runs: "thread elements --own --check";
698
+ readonly tag: "div";
699
+ readonly reads: "choices";
700
+ readonly keeps: true;
701
+ readonly works: "./radio-group.works.ts";
702
+ readonly carries: {
703
+ readonly name: "ruling";
704
+ readonly labelKey: "naming";
705
+ readonly options: "listing";
706
+ readonly chosen: "words";
707
+ readonly onValue: "picking";
708
+ readonly disabled: "flag";
709
+ };
710
+ readonly places: {
711
+ readonly option: {
712
+ readonly tag: "label";
713
+ readonly each: "options";
714
+ readonly by: "value";
715
+ readonly holds: "control caption";
716
+ };
717
+ readonly control: {
718
+ readonly tag: "input";
719
+ readonly reads: "choosing";
720
+ readonly gives: "option";
721
+ };
722
+ readonly caption: {
723
+ readonly shows: "caption";
724
+ };
725
+ };
726
+ readonly describes: "One answer from a short set, all visible at once. The version of a picker with nothing hidden.";
727
+ }, {
728
+ readonly id: "row";
729
+ readonly at: "thread/ui/elements/row.tsx";
730
+ readonly by: "thread elements";
731
+ readonly runs: "thread elements --own --check";
732
+ readonly tag: "div";
733
+ readonly describes: "Children left to right at the width each one needs. The horizontal arrangement, and the one this catalogue did not have — measured 2026-08-31: a column stacks, a grid cuts equal tracks, a stack overlaps, and a box states what it means rather than which way it runs, so a label beside a button had no declared shape and every app drew it with a host element.";
734
+ readonly arranges: true;
735
+ readonly sets: {
736
+ readonly display: "layout-flex";
737
+ readonly flexDirection: "flow-across";
738
+ readonly alignItems: "align-centre";
739
+ readonly gap: "space-3";
740
+ };
741
+ }, {
742
+ readonly id: "scatter";
743
+ readonly at: "thread/ui/elements/scatter.tsx";
744
+ readonly by: "thread elements";
745
+ readonly runs: "thread elements --own --check";
746
+ readonly tag: "svg";
747
+ readonly reads: "picture";
748
+ readonly keeps: true;
749
+ readonly works: "./scatter.works.ts";
750
+ readonly carries: {
751
+ readonly rows: "listing";
752
+ readonly x: "ruling";
753
+ readonly y: "ruling";
754
+ readonly titleKey: "titling";
755
+ };
756
+ readonly places: {
757
+ readonly point: {
758
+ readonly tag: "circle";
759
+ readonly each: "rows";
760
+ readonly keyed: "position";
761
+ readonly gives: "point";
762
+ };
763
+ };
764
+ readonly describes: "Two measurements plotted against each other, to show whether they move together.";
765
+ }, {
766
+ readonly id: "select";
767
+ readonly at: "thread/ui/elements/select.tsx";
768
+ readonly by: "thread elements";
769
+ readonly runs: "thread elements --own --check";
770
+ readonly tag: "label";
771
+ readonly carries: {
772
+ readonly labelKey: "wording";
773
+ readonly options: "listing";
774
+ readonly value: "words";
775
+ readonly onValue: "picking";
776
+ };
777
+ readonly works: "./select.works.ts";
778
+ readonly places: {
779
+ readonly label: {
780
+ readonly shows: "labelKey";
781
+ };
782
+ readonly control: {
783
+ readonly tag: "select";
784
+ readonly reads: "chooser";
785
+ readonly shows: "value";
786
+ readonly holds: "option";
787
+ };
788
+ readonly option: {
789
+ readonly tag: "option";
790
+ readonly each: "options";
791
+ readonly by: "value";
792
+ readonly shows: "labelKey";
793
+ };
794
+ };
795
+ readonly describes: "One answer picked from a closed list somebody scrolls. For a handful of options, prefer radios.";
796
+ }, {
797
+ readonly id: "separator";
798
+ readonly at: "thread/ui/elements/separator.tsx";
799
+ readonly by: "thread elements";
800
+ readonly runs: "thread elements --own --check";
801
+ readonly tag: "div";
802
+ readonly reads: "divider";
803
+ readonly carries: {
804
+ readonly labelKey: "noting";
805
+ readonly orientation: "words";
806
+ };
807
+ readonly places: {
808
+ readonly label: {
809
+ readonly shows: "labelKey";
810
+ };
811
+ };
812
+ readonly describes: "A visible break between groups, announced as one rather than drawn as a border on a neighbour.";
813
+ }, {
814
+ readonly id: "skeleton";
815
+ readonly at: "thread/ui/elements/skeleton.tsx";
816
+ readonly by: "thread elements";
817
+ readonly runs: "thread elements --own --check";
818
+ readonly tag: "span";
819
+ readonly reads: "placeholder";
820
+ readonly carries: {
821
+ readonly lines: "count";
822
+ };
823
+ readonly places: {
824
+ readonly line: {
825
+ readonly each: "lines";
826
+ };
827
+ };
828
+ readonly describes: "The shape of content that has not arrived, sized like the real thing so nothing jumps when it does.";
829
+ }, {
830
+ readonly id: "slider";
831
+ readonly at: "thread/ui/elements/slider.tsx";
832
+ readonly by: "thread elements";
833
+ readonly runs: "thread elements --own --check";
834
+ readonly tag: "input";
835
+ readonly reads: "sliding";
836
+ readonly gives: readonly ["min", "max", "step"];
837
+ readonly carries: {
838
+ readonly labelKey: "naming";
839
+ readonly value: "count";
840
+ readonly min: "count";
841
+ readonly max: "count";
842
+ readonly step: "count";
843
+ readonly onValue: "moving";
844
+ };
845
+ readonly works: "./slider.works.ts";
846
+ readonly describes: "A number chosen along a range, where the approximate value matters more than the exact one.";
847
+ }, {
848
+ readonly id: "sparkline";
849
+ readonly at: "thread/ui/elements/sparkline.tsx";
850
+ readonly by: "thread elements";
851
+ readonly runs: "thread elements --own --check";
852
+ readonly tag: "svg";
853
+ readonly reads: "placeholder";
854
+ readonly keeps: true;
855
+ readonly works: "./sparkline.works.ts";
856
+ readonly carries: {
857
+ readonly rows: "listing";
858
+ readonly value: "ruling";
859
+ };
860
+ readonly places: {
861
+ readonly line: {
862
+ readonly tag: "polyline";
863
+ readonly gives: "drawing";
864
+ };
865
+ };
866
+ readonly describes: "A shape over time with no axes, small enough to sit inside a row of text.";
867
+ }, {
868
+ readonly id: "spinner";
869
+ readonly at: "thread/ui/elements/spinner.tsx";
870
+ readonly by: "thread elements";
871
+ readonly runs: "thread elements --own --check";
872
+ readonly carries: {
873
+ readonly labelKey: "naming";
874
+ };
875
+ readonly always: readonly ["spinner"];
876
+ readonly tag: "span";
877
+ readonly describes: "Work in progress with no measurable end. Where the end IS measurable, show progress instead.";
878
+ }, {
879
+ readonly id: "stack";
880
+ readonly at: "thread/ui/elements/stack.tsx";
881
+ readonly by: "thread elements";
882
+ readonly runs: "thread elements --own --check";
883
+ readonly tag: "div";
884
+ readonly describes: "Children on the z-axis, overlapping by a token offset — an avatar sitting over the top edge of a panel.";
885
+ readonly arranges: true;
886
+ }, {
887
+ readonly id: "stat";
888
+ readonly at: "thread/ui/elements/stat.tsx";
889
+ readonly by: "thread elements";
890
+ readonly runs: "thread elements --own --check";
891
+ readonly tag: "figure";
892
+ readonly carries: {
893
+ readonly labelKey: "wording";
894
+ readonly value: "amount";
895
+ readonly compare: "count";
896
+ readonly format: "words";
897
+ };
898
+ readonly works: "./stat.works.ts";
899
+ readonly places: {
900
+ readonly figure: {
901
+ readonly shows: "figure";
902
+ };
903
+ readonly caption: {
904
+ readonly tag: "figcaption";
905
+ readonly shows: "labelKey";
906
+ };
907
+ readonly delta: {
908
+ readonly shows: "delta";
909
+ };
910
+ };
911
+ readonly describes: "One headline number with its movement, derived. Passing a precomputed delta is how a dashboard disagrees with itself.";
912
+ }, {
913
+ readonly id: "surface";
914
+ readonly at: "thread/ui/elements/surface.tsx";
915
+ readonly by: "thread elements";
916
+ readonly runs: "thread elements --own --check";
917
+ readonly tag: "div";
918
+ readonly arranges: true;
919
+ readonly keeps: true;
920
+ readonly animates: true;
921
+ readonly works: "./surface.works.ts";
922
+ readonly describes: "A plain painted panel wearing a resolved look, for when the treatment IS the content.";
923
+ }, {
924
+ readonly id: "table";
925
+ readonly at: "thread/ui/elements/table.tsx";
926
+ readonly by: "thread elements";
927
+ readonly runs: "thread elements --own --check";
928
+ readonly tag: "table";
929
+ readonly keeps: true;
930
+ readonly works: "./table.works.ts";
931
+ readonly carries: {
932
+ readonly rows: "listing";
933
+ readonly columns: "listing";
934
+ readonly by: "ruling";
935
+ readonly titleKey: "titling";
936
+ };
937
+ readonly places: {
938
+ readonly head: {
939
+ readonly tag: "thead";
940
+ readonly holds: "heading";
941
+ };
942
+ readonly heading: {
943
+ readonly tag: "tr";
944
+ readonly holds: "headed";
945
+ };
946
+ readonly headed: {
947
+ readonly tag: "th";
948
+ readonly each: "columns";
949
+ readonly by: "field";
950
+ readonly gives: "heading";
951
+ readonly shows: "heading";
952
+ };
953
+ readonly body: {
954
+ readonly tag: "tbody";
955
+ readonly holds: "record";
956
+ };
957
+ readonly record: {
958
+ readonly tag: "tr";
959
+ readonly each: "rows";
960
+ readonly by: "by";
961
+ readonly holds: "cell";
962
+ };
963
+ readonly cell: {
964
+ readonly tag: "td";
965
+ readonly each: "columns";
966
+ readonly by: "field";
967
+ readonly shows: "cell";
968
+ };
969
+ };
970
+ readonly describes: "Rows and columns somebody scans and compares. Reach for this when the exact values are the point.";
971
+ }, {
972
+ readonly id: "tabs";
973
+ readonly at: "thread/ui/elements/tabs.tsx";
974
+ readonly by: "thread elements";
975
+ readonly runs: "thread elements --own --check";
976
+ readonly tag: "div";
977
+ readonly keeps: true;
978
+ readonly works: "./tabs.works.ts";
979
+ readonly carries: {
980
+ readonly items: "parting";
981
+ readonly initial: "words";
982
+ readonly onChange: "picking";
983
+ readonly orientation: "words";
984
+ };
985
+ readonly dresses: "strip";
986
+ readonly places: {
987
+ readonly strip: {
988
+ readonly tag: "div";
989
+ readonly gives: "strip";
990
+ readonly holds: "tab";
991
+ readonly display: "layout-flex";
992
+ readonly alignItems: "align-centre";
993
+ };
994
+ readonly tab: {
995
+ readonly tag: "button";
996
+ readonly each: "items";
997
+ readonly by: "id";
998
+ readonly gives: "tab";
999
+ readonly shows: "label";
1000
+ readonly display: "layout-flex";
1001
+ readonly alignItems: "align-centre";
1002
+ readonly justifyContent: "align-centre";
1003
+ readonly height: "control-md";
1004
+ readonly padding: "control-pad-y control-pad-x";
1005
+ readonly borderRadius: "control-radius";
1006
+ readonly borderWidth: "edge-hair";
1007
+ readonly borderStyle: "line-off";
1008
+ readonly borderColor: "colour-clear";
1009
+ readonly background: "colour-clear";
1010
+ readonly color: "colour-ink";
1011
+ readonly cursor: "cursor-press";
1012
+ readonly transition: "motion-quick ease-out";
1013
+ };
1014
+ readonly panel: {
1015
+ readonly tag: "div";
1016
+ readonly when: "opened";
1017
+ readonly gives: "panel";
1018
+ readonly shows: "inside";
1019
+ };
1020
+ };
1021
+ readonly describes: "Sibling panels where only one is visible, switched without going anywhere. Not navigation between screens. It `dresses` its strip rather than itself, which is the difference between a row of tabs and a capsule: the element wraps the strip AND the panel, so a variant landing on the element put `radius-lg` and a filled material around the whole assembly — measured 2026-09-03, and it is what made tabs read as one pill with a page inside it. The tab itself states its own look here because every key it had was structural, so the generator emitted a `button` with no class at all and nothing any style guide row said could reach it.";
1022
+ }, {
1023
+ readonly id: "text";
1024
+ readonly at: "thread/ui/elements/text.tsx";
1025
+ readonly by: "thread elements";
1026
+ readonly runs: "thread elements --own --check";
1027
+ readonly tag: "span";
1028
+ readonly shows: "k";
1029
+ readonly sets: {
1030
+ readonly display: "layout-inline-block";
1031
+ };
1032
+ readonly carries: {
1033
+ readonly k: "wording";
1034
+ readonly with: "holding";
1035
+ readonly is: "styling";
1036
+ readonly announce: "announcing";
1037
+ };
1038
+ readonly describes: "The only place a message key becomes visible words. Every sentence a person reads passes through here. It sets `inline-block` because that is what makes a font role's trim reach it: `text-box-trim` acts on a block container's line boxes and an inline box is not one, so a role carrying the trim governed nothing wherever wording rendered inline. Measured 2026-09-03 at a 1280 viewport: 62 of 90 text elements trimmed to their cap height exactly without this, 72 with it, and the number wrapping to more than one line was 4 either way — it costs no wrapping. Inline-block rather than block because wording still belongs in a line beside other things when an app puts it there.";
1039
+ }, {
1040
+ readonly id: "textarea";
1041
+ readonly at: "thread/ui/elements/textarea.tsx";
1042
+ readonly by: "thread elements";
1043
+ readonly runs: "thread elements --own --check";
1044
+ readonly tag: "label";
1045
+ readonly carries: {
1046
+ readonly labelKey: "wording";
1047
+ readonly name: "words";
1048
+ readonly value: "words";
1049
+ readonly onValue: "picking";
1050
+ readonly validator: "words";
1051
+ readonly rows: "count";
1052
+ };
1053
+ readonly works: "./textarea.works.ts";
1054
+ readonly places: {
1055
+ readonly label: {
1056
+ readonly shows: "labelKey";
1057
+ };
1058
+ readonly control: {
1059
+ readonly tag: "textarea";
1060
+ readonly reads: "writing";
1061
+ readonly shows: "value";
1062
+ readonly takes: "name rows validator";
1063
+ };
1064
+ };
1065
+ readonly describes: "Prose being typed across more than one line, where the shape of what is written matters.";
1066
+ }, {
1067
+ readonly id: "time";
1068
+ readonly at: "thread/ui/elements/time.tsx";
1069
+ readonly by: "thread elements";
1070
+ readonly runs: "thread elements --own --check";
1071
+ readonly keeps: true;
1072
+ readonly carries: {
1073
+ readonly value: "amount";
1074
+ readonly relative: "flag";
1075
+ readonly is: "styling";
1076
+ };
1077
+ readonly works: "./time.works.ts";
1078
+ readonly describes: "A moment, formatted absolutely or as distance from now. Never a date somebody assembled from parts.";
1079
+ }, {
1080
+ readonly id: "toggle";
1081
+ readonly at: "thread/ui/elements/toggle.tsx";
1082
+ readonly by: "thread elements";
1083
+ readonly runs: "thread elements --own --check";
1084
+ readonly tag: "label";
1085
+ readonly carries: {
1086
+ readonly labelKey: "wording";
1087
+ readonly on: "flag";
1088
+ readonly onToggle: "telling";
1089
+ };
1090
+ readonly works: "./toggle.works.ts";
1091
+ readonly places: {
1092
+ readonly control: {
1093
+ readonly tag: "input";
1094
+ readonly reads: "choice";
1095
+ readonly shows: "on";
1096
+ };
1097
+ readonly label: {
1098
+ readonly shows: "labelKey";
1099
+ };
1100
+ };
1101
+ readonly describes: "A single yes-or-no answer, flipped in place. Reach for this rather than two mutually exclusive buttons.";
1102
+ }, {
1103
+ readonly id: "tooltip";
1104
+ readonly at: "thread/ui/elements/tooltip.tsx";
1105
+ readonly by: "thread elements";
1106
+ readonly runs: "thread elements --own --check";
1107
+ readonly tag: "span";
1108
+ readonly arranges: true;
1109
+ readonly keeps: true;
1110
+ readonly works: "./tooltip.works.ts";
1111
+ readonly dresses: "bubble";
1112
+ readonly measures: readonly ["x", "y"];
1113
+ readonly carries: {
1114
+ readonly labelKey: "wording";
1115
+ readonly side: "words";
1116
+ };
1117
+ readonly places: {
1118
+ readonly bubble: {
1119
+ readonly tag: "span";
1120
+ readonly when: "showing";
1121
+ readonly gives: "bubble";
1122
+ readonly shows: "labelKey";
1123
+ readonly position: "position-lifted";
1124
+ readonly left: "x";
1125
+ readonly top: "y";
1126
+ };
1127
+ };
1128
+ readonly describes: "A short clarification revealed by hovering or focusing. Never the only place something is said.";
1129
+ }, {
1130
+ readonly id: "value";
1131
+ readonly at: "thread/ui/elements/value.tsx";
1132
+ readonly by: "thread elements";
1133
+ readonly runs: "thread elements --own --check";
1134
+ readonly carries: {
1135
+ readonly validator: "ruling";
1136
+ readonly value: "amount";
1137
+ readonly context: "holding";
1138
+ readonly is: "styling";
1139
+ };
1140
+ readonly works: "./value.works.ts";
1141
+ readonly describes: "A single formatted datum, punctuated by the validator that governs its kind rather than by the caller.";
1142
+ }];
1143
+ };