@cardstack/boxel-cli 0.10.0 → 0.10.1-unstable.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 (1070) hide show
  1. package/bundled-realms/pretui/README.md +49 -0
  2. package/bundled-realms/pretui/color/LICENSE +21 -0
  3. package/bundled-realms/pretui/color/README.md +155 -0
  4. package/bundled-realms/pretui/color/index.js +78 -0
  5. package/bundled-realms/pretui/color-engine.ts +1243 -0
  6. package/bundled-realms/pretui/components/accordion.gts +58 -0
  7. package/bundled-realms/pretui/components/accordion.md +60 -0
  8. package/bundled-realms/pretui/components/accordion.usage.gts +129 -0
  9. package/bundled-realms/pretui/components/action-bar.gts +407 -0
  10. package/bundled-realms/pretui/components/action-bar.md +48 -0
  11. package/bundled-realms/pretui/components/action-bar.usage.gts +213 -0
  12. package/bundled-realms/pretui/components/affix.gts +116 -0
  13. package/bundled-realms/pretui/components/affix.md +54 -0
  14. package/bundled-realms/pretui/components/affix.usage.gts +73 -0
  15. package/bundled-realms/pretui/components/agent-question.gts +116 -0
  16. package/bundled-realms/pretui/components/agent-question.md +50 -0
  17. package/bundled-realms/pretui/components/agent-question.usage.gts +22 -0
  18. package/bundled-realms/pretui/components/ai-instructions.gts +378 -0
  19. package/bundled-realms/pretui/components/ai-instructions.md +49 -0
  20. package/bundled-realms/pretui/components/ai-instructions.usage.gts +101 -0
  21. package/bundled-realms/pretui/components/alert-dialog.gts +223 -0
  22. package/bundled-realms/pretui/components/alert-dialog.md +76 -0
  23. package/bundled-realms/pretui/components/alert-dialog.usage.gts +128 -0
  24. package/bundled-realms/pretui/components/alert.gts +163 -0
  25. package/bundled-realms/pretui/components/alert.md +57 -0
  26. package/bundled-realms/pretui/components/alert.usage.gts +99 -0
  27. package/bundled-realms/pretui/components/amount-input.gts +621 -0
  28. package/bundled-realms/pretui/components/amount-input.md +63 -0
  29. package/bundled-realms/pretui/components/amount-input.usage.gts +170 -0
  30. package/bundled-realms/pretui/components/angle-dial.gts +367 -0
  31. package/bundled-realms/pretui/components/angle-dial.md +56 -0
  32. package/bundled-realms/pretui/components/angle-dial.usage.gts +166 -0
  33. package/bundled-realms/pretui/components/animated-image.gts +291 -0
  34. package/bundled-realms/pretui/components/animated-image.md +49 -0
  35. package/bundled-realms/pretui/components/animated-image.usage.gts +127 -0
  36. package/bundled-realms/pretui/components/app-shell.gts +19 -0
  37. package/bundled-realms/pretui/components/app-shell.md +43 -0
  38. package/bundled-realms/pretui/components/app-shell.usage.gts +52 -0
  39. package/bundled-realms/pretui/components/approval-footer.gts +69 -0
  40. package/bundled-realms/pretui/components/approval-footer.md +49 -0
  41. package/bundled-realms/pretui/components/approval-footer.usage.gts +22 -0
  42. package/bundled-realms/pretui/components/aspect-ratio.gts +328 -0
  43. package/bundled-realms/pretui/components/aspect-ratio.md +72 -0
  44. package/bundled-realms/pretui/components/aspect-ratio.usage.gts +174 -0
  45. package/bundled-realms/pretui/components/asset-grid.gts +542 -0
  46. package/bundled-realms/pretui/components/asset-grid.md +54 -0
  47. package/bundled-realms/pretui/components/asset-grid.usage.gts +171 -0
  48. package/bundled-realms/pretui/components/asset-well.gts +731 -0
  49. package/bundled-realms/pretui/components/asset-well.md +72 -0
  50. package/bundled-realms/pretui/components/asset-well.usage.gts +264 -0
  51. package/bundled-realms/pretui/components/audio-player.gts +152 -0
  52. package/bundled-realms/pretui/components/audio-player.md +51 -0
  53. package/bundled-realms/pretui/components/audio-player.usage.gts +118 -0
  54. package/bundled-realms/pretui/components/autocomplete.gts +1150 -0
  55. package/bundled-realms/pretui/components/autocomplete.md +67 -0
  56. package/bundled-realms/pretui/components/autocomplete.usage.gts +339 -0
  57. package/bundled-realms/pretui/components/avatar-group.gts +30 -0
  58. package/bundled-realms/pretui/components/avatar-group.md +48 -0
  59. package/bundled-realms/pretui/components/avatar-group.usage.gts +39 -0
  60. package/bundled-realms/pretui/components/avatar.gts +134 -0
  61. package/bundled-realms/pretui/components/avatar.md +69 -0
  62. package/bundled-realms/pretui/components/avatar.usage.gts +101 -0
  63. package/bundled-realms/pretui/components/backdrop.gts +179 -0
  64. package/bundled-realms/pretui/components/backdrop.md +56 -0
  65. package/bundled-realms/pretui/components/backdrop.usage.gts +223 -0
  66. package/bundled-realms/pretui/components/background-field.gts +743 -0
  67. package/bundled-realms/pretui/components/background-field.md +62 -0
  68. package/bundled-realms/pretui/components/background-field.usage.gts +328 -0
  69. package/bundled-realms/pretui/components/badge.gts +188 -0
  70. package/bundled-realms/pretui/components/badge.md +62 -0
  71. package/bundled-realms/pretui/components/badge.usage.gts +73 -0
  72. package/bundled-realms/pretui/components/bar-list.gts +255 -0
  73. package/bundled-realms/pretui/components/bar-list.md +49 -0
  74. package/bundled-realms/pretui/components/bar-list.usage.gts +129 -0
  75. package/bundled-realms/pretui/components/board.gts +108 -0
  76. package/bundled-realms/pretui/components/board.md +54 -0
  77. package/bundled-realms/pretui/components/board.usage.gts +321 -0
  78. package/bundled-realms/pretui/components/bottom-nav.gts +217 -0
  79. package/bundled-realms/pretui/components/bottom-nav.md +64 -0
  80. package/bundled-realms/pretui/components/bottom-nav.usage.gts +68 -0
  81. package/bundled-realms/pretui/components/breadcrumb.gts +56 -0
  82. package/bundled-realms/pretui/components/breadcrumb.md +52 -0
  83. package/bundled-realms/pretui/components/breadcrumb.usage.gts +24 -0
  84. package/bundled-realms/pretui/components/broken-link.gts +46 -0
  85. package/bundled-realms/pretui/components/broken-link.md +50 -0
  86. package/bundled-realms/pretui/components/broken-link.usage.gts +57 -0
  87. package/bundled-realms/pretui/components/button-group.gts +246 -0
  88. package/bundled-realms/pretui/components/button-group.md +46 -0
  89. package/bundled-realms/pretui/components/button-group.usage.gts +137 -0
  90. package/bundled-realms/pretui/components/button.examples.gts +67 -0
  91. package/bundled-realms/pretui/components/button.gts +594 -0
  92. package/bundled-realms/pretui/components/button.md +81 -0
  93. package/bundled-realms/pretui/components/button.usage.gts +159 -0
  94. package/bundled-realms/pretui/components/calendar.gts +457 -0
  95. package/bundled-realms/pretui/components/calendar.md +57 -0
  96. package/bundled-realms/pretui/components/calendar.usage.gts +161 -0
  97. package/bundled-realms/pretui/components/callout.gts +2 -0
  98. package/bundled-realms/pretui/components/callout.md +40 -0
  99. package/bundled-realms/pretui/components/callout.usage.gts +48 -0
  100. package/bundled-realms/pretui/components/card.gts +637 -0
  101. package/bundled-realms/pretui/components/card.md +105 -0
  102. package/bundled-realms/pretui/components/card.usage.gts +279 -0
  103. package/bundled-realms/pretui/components/carousel.gts +583 -0
  104. package/bundled-realms/pretui/components/carousel.md +53 -0
  105. package/bundled-realms/pretui/components/carousel.usage.gts +220 -0
  106. package/bundled-realms/pretui/components/cascader.gts +436 -0
  107. package/bundled-realms/pretui/components/cascader.md +61 -0
  108. package/bundled-realms/pretui/components/cascader.usage.gts +79 -0
  109. package/bundled-realms/pretui/components/channel-slider.gts +251 -0
  110. package/bundled-realms/pretui/components/channel-slider.md +51 -0
  111. package/bundled-realms/pretui/components/channel-slider.usage.gts +104 -0
  112. package/bundled-realms/pretui/components/chart.gts +1011 -0
  113. package/bundled-realms/pretui/components/chart.md +60 -0
  114. package/bundled-realms/pretui/components/chart.usage.gts +660 -0
  115. package/bundled-realms/pretui/components/checkbox-card.gts +82 -0
  116. package/bundled-realms/pretui/components/checkbox-card.md +73 -0
  117. package/bundled-realms/pretui/components/checkbox-card.usage.gts +114 -0
  118. package/bundled-realms/pretui/components/checkbox.examples.gts +61 -0
  119. package/bundled-realms/pretui/components/checkbox.gts +123 -0
  120. package/bundled-realms/pretui/components/checkbox.md +55 -0
  121. package/bundled-realms/pretui/components/checkbox.usage.gts +31 -0
  122. package/bundled-realms/pretui/components/chip.gts +136 -0
  123. package/bundled-realms/pretui/components/chip.md +54 -0
  124. package/bundled-realms/pretui/components/chip.usage.gts +97 -0
  125. package/bundled-realms/pretui/components/code-block.gts +888 -0
  126. package/bundled-realms/pretui/components/code-block.md +61 -0
  127. package/bundled-realms/pretui/components/code-block.usage.gts +374 -0
  128. package/bundled-realms/pretui/components/collapsed-turn.gts +44 -0
  129. package/bundled-realms/pretui/components/collapsed-turn.md +48 -0
  130. package/bundled-realms/pretui/components/collapsed-turn.usage.gts +21 -0
  131. package/bundled-realms/pretui/components/collapsible.gts +283 -0
  132. package/bundled-realms/pretui/components/collapsible.md +69 -0
  133. package/bundled-realms/pretui/components/collapsible.usage.gts +173 -0
  134. package/bundled-realms/pretui/components/color-area.gts +339 -0
  135. package/bundled-realms/pretui/components/color-area.md +49 -0
  136. package/bundled-realms/pretui/components/color-area.usage.gts +72 -0
  137. package/bundled-realms/pretui/components/color-field.gts +179 -0
  138. package/bundled-realms/pretui/components/color-field.md +47 -0
  139. package/bundled-realms/pretui/components/color-field.usage.gts +87 -0
  140. package/bundled-realms/pretui/components/color-palette.gts +198 -0
  141. package/bundled-realms/pretui/components/color-palette.md +48 -0
  142. package/bundled-realms/pretui/components/color-picker.gts +721 -0
  143. package/bundled-realms/pretui/components/color-picker.md +59 -0
  144. package/bundled-realms/pretui/components/color-picker.usage.gts +122 -0
  145. package/bundled-realms/pretui/components/color-stop-editor.gts +184 -0
  146. package/bundled-realms/pretui/components/color-stop-editor.md +46 -0
  147. package/bundled-realms/pretui/components/color-stop-editor.usage.gts +75 -0
  148. package/bundled-realms/pretui/components/combobox.gts +333 -0
  149. package/bundled-realms/pretui/components/combobox.md +49 -0
  150. package/bundled-realms/pretui/components/combobox.usage.gts +143 -0
  151. package/bundled-realms/pretui/components/command-palette.gts +982 -0
  152. package/bundled-realms/pretui/components/command-palette.md +47 -0
  153. package/bundled-realms/pretui/components/command-palette.usage.gts +95 -0
  154. package/bundled-realms/pretui/components/command.gts +2 -0
  155. package/bundled-realms/pretui/components/command.md +45 -0
  156. package/bundled-realms/pretui/components/command.usage.gts +58 -0
  157. package/bundled-realms/pretui/components/compaction-chip.gts +273 -0
  158. package/bundled-realms/pretui/components/compaction-chip.md +45 -0
  159. package/bundled-realms/pretui/components/compaction-chip.usage.gts +110 -0
  160. package/bundled-realms/pretui/components/comparison.gts +223 -0
  161. package/bundled-realms/pretui/components/comparison.md +46 -0
  162. package/bundled-realms/pretui/components/comparison.usage.gts +148 -0
  163. package/bundled-realms/pretui/components/composer.gts +566 -0
  164. package/bundled-realms/pretui/components/composer.md +59 -0
  165. package/bundled-realms/pretui/components/composer.usage.gts +173 -0
  166. package/bundled-realms/pretui/components/compound-field.gts +289 -0
  167. package/bundled-realms/pretui/components/compound-field.md +66 -0
  168. package/bundled-realms/pretui/components/compound-field.usage.gts +378 -0
  169. package/bundled-realms/pretui/components/contact-link.gts +583 -0
  170. package/bundled-realms/pretui/components/contact-link.md +53 -0
  171. package/bundled-realms/pretui/components/contact-link.usage.gts +273 -0
  172. package/bundled-realms/pretui/components/context-menu.gts +811 -0
  173. package/bundled-realms/pretui/components/context-menu.md +74 -0
  174. package/bundled-realms/pretui/components/context-menu.usage.gts +244 -0
  175. package/bundled-realms/pretui/components/copy-button.gts +237 -0
  176. package/bundled-realms/pretui/components/copy-button.md +71 -0
  177. package/bundled-realms/pretui/components/copy-button.usage.gts +135 -0
  178. package/bundled-realms/pretui/components/copy-fit.gts +396 -0
  179. package/bundled-realms/pretui/components/copy-fit.md +60 -0
  180. package/bundled-realms/pretui/components/copy-fit.usage.gts +200 -0
  181. package/bundled-realms/pretui/components/cta-band.gts +285 -0
  182. package/bundled-realms/pretui/components/cta-band.md +50 -0
  183. package/bundled-realms/pretui/components/cta-band.usage.gts +208 -0
  184. package/bundled-realms/pretui/components/cue.gts +180 -0
  185. package/bundled-realms/pretui/components/cue.md +53 -0
  186. package/bundled-realms/pretui/components/cue.usage.gts +88 -0
  187. package/bundled-realms/pretui/components/cursor-trail.gts +221 -0
  188. package/bundled-realms/pretui/components/cursor-trail.md +56 -0
  189. package/bundled-realms/pretui/components/cursor-trail.usage.gts +218 -0
  190. package/bundled-realms/pretui/components/dashboard-grid.gts +939 -0
  191. package/bundled-realms/pretui/components/dashboard-grid.md +60 -0
  192. package/bundled-realms/pretui/components/dashboard-grid.usage.gts +307 -0
  193. package/bundled-realms/pretui/components/dashboard-item.gts +286 -0
  194. package/bundled-realms/pretui/components/dashboard-item.md +52 -0
  195. package/bundled-realms/pretui/components/dashboard-item.usage.gts +87 -0
  196. package/bundled-realms/pretui/components/data-grid.gts +263 -0
  197. package/bundled-realms/pretui/components/data-grid.md +64 -0
  198. package/bundled-realms/pretui/components/data-grid.usage.gts +50 -0
  199. package/bundled-realms/pretui/components/data-table.gts +1618 -0
  200. package/bundled-realms/pretui/components/data-table.md +104 -0
  201. package/bundled-realms/pretui/components/data-table.usage.gts +324 -0
  202. package/bundled-realms/pretui/components/date-picker.gts +98 -0
  203. package/bundled-realms/pretui/components/date-picker.md +59 -0
  204. package/bundled-realms/pretui/components/date-picker.usage.gts +66 -0
  205. package/bundled-realms/pretui/components/date-range-picker.gts +131 -0
  206. package/bundled-realms/pretui/components/date-range-picker.md +55 -0
  207. package/bundled-realms/pretui/components/date-range-picker.usage.gts +125 -0
  208. package/bundled-realms/pretui/components/date-time-picker.gts +227 -0
  209. package/bundled-realms/pretui/components/date-time-picker.md +60 -0
  210. package/bundled-realms/pretui/components/date-time-picker.usage.gts +64 -0
  211. package/bundled-realms/pretui/components/defer.gts +374 -0
  212. package/bundled-realms/pretui/components/defer.md +61 -0
  213. package/bundled-realms/pretui/components/defer.usage.gts +174 -0
  214. package/bundled-realms/pretui/components/delta.gts +45 -0
  215. package/bundled-realms/pretui/components/delta.md +53 -0
  216. package/bundled-realms/pretui/components/delta.usage.gts +31 -0
  217. package/bundled-realms/pretui/components/descriptions.gts +365 -0
  218. package/bundled-realms/pretui/components/descriptions.md +73 -0
  219. package/bundled-realms/pretui/components/descriptions.usage.gts +123 -0
  220. package/bundled-realms/pretui/components/dialog.gts +153 -0
  221. package/bundled-realms/pretui/components/dialog.md +60 -0
  222. package/bundled-realms/pretui/components/dialog.usage.gts +86 -0
  223. package/bundled-realms/pretui/components/diff-block.gts +89 -0
  224. package/bundled-realms/pretui/components/diff-block.md +51 -0
  225. package/bundled-realms/pretui/components/diff-block.usage.gts +27 -0
  226. package/bundled-realms/pretui/components/disclosure.gts +2 -0
  227. package/bundled-realms/pretui/components/disclosure.md +45 -0
  228. package/bundled-realms/pretui/components/disclosure.usage.gts +47 -0
  229. package/bundled-realms/pretui/components/divider.gts +75 -0
  230. package/bundled-realms/pretui/components/divider.md +49 -0
  231. package/bundled-realms/pretui/components/divider.usage.gts +98 -0
  232. package/bundled-realms/pretui/components/doc-report.gts +306 -0
  233. package/bundled-realms/pretui/components/doc-report.md +45 -0
  234. package/bundled-realms/pretui/components/doc-report.usage.gts +126 -0
  235. package/bundled-realms/pretui/components/dock.gts +165 -0
  236. package/bundled-realms/pretui/components/dock.md +42 -0
  237. package/bundled-realms/pretui/components/dock.usage.gts +114 -0
  238. package/bundled-realms/pretui/components/drawer.gts +166 -0
  239. package/bundled-realms/pretui/components/drawer.md +66 -0
  240. package/bundled-realms/pretui/components/drawer.usage.gts +111 -0
  241. package/bundled-realms/pretui/components/dropzone.gts +314 -0
  242. package/bundled-realms/pretui/components/dropzone.md +56 -0
  243. package/bundled-realms/pretui/components/dropzone.usage.gts +203 -0
  244. package/bundled-realms/pretui/components/dueling-picklist.gts +991 -0
  245. package/bundled-realms/pretui/components/dueling-picklist.md +67 -0
  246. package/bundled-realms/pretui/components/dueling-picklist.usage.gts +182 -0
  247. package/bundled-realms/pretui/components/dynamic-island.gts +264 -0
  248. package/bundled-realms/pretui/components/dynamic-island.md +45 -0
  249. package/bundled-realms/pretui/components/dynamic-island.usage.gts +195 -0
  250. package/bundled-realms/pretui/components/easing-curve.gts +629 -0
  251. package/bundled-realms/pretui/components/easing-curve.md +46 -0
  252. package/bundled-realms/pretui/components/easing-curve.usage.gts +122 -0
  253. package/bundled-realms/pretui/components/edit-in-place.gts +559 -0
  254. package/bundled-realms/pretui/components/edit-in-place.md +63 -0
  255. package/bundled-realms/pretui/components/edit-in-place.usage.gts +209 -0
  256. package/bundled-realms/pretui/components/editable.gts +299 -0
  257. package/bundled-realms/pretui/components/editable.md +79 -0
  258. package/bundled-realms/pretui/components/editable.usage.gts +68 -0
  259. package/bundled-realms/pretui/components/email-input.gts +83 -0
  260. package/bundled-realms/pretui/components/email-input.md +52 -0
  261. package/bundled-realms/pretui/components/email-input.usage.gts +90 -0
  262. package/bundled-realms/pretui/components/emoji-button.gts +162 -0
  263. package/bundled-realms/pretui/components/emoji-button.md +46 -0
  264. package/bundled-realms/pretui/components/emoji-button.usage.gts +174 -0
  265. package/bundled-realms/pretui/components/emoji-picker.gts +1396 -0
  266. package/bundled-realms/pretui/components/emoji-picker.md +53 -0
  267. package/bundled-realms/pretui/components/emoji-picker.usage.gts +235 -0
  268. package/bundled-realms/pretui/components/empty-state.gts +162 -0
  269. package/bundled-realms/pretui/components/empty-state.md +63 -0
  270. package/bundled-realms/pretui/components/empty-state.usage.gts +113 -0
  271. package/bundled-realms/pretui/components/empty.gts +2 -0
  272. package/bundled-realms/pretui/components/empty.md +43 -0
  273. package/bundled-realms/pretui/components/empty.usage.gts +33 -0
  274. package/bundled-realms/pretui/components/entity-display.gts +126 -0
  275. package/bundled-realms/pretui/components/entity-display.md +50 -0
  276. package/bundled-realms/pretui/components/error-summary.gts +321 -0
  277. package/bundled-realms/pretui/components/error-summary.md +60 -0
  278. package/bundled-realms/pretui/components/error-summary.usage.gts +155 -0
  279. package/bundled-realms/pretui/components/expression-builder.gts +1211 -0
  280. package/bundled-realms/pretui/components/expression-builder.md +60 -0
  281. package/bundled-realms/pretui/components/expression-builder.usage.gts +246 -0
  282. package/bundled-realms/pretui/components/fab.gts +2 -0
  283. package/bundled-realms/pretui/components/fab.md +38 -0
  284. package/bundled-realms/pretui/components/fab.usage.gts +38 -0
  285. package/bundled-realms/pretui/components/feature-voting.gts +365 -0
  286. package/bundled-realms/pretui/components/feature-voting.md +44 -0
  287. package/bundled-realms/pretui/components/feature-voting.usage.gts +114 -0
  288. package/bundled-realms/pretui/components/feed.gts +244 -0
  289. package/bundled-realms/pretui/components/feed.md +56 -0
  290. package/bundled-realms/pretui/components/feed.usage.gts +250 -0
  291. package/bundled-realms/pretui/components/field-error.gts +127 -0
  292. package/bundled-realms/pretui/components/field-error.md +60 -0
  293. package/bundled-realms/pretui/components/field-error.usage.gts +146 -0
  294. package/bundled-realms/pretui/components/field.gts +185 -0
  295. package/bundled-realms/pretui/components/field.md +60 -0
  296. package/bundled-realms/pretui/components/field.usage.gts +73 -0
  297. package/bundled-realms/pretui/components/fieldset.gts +124 -0
  298. package/bundled-realms/pretui/components/fieldset.md +65 -0
  299. package/bundled-realms/pretui/components/fieldset.usage.gts +105 -0
  300. package/bundled-realms/pretui/components/file-trigger.gts +185 -0
  301. package/bundled-realms/pretui/components/file-trigger.md +53 -0
  302. package/bundled-realms/pretui/components/file-trigger.usage.gts +121 -0
  303. package/bundled-realms/pretui/components/file-upload.gts +353 -0
  304. package/bundled-realms/pretui/components/file-upload.md +63 -0
  305. package/bundled-realms/pretui/components/file-upload.usage.gts +64 -0
  306. package/bundled-realms/pretui/components/filmstrip.gts +465 -0
  307. package/bundled-realms/pretui/components/filmstrip.md +53 -0
  308. package/bundled-realms/pretui/components/filmstrip.usage.gts +115 -0
  309. package/bundled-realms/pretui/components/filter-chips.gts +236 -0
  310. package/bundled-realms/pretui/components/filter-chips.md +58 -0
  311. package/bundled-realms/pretui/components/filter-chips.usage.gts +102 -0
  312. package/bundled-realms/pretui/components/filter-set.gts +293 -0
  313. package/bundled-realms/pretui/components/filter-set.md +60 -0
  314. package/bundled-realms/pretui/components/filter-set.usage.gts +145 -0
  315. package/bundled-realms/pretui/components/float-button.gts +339 -0
  316. package/bundled-realms/pretui/components/float-button.md +69 -0
  317. package/bundled-realms/pretui/components/float-button.usage.gts +134 -0
  318. package/bundled-realms/pretui/components/fold.gts +86 -0
  319. package/bundled-realms/pretui/components/fold.md +54 -0
  320. package/bundled-realms/pretui/components/fold.usage.gts +19 -0
  321. package/bundled-realms/pretui/components/form-field.gts +609 -0
  322. package/bundled-realms/pretui/components/form-field.md +77 -0
  323. package/bundled-realms/pretui/components/form-field.usage.gts +279 -0
  324. package/bundled-realms/pretui/components/form-footer.gts +246 -0
  325. package/bundled-realms/pretui/components/form-footer.md +59 -0
  326. package/bundled-realms/pretui/components/form-footer.usage.gts +217 -0
  327. package/bundled-realms/pretui/components/form-layout.gts +130 -0
  328. package/bundled-realms/pretui/components/form-layout.md +52 -0
  329. package/bundled-realms/pretui/components/form-layout.usage.gts +200 -0
  330. package/bundled-realms/pretui/components/form-section.gts +434 -0
  331. package/bundled-realms/pretui/components/form-section.md +67 -0
  332. package/bundled-realms/pretui/components/form-section.usage.gts +402 -0
  333. package/bundled-realms/pretui/components/form.gts +315 -0
  334. package/bundled-realms/pretui/components/form.md +82 -0
  335. package/bundled-realms/pretui/components/form.usage.gts +306 -0
  336. package/bundled-realms/pretui/components/format-bytes.gts +212 -0
  337. package/bundled-realms/pretui/components/format-bytes.md +47 -0
  338. package/bundled-realms/pretui/components/format-bytes.usage.gts +274 -0
  339. package/bundled-realms/pretui/components/format-date.gts +249 -0
  340. package/bundled-realms/pretui/components/format-date.md +55 -0
  341. package/bundled-realms/pretui/components/format-date.usage.gts +245 -0
  342. package/bundled-realms/pretui/components/format-number.gts +138 -0
  343. package/bundled-realms/pretui/components/format-number.md +51 -0
  344. package/bundled-realms/pretui/components/format-number.usage.gts +261 -0
  345. package/bundled-realms/pretui/components/formatted-value.gts +65 -0
  346. package/bundled-realms/pretui/components/freestyle-usage.gts +311 -0
  347. package/bundled-realms/pretui/components/freestyle-usage.md +49 -0
  348. package/bundled-realms/pretui/components/gallery.gts +819 -0
  349. package/bundled-realms/pretui/components/gallery.md +65 -0
  350. package/bundled-realms/pretui/components/gallery.usage.gts +212 -0
  351. package/bundled-realms/pretui/components/gradient-editor.gts +682 -0
  352. package/bundled-realms/pretui/components/gradient-editor.md +43 -0
  353. package/bundled-realms/pretui/components/gradient-editor.usage.gts +69 -0
  354. package/bundled-realms/pretui/components/graph-layout.md +54 -0
  355. package/bundled-realms/pretui/components/graph-layout.usage.gts +343 -0
  356. package/bundled-realms/pretui/components/graph-outline.gts +553 -0
  357. package/bundled-realms/pretui/components/graph-outline.md +50 -0
  358. package/bundled-realms/pretui/components/graph-outline.usage.gts +88 -0
  359. package/bundled-realms/pretui/components/grid.gts +68 -0
  360. package/bundled-realms/pretui/components/grid.md +54 -0
  361. package/bundled-realms/pretui/components/grid.usage.gts +144 -0
  362. package/bundled-realms/pretui/components/handle.gts +192 -0
  363. package/bundled-realms/pretui/components/handle.md +55 -0
  364. package/bundled-realms/pretui/components/handle.usage.gts +174 -0
  365. package/bundled-realms/pretui/components/hero-split.gts +307 -0
  366. package/bundled-realms/pretui/components/hero-split.md +50 -0
  367. package/bundled-realms/pretui/components/hero-split.usage.gts +200 -0
  368. package/bundled-realms/pretui/components/hover-actions.gts +485 -0
  369. package/bundled-realms/pretui/components/hover-actions.md +55 -0
  370. package/bundled-realms/pretui/components/hover-actions.usage.gts +224 -0
  371. package/bundled-realms/pretui/components/hover-card.gts +347 -0
  372. package/bundled-realms/pretui/components/hover-card.md +72 -0
  373. package/bundled-realms/pretui/components/hover-card.usage.gts +174 -0
  374. package/bundled-realms/pretui/components/hover-video-player.gts +315 -0
  375. package/bundled-realms/pretui/components/hover-video-player.md +57 -0
  376. package/bundled-realms/pretui/components/hover-video-player.usage.gts +152 -0
  377. package/bundled-realms/pretui/components/icon-button.examples.gts +69 -0
  378. package/bundled-realms/pretui/components/icon-button.gts +153 -0
  379. package/bundled-realms/pretui/components/icon-button.md +72 -0
  380. package/bundled-realms/pretui/components/icon-button.usage.gts +208 -0
  381. package/bundled-realms/pretui/components/image-cropper.gts +693 -0
  382. package/bundled-realms/pretui/components/image-cropper.md +52 -0
  383. package/bundled-realms/pretui/components/image-cropper.usage.gts +108 -0
  384. package/bundled-realms/pretui/components/image-frame.gts +91 -0
  385. package/bundled-realms/pretui/components/image-frame.md +42 -0
  386. package/bundled-realms/pretui/components/image-frame.usage.gts +28 -0
  387. package/bundled-realms/pretui/components/image.gts +326 -0
  388. package/bundled-realms/pretui/components/image.md +71 -0
  389. package/bundled-realms/pretui/components/image.usage.gts +126 -0
  390. package/bundled-realms/pretui/components/in-view.gts +245 -0
  391. package/bundled-realms/pretui/components/in-view.md +53 -0
  392. package/bundled-realms/pretui/components/in-view.usage.gts +264 -0
  393. package/bundled-realms/pretui/components/indicator.gts +137 -0
  394. package/bundled-realms/pretui/components/indicator.md +60 -0
  395. package/bundled-realms/pretui/components/indicator.usage.gts +66 -0
  396. package/bundled-realms/pretui/components/infinite-scroll.gts +163 -0
  397. package/bundled-realms/pretui/components/infinite-scroll.md +54 -0
  398. package/bundled-realms/pretui/components/infinite-scroll.usage.gts +73 -0
  399. package/bundled-realms/pretui/components/input-group.gts +264 -0
  400. package/bundled-realms/pretui/components/input-group.md +55 -0
  401. package/bundled-realms/pretui/components/input-group.usage.gts +283 -0
  402. package/bundled-realms/pretui/components/input.examples.gts +61 -0
  403. package/bundled-realms/pretui/components/input.gts +202 -0
  404. package/bundled-realms/pretui/components/input.md +67 -0
  405. package/bundled-realms/pretui/components/input.usage.gts +208 -0
  406. package/bundled-realms/pretui/components/interactive-input.gts +343 -0
  407. package/bundled-realms/pretui/components/interactive-input.md +45 -0
  408. package/bundled-realms/pretui/components/interactive-input.usage.gts +98 -0
  409. package/bundled-realms/pretui/components/item.gts +218 -0
  410. package/bundled-realms/pretui/components/item.md +66 -0
  411. package/bundled-realms/pretui/components/item.usage.gts +121 -0
  412. package/bundled-realms/pretui/components/joystick.gts +381 -0
  413. package/bundled-realms/pretui/components/joystick.md +52 -0
  414. package/bundled-realms/pretui/components/joystick.usage.gts +140 -0
  415. package/bundled-realms/pretui/components/json-editor.gts +1016 -0
  416. package/bundled-realms/pretui/components/json-editor.md +51 -0
  417. package/bundled-realms/pretui/components/json-editor.usage.gts +230 -0
  418. package/bundled-realms/pretui/components/json-tree.gts +596 -0
  419. package/bundled-realms/pretui/components/json-tree.md +52 -0
  420. package/bundled-realms/pretui/components/json-tree.usage.gts +217 -0
  421. package/bundled-realms/pretui/components/jump-chip.gts +230 -0
  422. package/bundled-realms/pretui/components/jump-chip.md +44 -0
  423. package/bundled-realms/pretui/components/jump-chip.usage.gts +151 -0
  424. package/bundled-realms/pretui/components/kbd.gts +60 -0
  425. package/bundled-realms/pretui/components/kbd.md +50 -0
  426. package/bundled-realms/pretui/components/kbd.usage.gts +98 -0
  427. package/bundled-realms/pretui/components/key-value.gts +150 -0
  428. package/bundled-realms/pretui/components/key-value.md +81 -0
  429. package/bundled-realms/pretui/components/key-value.usage.gts +125 -0
  430. package/bundled-realms/pretui/components/known-date.gts +770 -0
  431. package/bundled-realms/pretui/components/known-date.md +56 -0
  432. package/bundled-realms/pretui/components/known-date.usage.gts +192 -0
  433. package/bundled-realms/pretui/components/label.gts +60 -0
  434. package/bundled-realms/pretui/components/label.md +56 -0
  435. package/bundled-realms/pretui/components/label.usage.gts +63 -0
  436. package/bundled-realms/pretui/components/layer-manager.gts +1884 -0
  437. package/bundled-realms/pretui/components/layer-manager.md +59 -0
  438. package/bundled-realms/pretui/components/layer-manager.usage.gts +233 -0
  439. package/bundled-realms/pretui/components/lightbox.gts +461 -0
  440. package/bundled-realms/pretui/components/lightbox.md +57 -0
  441. package/bundled-realms/pretui/components/lightbox.usage.gts +180 -0
  442. package/bundled-realms/pretui/components/line-grid.examples.gts +156 -0
  443. package/bundled-realms/pretui/components/line-grid.gts +523 -0
  444. package/bundled-realms/pretui/components/line-grid.md +55 -0
  445. package/bundled-realms/pretui/components/line-grid.usage.gts +181 -0
  446. package/bundled-realms/pretui/components/list.gts +679 -0
  447. package/bundled-realms/pretui/components/list.md +90 -0
  448. package/bundled-realms/pretui/components/list.usage.gts +203 -0
  449. package/bundled-realms/pretui/components/loader.gts +2 -0
  450. package/bundled-realms/pretui/components/loader.md +33 -0
  451. package/bundled-realms/pretui/components/loader.usage.gts +35 -0
  452. package/bundled-realms/pretui/components/loading-overlay.gts +120 -0
  453. package/bundled-realms/pretui/components/loading-overlay.md +68 -0
  454. package/bundled-realms/pretui/components/loading-overlay.usage.gts +102 -0
  455. package/bundled-realms/pretui/components/loading-state.gts +124 -0
  456. package/bundled-realms/pretui/components/loading-state.md +48 -0
  457. package/bundled-realms/pretui/components/loading-state.usage.gts +16 -0
  458. package/bundled-realms/pretui/components/lookup.gts +451 -0
  459. package/bundled-realms/pretui/components/lookup.md +59 -0
  460. package/bundled-realms/pretui/components/lookup.usage.gts +235 -0
  461. package/bundled-realms/pretui/components/magnetic.gts +158 -0
  462. package/bundled-realms/pretui/components/magnetic.md +48 -0
  463. package/bundled-realms/pretui/components/magnetic.usage.gts +125 -0
  464. package/bundled-realms/pretui/components/marquee.gts +141 -0
  465. package/bundled-realms/pretui/components/marquee.md +43 -0
  466. package/bundled-realms/pretui/components/marquee.usage.gts +116 -0
  467. package/bundled-realms/pretui/components/masonry.gts +95 -0
  468. package/bundled-realms/pretui/components/masonry.md +59 -0
  469. package/bundled-realms/pretui/components/masonry.usage.gts +238 -0
  470. package/bundled-realms/pretui/components/media-inspector.gts +145 -0
  471. package/bundled-realms/pretui/components/media-inspector.md +46 -0
  472. package/bundled-realms/pretui/components/media-inspector.usage.gts +83 -0
  473. package/bundled-realms/pretui/components/media-player.gts +1133 -0
  474. package/bundled-realms/pretui/components/media-player.md +74 -0
  475. package/bundled-realms/pretui/components/media-player.usage.gts +265 -0
  476. package/bundled-realms/pretui/components/media-viewer.gts +136 -0
  477. package/bundled-realms/pretui/components/media-viewer.md +47 -0
  478. package/bundled-realms/pretui/components/media-viewer.usage.gts +70 -0
  479. package/bundled-realms/pretui/components/mentions.gts +340 -0
  480. package/bundled-realms/pretui/components/mentions.md +65 -0
  481. package/bundled-realms/pretui/components/mentions.usage.gts +73 -0
  482. package/bundled-realms/pretui/components/menu-panel.gts +367 -0
  483. package/bundled-realms/pretui/components/menu.gts +652 -0
  484. package/bundled-realms/pretui/components/menu.md +69 -0
  485. package/bundled-realms/pretui/components/menu.usage.gts +116 -0
  486. package/bundled-realms/pretui/components/menubar.gts +1200 -0
  487. package/bundled-realms/pretui/components/menubar.md +49 -0
  488. package/bundled-realms/pretui/components/menubar.usage.gts +220 -0
  489. package/bundled-realms/pretui/components/meter.gts +113 -0
  490. package/bundled-realms/pretui/components/meter.md +50 -0
  491. package/bundled-realms/pretui/components/meter.usage.gts +50 -0
  492. package/bundled-realms/pretui/components/modal.gts +2 -0
  493. package/bundled-realms/pretui/components/modal.md +41 -0
  494. package/bundled-realms/pretui/components/modal.usage.gts +50 -0
  495. package/bundled-realms/pretui/components/model-viewer.gts +658 -0
  496. package/bundled-realms/pretui/components/model-viewer.md +57 -0
  497. package/bundled-realms/pretui/components/model-viewer.usage.gts +123 -0
  498. package/bundled-realms/pretui/components/money-input.gts +66 -0
  499. package/bundled-realms/pretui/components/money-input.md +43 -0
  500. package/bundled-realms/pretui/components/money-input.usage.gts +293 -0
  501. package/bundled-realms/pretui/components/morphing-dialog.gts +173 -0
  502. package/bundled-realms/pretui/components/morphing-dialog.md +46 -0
  503. package/bundled-realms/pretui/components/morphing-dialog.usage.gts +168 -0
  504. package/bundled-realms/pretui/components/morphing-popover.gts +245 -0
  505. package/bundled-realms/pretui/components/morphing-popover.md +47 -0
  506. package/bundled-realms/pretui/components/morphing-popover.usage.gts +176 -0
  507. package/bundled-realms/pretui/components/multi-select.gts +392 -0
  508. package/bundled-realms/pretui/components/multi-select.md +57 -0
  509. package/bundled-realms/pretui/components/multi-select.usage.gts +97 -0
  510. package/bundled-realms/pretui/components/native-select.gts +212 -0
  511. package/bundled-realms/pretui/components/native-select.md +77 -0
  512. package/bundled-realms/pretui/components/native-select.usage.gts +109 -0
  513. package/bundled-realms/pretui/components/navigation-menu.gts +351 -0
  514. package/bundled-realms/pretui/components/navigation-menu.md +65 -0
  515. package/bundled-realms/pretui/components/navigation-menu.usage.gts +61 -0
  516. package/bundled-realms/pretui/components/node-canvas.gts +1174 -0
  517. package/bundled-realms/pretui/components/node-canvas.md +57 -0
  518. package/bundled-realms/pretui/components/node-canvas.usage.gts +548 -0
  519. package/bundled-realms/pretui/components/node-card.gts +181 -0
  520. package/bundled-realms/pretui/components/node-card.md +53 -0
  521. package/bundled-realms/pretui/components/node-card.usage.gts +156 -0
  522. package/bundled-realms/pretui/components/notification.gts +242 -0
  523. package/bundled-realms/pretui/components/notification.md +69 -0
  524. package/bundled-realms/pretui/components/notification.usage.gts +125 -0
  525. package/bundled-realms/pretui/components/number-input.gts +191 -0
  526. package/bundled-realms/pretui/components/number-input.md +54 -0
  527. package/bundled-realms/pretui/components/number-input.usage.gts +132 -0
  528. package/bundled-realms/pretui/components/odometer.gts +349 -0
  529. package/bundled-realms/pretui/components/odometer.md +55 -0
  530. package/bundled-realms/pretui/components/odometer.usage.gts +258 -0
  531. package/bundled-realms/pretui/components/onboarding.gts +298 -0
  532. package/bundled-realms/pretui/components/onboarding.md +48 -0
  533. package/bundled-realms/pretui/components/onboarding.usage.gts +155 -0
  534. package/bundled-realms/pretui/components/origin-grid.gts +486 -0
  535. package/bundled-realms/pretui/components/origin-grid.md +47 -0
  536. package/bundled-realms/pretui/components/origin-grid.usage.gts +87 -0
  537. package/bundled-realms/pretui/components/otp-input.gts +289 -0
  538. package/bundled-realms/pretui/components/otp-input.md +47 -0
  539. package/bundled-realms/pretui/components/otp-input.usage.gts +131 -0
  540. package/bundled-realms/pretui/components/page-scaffold.gts +343 -0
  541. package/bundled-realms/pretui/components/page-scaffold.md +57 -0
  542. package/bundled-realms/pretui/components/page-scaffold.usage.gts +391 -0
  543. package/bundled-realms/pretui/components/pagination.gts +150 -0
  544. package/bundled-realms/pretui/components/pagination.md +56 -0
  545. package/bundled-realms/pretui/components/pagination.usage.gts +33 -0
  546. package/bundled-realms/pretui/components/panel-section.gts +301 -0
  547. package/bundled-realms/pretui/components/panel-section.md +48 -0
  548. package/bundled-realms/pretui/components/panel-section.usage.gts +137 -0
  549. package/bundled-realms/pretui/components/panel.gts +158 -0
  550. package/bundled-realms/pretui/components/panel.md +58 -0
  551. package/bundled-realms/pretui/components/panel.usage.gts +82 -0
  552. package/bundled-realms/pretui/components/password-input.gts +329 -0
  553. package/bundled-realms/pretui/components/password-input.md +58 -0
  554. package/bundled-realms/pretui/components/password-input.usage.gts +156 -0
  555. package/bundled-realms/pretui/components/password-strength.gts +485 -0
  556. package/bundled-realms/pretui/components/password-strength.md +50 -0
  557. package/bundled-realms/pretui/components/password-strength.usage.gts +34 -0
  558. package/bundled-realms/pretui/components/path-text.gts +288 -0
  559. package/bundled-realms/pretui/components/path-text.md +58 -0
  560. package/bundled-realms/pretui/components/path-text.usage.gts +239 -0
  561. package/bundled-realms/pretui/components/period-input.gts +1100 -0
  562. package/bundled-realms/pretui/components/period-input.md +54 -0
  563. package/bundled-realms/pretui/components/period-input.usage.gts +299 -0
  564. package/bundled-realms/pretui/components/phone-input.gts +80 -0
  565. package/bundled-realms/pretui/components/phone-input.md +55 -0
  566. package/bundled-realms/pretui/components/phone-input.usage.gts +91 -0
  567. package/bundled-realms/pretui/components/pin-input.gts +2 -0
  568. package/bundled-realms/pretui/components/pin-input.md +45 -0
  569. package/bundled-realms/pretui/components/pin-input.usage.gts +39 -0
  570. package/bundled-realms/pretui/components/pip-scale.gts +717 -0
  571. package/bundled-realms/pretui/components/pip-scale.md +55 -0
  572. package/bundled-realms/pretui/components/pip-scale.usage.gts +318 -0
  573. package/bundled-realms/pretui/components/popconfirm.gts +380 -0
  574. package/bundled-realms/pretui/components/popconfirm.md +78 -0
  575. package/bundled-realms/pretui/components/popconfirm.usage.gts +171 -0
  576. package/bundled-realms/pretui/components/popover.gts +198 -0
  577. package/bundled-realms/pretui/components/popover.md +57 -0
  578. package/bundled-realms/pretui/components/popover.usage.gts +106 -0
  579. package/bundled-realms/pretui/components/popup.gts +85 -0
  580. package/bundled-realms/pretui/components/popup.md +42 -0
  581. package/bundled-realms/pretui/components/popup.usage.gts +23 -0
  582. package/bundled-realms/pretui/components/presence.gts +156 -0
  583. package/bundled-realms/pretui/components/presence.md +55 -0
  584. package/bundled-realms/pretui/components/presence.usage.gts +204 -0
  585. package/bundled-realms/pretui/components/progress-bar.gts +177 -0
  586. package/bundled-realms/pretui/components/progress-bar.md +63 -0
  587. package/bundled-realms/pretui/components/progress-bar.usage.gts +172 -0
  588. package/bundled-realms/pretui/components/progress-radial.gts +67 -0
  589. package/bundled-realms/pretui/components/progress-radial.md +55 -0
  590. package/bundled-realms/pretui/components/progress-radial.usage.gts +76 -0
  591. package/bundled-realms/pretui/components/prompt-library.gts +358 -0
  592. package/bundled-realms/pretui/components/prompt-library.md +45 -0
  593. package/bundled-realms/pretui/components/prompt-library.usage.gts +117 -0
  594. package/bundled-realms/pretui/components/property-row.gts +316 -0
  595. package/bundled-realms/pretui/components/property-row.md +55 -0
  596. package/bundled-realms/pretui/components/property-row.usage.gts +146 -0
  597. package/bundled-realms/pretui/components/property-sheet.gts +133 -0
  598. package/bundled-realms/pretui/components/property-sheet.md +48 -0
  599. package/bundled-realms/pretui/components/property-sheet.usage.gts +132 -0
  600. package/bundled-realms/pretui/components/prose.gts +31 -0
  601. package/bundled-realms/pretui/components/prose.md +57 -0
  602. package/bundled-realms/pretui/components/prose.usage.gts +15 -0
  603. package/bundled-realms/pretui/components/pulsing-border.gts +297 -0
  604. package/bundled-realms/pretui/components/pulsing-border.md +65 -0
  605. package/bundled-realms/pretui/components/pulsing-border.usage.gts +253 -0
  606. package/bundled-realms/pretui/components/qr-code.gts +660 -0
  607. package/bundled-realms/pretui/components/qr-code.md +58 -0
  608. package/bundled-realms/pretui/components/qr-code.usage.gts +224 -0
  609. package/bundled-realms/pretui/components/queued-message.gts +83 -0
  610. package/bundled-realms/pretui/components/queued-message.md +53 -0
  611. package/bundled-realms/pretui/components/queued-message.usage.gts +21 -0
  612. package/bundled-realms/pretui/components/radio-card.gts +88 -0
  613. package/bundled-realms/pretui/components/radio-card.md +72 -0
  614. package/bundled-realms/pretui/components/radio-card.usage.gts +148 -0
  615. package/bundled-realms/pretui/components/radio-group.gts +119 -0
  616. package/bundled-realms/pretui/components/radio-group.md +46 -0
  617. package/bundled-realms/pretui/components/radio-group.usage.gts +80 -0
  618. package/bundled-realms/pretui/components/range-slider.gts +34 -0
  619. package/bundled-realms/pretui/components/range-slider.md +47 -0
  620. package/bundled-realms/pretui/components/range-slider.usage.gts +46 -0
  621. package/bundled-realms/pretui/components/rating.examples.gts +67 -0
  622. package/bundled-realms/pretui/components/rating.gts +266 -0
  623. package/bundled-realms/pretui/components/rating.md +55 -0
  624. package/bundled-realms/pretui/components/rating.usage.gts +96 -0
  625. package/bundled-realms/pretui/components/readiness-panel.gts +856 -0
  626. package/bundled-realms/pretui/components/readiness-panel.md +64 -0
  627. package/bundled-realms/pretui/components/readiness-panel.usage.gts +372 -0
  628. package/bundled-realms/pretui/components/recommendation.gts +316 -0
  629. package/bundled-realms/pretui/components/recommendation.md +49 -0
  630. package/bundled-realms/pretui/components/recommendation.usage.gts +103 -0
  631. package/bundled-realms/pretui/components/record-detail.gts +1170 -0
  632. package/bundled-realms/pretui/components/record-detail.md +63 -0
  633. package/bundled-realms/pretui/components/record-detail.usage.gts +533 -0
  634. package/bundled-realms/pretui/components/record-face.gts +153 -0
  635. package/bundled-realms/pretui/components/record-pill.gts +116 -0
  636. package/bundled-realms/pretui/components/record-pill.md +55 -0
  637. package/bundled-realms/pretui/components/record-pill.usage.gts +108 -0
  638. package/bundled-realms/pretui/components/relative-time.gts +88 -0
  639. package/bundled-realms/pretui/components/relative-time.md +58 -0
  640. package/bundled-realms/pretui/components/relative-time.usage.gts +89 -0
  641. package/bundled-realms/pretui/components/reorder.gts +620 -0
  642. package/bundled-realms/pretui/components/reorder.md +47 -0
  643. package/bundled-realms/pretui/components/reorder.usage.gts +171 -0
  644. package/bundled-realms/pretui/components/resizable.gts +2 -0
  645. package/bundled-realms/pretui/components/resizable.md +37 -0
  646. package/bundled-realms/pretui/components/resizable.usage.gts +53 -0
  647. package/bundled-realms/pretui/components/result-card.gts +68 -0
  648. package/bundled-realms/pretui/components/result-card.md +45 -0
  649. package/bundled-realms/pretui/components/result-card.usage.gts +29 -0
  650. package/bundled-realms/pretui/components/result.gts +204 -0
  651. package/bundled-realms/pretui/components/result.md +67 -0
  652. package/bundled-realms/pretui/components/result.usage.gts +85 -0
  653. package/bundled-realms/pretui/components/rule-row.gts +462 -0
  654. package/bundled-realms/pretui/components/rule-row.md +60 -0
  655. package/bundled-realms/pretui/components/rule-row.usage.gts +157 -0
  656. package/bundled-realms/pretui/components/scroll-area.gts +121 -0
  657. package/bundled-realms/pretui/components/scroll-area.md +59 -0
  658. package/bundled-realms/pretui/components/scroll-area.usage.gts +175 -0
  659. package/bundled-realms/pretui/components/scroll-progress.gts +222 -0
  660. package/bundled-realms/pretui/components/scroll-progress.md +48 -0
  661. package/bundled-realms/pretui/components/scroll-progress.usage.gts +162 -0
  662. package/bundled-realms/pretui/components/scroller.gts +323 -0
  663. package/bundled-realms/pretui/components/scroller.md +44 -0
  664. package/bundled-realms/pretui/components/scroller.usage.gts +184 -0
  665. package/bundled-realms/pretui/components/scrub-input.gts +691 -0
  666. package/bundled-realms/pretui/components/scrub-input.md +61 -0
  667. package/bundled-realms/pretui/components/scrub-input.usage.gts +275 -0
  668. package/bundled-realms/pretui/components/search-input.gts +141 -0
  669. package/bundled-realms/pretui/components/search-input.md +56 -0
  670. package/bundled-realms/pretui/components/search-input.usage.gts +91 -0
  671. package/bundled-realms/pretui/components/segmented-control.gts +198 -0
  672. package/bundled-realms/pretui/components/segmented-control.md +39 -0
  673. package/bundled-realms/pretui/components/segmented-control.usage.gts +66 -0
  674. package/bundled-realms/pretui/components/select.examples.gts +80 -0
  675. package/bundled-realms/pretui/components/select.gts +481 -0
  676. package/bundled-realms/pretui/components/select.md +71 -0
  677. package/bundled-realms/pretui/components/select.usage.gts +109 -0
  678. package/bundled-realms/pretui/components/separator.gts +2 -0
  679. package/bundled-realms/pretui/components/separator.md +36 -0
  680. package/bundled-realms/pretui/components/separator.usage.gts +32 -0
  681. package/bundled-realms/pretui/components/session-prep.gts +164 -0
  682. package/bundled-realms/pretui/components/session-prep.md +48 -0
  683. package/bundled-realms/pretui/components/session-prep.usage.gts +122 -0
  684. package/bundled-realms/pretui/components/sheet-toolbar.gts +130 -0
  685. package/bundled-realms/pretui/components/sheet-toolbar.md +51 -0
  686. package/bundled-realms/pretui/components/sheet-toolbar.usage.gts +151 -0
  687. package/bundled-realms/pretui/components/sheet.gts +1166 -0
  688. package/bundled-realms/pretui/components/sheet.md +78 -0
  689. package/bundled-realms/pretui/components/sheet.usage.gts +318 -0
  690. package/bundled-realms/pretui/components/sidebar.gts +1165 -0
  691. package/bundled-realms/pretui/components/sidebar.md +88 -0
  692. package/bundled-realms/pretui/components/sidebar.usage.gts +360 -0
  693. package/bundled-realms/pretui/components/signature-pad.gts +840 -0
  694. package/bundled-realms/pretui/components/signature-pad.md +57 -0
  695. package/bundled-realms/pretui/components/signature-pad.usage.gts +222 -0
  696. package/bundled-realms/pretui/components/skeleton.gts +46 -0
  697. package/bundled-realms/pretui/components/skeleton.md +56 -0
  698. package/bundled-realms/pretui/components/skeleton.usage.gts +56 -0
  699. package/bundled-realms/pretui/components/skip-link.gts +65 -0
  700. package/bundled-realms/pretui/components/skip-link.md +49 -0
  701. package/bundled-realms/pretui/components/skip-link.usage.gts +47 -0
  702. package/bundled-realms/pretui/components/slide-over.gts +2 -0
  703. package/bundled-realms/pretui/components/slide-over.md +41 -0
  704. package/bundled-realms/pretui/components/slide-over.usage.gts +50 -0
  705. package/bundled-realms/pretui/components/slider.examples.gts +61 -0
  706. package/bundled-realms/pretui/components/slider.gts +331 -0
  707. package/bundled-realms/pretui/components/slider.md +59 -0
  708. package/bundled-realms/pretui/components/slider.usage.gts +99 -0
  709. package/bundled-realms/pretui/components/sliding-highlight.gts +249 -0
  710. package/bundled-realms/pretui/components/sliding-highlight.md +58 -0
  711. package/bundled-realms/pretui/components/sliding-highlight.usage.gts +184 -0
  712. package/bundled-realms/pretui/components/snackbar.gts +2 -0
  713. package/bundled-realms/pretui/components/snackbar.md +34 -0
  714. package/bundled-realms/pretui/components/snackbar.usage.gts +31 -0
  715. package/bundled-realms/pretui/components/sonner.gts +2 -0
  716. package/bundled-realms/pretui/components/sonner.md +42 -0
  717. package/bundled-realms/pretui/components/sonner.usage.gts +43 -0
  718. package/bundled-realms/pretui/components/sparkline.gts +233 -0
  719. package/bundled-realms/pretui/components/sparkline.md +58 -0
  720. package/bundled-realms/pretui/components/sparkline.usage.gts +74 -0
  721. package/bundled-realms/pretui/components/spinner.gts +57 -0
  722. package/bundled-realms/pretui/components/spinner.md +49 -0
  723. package/bundled-realms/pretui/components/spinner.usage.gts +65 -0
  724. package/bundled-realms/pretui/components/split-panes.gts +69 -0
  725. package/bundled-realms/pretui/components/split-panes.md +54 -0
  726. package/bundled-realms/pretui/components/split-panes.usage.gts +171 -0
  727. package/bundled-realms/pretui/components/spotlight.gts +174 -0
  728. package/bundled-realms/pretui/components/spotlight.md +51 -0
  729. package/bundled-realms/pretui/components/spotlight.usage.gts +197 -0
  730. package/bundled-realms/pretui/components/stack-divider.gts +58 -0
  731. package/bundled-realms/pretui/components/stack.gts +284 -0
  732. package/bundled-realms/pretui/components/stack.md +81 -0
  733. package/bundled-realms/pretui/components/stack.usage.gts +228 -0
  734. package/bundled-realms/pretui/components/stacking-cards.gts +137 -0
  735. package/bundled-realms/pretui/components/stacking-cards.md +40 -0
  736. package/bundled-realms/pretui/components/stacking-cards.usage.gts +124 -0
  737. package/bundled-realms/pretui/components/stat.gts +216 -0
  738. package/bundled-realms/pretui/components/stat.md +57 -0
  739. package/bundled-realms/pretui/components/stat.usage.gts +16 -0
  740. package/bundled-realms/pretui/components/statement-table.examples.gts +185 -0
  741. package/bundled-realms/pretui/components/statement-table.gts +792 -0
  742. package/bundled-realms/pretui/components/statement-table.md +58 -0
  743. package/bundled-realms/pretui/components/statement-table.usage.gts +252 -0
  744. package/bundled-realms/pretui/components/status-chip.gts +37 -0
  745. package/bundled-realms/pretui/components/status-chip.md +48 -0
  746. package/bundled-realms/pretui/components/status-chip.usage.gts +36 -0
  747. package/bundled-realms/pretui/components/step-list.gts +624 -0
  748. package/bundled-realms/pretui/components/step-list.md +50 -0
  749. package/bundled-realms/pretui/components/step-list.usage.gts +166 -0
  750. package/bundled-realms/pretui/components/stepper.gts +201 -0
  751. package/bundled-realms/pretui/components/stepper.md +54 -0
  752. package/bundled-realms/pretui/components/stepper.usage.gts +103 -0
  753. package/bundled-realms/pretui/components/steps-with-media.gts +254 -0
  754. package/bundled-realms/pretui/components/steps-with-media.md +54 -0
  755. package/bundled-realms/pretui/components/steps-with-media.usage.gts +208 -0
  756. package/bundled-realms/pretui/components/streaming-text.gts +77 -0
  757. package/bundled-realms/pretui/components/streaming-text.md +55 -0
  758. package/bundled-realms/pretui/components/streaming-text.usage.gts +15 -0
  759. package/bundled-realms/pretui/components/swatch-chip.gts +104 -0
  760. package/bundled-realms/pretui/components/swatch-chip.md +47 -0
  761. package/bundled-realms/pretui/components/swatch-chip.usage.gts +21 -0
  762. package/bundled-realms/pretui/components/swatch.gts +141 -0
  763. package/bundled-realms/pretui/components/swatch.md +50 -0
  764. package/bundled-realms/pretui/components/swatch.usage.gts +80 -0
  765. package/bundled-realms/pretui/components/switch.examples.gts +53 -0
  766. package/bundled-realms/pretui/components/switch.gts +118 -0
  767. package/bundled-realms/pretui/components/switch.md +62 -0
  768. package/bundled-realms/pretui/components/switch.usage.gts +59 -0
  769. package/bundled-realms/pretui/components/table-of-contents.gts +384 -0
  770. package/bundled-realms/pretui/components/table-of-contents.md +75 -0
  771. package/bundled-realms/pretui/components/table-of-contents.usage.gts +270 -0
  772. package/bundled-realms/pretui/components/table.gts +158 -0
  773. package/bundled-realms/pretui/components/table.md +80 -0
  774. package/bundled-realms/pretui/components/table.usage.gts +44 -0
  775. package/bundled-realms/pretui/components/tabs.gts +117 -0
  776. package/bundled-realms/pretui/components/tabs.md +58 -0
  777. package/bundled-realms/pretui/components/tabs.usage.gts +94 -0
  778. package/bundled-realms/pretui/components/tags-input.gts +52 -0
  779. package/bundled-realms/pretui/components/tags-input.md +48 -0
  780. package/bundled-realms/pretui/components/tags-input.usage.gts +56 -0
  781. package/bundled-realms/pretui/components/task-row.gts +483 -0
  782. package/bundled-realms/pretui/components/task-row.md +48 -0
  783. package/bundled-realms/pretui/components/task-row.usage.gts +119 -0
  784. package/bundled-realms/pretui/components/terminal-animation.gts +355 -0
  785. package/bundled-realms/pretui/components/terminal-animation.md +49 -0
  786. package/bundled-realms/pretui/components/terminal-animation.usage.gts +110 -0
  787. package/bundled-realms/pretui/components/text-effects.gts +339 -0
  788. package/bundled-realms/pretui/components/text-effects.md +49 -0
  789. package/bundled-realms/pretui/components/text-effects.usage.gts +192 -0
  790. package/bundled-realms/pretui/components/text-morph.gts +292 -0
  791. package/bundled-realms/pretui/components/text-morph.md +45 -0
  792. package/bundled-realms/pretui/components/text-morph.usage.gts +117 -0
  793. package/bundled-realms/pretui/components/text-rotate.gts +121 -0
  794. package/bundled-realms/pretui/components/text-rotate.md +44 -0
  795. package/bundled-realms/pretui/components/text-rotate.usage.gts +73 -0
  796. package/bundled-realms/pretui/components/text-scramble.gts +189 -0
  797. package/bundled-realms/pretui/components/text-scramble.md +42 -0
  798. package/bundled-realms/pretui/components/text-scramble.usage.gts +80 -0
  799. package/bundled-realms/pretui/components/text-shimmer.gts +89 -0
  800. package/bundled-realms/pretui/components/text-shimmer.md +42 -0
  801. package/bundled-realms/pretui/components/text-shimmer.usage.gts +69 -0
  802. package/bundled-realms/pretui/components/textarea.gts +112 -0
  803. package/bundled-realms/pretui/components/textarea.md +51 -0
  804. package/bundled-realms/pretui/components/textarea.usage.gts +100 -0
  805. package/bundled-realms/pretui/components/theme-frame.gts +272 -0
  806. package/bundled-realms/pretui/components/theme-frame.md +48 -0
  807. package/bundled-realms/pretui/components/thinking.gts +431 -0
  808. package/bundled-realms/pretui/components/thinking.md +47 -0
  809. package/bundled-realms/pretui/components/thinking.usage.gts +134 -0
  810. package/bundled-realms/pretui/components/tilt.gts +194 -0
  811. package/bundled-realms/pretui/components/tilt.md +50 -0
  812. package/bundled-realms/pretui/components/tilt.usage.gts +174 -0
  813. package/bundled-realms/pretui/components/time-input.gts +583 -0
  814. package/bundled-realms/pretui/components/time-input.md +51 -0
  815. package/bundled-realms/pretui/components/time-input.usage.gts +110 -0
  816. package/bundled-realms/pretui/components/timeline.gts +269 -0
  817. package/bundled-realms/pretui/components/timeline.md +63 -0
  818. package/bundled-realms/pretui/components/timeline.usage.gts +180 -0
  819. package/bundled-realms/pretui/components/toast.gts +85 -0
  820. package/bundled-realms/pretui/components/toast.md +57 -0
  821. package/bundled-realms/pretui/components/toast.usage.gts +18 -0
  822. package/bundled-realms/pretui/components/toaster.gts +808 -0
  823. package/bundled-realms/pretui/components/toaster.md +83 -0
  824. package/bundled-realms/pretui/components/toaster.usage.gts +256 -0
  825. package/bundled-realms/pretui/components/toggle-group.gts +435 -0
  826. package/bundled-realms/pretui/components/toggle-group.md +59 -0
  827. package/bundled-realms/pretui/components/toggle-group.usage.gts +260 -0
  828. package/bundled-realms/pretui/components/toggle-matrix.gts +994 -0
  829. package/bundled-realms/pretui/components/toggle-matrix.md +44 -0
  830. package/bundled-realms/pretui/components/toggle-matrix.usage.gts +243 -0
  831. package/bundled-realms/pretui/components/toggle.gts +235 -0
  832. package/bundled-realms/pretui/components/toggle.md +59 -0
  833. package/bundled-realms/pretui/components/toggle.usage.gts +244 -0
  834. package/bundled-realms/pretui/components/token-input.gts +483 -0
  835. package/bundled-realms/pretui/components/token-input.md +50 -0
  836. package/bundled-realms/pretui/components/token-input.usage.gts +137 -0
  837. package/bundled-realms/pretui/components/token.gts +197 -0
  838. package/bundled-realms/pretui/components/token.md +63 -0
  839. package/bundled-realms/pretui/components/token.usage.gts +128 -0
  840. package/bundled-realms/pretui/components/toolbar.gts +62 -0
  841. package/bundled-realms/pretui/components/toolbar.md +50 -0
  842. package/bundled-realms/pretui/components/toolbar.usage.gts +78 -0
  843. package/bundled-realms/pretui/components/tooltip.gts +212 -0
  844. package/bundled-realms/pretui/components/tooltip.md +53 -0
  845. package/bundled-realms/pretui/components/tooltip.usage.gts +64 -0
  846. package/bundled-realms/pretui/components/tour.gts +436 -0
  847. package/bundled-realms/pretui/components/tour.md +62 -0
  848. package/bundled-realms/pretui/components/tour.usage.gts +70 -0
  849. package/bundled-realms/pretui/components/transfer.gts +2 -0
  850. package/bundled-realms/pretui/components/transfer.md +39 -0
  851. package/bundled-realms/pretui/components/transfer.usage.gts +52 -0
  852. package/bundled-realms/pretui/components/transmute.gts +103 -0
  853. package/bundled-realms/pretui/components/transmute.md +49 -0
  854. package/bundled-realms/pretui/components/transmute.usage.gts +16 -0
  855. package/bundled-realms/pretui/components/tree-select.gts +596 -0
  856. package/bundled-realms/pretui/components/tree-select.md +70 -0
  857. package/bundled-realms/pretui/components/tree-select.usage.gts +75 -0
  858. package/bundled-realms/pretui/components/tree.gts +532 -0
  859. package/bundled-realms/pretui/components/tree.md +68 -0
  860. package/bundled-realms/pretui/components/tree.usage.gts +278 -0
  861. package/bundled-realms/pretui/components/trim-bar.gts +611 -0
  862. package/bundled-realms/pretui/components/trim-bar.md +48 -0
  863. package/bundled-realms/pretui/components/trim-bar.usage.gts +112 -0
  864. package/bundled-realms/pretui/components/typewriter.gts +122 -0
  865. package/bundled-realms/pretui/components/typewriter.md +45 -0
  866. package/bundled-realms/pretui/components/typewriter.usage.gts +105 -0
  867. package/bundled-realms/pretui/components/typography.gts +379 -0
  868. package/bundled-realms/pretui/components/typography.md +77 -0
  869. package/bundled-realms/pretui/components/typography.usage.gts +52 -0
  870. package/bundled-realms/pretui/components/url-input.gts +130 -0
  871. package/bundled-realms/pretui/components/url-input.md +58 -0
  872. package/bundled-realms/pretui/components/url-input.usage.gts +97 -0
  873. package/bundled-realms/pretui/components/usage-action.gts +16 -0
  874. package/bundled-realms/pretui/components/usage-argument.gts +109 -0
  875. package/bundled-realms/pretui/components/usage-argument.md +44 -0
  876. package/bundled-realms/pretui/components/usage-array.gts +80 -0
  877. package/bundled-realms/pretui/components/usage-array.md +47 -0
  878. package/bundled-realms/pretui/components/usage-bool.gts +62 -0
  879. package/bundled-realms/pretui/components/usage-bool.md +47 -0
  880. package/bundled-realms/pretui/components/usage-component-arg.gts +16 -0
  881. package/bundled-realms/pretui/components/usage-css-variable.gts +56 -0
  882. package/bundled-realms/pretui/components/usage-css-variable.md +48 -0
  883. package/bundled-realms/pretui/components/usage-number.gts +127 -0
  884. package/bundled-realms/pretui/components/usage-number.md +48 -0
  885. package/bundled-realms/pretui/components/usage-object.gts +58 -0
  886. package/bundled-realms/pretui/components/usage-object.md +48 -0
  887. package/bundled-realms/pretui/components/usage-string.gts +89 -0
  888. package/bundled-realms/pretui/components/usage-string.md +46 -0
  889. package/bundled-realms/pretui/components/usage-yield.gts +16 -0
  890. package/bundled-realms/pretui/components/value-input.gts +265 -0
  891. package/bundled-realms/pretui/components/value-input.md +49 -0
  892. package/bundled-realms/pretui/components/value-input.usage.gts +176 -0
  893. package/bundled-realms/pretui/components/video-player.gts +80 -0
  894. package/bundled-realms/pretui/components/video-player.md +46 -0
  895. package/bundled-realms/pretui/components/video-player.usage.gts +107 -0
  896. package/bundled-realms/pretui/components/viewport.gts +520 -0
  897. package/bundled-realms/pretui/components/viewport.md +55 -0
  898. package/bundled-realms/pretui/components/visually-hidden.gts +49 -0
  899. package/bundled-realms/pretui/components/visually-hidden.md +47 -0
  900. package/bundled-realms/pretui/components/visually-hidden.usage.gts +27 -0
  901. package/bundled-realms/pretui/components/watermark.gts +141 -0
  902. package/bundled-realms/pretui/components/watermark.md +58 -0
  903. package/bundled-realms/pretui/components/watermark.usage.gts +63 -0
  904. package/bundled-realms/pretui/components/waveform.gts +376 -0
  905. package/bundled-realms/pretui/components/waveform.md +56 -0
  906. package/bundled-realms/pretui/components/waveform.usage.gts +131 -0
  907. package/bundled-realms/pretui/components/wizard.gts +677 -0
  908. package/bundled-realms/pretui/components/wizard.md +58 -0
  909. package/bundled-realms/pretui/components/wizard.usage.gts +188 -0
  910. package/bundled-realms/pretui/components/work-item.gts +207 -0
  911. package/bundled-realms/pretui/components/work-item.md +58 -0
  912. package/bundled-realms/pretui/components/work-item.usage.gts +103 -0
  913. package/bundled-realms/pretui/components/zoomable-frame.gts +541 -0
  914. package/bundled-realms/pretui/components/zoomable-frame.md +50 -0
  915. package/bundled-realms/pretui/components/zoomable-frame.usage.gts +175 -0
  916. package/bundled-realms/pretui/cropper/LICENSE +21 -0
  917. package/bundled-realms/pretui/cropper/README.md +92 -0
  918. package/bundled-realms/pretui/cropper/index.js +81 -0
  919. package/bundled-realms/pretui/data-component.gts +1161 -0
  920. package/bundled-realms/pretui/demo-design-layers.gts +112 -0
  921. package/bundled-realms/pretui/demo-design-tools.gts +463 -0
  922. package/bundled-realms/pretui/demo-design-value.gts +9 -0
  923. package/bundled-realms/pretui/demo-forms-core.gts +82 -0
  924. package/bundled-realms/pretui/demo-forms-expression.gts +76 -0
  925. package/bundled-realms/pretui/demo-forms-record.gts +16 -0
  926. package/bundled-realms/pretui/demo-foundations-more.gts +10 -0
  927. package/bundled-realms/pretui/demo-foundations.gts +8 -0
  928. package/bundled-realms/pretui/demo-ink-feedback.gts +12 -0
  929. package/bundled-realms/pretui/demo-json.gts +17 -0
  930. package/bundled-realms/pretui/demo-locations.ts +103 -0
  931. package/bundled-realms/pretui/demo-media-library.gts +101 -0
  932. package/bundled-realms/pretui/demo-media.gts +6 -0
  933. package/bundled-realms/pretui/demo-menu.gts +182 -0
  934. package/bundled-realms/pretui/demo-motion-core.gts +4 -0
  935. package/bundled-realms/pretui/demo-motion-pointer.gts +21 -0
  936. package/bundled-realms/pretui/demo-reading-format.gts +10 -0
  937. package/bundled-realms/pretui/demo-structure-dashboard.gts +212 -0
  938. package/bundled-realms/pretui/demo-structure-data.gts +4 -0
  939. package/bundled-realms/pretui/demo-structure-scroll.gts +19 -0
  940. package/bundled-realms/pretui/demo-structure.gts +21 -0
  941. package/bundled-realms/pretui/demo-surfaces-grid.gts +104 -0
  942. package/bundled-realms/pretui/demo-texture.gts +21 -0
  943. package/bundled-realms/pretui/docs/catalog-taxonomy.md +200 -0
  944. package/bundled-realms/pretui/docs/composites.md +13 -0
  945. package/bundled-realms/pretui/docs/reading.md +12 -0
  946. package/bundled-realms/pretui/docs/structure.md +8 -0
  947. package/bundled-realms/pretui/emoji-data/LICENSE +202 -0
  948. package/bundled-realms/pretui/emoji-data/LICENSE.data +202 -0
  949. package/bundled-realms/pretui/emoji-data/LICENSE.emojibase +21 -0
  950. package/bundled-realms/pretui/emoji-data/LICENSE.unicode +39 -0
  951. package/bundled-realms/pretui/emoji-data/README.md +360 -0
  952. package/bundled-realms/pretui/emoji-data/data.ts +45 -0
  953. package/bundled-realms/pretui/emoji-data/engine.ts +465 -0
  954. package/bundled-realms/pretui/example-gallery.gts +129 -0
  955. package/bundled-realms/pretui/examples-kit.gts +228 -0
  956. package/bundled-realms/pretui/examples-listing.gts +51 -0
  957. package/bundled-realms/pretui/examples.gts +584 -0
  958. package/bundled-realms/pretui/focus.gts +459 -0
  959. package/bundled-realms/pretui/gridstack/LICENSE +21 -0
  960. package/bundled-realms/pretui/gridstack/README.md +103 -0
  961. package/bundled-realms/pretui/gridstack/index.js +169 -0
  962. package/bundled-realms/pretui/icon-registry.gts +753 -0
  963. package/bundled-realms/pretui/index.json +11 -0
  964. package/bundled-realms/pretui/internal/agentic-chat.gts +101 -0
  965. package/bundled-realms/pretui/internal/blocks.gts +35 -0
  966. package/bundled-realms/pretui/internal/choice-cards.gts +258 -0
  967. package/bundled-realms/pretui/internal/color-fixtures.gts +3 -0
  968. package/bundled-realms/pretui/internal/composites-fixtures.gts +16 -0
  969. package/bundled-realms/pretui/internal/corner-mark.gts +83 -0
  970. package/bundled-realms/pretui/internal/design-tools.gts +881 -0
  971. package/bundled-realms/pretui/internal/extras.gts +31 -0
  972. package/bundled-realms/pretui/internal/feedback.gts +27 -0
  973. package/bundled-realms/pretui/internal/file-intake-fixtures.gts +17 -0
  974. package/bundled-realms/pretui/internal/file-intake.gts +193 -0
  975. package/bundled-realms/pretui/internal/forms-core.gts +394 -0
  976. package/bundled-realms/pretui/internal/forms-expression.gts +837 -0
  977. package/bundled-realms/pretui/internal/forms-picker-fixtures.gts +10 -0
  978. package/bundled-realms/pretui/internal/forms-picker.gts +129 -0
  979. package/bundled-realms/pretui/internal/forms-record.gts +173 -0
  980. package/bundled-realms/pretui/internal/freestyle.gts +117 -0
  981. package/bundled-realms/pretui/internal/ink.gts +25 -0
  982. package/bundled-realms/pretui/internal/json-tree.gts +526 -0
  983. package/bundled-realms/pretui/internal/keep-style.gts +168 -0
  984. package/bundled-realms/pretui/internal/media-assets.gts +10 -0
  985. package/bundled-realms/pretui/internal/media-library.gts +14 -0
  986. package/bundled-realms/pretui/internal/media-viewer.gts +322 -0
  987. package/bundled-realms/pretui/internal/media-wave.gts +270 -0
  988. package/bundled-realms/pretui/internal/menu.gts +522 -0
  989. package/bundled-realms/pretui/internal/money-fixtures.gts +6 -0
  990. package/bundled-realms/pretui/internal/money.gts +477 -0
  991. package/bundled-realms/pretui/internal/motion-core.gts +54 -0
  992. package/bundled-realms/pretui/internal/motion-pointer.gts +234 -0
  993. package/bundled-realms/pretui/internal/overlay-confirm.gts +35 -0
  994. package/bundled-realms/pretui/internal/overlay.gts +291 -0
  995. package/bundled-realms/pretui/internal/reading-extras.gts +56 -0
  996. package/bundled-realms/pretui/internal/reading-format.gts +232 -0
  997. package/bundled-realms/pretui/internal/reading-listing.gts +232 -0
  998. package/bundled-realms/pretui/internal/structure-chart.gts +414 -0
  999. package/bundled-realms/pretui/internal/structure-dashboard.gts +503 -0
  1000. package/bundled-realms/pretui/internal/structure-flow.gts +48 -0
  1001. package/bundled-realms/pretui/internal/structure-layout-fixtures.gts +36 -0
  1002. package/bundled-realms/pretui/internal/structure-layout.gts +99 -0
  1003. package/bundled-realms/pretui/internal/structure-morph.gts +140 -0
  1004. package/bundled-realms/pretui/internal/structure-scenes.gts +25 -0
  1005. package/bundled-realms/pretui/internal/structure-scroll.gts +72 -0
  1006. package/bundled-realms/pretui/internal/structure-shell-fixtures.gts +25 -0
  1007. package/bundled-realms/pretui/internal/surfaces-canvas-fixtures.gts +5 -0
  1008. package/bundled-realms/pretui/internal/surfaces-canvas.gts +283 -0
  1009. package/bundled-realms/pretui/internal/texture.gts +81 -0
  1010. package/bundled-realms/pretui/internal/toggle-controls-fixtures.gts +7 -0
  1011. package/bundled-realms/pretui/internal/toggle-controls.gts +81 -0
  1012. package/bundled-realms/pretui/json-model.ts +1981 -0
  1013. package/bundled-realms/pretui/media-chrome/LICENSE +19 -0
  1014. package/bundled-realms/pretui/media-chrome/README.md +111 -0
  1015. package/bundled-realms/pretui/media-chrome/index.js +1647 -0
  1016. package/bundled-realms/pretui/media-examples.gts +315 -0
  1017. package/bundled-realms/pretui/model-viewer/LICENSE +202 -0
  1018. package/{LICENSE → bundled-realms/pretui/model-viewer/LICENSE-gainmap-js} +1 -1
  1019. package/bundled-realms/pretui/model-viewer/LICENSE-lit +28 -0
  1020. package/bundled-realms/pretui/model-viewer/LICENSE-three +21 -0
  1021. package/bundled-realms/pretui/model-viewer/NOTICE +67 -0
  1022. package/bundled-realms/pretui/model-viewer/README.md +122 -0
  1023. package/bundled-realms/pretui/model-viewer/index.js +6413 -0
  1024. package/bundled-realms/pretui/package.json +51 -0
  1025. package/bundled-realms/pretui/photoswipe/LICENSE +21 -0
  1026. package/bundled-realms/pretui/photoswipe/README.md +91 -0
  1027. package/bundled-realms/pretui/photoswipe/index.js +149 -0
  1028. package/bundled-realms/pretui/photoswipe/style.ts +465 -0
  1029. package/bundled-realms/pretui/plot/LICENSE +13 -0
  1030. package/bundled-realms/pretui/plot/LICENSE.d3 +13 -0
  1031. package/bundled-realms/pretui/plot/LICENSE.interval-tree-1d +22 -0
  1032. package/bundled-realms/pretui/plot/LICENSE.isoformat +13 -0
  1033. package/bundled-realms/pretui/plot/README.md +35 -0
  1034. package/bundled-realms/pretui/plot/index.d.ts +31 -0
  1035. package/bundled-realms/pretui/plot/index.js +449 -0
  1036. package/bundled-realms/pretui/pretui-component.gts +1336 -0
  1037. package/bundled-realms/pretui/pretui-css.gts +380 -0
  1038. package/bundled-realms/pretui/pretui-primitives.gts +162 -0
  1039. package/bundled-realms/pretui/qrcode/LICENSE +34 -0
  1040. package/bundled-realms/pretui/qrcode/README.md +87 -0
  1041. package/bundled-realms/pretui/qrcode/index.js +35 -0
  1042. package/bundled-realms/pretui/realm.json +16 -0
  1043. package/bundled-realms/pretui/registry.ts +40 -0
  1044. package/bundled-realms/pretui/sigpad/LICENSE +21 -0
  1045. package/bundled-realms/pretui/sigpad/README.md +103 -0
  1046. package/bundled-realms/pretui/sigpad/index.js +30 -0
  1047. package/bundled-realms/pretui/structure-dashboard-css.ts +166 -0
  1048. package/bundled-realms/pretui/surfaces/README.md +37 -0
  1049. package/bundled-realms/pretui/surfaces/canvas/LICENSE.d3 +168 -0
  1050. package/bundled-realms/pretui/surfaces/canvas/LICENSE.xyflow +21 -0
  1051. package/bundled-realms/pretui/surfaces/canvas/index.js +25420 -0
  1052. package/bundled-realms/pretui/surfaces/grid/LICENSE.tanstack +50 -0
  1053. package/bundled-realms/pretui/surfaces/grid/index.js +21478 -0
  1054. package/bundled-realms/pretui/surfaces/layout/index.js +9036 -0
  1055. package/bundled-realms/pretui/surfaces-canvas-css.ts +1640 -0
  1056. package/bundled-realms/pretui/surfaces-canvas-layout.ts +607 -0
  1057. package/bundled-realms/pretui/tsconfig.json +54 -0
  1058. package/bundled-realms/pretui/wavesurfer/LICENSE +29 -0
  1059. package/bundled-realms/pretui/wavesurfer/README.md +85 -0
  1060. package/bundled-realms/pretui/wavesurfer/index.js +184 -0
  1061. package/bundled-realms/pretui/zxcvbn/LICENSE +21 -0
  1062. package/bundled-realms/pretui/zxcvbn/README.md +192 -0
  1063. package/bundled-realms/pretui/zxcvbn/index.d.ts +28 -0
  1064. package/bundled-realms/pretui/zxcvbn/index.js +5931 -0
  1065. package/bundled-test-harness/index.html +1 -1
  1066. package/bundled-test-harness/tests/index.html +1 -1
  1067. package/dist/api.js +1 -1
  1068. package/dist/index.js +33 -33
  1069. package/package.json +1 -1
  1070. package/src/lib/test-engine.ts +14 -4
@@ -0,0 +1,1243 @@
1
+ // Pretui — the colour engine.
2
+ //
3
+ // The one place in the kit that knows what a colour IS. Everything visual
4
+ // (ColorPicker, GradientEditor, Swatch, ColorPalette, ColorField) reads its
5
+ // numbers from here and, critically, gets its CSS strings from here.
6
+ //
7
+ // Three jobs, in order of how much trouble they save:
8
+ //
9
+ // 1. **The injection guard.** A colour surface interpolates caller strings
10
+ // into inline styles constantly, and `@value` of `red; background:
11
+ // url(…)` would inject declarations. Nothing in this kit may pass a
12
+ // caller string to a style attribute. `cssFor()` PARSES the caller's
13
+ // text with the colour engine and RE-SERIALIZES a string this module
14
+ // constructed from numbers — the caller's characters never survive the
15
+ // round trip. Every attack shape was measured against colorjs.io's
16
+ // parser and every one throws (`red; background: url(...)`,
17
+ // `red}\n.x{color:blue`, `url(...)`, `expression(...)`, `#fff;--y:1`,
18
+ // backtick-interpolation), so the parse gate alone is sufficient; the
19
+ // charset assertion on the OUTPUT is belt and braces.
20
+ //
21
+ // 2. **Gamut, made visible.** `clampTo()` never silently rewrites a colour.
22
+ // It returns the mapped colour AND whether mapping happened AND how far
23
+ // it moved (ΔE OK), so the UI can say "outside sRGB — clamped to #ff5843"
24
+ // instead of quietly lying. This is the whole reason OKLCH matters: you
25
+ // can *ask for* a colour a display cannot show, and the honest answer is
26
+ // "here is the nearest one", not a silently different swatch.
27
+ //
28
+ // 3. **Pure functions, no DOM, no timers.** Every export here is a pure
29
+ // function of its arguments — unit-testable without a browser, safe
30
+ // anywhere in the realm module graph, and free of `Date.now()` /
31
+ // `Math.random()` (indexing determinism). Stop ids come from a caller-
32
+ // supplied monotonic counter, never a random source.
33
+ //
34
+ // Better than the inspiration (hdr-color-input v0.4.3, MIT, Adam Argyle):
35
+ // upstream runs its area paint in a Worker built from an object URL and
36
+ // carries preact/signals for reactivity. Neither survives contact with a
37
+ // Boxel realm — an unowned Worker is exactly the lifetime hazard the realm's
38
+ // no-unowned-timers law exists to prevent, and a second reactive system
39
+ // beside Glimmer's `@tracked` is a liability. The paint is a bounded
40
+ // synchronous pass in an `ember-modifier` instead (see `paintArea`), which
41
+ // has no lifetime to leak, and reactivity is `@tracked`. Upstream also
42
+ // clamps silently; this module reports.
43
+ //
44
+ // Colour maths is VENDORED, not ported: see `color/README.md`.
45
+
46
+ /* eslint-disable @typescript-eslint/no-explicit-any -- the vendored bundle
47
+ ships no type declarations; its surface is re-declared as `Engine` below
48
+ and every use goes through that one narrow cast. */
49
+ import * as Vendor from './color/index.js';
50
+
51
+ // ── The vendored surface, narrowly declared ──────────────────────────────
52
+ // Only what this module actually calls. Declaring it here (rather than
53
+ // shipping a .d.ts beside a minified bundle) keeps the contract readable and
54
+ // keeps the realm free of a declaration file the loader would have to skip.
55
+
56
+ /** A colour as the vendored engine models it: a space, three coordinates,
57
+ * and alpha. Coordinates may be NaN for an undefined hue — that is legal
58
+ * and meaningful (an achromatic colour has no hue). */
59
+ export interface PlainColor {
60
+ /** Present on colours the engine RETURNS (`to`, `toGamut`). */
61
+ space?: any;
62
+ /** Present on colours the engine PARSES. See `parseColor`. */
63
+ spaceId?: string;
64
+ coords: [number, number, number];
65
+ alpha: number;
66
+ }
67
+
68
+ interface Engine {
69
+ ColorSpace: { registry: Record<string, any> };
70
+ parse: (text: string) => PlainColor;
71
+ to: (color: PlainColor, space: any) => PlainColor;
72
+ serialize: (color: PlainColor, options?: Record<string, unknown>) => string;
73
+ inGamut: (color: PlainColor, space: any) => boolean;
74
+ toGamut: (color: PlainColor, options?: Record<string, unknown>) => PlainColor;
75
+ deltaE: (a: PlainColor, b: PlainColor, method?: string) => number;
76
+ contrastWCAG21: (a: PlainColor, b: PlainColor) => number;
77
+ getLuminance: (color: PlainColor) => number;
78
+ mix: (
79
+ a: PlainColor,
80
+ b: PlainColor,
81
+ t: number,
82
+ options: { space: any; hue: HueMethod; premultiplied: boolean },
83
+ ) => PlainColor;
84
+ }
85
+
86
+ const engine = Vendor as unknown as Engine;
87
+
88
+ /** Look a registered space up by its colorjs id. Throws only on a
89
+ * programmer error (an id this module does not register). */
90
+ function spaceObject(id: string): any {
91
+ let found = engine.ColorSpace.registry[id];
92
+ if (!found) {
93
+ throw new Error(`pretui color-engine: space "${id}" is not registered`);
94
+ }
95
+ return found;
96
+ }
97
+
98
+ // ── Spaces and channels ──────────────────────────────────────────────────
99
+
100
+ /** Channel models a caller may drive the picker in. `p3` and `rec2020` are
101
+ * RGB spaces with wider primaries; `oklch`/`oklab` are perceptual and
102
+ * unbounded, which is exactly why they need a gamut to be checked against. */
103
+ export type SpaceId =
104
+ | 'srgb'
105
+ | 'p3'
106
+ | 'rec2020'
107
+ | 'oklch'
108
+ | 'oklab'
109
+ | 'hsl'
110
+ | 'hsv';
111
+
112
+ /** Gamuts a colour can be checked and mapped into. Distinct from SpaceId on
113
+ * purpose: OKLCH is a *space*, sRGB is also a *gamut*, and conflating the
114
+ * two is why most pickers cannot tell you that a colour is unshowable. */
115
+ export type GamutId = 'srgb' | 'p3' | 'rec2020';
116
+
117
+ export interface ChannelSpec {
118
+ /** Machine key, matching the space's coordinate name. */
119
+ readonly id: string;
120
+ /** Human label used in the numeric input and in `aria-valuetext`. */
121
+ readonly label: string;
122
+ /** Slider/input minimum, in DISPLAY units (see `scale`). */
123
+ readonly min: number;
124
+ /** Slider/input maximum, in display units. */
125
+ readonly max: number;
126
+ /** One arrow press. Shift multiplies by 10, Alt divides by 10. */
127
+ readonly step: number;
128
+ /** Decimal places the numeric input rounds to. */
129
+ readonly precision: number;
130
+ /** Suffix shown after the number and spoken in `aria-valuetext`. */
131
+ readonly unit: string;
132
+ /** Display value = stored coordinate × scale. sRGB channels are shown
133
+ * 0–255 because that is the number every designer already has in hand,
134
+ * while the stored coordinate stays 0–1 as CSS defines it. */
135
+ readonly scale: number;
136
+ /** Hue channels wrap at the ends instead of clamping. */
137
+ readonly isHue: boolean;
138
+ }
139
+
140
+ /** How a space projects onto the 2D area picker. Three kinds only:
141
+ * HSV-style (saturation × value under a hue slider) for the RGB-ish
142
+ * spaces, chroma × lightness under a hue slider for the LCH-ish ones, and
143
+ * a × b under a lightness slider for OKLab. */
144
+ export interface AreaSpec {
145
+ /** The space the area's geometry is computed in — may differ from the
146
+ * space whose channels the numeric inputs show. */
147
+ readonly model: SpaceId;
148
+ /** Coordinate index driven by the horizontal axis. */
149
+ readonly x: number;
150
+ /** Coordinate index driven by the vertical axis (top = max). */
151
+ readonly y: number;
152
+ /** Coordinate index driven by the slider beside the area. */
153
+ readonly z: number;
154
+ }
155
+
156
+ export interface SpaceSpec {
157
+ readonly id: SpaceId;
158
+ /** colorjs registry id — identical to `id` for every space here, but kept
159
+ * separate so a future space can differ without a rename cascade. */
160
+ readonly cssId: string;
161
+ readonly label: string;
162
+ /** Short prose a caller can put beside the space switcher. */
163
+ readonly note: string;
164
+ readonly channels: readonly [ChannelSpec, ChannelSpec, ChannelSpec];
165
+ readonly area: AreaSpec;
166
+ /** The gamut this space is naturally bounded by, or null when the space
167
+ * is unbounded (OKLCH/OKLab describe colours no display can show). */
168
+ readonly nativeGamut: GamutId | null;
169
+ }
170
+
171
+ function channel(
172
+ id: string,
173
+ label: string,
174
+ min: number,
175
+ max: number,
176
+ step: number,
177
+ precision: number,
178
+ unit = '',
179
+ scale = 1,
180
+ isHue = false,
181
+ ): ChannelSpec {
182
+ return { id, label, min, max, step, precision, unit, scale, isHue };
183
+ }
184
+
185
+ const HUE = channel('h', 'Hue', 0, 360, 1, 2, '°', 1, true);
186
+
187
+ const RGB255 = (id: string, label: string) =>
188
+ channel(id, label, 0, 255, 1, 0, '', 255);
189
+ const RGB01 = (id: string, label: string) =>
190
+ channel(id, label, 0, 1, 0.001, 4, '', 1);
191
+
192
+ const AREA_HSV: AreaSpec = { model: 'hsv', x: 1, y: 2, z: 0 };
193
+ const AREA_LCH: AreaSpec = { model: 'oklch', x: 1, y: 0, z: 2 };
194
+ const AREA_LAB: AreaSpec = { model: 'oklab', x: 1, y: 2, z: 0 };
195
+
196
+ export const SPACES: readonly SpaceSpec[] = [
197
+ {
198
+ id: 'srgb',
199
+ cssId: 'srgb',
200
+ label: 'sRGB',
201
+ note: 'The web default gamut. Channels shown 0–255.',
202
+ channels: [RGB255('r', 'Red'), RGB255('g', 'Green'), RGB255('b', 'Blue')],
203
+ area: AREA_HSV,
204
+ nativeGamut: 'srgb',
205
+ },
206
+ {
207
+ id: 'hsl',
208
+ cssId: 'hsl',
209
+ label: 'HSL',
210
+ note: 'sRGB in cylindrical coordinates. Lightness is not perceptual.',
211
+ channels: [
212
+ HUE,
213
+ channel('s', 'Saturation', 0, 100, 1, 1, '%'),
214
+ channel('l', 'Lightness', 0, 100, 1, 1, '%'),
215
+ ],
216
+ area: AREA_HSV,
217
+ nativeGamut: 'srgb',
218
+ },
219
+ {
220
+ id: 'hsv',
221
+ cssId: 'hsv',
222
+ label: 'HSV',
223
+ note: 'The classic picker model. Not a CSS colour syntax — output is sRGB.',
224
+ channels: [
225
+ HUE,
226
+ channel('s', 'Saturation', 0, 100, 1, 1, '%'),
227
+ channel('v', 'Value', 0, 100, 1, 1, '%'),
228
+ ],
229
+ area: AREA_HSV,
230
+ nativeGamut: 'srgb',
231
+ },
232
+ {
233
+ id: 'oklch',
234
+ cssId: 'oklch',
235
+ label: 'OKLCH',
236
+ note: 'Perceptual lightness, chroma and hue. Unbounded — check the gamut.',
237
+ channels: [
238
+ channel('l', 'Lightness', 0, 1, 0.001, 4),
239
+ channel('c', 'Chroma', 0, 0.4, 0.001, 4),
240
+ HUE,
241
+ ],
242
+ area: AREA_LCH,
243
+ nativeGamut: null,
244
+ },
245
+ {
246
+ id: 'oklab',
247
+ cssId: 'oklab',
248
+ label: 'OKLab',
249
+ note: 'Perceptual, rectangular. a is green↔red, b is blue↔yellow.',
250
+ channels: [
251
+ channel('l', 'Lightness', 0, 1, 0.001, 4),
252
+ channel('a', 'a (green–red)', -0.4, 0.4, 0.001, 4),
253
+ channel('b', 'b (blue–yellow)', -0.4, 0.4, 0.001, 4),
254
+ ],
255
+ area: AREA_LAB,
256
+ nativeGamut: null,
257
+ },
258
+ {
259
+ id: 'p3',
260
+ cssId: 'p3',
261
+ label: 'Display P3',
262
+ note: 'Wide-gamut RGB. About 25% more colours than sRGB.',
263
+ channels: [RGB01('r', 'Red'), RGB01('g', 'Green'), RGB01('b', 'Blue')],
264
+ area: AREA_LCH,
265
+ nativeGamut: 'p3',
266
+ },
267
+ {
268
+ id: 'rec2020',
269
+ cssId: 'rec2020',
270
+ label: 'Rec. 2020',
271
+ note: 'The HDR/UHD gamut. Wider than P3; few displays cover it.',
272
+ channels: [RGB01('r', 'Red'), RGB01('g', 'Green'), RGB01('b', 'Blue')],
273
+ area: AREA_LCH,
274
+ nativeGamut: 'rec2020',
275
+ },
276
+ ];
277
+
278
+ const SPACE_BY_ID = new Map<SpaceId, SpaceSpec>(SPACES.map((s) => [s.id, s]));
279
+
280
+ /** Never throws for a known id; falls back to sRGB for anything else so a
281
+ * bad `@space` degrades to a working picker instead of a blank one. */
282
+ export function spaceSpec(id: SpaceId | string | undefined): SpaceSpec {
283
+ return SPACE_BY_ID.get(id as SpaceId) ?? SPACE_BY_ID.get('srgb')!;
284
+ }
285
+
286
+ export const GAMUTS: readonly { id: GamutId; label: string }[] = [
287
+ { id: 'srgb', label: 'sRGB' },
288
+ { id: 'p3', label: 'Display P3' },
289
+ { id: 'rec2020', label: 'Rec. 2020' },
290
+ ];
291
+
292
+ // ── The colour value ─────────────────────────────────────────────────────
293
+
294
+ export interface ColorValue {
295
+ readonly space: SpaceId;
296
+ readonly coords: readonly [number, number, number];
297
+ readonly alpha: number;
298
+ }
299
+
300
+ /** Black, opaque, sRGB — the value every fallible path lands on. */
301
+ export const BLACK: ColorValue = { space: 'srgb', coords: [0, 0, 0], alpha: 1 };
302
+
303
+ function toPlain(value: ColorValue): PlainColor {
304
+ return {
305
+ space: spaceObject(spaceSpec(value.space).cssId),
306
+ coords: [value.coords[0], value.coords[1], value.coords[2]],
307
+ alpha: value.alpha,
308
+ };
309
+ }
310
+
311
+ function fromPlain(plain: PlainColor, space: SpaceId): ColorValue {
312
+ let [a, b, c] = plain.coords;
313
+ return {
314
+ space,
315
+ coords: [numeric(a), numeric(b), numeric(c)],
316
+ alpha: numeric(plain.alpha, 1),
317
+ };
318
+ }
319
+
320
+ /** NaN is legal inside colorjs (an undefined hue) but poisonous in a
321
+ * template — it renders as "NaN" and breaks every comparison. Undefined
322
+ * hues become 0, which is the same colour. */
323
+ function numeric(n: number, fallback = 0): number {
324
+ return Number.isFinite(n) ? n : fallback;
325
+ }
326
+
327
+ // ── Parsing ──────────────────────────────────────────────────────────────
328
+
329
+ /**
330
+ * Parse any CSS colour string. **Never throws** and never returns the
331
+ * caller's characters — a `ColorValue` is numbers only, which is what makes
332
+ * the re-serialize guard total.
333
+ *
334
+ * Returns null for anything that is not a colour, including every injection
335
+ * shape (`red; background: url(…)`, `red}.x{…`, `url(…)`, `expression(…)`).
336
+ */
337
+ export function parseColor(text: string | undefined | null): ColorValue | null {
338
+ if (typeof text !== 'string') {
339
+ return null;
340
+ }
341
+ let trimmed = text.trim();
342
+ if (!trimmed || trimmed.length > 256) {
343
+ return null;
344
+ }
345
+ let plain: PlainColor;
346
+ try {
347
+ // colorjs 0.7's `parse` returns a ColorConstructor — `{ spaceId, coords,
348
+ // alpha }` — NOT a PlainColorObject. Every consumer (`to`, `serialize`,
349
+ // `inGamut`) accepts either shape, but reading the space back off it
350
+ // means checking `spaceId` first. Getting this wrong is silent: the
351
+ // colour parses, `plain.space` reads `undefined`, and every value in the
352
+ // picker becomes null.
353
+ plain = engine.parse(trimmed);
354
+ } catch {
355
+ return null;
356
+ }
357
+ if (!plain || !Array.isArray(plain.coords)) {
358
+ return null;
359
+ }
360
+ let id = (plain.space?.id ?? plain.spaceId ?? 'srgb') as string;
361
+ if (SPACE_BY_ID.has(id as SpaceId)) {
362
+ return fromPlain(plain, id as SpaceId);
363
+ }
364
+ // A syntax this kit does not expose as a channel model (`lab()`, `hwb()`,
365
+ // `color(xyz …)`) still has to produce a working picker: normalize into
366
+ // sRGB rather than refusing the paste.
367
+ try {
368
+ return fromPlain(engine.to(plain, spaceObject('srgb')), 'srgb');
369
+ } catch {
370
+ return null;
371
+ }
372
+ }
373
+
374
+ /** Convert between the kit's spaces. Total: an impossible conversion
375
+ * returns the input unchanged rather than throwing into a render. */
376
+ export function toSpace(value: ColorValue, target: SpaceId): ColorValue {
377
+ if (value.space === target) {
378
+ return value;
379
+ }
380
+ try {
381
+ let plain = engine.to(toPlain(value), spaceObject(spaceSpec(target).cssId));
382
+ let next = fromPlain(plain, target);
383
+ // A conversion that loses the hue (achromatic input) must not spin the
384
+ // hue slider to 0 and destroy the user's hue. Carry it forward.
385
+ let spec = spaceSpec(target);
386
+ let hueIndex = spec.channels.findIndex((c) => c.isHue);
387
+ if (hueIndex >= 0 && !Number.isFinite(plain.coords[hueIndex])) {
388
+ let sourceHue = hueOf(value);
389
+ if (sourceHue !== null) {
390
+ let coords: [number, number, number] = [
391
+ next.coords[0],
392
+ next.coords[1],
393
+ next.coords[2],
394
+ ];
395
+ coords[hueIndex] = sourceHue;
396
+ return { ...next, coords };
397
+ }
398
+ }
399
+ return next;
400
+ } catch {
401
+ return value;
402
+ }
403
+ }
404
+
405
+ /** The hue of a colour in its own space, or null when the space has none. */
406
+ export function hueOf(value: ColorValue): number | null {
407
+ let spec = spaceSpec(value.space);
408
+ let index = spec.channels.findIndex((c) => c.isHue);
409
+ if (index < 0) {
410
+ return null;
411
+ }
412
+ let raw = value.coords[index];
413
+ return Number.isFinite(raw) ? raw : null;
414
+ }
415
+
416
+ // ── Channel arithmetic ───────────────────────────────────────────────────
417
+
418
+ /** Wrap a hue into [0, 360). `-30` becomes `330`, `400` becomes `40`. */
419
+ export function wrapHue(deg: number): number {
420
+ let wrapped = deg % 360;
421
+ return wrapped < 0 ? wrapped + 360 : wrapped;
422
+ }
423
+
424
+ export function clamp(n: number, min: number, max: number): number {
425
+ return n < min ? min : n > max ? max : n;
426
+ }
427
+
428
+ /** Round to a fixed number of decimals without `toFixed`'s string detour,
429
+ * and without `-0`. */
430
+ export function round(n: number, decimals: number): number {
431
+ let factor = 10 ** decimals;
432
+ let rounded = Math.round(n * factor) / factor;
433
+ return rounded === 0 ? 0 : rounded;
434
+ }
435
+
436
+ /** Set one channel, in DISPLAY units, honouring hue wrap and clamping.
437
+ * Returns a new value; never mutates. */
438
+ export function withChannel(
439
+ value: ColorValue,
440
+ index: number,
441
+ display: number,
442
+ ): ColorValue {
443
+ let spec = spaceSpec(value.space);
444
+ let ch = spec.channels[index];
445
+ if (!ch || !Number.isFinite(display)) {
446
+ return value;
447
+ }
448
+ let bounded = ch.isHue
449
+ ? wrapHue(display)
450
+ : clamp(display, ch.min, ch.max);
451
+ let coords: [number, number, number] = [
452
+ value.coords[0],
453
+ value.coords[1],
454
+ value.coords[2],
455
+ ];
456
+ coords[index] = bounded / ch.scale;
457
+ return { space: value.space, coords, alpha: value.alpha };
458
+ }
459
+
460
+ /** Read one channel in DISPLAY units, rounded for presentation. */
461
+ export function channelDisplay(value: ColorValue, index: number): number {
462
+ let ch = spaceSpec(value.space).channels[index];
463
+ if (!ch) {
464
+ return 0;
465
+ }
466
+ return round(numeric(value.coords[index]) * ch.scale, ch.precision);
467
+ }
468
+
469
+ export function withAlpha(value: ColorValue, alpha: number): ColorValue {
470
+ return {
471
+ space: value.space,
472
+ coords: [value.coords[0], value.coords[1], value.coords[2]],
473
+ alpha: clamp(numeric(alpha, 1), 0, 1),
474
+ };
475
+ }
476
+
477
+ /** Arrow-key step for a channel under the current modifiers. Shift is
478
+ * coarse (×10), Alt is fine (÷10) — the pair every design tool ships and
479
+ * most colour pickers omit. Both together cancel, which is the least
480
+ * surprising resolution. */
481
+ export function stepFor(
482
+ ch: ChannelSpec,
483
+ modifiers: { shiftKey?: boolean; altKey?: boolean },
484
+ ): number {
485
+ let step = ch.step;
486
+ if (modifiers.shiftKey) {
487
+ step *= 10;
488
+ }
489
+ if (modifiers.altKey) {
490
+ step /= 10;
491
+ }
492
+ return step;
493
+ }
494
+
495
+ // ── Gamut ────────────────────────────────────────────────────────────────
496
+
497
+ export interface ClampResult {
498
+ /** The colour after gamut mapping — identical to the input when it was
499
+ * already inside. */
500
+ readonly color: ColorValue;
501
+ /** Whether mapping actually moved the colour. */
502
+ readonly clamped: boolean;
503
+ /** How far it moved, in ΔE OK (perceptual). 0 when unclamped. Roughly:
504
+ * under 0.02 is invisible, over 0.05 is a different colour. */
505
+ readonly distance: number;
506
+ /** The gamut it was mapped into. */
507
+ readonly gamut: GamutId;
508
+ }
509
+
510
+ /** Matches colorjs.io's own in-gamut tolerance. A channel at 1.0000001 is
511
+ * a rounding artefact, not an unshowable colour. */
512
+ const GAMUT_EPSILON = 0.000075;
513
+
514
+ export function inGamutOf(value: ColorValue, gamut: GamutId): boolean {
515
+ try {
516
+ return engine.inGamut(toPlain(value), spaceObject(gamut));
517
+ } catch {
518
+ return true;
519
+ }
520
+ }
521
+
522
+ /**
523
+ * Map a colour into a gamut and REPORT what happened. The reporting is the
524
+ * point — a user who pushes chroma past what sRGB can show should see that
525
+ * it was clamped and to what, rather than watching the swatch quietly stop
526
+ * following the slider.
527
+ *
528
+ * Uses colorjs.io's CSS gamut-mapping algorithm (chroma reduction in OKLCh
529
+ * with a local-clip fallback), which is the same algorithm browsers use for
530
+ * `color()` values they cannot display — so the clamped colour matches what
531
+ * the display would have shown anyway.
532
+ */
533
+ export function clampTo(value: ColorValue, gamut: GamutId): ClampResult {
534
+ if (inGamutOf(value, gamut)) {
535
+ return { color: value, clamped: false, distance: 0, gamut };
536
+ }
537
+ try {
538
+ // `toGamut` MUTATES the colour it is handed. Passing the same object
539
+ // twice (once as the mapping input, once as the ΔE reference) silently
540
+ // reports a distance of 0 for every clamp — the exact number this
541
+ // component exists to show. Two independent plain colours, always.
542
+ let original = toPlain(value);
543
+ let mapped = engine.toGamut(toPlain(value), { space: spaceObject(gamut) });
544
+ let distance = engine.deltaE(original, mapped, 'OK');
545
+ return {
546
+ color: fromPlain(
547
+ engine.to(mapped, spaceObject(spaceSpec(value.space).cssId)),
548
+ value.space,
549
+ ),
550
+ clamped: true,
551
+ distance: round(numeric(distance), 4),
552
+ gamut,
553
+ };
554
+ } catch {
555
+ return { color: value, clamped: false, distance: 0, gamut };
556
+ }
557
+ }
558
+
559
+ // ── Serialization: the injection guard ───────────────────────────────────
560
+
561
+ /** Characters a CSS colour token can legally contain. Asserted on OUTPUT
562
+ * only — the input gate is the parser, which rejects everything that is
563
+ * not a colour. */
564
+ const CSS_COLOR_CHARS = /^[a-zA-Z0-9#%.,()/\s+-]+$/;
565
+
566
+ /** Canonical CSS for a colour, built from numbers this module holds. Never
567
+ * contains caller characters. */
568
+ export function serializeColor(
569
+ value: ColorValue,
570
+ options?: { precision?: number; format?: string },
571
+ ): string {
572
+ try {
573
+ // HSV is a picker model, not a CSS colour syntax. colorjs serializes it
574
+ // as `color(--hsv …)`, a custom-space form no browser accepts — which
575
+ // would silently invalidate every track gradient and every swatch style
576
+ // the moment a caller chose the HSV model. Anything without real CSS
577
+ // syntax goes out as sRGB.
578
+ let source = CSS_NATIVE_SPACES.has(value.space) ? value : toSpace(value, 'srgb');
579
+ let out = engine.serialize(toPlain(source), {
580
+ precision: options?.precision ?? 4,
581
+ ...(options?.format ? { format: options.format } : {}),
582
+ });
583
+ return CSS_COLOR_CHARS.test(out) && !out.includes('--') ? out : 'transparent';
584
+ } catch {
585
+ return 'transparent';
586
+ }
587
+ }
588
+
589
+ /** Spaces CSS can actually express. `hsv` is deliberately absent. */
590
+ const CSS_NATIVE_SPACES = new Set<SpaceId>([
591
+ 'srgb',
592
+ 'hsl',
593
+ 'oklch',
594
+ 'oklab',
595
+ 'p3',
596
+ 'rec2020',
597
+ ]);
598
+
599
+ /**
600
+ * Hex for a colour, gamut-mapped into sRGB first. Always 6 or 8 digits
601
+ * (never the 3-digit short form) so the string is a stable width in a
602
+ * monospace input and never reflows the field as the user drags.
603
+ */
604
+ export function toHex(value: ColorValue): string {
605
+ let mapped = clampTo(toSpace(value, 'srgb'), 'srgb').color;
606
+ let [r, g, b] = mapped.coords;
607
+ let pair = (n: number) =>
608
+ clamp(Math.round(numeric(n) * 255), 0, 255)
609
+ .toString(16)
610
+ .padStart(2, '0');
611
+ let alpha = clamp(numeric(value.alpha, 1), 0, 1);
612
+ let base = `#${pair(r)}${pair(g)}${pair(b)}`;
613
+ return alpha >= 1 ? base : `${base}${pair(alpha)}`;
614
+ }
615
+
616
+ /**
617
+ * **The guard.** Turn anything a caller supplied into a CSS string that is
618
+ * safe to interpolate into an inline style.
619
+ *
620
+ * A string goes through `parseColor` (which rejects every non-colour) and
621
+ * comes back out as a string this module serialized from numbers. A
622
+ * `ColorValue` skips the parse but takes the same serialize path. Anything
623
+ * unparseable becomes `fallback` — never the caller's text.
624
+ *
625
+ * Every inline style in the colour surfaces uses this. There is no other
626
+ * sanctioned way to get a colour into a style attribute.
627
+ */
628
+ export function cssFor(
629
+ value: ColorValue | string | undefined | null,
630
+ fallback = 'transparent',
631
+ ): string {
632
+ let parsed =
633
+ typeof value === 'string' ? parseColor(value) : (value ?? null);
634
+ if (!parsed) {
635
+ return fallback;
636
+ }
637
+ let out = serializeColor(parsed);
638
+ return out === 'transparent' && parsed.alpha > 0 ? fallback : out;
639
+ }
640
+
641
+ /** Same guard, but forced into sRGB hex — for the `<input type='color'>`
642
+ * fallback and for anywhere a 7-character string is required. */
643
+ export function hexFor(
644
+ value: ColorValue | string | undefined | null,
645
+ fallback = '#000000',
646
+ ): string {
647
+ let parsed = typeof value === 'string' ? parseColor(value) : (value ?? null);
648
+ if (!parsed) {
649
+ return fallback;
650
+ }
651
+ let hex = toHex(withAlpha(parsed, 1));
652
+ return /^#[0-9a-f]{6}$/.test(hex) ? hex : fallback;
653
+ }
654
+
655
+ // ── Announcement ─────────────────────────────────────────────────────────
656
+
657
+ /** Human text for one channel, for `aria-valuetext`. "Lightness 62%", never
658
+ * "0.62" — a screen-reader user gets the same sentence a sighted user
659
+ * reads off the label. */
660
+ export function channelValueText(
661
+ spec: SpaceSpec,
662
+ index: number,
663
+ displayValue: number,
664
+ ): string {
665
+ let ch = spec.channels[index];
666
+ if (!ch) {
667
+ return String(displayValue);
668
+ }
669
+ if (ch.isHue) {
670
+ let word = hueName(displayValue, hueWheel(spec.id));
671
+ return `${ch.label} ${round(displayValue, 0)} degrees, ${word}`;
672
+ }
673
+ let unit = ch.unit ? ch.unit : '';
674
+ return `${ch.label} ${round(displayValue, ch.precision)}${unit}`;
675
+ }
676
+
677
+ /** Hue words on the **sRGB** wheel (HSL/HSV), where 0=red, 60=yellow,
678
+ * 120=green, 180=cyan, 240=blue, 300=magenta. */
679
+ const HUE_NAMES_SRGB: readonly [number, string][] = [
680
+ [15, 'red'],
681
+ [45, 'orange'],
682
+ [70, 'yellow'],
683
+ [100, 'yellow green'],
684
+ [160, 'green'],
685
+ [200, 'cyan'],
686
+ [260, 'blue'],
687
+ [290, 'indigo'],
688
+ [320, 'violet'],
689
+ [350, 'magenta'],
690
+ [360, 'red'],
691
+ ];
692
+
693
+ /** Hue words on the **OK** wheel, which is a different scale entirely —
694
+ * sRGB red sits at 29°, yellow at 110°, green at 142°, cyan at 195°, blue
695
+ * at 264°, magenta at 328°. Naming an OKLCH hue off the sRGB table calls
696
+ * pure red "orange", which is exactly the kind of quietly wrong
697
+ * announcement a screen-reader user has no way to catch. */
698
+ const HUE_NAMES_OK: readonly [number, string][] = [
699
+ [42, 'red'],
700
+ [82, 'orange'],
701
+ [126, 'yellow'],
702
+ [168, 'green'],
703
+ [230, 'cyan'],
704
+ [296, 'blue'],
705
+ [345, 'magenta'],
706
+ [360, 'red'],
707
+ ];
708
+
709
+ /** A colour word for a hue angle. Colour must never be the only channel —
710
+ * this is what lets a slider announce something a screen reader can use.
711
+ * `wheel` picks the scale: OK hues and sRGB hues are NOT interchangeable. */
712
+ export function hueName(deg: number, wheel: 'ok' | 'srgb' = 'ok'): string {
713
+ let h = wrapHue(deg);
714
+ for (let [limit, name] of wheel === 'ok' ? HUE_NAMES_OK : HUE_NAMES_SRGB) {
715
+ if (h < limit) {
716
+ return name;
717
+ }
718
+ }
719
+ return 'red';
720
+ }
721
+
722
+ /** Which hue wheel a space's hue channel lives on. */
723
+ export function hueWheel(space: SpaceId): 'ok' | 'srgb' {
724
+ return space === 'oklch' ? 'ok' : 'srgb';
725
+ }
726
+
727
+ /**
728
+ * A full spoken description of a colour: the hex (readable text, not colour
729
+ * alone), a colour word, and the gamut verdict. This is what the picker's
730
+ * live region announces and what `Swatch` puts in its accessible name.
731
+ */
732
+ export function describeColor(value: ColorValue, gamut: GamutId = 'srgb'): string {
733
+ let lch = toSpace(value, 'oklch');
734
+ let lightness = lch.coords[0];
735
+ let chroma = lch.coords[1];
736
+ let tone =
737
+ lightness > 0.92
738
+ ? 'near white'
739
+ : lightness < 0.12
740
+ ? 'near black'
741
+ : chroma < 0.02
742
+ ? 'grey'
743
+ : `${lightnessWord(lightness)} ${hueName(lch.coords[2])}`;
744
+ let alpha = clamp(numeric(value.alpha, 1), 0, 1);
745
+ let opacity = alpha >= 1 ? '' : `, ${Math.round(alpha * 100)}% opaque`;
746
+ let outside = inGamutOf(value, gamut)
747
+ ? ''
748
+ : `, outside ${gamutLabel(gamut)}`;
749
+ return `${toHex(value)}, ${tone}${opacity}${outside}`;
750
+ }
751
+
752
+ function lightnessWord(l: number): string {
753
+ if (l < 0.3) {
754
+ return 'dark';
755
+ }
756
+ if (l < 0.55) {
757
+ return 'medium';
758
+ }
759
+ if (l < 0.78) {
760
+ return 'light';
761
+ }
762
+ return 'pale';
763
+ }
764
+
765
+ export function gamutLabel(gamut: GamutId): string {
766
+ return GAMUTS.find((g) => g.id === gamut)?.label ?? gamut;
767
+ }
768
+
769
+ // ── Contrast ─────────────────────────────────────────────────────────────
770
+
771
+ /** WCAG 2.1 contrast ratio between two colours, for the picker's own
772
+ * readout. Returns 1 (no contrast) rather than throwing. */
773
+ export function contrastRatio(a: ColorValue, b: ColorValue): number {
774
+ try {
775
+ return round(numeric(engine.contrastWCAG21(toPlain(a), toPlain(b)), 1), 2);
776
+ } catch {
777
+ return 1;
778
+ }
779
+ }
780
+
781
+ /** Black or white ink, whichever reads better ON the given colour. Used for
782
+ * the value text drawn over a swatch. */
783
+ export function inkOn(value: ColorValue): 'black' | 'white' {
784
+ try {
785
+ return engine.getLuminance(toPlain(toSpace(value, 'srgb'))) > 0.42
786
+ ? 'black'
787
+ : 'white';
788
+ } catch {
789
+ return 'black';
790
+ }
791
+ }
792
+
793
+ // ── Gradients ────────────────────────────────────────────────────────────
794
+
795
+ /** Interpolation spaces CSS gradients accept. The rectangular ones
796
+ * (`oklab`, `srgb`, `lab`) never take a hue path; the polar ones do. */
797
+ export type InterpolationSpace =
798
+ | 'oklab'
799
+ | 'oklch'
800
+ | 'srgb'
801
+ | 'srgb-linear'
802
+ | 'lab'
803
+ | 'lch'
804
+ | 'hsl'
805
+ | 'hwb';
806
+
807
+ export type HueMethod = 'shorter' | 'longer' | 'increasing' | 'decreasing';
808
+
809
+ export const INTERPOLATION_SPACES: readonly {
810
+ id: InterpolationSpace;
811
+ label: string;
812
+ polar: boolean;
813
+ note: string;
814
+ }[] = [
815
+ { id: 'oklab', label: 'OKLab', polar: false, note: 'Perceptually even. The right default for two arbitrary colours.' },
816
+ { id: 'oklch', label: 'OKLCH', polar: true, note: 'Perceptual, travels around the hue wheel. Vivid mid-tones.' },
817
+ { id: 'srgb', label: 'sRGB', polar: false, note: 'The legacy default. Muddy greys through the middle.' },
818
+ { id: 'srgb-linear', label: 'sRGB linear', polar: false, note: 'Physically correct light mixing. Brighter middles.' },
819
+ { id: 'lab', label: 'CIE Lab', polar: false, note: 'Perceptual, older model. Slight hue drift in blues.' },
820
+ { id: 'lch', label: 'CIE LCH', polar: true, note: 'Polar Lab. Strong hue travel, some lightness wobble.' },
821
+ { id: 'hsl', label: 'HSL', polar: true, note: 'Cheap and cheerful. Not perceptual at all.' },
822
+ { id: 'hwb', label: 'HWB', polar: true, note: 'Hue with white/black mixing.' },
823
+ ];
824
+
825
+ export const HUE_METHODS: readonly { id: HueMethod; label: string }[] = [
826
+ { id: 'shorter', label: 'Shorter' },
827
+ { id: 'longer', label: 'Longer' },
828
+ { id: 'increasing', label: 'Increasing' },
829
+ { id: 'decreasing', label: 'Decreasing' },
830
+ ];
831
+
832
+ export type GradientKind = 'linear' | 'radial' | 'conic';
833
+
834
+ export interface GradientStop {
835
+ /** Stable identity for `{{#each key=}}` and for selection. Assigned by
836
+ * `nextStopId` — a monotonic counter, never `Math.random()`. */
837
+ readonly id: string;
838
+ /** 0–100, along the gradient line. */
839
+ readonly position: number;
840
+ /** A CSS colour string. Always passed through `cssFor` before it reaches
841
+ * a style attribute. */
842
+ readonly color: string;
843
+ }
844
+
845
+ export interface GradientSpec {
846
+ readonly kind: GradientKind;
847
+ /** Degrees. Linear: the gradient line's direction. Conic: the start
848
+ * angle. Ignored for radial. */
849
+ readonly angle: number;
850
+ /** Percent from the left/top. Radial and conic only. */
851
+ readonly centerX: number;
852
+ readonly centerY: number;
853
+ readonly interpolation: InterpolationSpace;
854
+ readonly hueMethod: HueMethod;
855
+ readonly stops: readonly GradientStop[];
856
+ }
857
+
858
+ /** Deterministic stop ids. The caller owns the counter (one per editor
859
+ * instance), which keeps ids stable across re-renders and keeps this
860
+ * module free of module-level mutable state. */
861
+ export function nextStopId(counter: { value: number }): string {
862
+ counter.value += 1;
863
+ return `stop-${counter.value}`;
864
+ }
865
+
866
+ export const DEFAULT_GRADIENT: GradientSpec = {
867
+ kind: 'linear',
868
+ angle: 90,
869
+ centerX: 50,
870
+ centerY: 50,
871
+ interpolation: 'oklab',
872
+ hueMethod: 'shorter',
873
+ stops: [
874
+ { id: 'stop-1', position: 0, color: '#7c3aed' },
875
+ { id: 'stop-2', position: 100, color: '#06b6d4' },
876
+ ],
877
+ };
878
+
879
+ /** Stops in paint order. Sorting here rather than on mutation means a stop
880
+ * dragged past its neighbour keeps its identity (and its selection) — the
881
+ * thing every gradient editor that sorts eagerly gets wrong. */
882
+ export function sortedStops(spec: GradientSpec): GradientStop[] {
883
+ return [...spec.stops].sort((a, b) => a.position - b.position);
884
+ }
885
+
886
+ /**
887
+ * **Safe** CSS for a gradient. Every stop colour goes through `cssFor`, so a
888
+ * poisoned stop becomes `transparent` rather than a declaration. Every
889
+ * number is clamped and rounded here, so no caller number can escape either
890
+ * (`NaN` would serialize as the literal text "NaN" and break the rule).
891
+ */
892
+ export function gradientCss(spec: GradientSpec): string {
893
+ let stops = sortedStops(spec);
894
+ if (stops.length === 0) {
895
+ return 'none';
896
+ }
897
+ let interp = INTERPOLATION_SPACES.find((s) => s.id === spec.interpolation);
898
+ let space = interp ? interp.id : 'oklab';
899
+ let hue = interp?.polar
900
+ ? ` ${HUE_METHODS.find((m) => m.id === spec.hueMethod)?.id ?? 'shorter'} hue`
901
+ : '';
902
+ let inClause = `in ${space}${hue}`;
903
+
904
+ let list = stops
905
+ .map(
906
+ (stop) =>
907
+ `${cssFor(stop.color)} ${round(clamp(numeric(stop.position), 0, 100), 2)}%`,
908
+ )
909
+ .join(', ');
910
+
911
+ let x = round(clamp(numeric(spec.centerX, 50), 0, 100), 2);
912
+ let y = round(clamp(numeric(spec.centerY, 50), 0, 100), 2);
913
+ let angle = round(wrapHue(numeric(spec.angle)), 2);
914
+
915
+ // CSS Images 4 puts the geometry and the interpolation method in the SAME
916
+ // first argument, combined with `||` — `linear-gradient(90deg in oklab,
917
+ // …)`. Emitting them as two comma-separated arguments (which reads
918
+ // naturally and is what a first draft produces) is a parse error, and a
919
+ // parse error in a `background` declaration is INVISIBLE: the browser
920
+ // drops the declaration and the element simply has no gradient.
921
+ if (spec.kind === 'radial') {
922
+ return `radial-gradient(circle at ${x}% ${y}% ${inClause}, ${list})`;
923
+ }
924
+ if (spec.kind === 'conic') {
925
+ // Upstream (figui3) emits `from <angle>` but never `at <x> <y>`, so its
926
+ // conic centre is not editable. Both are emitted here.
927
+ return `conic-gradient(from ${angle}deg at ${x}% ${y}% ${inClause}, ${list})`;
928
+ }
929
+ return `linear-gradient(${angle}deg ${inClause}, ${list})`;
930
+ }
931
+
932
+ /**
933
+ * The colour the gradient already shows at `position` (0–100), interpolated
934
+ * in the gradient's OWN interpolation space and honouring its hue path.
935
+ *
936
+ * This is what a newly inserted stop should be. Upstream (figui3) inserts a
937
+ * hard-coded `#888888` from the "+" button, so adding a stop visibly breaks
938
+ * the ramp and the user has to repair it; sampling means insertion is a
939
+ * no-op on the rendered gradient until the user actually changes something,
940
+ * which is the behaviour every design tool's users expect.
941
+ */
942
+ export function sampleGradientAt(
943
+ spec: GradientSpec,
944
+ position: number,
945
+ ): ColorValue {
946
+ let stops = sortedStops(spec);
947
+ if (stops.length === 0) {
948
+ return BLACK;
949
+ }
950
+ let at = clamp(numeric(position), 0, 100);
951
+ let lower = stops[0]!;
952
+ let upper = stops[stops.length - 1]!;
953
+ for (let i = 0; i < stops.length - 1; i++) {
954
+ if (stops[i]!.position <= at && at <= stops[i + 1]!.position) {
955
+ lower = stops[i]!;
956
+ upper = stops[i + 1]!;
957
+ break;
958
+ }
959
+ }
960
+ if (at <= stops[0]!.position) {
961
+ return parseColor(stops[0]!.color) ?? BLACK;
962
+ }
963
+ if (at >= stops[stops.length - 1]!.position) {
964
+ return parseColor(stops[stops.length - 1]!.color) ?? BLACK;
965
+ }
966
+
967
+ let span = upper.position - lower.position;
968
+ let t = span === 0 ? 0 : (at - lower.position) / span;
969
+ let a = parseColor(lower.color) ?? BLACK;
970
+ let b = parseColor(upper.color) ?? BLACK;
971
+ return mixIn(a, b, t, spec.interpolation, spec.hueMethod);
972
+ }
973
+
974
+ /**
975
+ * Interpolate two colours the way a CSS gradient does in `space`: the
976
+ * requested hue path, a powerless hue taking the other stop's, and alpha
977
+ * premultiplied.
978
+ */
979
+ export function mixIn(
980
+ from: ColorValue,
981
+ to: ColorValue,
982
+ t: number,
983
+ space: InterpolationSpace,
984
+ hueMethod: HueMethod = 'shorter',
985
+ ): ColorValue {
986
+ let amount = clamp(numeric(t), 0, 1);
987
+ try {
988
+ // through sRGB so the engine sees an achromatic stop's hue as missing
989
+ let mixed = engine.mix(
990
+ toPlain(toSpace(from, 'srgb')),
991
+ toPlain(toSpace(to, 'srgb')),
992
+ amount,
993
+ { space: spaceObject(space), hue: hueMethod, premultiplied: true },
994
+ );
995
+ let out = engine.to(mixed, spaceObject(spaceSpec(from.space).cssId));
996
+ return fromPlain(out, from.space);
997
+ } catch {
998
+ return from;
999
+ }
1000
+ }
1001
+
1002
+ /** The signed hue travel from `a` to `b` under a CSS hue-interpolation
1003
+ * method. Implements CSS Color 4 §12.4 exactly. */
1004
+ export function hueDelta(a: number, b: number, method: HueMethod): number {
1005
+ let from = wrapHue(a);
1006
+ let to = wrapHue(b);
1007
+ let diff = to - from;
1008
+ if (method === 'increasing') {
1009
+ return diff < 0 ? diff + 360 : diff;
1010
+ }
1011
+ if (method === 'decreasing') {
1012
+ return diff > 0 ? diff - 360 : diff;
1013
+ }
1014
+ if (method === 'longer') {
1015
+ if (diff > 0 && diff < 180) {
1016
+ return diff - 360;
1017
+ }
1018
+ if (diff > -180 && diff <= 0) {
1019
+ return diff + 360;
1020
+ }
1021
+ return diff;
1022
+ }
1023
+ // 'shorter'
1024
+ if (diff > 180) {
1025
+ return diff - 360;
1026
+ }
1027
+ if (diff < -180) {
1028
+ return diff + 360;
1029
+ }
1030
+ return diff;
1031
+ }
1032
+
1033
+ /** A flat CSS value for a solid fill, or the gradient — one call site for
1034
+ * "paint this fill". */
1035
+ export function fillCss(
1036
+ fill: { kind: 'solid'; color: string } | { kind: 'gradient'; gradient: GradientSpec },
1037
+ ): string {
1038
+ return fill.kind === 'solid' ? cssFor(fill.color) : gradientCss(fill.gradient);
1039
+ }
1040
+
1041
+ // ── Track gradients for sliders ──────────────────────────────────────────
1042
+
1043
+ /**
1044
+ * A `linear-gradient` showing what one channel does across its range, with
1045
+ * every other channel held. Built by sampling real conversions rather than
1046
+ * faking it with hard-coded hues, so an OKLCH chroma track actually shows
1047
+ * OKLCH chroma — including the point where it leaves the gamut.
1048
+ *
1049
+ * `steps` is deliberately modest: the browser interpolates between them in
1050
+ * sRGB, which is close enough over a 1/steps slice and costs 1/40th of the
1051
+ * conversions a per-pixel paint would.
1052
+ */
1053
+ export function channelTrackCss(
1054
+ value: ColorValue,
1055
+ index: number,
1056
+ gamut: GamutId,
1057
+ steps = 24,
1058
+ ): string {
1059
+ let spec = spaceSpec(value.space);
1060
+ let ch = spec.channels[index];
1061
+ if (!ch) {
1062
+ return 'transparent';
1063
+ }
1064
+ let parts: string[] = [];
1065
+ for (let i = 0; i <= steps; i++) {
1066
+ let t = i / steps;
1067
+ let display = ch.min + (ch.max - ch.min) * t;
1068
+ let sample = clampTo(withAlpha(withChannel(value, index, display), 1), gamut).color;
1069
+ parts.push(`${cssFor(sample)} ${round(t * 100, 2)}%`);
1070
+ }
1071
+ return `linear-gradient(to right, ${parts.join(', ')})`;
1072
+ }
1073
+
1074
+ /** The alpha track: the colour fading over the checkerboard the CSS puts
1075
+ * behind it. */
1076
+ export function alphaTrackCss(value: ColorValue, gamut: GamutId): string {
1077
+ let solid = clampTo(withAlpha(value, 1), gamut).color;
1078
+ return `linear-gradient(to right, ${cssFor(withAlpha(solid, 0))}, ${cssFor(solid)})`;
1079
+ }
1080
+
1081
+ // ── The area picker ──────────────────────────────────────────────────────
1082
+
1083
+ export interface AreaPaint {
1084
+ /** Pixel data, `size × size`, RGBA. */
1085
+ readonly data: Uint8ClampedArray;
1086
+ readonly size: number;
1087
+ }
1088
+
1089
+ /**
1090
+ * Paint the 2D area for a space at a fixed third channel.
1091
+ *
1092
+ * **No worker, no object URL.** Upstream (hdr-color-input) offloads this to
1093
+ * a Worker constructed from a blob URL; in a realm that is an unowned
1094
+ * lifetime — the exact hazard the no-unowned-timers law exists for — and it
1095
+ * would require inlining the whole colour bundle as a string. A bounded
1096
+ * synchronous pass at `size × size` (default 96² = 9216 conversions, ~15ms)
1097
+ * inside an `ember-modifier` has no lifetime to leak and no teardown to
1098
+ * forget. The canvas is then scaled up by CSS.
1099
+ *
1100
+ * **Gamut is drawn, not hidden.** Pixels outside `gamut` are painted with
1101
+ * their gamut-mapped colour at reduced alpha, so the unreachable region
1102
+ * reads as a faded zone with a visible boundary. Most pickers clamp these
1103
+ * pixels silently and leave a flat band that lies about what is selectable.
1104
+ */
1105
+ export function paintArea(
1106
+ base: ColorValue,
1107
+ gamut: GamutId,
1108
+ size = 96,
1109
+ ): AreaPaint {
1110
+ let spec = spaceSpec(base.space);
1111
+ let area = spec.area;
1112
+ let model = spaceSpec(area.model);
1113
+ let source = toSpace(base, area.model);
1114
+ let xCh = model.channels[area.x]!;
1115
+ let yCh = model.channels[area.y]!;
1116
+ let held = source.coords[area.z];
1117
+
1118
+ let data = new Uint8ClampedArray(size * size * 4);
1119
+ let srgb = spaceObject('srgb');
1120
+ let gamutSpace = spaceObject(gamut);
1121
+ let modelSpace = spaceObject(model.cssId);
1122
+
1123
+ for (let row = 0; row < size; row++) {
1124
+ // Top row is the channel maximum — screen coordinates run downward.
1125
+ let yValue =
1126
+ yCh.max - ((yCh.max - yCh.min) * row) / (size - 1);
1127
+ for (let col = 0; col < size; col++) {
1128
+ let xValue = xCh.min + ((xCh.max - xCh.min) * col) / (size - 1);
1129
+ let coords: [number, number, number] = [0, 0, 0];
1130
+ coords[area.x] = xValue / xCh.scale;
1131
+ coords[area.y] = yValue / yCh.scale;
1132
+ coords[area.z] = held;
1133
+
1134
+ let plain: PlainColor = { space: modelSpace, coords, alpha: 1 };
1135
+ let outside = false;
1136
+ let rgb: PlainColor;
1137
+ try {
1138
+ // CLIP, not the CSS gamut-mapping algorithm. `toGamut` runs a
1139
+ // binary chroma search per call; at 9216 pixels that measured
1140
+ // ~260ms for OKLCH, which is a visible stall on every hue drag.
1141
+ // Clipping is ~8ms and is honest here because the out-of-gamut
1142
+ // region is drawn faded rather than pretending to be selectable —
1143
+ // the pixel only has to say "roughly this colour, unreachable",
1144
+ // and the exact mapped value comes from `clampTo` at commit time.
1145
+ let target = engine.to(plain, gamutSpace);
1146
+ for (let i = 0; i < 3; i++) {
1147
+ let v = numeric(target.coords[i]);
1148
+ if (v < -GAMUT_EPSILON || v > 1 + GAMUT_EPSILON) {
1149
+ outside = true;
1150
+ }
1151
+ target.coords[i] = clamp(v, 0, 1);
1152
+ }
1153
+ rgb = gamut === 'srgb' ? target : engine.to(target, srgb);
1154
+ } catch {
1155
+ rgb = { space: srgb, coords: [0, 0, 0], alpha: 1 };
1156
+ outside = true;
1157
+ }
1158
+
1159
+ let offset = (row * size + col) * 4;
1160
+ data[offset] = clamp(numeric(rgb.coords[0]) * 255, 0, 255);
1161
+ data[offset + 1] = clamp(numeric(rgb.coords[1]) * 255, 0, 255);
1162
+ data[offset + 2] = clamp(numeric(rgb.coords[2]) * 255, 0, 255);
1163
+ data[offset + 3] = outside ? 92 : 255;
1164
+ }
1165
+ }
1166
+ return { data, size };
1167
+ }
1168
+
1169
+ /** Where the thumb sits on the area, as 0–1 fractions (x from left, y from
1170
+ * top). Pure geometry — the inverse of `areaColorAt`. */
1171
+ export function areaPosition(value: ColorValue): { x: number; y: number } {
1172
+ let spec = spaceSpec(value.space);
1173
+ let area = spec.area;
1174
+ let model = spaceSpec(area.model);
1175
+ let source = toSpace(value, area.model);
1176
+ let xCh = model.channels[area.x]!;
1177
+ let yCh = model.channels[area.y]!;
1178
+ let xValue = numeric(source.coords[area.x]) * xCh.scale;
1179
+ let yValue = numeric(source.coords[area.y]) * yCh.scale;
1180
+ return {
1181
+ x: clamp((xValue - xCh.min) / (xCh.max - xCh.min), 0, 1),
1182
+ y: clamp(1 - (yValue - yCh.min) / (yCh.max - yCh.min), 0, 1),
1183
+ };
1184
+ }
1185
+
1186
+ /** The colour at a fraction of the area, keeping the held channel and the
1187
+ * alpha of `base`. The inverse of `areaPosition`. */
1188
+ export function areaColorAt(
1189
+ base: ColorValue,
1190
+ fx: number,
1191
+ fy: number,
1192
+ ): ColorValue {
1193
+ let spec = spaceSpec(base.space);
1194
+ let area = spec.area;
1195
+ let model = spaceSpec(area.model);
1196
+ let source = toSpace(base, area.model);
1197
+ let xCh = model.channels[area.x]!;
1198
+ let yCh = model.channels[area.y]!;
1199
+
1200
+ let next = withChannel(
1201
+ source,
1202
+ area.x,
1203
+ xCh.min + (xCh.max - xCh.min) * clamp(fx, 0, 1),
1204
+ );
1205
+ next = withChannel(
1206
+ next,
1207
+ area.y,
1208
+ yCh.min + (yCh.max - yCh.min) * (1 - clamp(fy, 0, 1)),
1209
+ );
1210
+ return withAlpha(toSpace(next, base.space), base.alpha);
1211
+ }
1212
+
1213
+ /** The held (slider) channel of the area, in DISPLAY units, plus its spec —
1214
+ * what the slider beside the area drives. */
1215
+ export function areaHeldChannel(value: ColorValue): {
1216
+ spec: ChannelSpec;
1217
+ index: number;
1218
+ model: SpaceId;
1219
+ display: number;
1220
+ } {
1221
+ let area = spaceSpec(value.space).area;
1222
+ let model = spaceSpec(area.model);
1223
+ let source = toSpace(value, area.model);
1224
+ let ch = model.channels[area.z]!;
1225
+ return {
1226
+ spec: ch,
1227
+ index: area.z,
1228
+ model: area.model,
1229
+ display: round(numeric(source.coords[area.z]) * ch.scale, ch.precision),
1230
+ };
1231
+ }
1232
+
1233
+ /** Drive the area's held channel. Round-trips through the area model, so an
1234
+ * OKLCH hue slider under an sRGB picker still moves the hue. */
1235
+ export function withHeldChannel(
1236
+ value: ColorValue,
1237
+ display: number,
1238
+ ): ColorValue {
1239
+ let area = spaceSpec(value.space).area;
1240
+ let source = toSpace(value, area.model);
1241
+ let next = withChannel(source, area.z, display);
1242
+ return withAlpha(toSpace(next, value.space), value.alpha);
1243
+ }