@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,1396 @@
1
+ // Pretui — EmojiPicker: a searchable, keyboard-navigable emoji grid.
2
+ //
3
+ // A searchable, keyboard-complete emoji picker and the small trigger that
4
+ // opens one in a popover.
5
+ //
6
+ // PROVENANCE. The interaction design, the search ranking, the skin-tone
7
+ // handling and the emoji-support detection are ported from Nolan Lawson's
8
+ // emoji-picker-element (Apache-2.0). The dataset and the ported algorithms
9
+ // live in ./emoji-data/ with the licence and the full provenance record; that
10
+ // directory's README explains why this is a PORT rather than a vendored
11
+ // bundle. The short version, because it is the load-bearing fact: the
12
+ // upstream bundle references `requestAnimationFrame`, `Element`,
13
+ // `HTMLElement` and `customElements` at MODULE SCOPE and ships no server-safe
14
+ // globals shim, so importing it anywhere in the realm graph throws under the
15
+ // indexer. Media Chrome survived vendoring because it has that shim; this
16
+ // library does not.
17
+ //
18
+ // WHAT UPSTREAM GOT WRONG, AND WHAT IS FIXED HERE (specifically):
19
+ //
20
+ // 1. THE BROWSE GRID HAS NO KEYBOARD PATH. Upstream renders every emoji in a
21
+ // category as a bare <button> with no tabindex management, so a category
22
+ // is 388 consecutive tab stops and there is no arrow-key navigation at
23
+ // all — the only keydown handlers are on the search field, the category
24
+ // nav and the skin-tone list. Here the grid is one tab stop with roving
25
+ // tabindex and full 2-D arrow / Home / End / PageUp / PageDown movement.
26
+ // 2. THE GRID USES THE WRONG ROLE. Upstream marks it up as role='menu' with
27
+ // role='menuitem' children, which is a single-column action list; a
28
+ // screen reader announces "menu, 388 items" and no position. This is a
29
+ // role='grid' of role='row' / role='gridcell', so row and column position
30
+ // are announced and the APG grid pattern applies.
31
+ // 3. IT FETCHES ITS DATA FROM A CDN AT RUNTIME. jsdelivr, with ETag
32
+ // revalidation, into IndexedDB. That breaks offline, pins us to a third
33
+ // party's uptime and is the same supply-chain exposure being removed from
34
+ // the QR component. The dataset is local and the picker never touches the
35
+ // network.
36
+ // 4. IT FORKS ON prefers-color-scheme INSIDE ITS OWN SHADOW ROOT. A picker
37
+ // in a Pretui dark theme frame on a light OS came out light. Every colour
38
+ // here is a token with a light-value fallback and there are zero dark
39
+ // branches, so the theme frame decides.
40
+ // 5. NO EMOJI PREVIEW. Upstream puts the CLDR name in a `title` tooltip,
41
+ // which is hover-only and invisible in a screenshot. A persistent preview
42
+ // row names the focused emoji in text — the Law 8 resting state.
43
+ //
44
+ // KNOWN UNFINISHED EDGE, named rather than hidden (Law 7). Upstream also runs
45
+ // a per-emoji glyph WIDTH measurement to catch ZWJ sequences the font renders
46
+ // as two glyphs ("person with red hair" drawn as a person plus a floating
47
+ // wig). Versions 12.1, 13.1 and 15.1 are compound-only and can be caught no
48
+ // other way. That check is a layout-thrashing measure pass over every
49
+ // rendered cell; the cheap half — canvas colour detection of the font's
50
+ // version level — IS ported and removes the bulk of the tofu. See
51
+ // ./emoji-data/README.md.
52
+ import Component from '@glimmer/component';
53
+ import { tracked } from '@glimmer/tracking';
54
+ import { on } from '@ember/modifier';
55
+ import { fn } from '@ember/helper';
56
+ import { modifier } from 'ember-modifier';
57
+ import { listen } from '../focus';
58
+ import { cssStyleFrom } from '../pretui-css';
59
+ import { EMOJI_GROUPS, EmojiIndex, MIN_SEARCH_LENGTH, SKIN_TONE_LABELS, SKIN_TONE_SAMPLE, applySkinTone, detectSupportLevel, toneOf } from '../emoji-data/engine';
60
+ import type { Emoji } from '../emoji-data/engine';
61
+
62
+ // ── Public shapes ────────────────────────────────────────────────────────
63
+
64
+ /** What a caller receives when someone picks an emoji. */
65
+ export interface EmojiSelection {
66
+ /** The emoji to insert, with the active skin tone already applied. */
67
+ unicode: string;
68
+ /** The CLDR annotation, e.g. "waving hand". Safe to use as alt text. */
69
+ annotation: string;
70
+ /** The untoned emoji, which is the identity used by the recent list. */
71
+ base: string;
72
+ /** The tone that was applied, 0 when none. */
73
+ skinTone: number;
74
+ }
75
+
76
+ /** The id the recent pseudo-category uses; no emojibase group has it. */
77
+ const RECENT_GROUP = -1;
78
+
79
+ const DEFAULT_COLUMNS = 9;
80
+ const DEFAULT_RECENT_LIMIT = 18;
81
+ /** Rows moved by PageUp / PageDown. */
82
+ const PAGE_ROWS = 5;
83
+ /** How long the query must be still before the result count is announced. */
84
+ const ANNOUNCE_DELAY = 700;
85
+
86
+ let uid = 0;
87
+ /** Deterministic per-instance id source. A counter, not Math.random, because
88
+ * randomness breaks indexing determinism. */
89
+ function nextId(): string {
90
+ uid += 1;
91
+ return 'pretui-emoji-' + uid;
92
+ }
93
+
94
+ // ── Modifiers ────────────────────────────────────────────────────────────
95
+
96
+ /**
97
+ * Build the index once the picker is in a real browser.
98
+ *
99
+ * This is the ONLY place the dataset is requested, and it is deliberately a
100
+ * modifier: `detectSupportLevel` needs a canvas and `import('./data')` should
101
+ * not run under the indexer. A getter would be evaluated during prerender and
102
+ * is exactly the mistake the Observable Plot spike warned about.
103
+ */
104
+ const buildIndex = modifier(
105
+ (_el: HTMLElement, [run]: [(cancelled: () => boolean) => void]) => {
106
+ let destroyed = false;
107
+ run(() => destroyed);
108
+ return () => {
109
+ destroyed = true;
110
+ };
111
+ },
112
+ );
113
+
114
+ /**
115
+ * Roving tabindex and focus for the grid, applied imperatively in one pass.
116
+ *
117
+ * Doing this with a per-cell modifier would re-run 388 modifiers on every
118
+ * arrow key. This runs twice per keystroke: one loop to set tabIndex, one
119
+ * `focus()`. `key` is the change key — the identity of the current cell list —
120
+ * so switching category or typing re-seats the roving stop.
121
+ *
122
+ * tabIndex is set as a PROPERTY, matching `rovingTabindex` in focus.gts.
123
+ */
124
+ const rovingGrid = modifier(
125
+ (
126
+ el: HTMLElement,
127
+ [index, shouldFocus, _key]: [number, boolean, string],
128
+ ) => {
129
+ let cells = el.querySelectorAll<HTMLElement>('[data-emoji-cell]');
130
+ for (let i = 0; i < cells.length; i++) {
131
+ cells[i]!.tabIndex = i === index ? 0 : -1;
132
+ }
133
+ if (shouldFocus) {
134
+ cells[index]?.focus();
135
+ }
136
+ },
137
+ );
138
+
139
+ /**
140
+ * Announce `text` once it has stopped changing for `delay` ms.
141
+ *
142
+ * Same one-shot contract as `estimateWhenIdle` in password-strength.gts, and
143
+ * for the same realm-law reason: the modifier owns the handle, its destructor
144
+ * clears it, and because the function form of `modifier` tears down before it
145
+ * re-runs on an arg change, each new value cancels the pending call and arms
146
+ * exactly one more. Nothing re-arms after teardown, so this cannot strand
147
+ * `await settled()`.
148
+ *
149
+ * `run` is a positional arg rather than a captured closure so that identity
150
+ * churn in the caller cannot retrigger the modifier every render.
151
+ */
152
+ const announceWhenIdle = modifier(
153
+ (
154
+ _el: HTMLElement,
155
+ [text, delay, run]: [string, number, (text: string) => void],
156
+ ) => {
157
+ let handle = setTimeout(() => run(text), delay);
158
+ return () => clearTimeout(handle);
159
+ },
160
+ );
161
+
162
+ /** Focus the element when `should` flips true. Local to avoid focus.gts's
163
+ * `focusWhen`, which focuses on insert; the search field must only take focus
164
+ * when the caller asked for it. */
165
+ const focusOnce = modifier((el: HTMLElement, [should]: [boolean]) => {
166
+ if (should) {
167
+ el.focus();
168
+ }
169
+ });
170
+
171
+ // ── EmojiPicker ──────────────────────────────────────────────────────────
172
+
173
+ export interface EmojiPickerSignature {
174
+ Args: {
175
+ /** Called with the chosen emoji. The only required arg in practice. */
176
+ onSelect?: (selection: EmojiSelection) => void;
177
+ /** Active skin tone 0-5. Controlled when supplied. */
178
+ skinTone?: number;
179
+ /** Called when the tone changes; persist it to make the choice sticky. */
180
+ onSkinTone?: (skinTone: number) => void;
181
+ /**
182
+ * Recently-used emoji, MOST RECENT FIRST, as untoned unicode strings.
183
+ *
184
+ * Ordering is positional and carries NO timestamp — `Date.now()` is
185
+ * forbidden in realm code because it breaks indexing determinism, and a
186
+ * wall clock was never needed: "most recent" is "index 0". Controlled
187
+ * when supplied; otherwise the picker keeps its own list for the session.
188
+ */
189
+ recent?: readonly string[];
190
+ /** Receives the new recent list after each pick. Persist it verbatim. */
191
+ onRecent?: (recent: readonly string[]) => void;
192
+ /** How many recent emoji to keep. Default 18. */
193
+ recentLimit?: number;
194
+ /** Columns in the grid. Default 9. */
195
+ columns?: number;
196
+ /** Focus the search field on insert. Default false. */
197
+ autofocus?: boolean;
198
+ /**
199
+ * Pin the emoji version instead of detecting it. Detection draws fourteen
200
+ * 1x1 canvases; pin it if a caller has already measured, or to make a
201
+ * screenshot test deterministic across machines.
202
+ */
203
+ emojiVersion?: number;
204
+ /** Accessible name for the whole picker. Default "Emoji picker". */
205
+ label?: string;
206
+ };
207
+ Element: HTMLDivElement;
208
+ }
209
+
210
+ type Status = 'loading' | 'ready' | 'error';
211
+
212
+ interface Cell {
213
+ emoji: Emoji;
214
+ /** The glyph to paint, tone applied. */
215
+ glyph: string;
216
+ /** Flat index across the whole grid — the roving tabindex position. */
217
+ index: number;
218
+ key: string;
219
+ }
220
+
221
+ export class EmojiPicker extends Component<EmojiPickerSignature> {
222
+ private guid = nextId();
223
+
224
+ @tracked private status: Status = 'loading';
225
+ @tracked private index: EmojiIndex | undefined;
226
+ @tracked private errorMessage = '';
227
+ @tracked private query = '';
228
+ @tracked private group = EMOJI_GROUPS[0]!.id;
229
+ @tracked private focusedIndex = 0;
230
+ @tracked private gridHasFocus = false;
231
+ @tracked private toneOpen = false;
232
+ @tracked private toneActive = 0;
233
+ @tracked private internalTone = 0;
234
+ @tracked private internalRecent: readonly string[] = [];
235
+ @tracked private announcement = '';
236
+ /** The cell the preview row is describing — focused, or hovered. */
237
+ @tracked private previewIndex = -1;
238
+
239
+ // ── ids ────────────────────────────────────────────────────────────────
240
+ get searchId() {
241
+ return this.guid + '-search';
242
+ }
243
+ get panelId() {
244
+ return this.guid + '-panel';
245
+ }
246
+ get hintId() {
247
+ return this.guid + '-hint';
248
+ }
249
+ get toneButtonId() {
250
+ return this.guid + '-tone';
251
+ }
252
+ get toneListId() {
253
+ return this.guid + '-tones';
254
+ }
255
+ toneOptionId = (tone: number) => this.guid + '-tone-' + tone;
256
+ tabId = (group: number) => this.guid + '-tab-' + group;
257
+
258
+ get label(): string {
259
+ return this.args.label ?? 'Emoji picker';
260
+ }
261
+
262
+ get columns(): number {
263
+ let n = Math.trunc(this.args.columns ?? DEFAULT_COLUMNS);
264
+ return Math.max(4, Math.min(16, Number.isFinite(n) ? n : DEFAULT_COLUMNS));
265
+ }
266
+
267
+ get skinTone(): number {
268
+ let tone = this.args.skinTone ?? this.internalTone;
269
+ return Math.max(0, Math.min(5, Math.trunc(tone) || 0));
270
+ }
271
+
272
+ get recent(): readonly string[] {
273
+ return this.args.recent ?? this.internalRecent;
274
+ }
275
+
276
+ get recentLimit(): number {
277
+ let n = Math.trunc(this.args.recentLimit ?? DEFAULT_RECENT_LIMIT);
278
+ return Math.max(0, Math.min(64, Number.isFinite(n) ? n : DEFAULT_RECENT_LIMIT));
279
+ }
280
+
281
+ get searching(): boolean {
282
+ return this.query.trim().length >= MIN_SEARCH_LENGTH;
283
+ }
284
+
285
+ get isLoading(): boolean {
286
+ return this.status === 'loading';
287
+ }
288
+
289
+ get isError(): boolean {
290
+ return this.status === 'error';
291
+ }
292
+
293
+ get shouldAutofocus(): boolean {
294
+ return this.args.autofocus === true;
295
+ }
296
+
297
+ get rootStyle() {
298
+ return cssStyleFrom([
299
+ '--pretui-emoji-columns: ' + String(this.columns),
300
+ ]);
301
+ }
302
+
303
+ // ── Load ───────────────────────────────────────────────────────────────
304
+
305
+ /** Kicked off by the `buildIndex` modifier, so it only ever runs in a
306
+ * browser. `cancelled` is the modifier's destroyed flag — checked after
307
+ * every await so a picker torn down mid-load sets nothing. */
308
+ private load = (cancelled: () => boolean) => {
309
+ let version = this.args.emojiVersion;
310
+ let supportLevel =
311
+ typeof version === 'number' && Number.isFinite(version)
312
+ ? version
313
+ : detectSupportLevel();
314
+
315
+ EmojiIndex.load(supportLevel)
316
+ .then((index) => {
317
+ if (cancelled() || this.isDestroying) {
318
+ return;
319
+ }
320
+ this.index = index;
321
+ this.status = 'ready';
322
+ this.announcement = '';
323
+ })
324
+ .catch((error: unknown) => {
325
+ if (cancelled() || this.isDestroying) {
326
+ return;
327
+ }
328
+ // A picker that cannot load its data is a missing picker, not a
329
+ // broken one — say so in text and keep the trigger usable.
330
+ this.errorMessage =
331
+ error instanceof Error ? error.message : 'Could not load emoji.';
332
+ this.status = 'error';
333
+ });
334
+ };
335
+
336
+ // ── Categories ─────────────────────────────────────────────────────────
337
+
338
+ get tabs(): { id: number; key: string; sample: string; label: string }[] {
339
+ let tabs: { id: number; key: string; sample: string; label: string }[] = [];
340
+ if (this.recent.length) {
341
+ tabs.push({
342
+ id: RECENT_GROUP,
343
+ key: 'recent',
344
+ // A clock face, because there is no clock icon in icon-registry.gts
345
+ // and an emoji tab strip is the one place a glyph is not a cop-out.
346
+ sample: '\u{1F553}',
347
+ label: 'Recently used',
348
+ });
349
+ }
350
+ for (let group of EMOJI_GROUPS) {
351
+ tabs.push({ id: group.id, key: group.key, sample: group.sample, label: group.label });
352
+ }
353
+ return tabs;
354
+ }
355
+
356
+ /** The selected tab, clamped — the recent tab disappears when the list is
357
+ * empty, so a stale selection has to fall back to something real. */
358
+ get activeGroup(): number {
359
+ let tabs = this.tabs;
360
+ return tabs.some((t) => t.id === this.group) ? this.group : tabs[0]!.id;
361
+ }
362
+
363
+ isSelectedTab = (id: number): boolean => !this.searching && id === this.activeGroup;
364
+
365
+ get panelLabel(): string {
366
+ if (this.searching) {
367
+ return 'Search results';
368
+ }
369
+ return this.tabs.find((t) => t.id === this.activeGroup)?.label ?? 'Emoji';
370
+ }
371
+
372
+ // ── The current emoji list ─────────────────────────────────────────────
373
+
374
+ private get emojis(): readonly Emoji[] {
375
+ let index = this.index;
376
+ if (!index) {
377
+ return [];
378
+ }
379
+ if (this.searching) {
380
+ return index.search(this.query);
381
+ }
382
+ if (this.activeGroup === RECENT_GROUP) {
383
+ // Rehydrate from unicode. An emoji that has left the dataset, or that
384
+ // this browser's font cannot draw, silently drops out rather than
385
+ // rendering as tofu.
386
+ let out: Emoji[] = [];
387
+ for (let unicode of this.recent) {
388
+ let emoji = index.byUnicode(unicode);
389
+ if (emoji) {
390
+ out.push(emoji);
391
+ }
392
+ }
393
+ return out;
394
+ }
395
+ return index.byGroup(this.activeGroup);
396
+ }
397
+
398
+ get cells(): Cell[] {
399
+ let tone = this.skinTone;
400
+ return this.emojis.map((emoji, i) => ({
401
+ emoji,
402
+ glyph: toneOf(emoji, tone),
403
+ index: i,
404
+ key: emoji.unicode,
405
+ }));
406
+ }
407
+
408
+ /** Chunked into `role='row'` groups. Recomputed on category / query /
409
+ * tone change — never on arrow keys, which is why roving tabindex is
410
+ * imperative. */
411
+ get rows(): { key: string; cells: Cell[] }[] {
412
+ let columns = this.columns;
413
+ let cells = this.cells;
414
+ let rows: { key: string; cells: Cell[] }[] = [];
415
+ for (let i = 0; i < cells.length; i += columns) {
416
+ let chunk = cells.slice(i, i + columns);
417
+ rows.push({ key: chunk[0]!.key, cells: chunk });
418
+ }
419
+ return rows;
420
+ }
421
+
422
+ get isEmpty(): boolean {
423
+ return this.status === 'ready' && this.cells.length === 0;
424
+ }
425
+
426
+ /** Change key for `rovingGrid`: any of these means the cell list moved. */
427
+ get gridKey(): string {
428
+ return (
429
+ this.query + '|' + String(this.activeGroup) + '|' + String(this.skinTone) + '|' + String(this.cells.length)
430
+ );
431
+ }
432
+
433
+ // ── Announcement ───────────────────────────────────────────────────────
434
+
435
+ /** What the live region SHOULD say once things settle. Derived from
436
+ * settled state only; the delay lives in `announceWhenIdle`, so nothing is
437
+ * announced per keystroke. */
438
+ get pendingAnnouncement(): string {
439
+ if (this.status !== 'ready' || !this.searching) {
440
+ return '';
441
+ }
442
+ let n = this.cells.length;
443
+ if (n === 0) {
444
+ return 'No emoji found';
445
+ }
446
+ // "emoji" is invariant in the plural, which is why this reads better than
447
+ // DataComponent's generic pluraliser would ("1 emojis").
448
+ return String(n) + ' emoji found';
449
+ }
450
+
451
+ setAnnouncement = (text: string) => {
452
+ if (!this.isDestroying) {
453
+ this.announcement = text;
454
+ }
455
+ };
456
+
457
+ // ── Preview ────────────────────────────────────────────────────────────
458
+
459
+ get preview(): Cell | undefined {
460
+ let cells = this.cells;
461
+ if (!cells.length) {
462
+ return undefined;
463
+ }
464
+ let i = this.previewIndex >= 0 ? this.previewIndex : this.focusedIndex;
465
+ return cells[Math.max(0, Math.min(cells.length - 1, i))];
466
+ }
467
+
468
+ setPreview = (index: number) => {
469
+ this.previewIndex = index;
470
+ };
471
+ clearPreview = () => {
472
+ this.previewIndex = -1;
473
+ };
474
+
475
+ // ── Search ─────────────────────────────────────────────────────────────
476
+
477
+ onSearchInput = (event: Event) => {
478
+ // Search is a Map lookup over an in-memory index, so it runs on every
479
+ // keystroke with no debounce at all. Upstream debounces because its
480
+ // search is an IndexedDB round trip — removing the data fetch removed the
481
+ // reason for the timer, which is the single most dangerous thing a realm
482
+ // component can hold.
483
+ this.query = (event.target as HTMLInputElement).value;
484
+ this.focusedIndex = 0;
485
+ this.previewIndex = -1;
486
+ };
487
+
488
+ clearSearch = () => {
489
+ this.query = '';
490
+ this.focusedIndex = 0;
491
+ this.previewIndex = -1;
492
+ this.gridHasFocus = false;
493
+ };
494
+
495
+ onSearchKeydown = (rawEvent: Event) => {
496
+ let event = rawEvent as KeyboardEvent;
497
+ if (event.key === 'ArrowDown' || event.key === 'Enter') {
498
+ if (this.cells.length) {
499
+ event.preventDefault();
500
+ this.focusedIndex = 0;
501
+ this.gridHasFocus = true;
502
+ }
503
+ return;
504
+ }
505
+ if (event.key === 'Escape' && this.query !== '') {
506
+ // Escape clears the field before it reaches whatever surface is hosting
507
+ // the picker, so the first Escape does not also close the popover.
508
+ event.preventDefault();
509
+ event.stopPropagation();
510
+ this.clearSearch();
511
+ }
512
+ };
513
+
514
+ // ── Tabs ───────────────────────────────────────────────────────────────
515
+
516
+ selectGroup = (id: number) => {
517
+ this.group = id;
518
+ this.query = '';
519
+ this.focusedIndex = 0;
520
+ this.previewIndex = -1;
521
+ this.gridHasFocus = false;
522
+ };
523
+
524
+ onTabKeydown = (rawEvent: Event) => {
525
+ let event = rawEvent as KeyboardEvent;
526
+ let tabs = this.tabs;
527
+ let current = tabs.findIndex((t) => t.id === this.activeGroup);
528
+ let next = current;
529
+ switch (event.key) {
530
+ case 'ArrowRight':
531
+ next = (current + 1) % tabs.length;
532
+ break;
533
+ case 'ArrowLeft':
534
+ next = (current - 1 + tabs.length) % tabs.length;
535
+ break;
536
+ case 'Home':
537
+ next = 0;
538
+ break;
539
+ case 'End':
540
+ next = tabs.length - 1;
541
+ break;
542
+ case 'ArrowDown':
543
+ if (this.cells.length) {
544
+ event.preventDefault();
545
+ this.focusedIndex = 0;
546
+ this.gridHasFocus = true;
547
+ }
548
+ return;
549
+ default:
550
+ return;
551
+ }
552
+ event.preventDefault();
553
+ // Automatic activation: switching category is cheap and non-destructive,
554
+ // which is the condition APG puts on selection-follows-focus for tabs.
555
+ this.selectGroup(tabs[next]!.id);
556
+ (event.currentTarget as HTMLElement)
557
+ ?.querySelectorAll<HTMLElement>('[role="tab"]')
558
+ [next]?.focus();
559
+ };
560
+
561
+ // ── Grid keyboard ──────────────────────────────────────────────────────
562
+
563
+ onGridKeydown = (rawEvent: Event) => {
564
+ let event = rawEvent as KeyboardEvent;
565
+ let count = this.cells.length;
566
+ if (!count) {
567
+ return;
568
+ }
569
+ let columns = this.columns;
570
+ let i = this.focusedIndex;
571
+ let next = i;
572
+
573
+ switch (event.key) {
574
+ case 'ArrowRight':
575
+ next = Math.min(count - 1, i + 1);
576
+ break;
577
+ case 'ArrowLeft':
578
+ next = Math.max(0, i - 1);
579
+ break;
580
+ case 'ArrowDown':
581
+ next = i + columns < count ? i + columns : i;
582
+ break;
583
+ case 'ArrowUp':
584
+ if (i - columns < 0) {
585
+ // Leaving the top row returns to the search field rather than
586
+ // trapping focus — the grid is not a dialog.
587
+ event.preventDefault();
588
+ this.gridHasFocus = false;
589
+ this.focusSearch();
590
+ return;
591
+ }
592
+ next = i - columns;
593
+ break;
594
+ case 'Home':
595
+ next = event.ctrlKey || event.metaKey ? 0 : i - (i % columns);
596
+ break;
597
+ case 'End':
598
+ next =
599
+ event.ctrlKey || event.metaKey
600
+ ? count - 1
601
+ : Math.min(count - 1, i - (i % columns) + columns - 1);
602
+ break;
603
+ case 'PageDown':
604
+ next = Math.min(count - 1, i + columns * PAGE_ROWS);
605
+ break;
606
+ case 'PageUp':
607
+ next = Math.max(0, i - columns * PAGE_ROWS);
608
+ break;
609
+ case 'Escape':
610
+ event.preventDefault();
611
+ event.stopPropagation();
612
+ this.gridHasFocus = false;
613
+ this.focusSearch();
614
+ return;
615
+ default:
616
+ return;
617
+ }
618
+ event.preventDefault();
619
+ this.focusedIndex = next;
620
+ this.previewIndex = -1;
621
+ this.gridHasFocus = true;
622
+ };
623
+
624
+ private focusSearch() {
625
+ let root = document.getElementById(this.searchId);
626
+ root?.focus();
627
+ }
628
+
629
+ /**
630
+ * Keep the roving stop in step when focus arrives by any route we did not
631
+ * initiate — a click, a Tab, a screen reader moving the virtual cursor.
632
+ *
633
+ * The equality guard is load-bearing, not defensive. `rovingGrid` READS
634
+ * `focusedIndex` and then calls `focus()` on that cell, which fires this
635
+ * handler synchronously inside the same render computation; writing the
636
+ * value back there is a backtracking re-render and Glimmer asserts on it
637
+ * ("you attempted to update `focusedIndex` … but it had already been used").
638
+ * When the focus was ours the index already matches, so returning early
639
+ * makes the self-inflicted case a no-op and leaves the genuine ones alone.
640
+ */
641
+ onCellFocus = (index: number) => {
642
+ if (this.focusedIndex === index) {
643
+ return;
644
+ }
645
+ this.focusedIndex = index;
646
+ this.previewIndex = -1;
647
+ };
648
+
649
+ // ── Selection ──────────────────────────────────────────────────────────
650
+
651
+ choose = (cell: Cell) => {
652
+ let base = cell.emoji.unicode;
653
+ // Recency is positional: drop any existing occurrence, put this one at
654
+ // the front, trim to the limit. No timestamps, so the ordering is
655
+ // reproducible and the realm's no-wall-clock law is satisfied by
656
+ // construction rather than by care.
657
+ let next = [base, ...this.recent.filter((u) => u !== base)].slice(
658
+ 0,
659
+ this.recentLimit,
660
+ );
661
+ if (this.args.recent === undefined) {
662
+ this.internalRecent = next;
663
+ }
664
+ this.args.onRecent?.(next);
665
+ this.args.onSelect?.({
666
+ unicode: cell.glyph,
667
+ annotation: cell.emoji.annotation,
668
+ base,
669
+ skinTone: this.skinTone,
670
+ });
671
+ };
672
+
673
+ // ── Skin tone ──────────────────────────────────────────────────────────
674
+
675
+ get toneGlyph(): string {
676
+ return applySkinTone(SKIN_TONE_SAMPLE, this.skinTone);
677
+ }
678
+
679
+ get toneLabel(): string {
680
+ return 'Skin tone: ' + (SKIN_TONE_LABELS[this.skinTone] ?? 'Default');
681
+ }
682
+
683
+ get toneOptions(): { tone: number; glyph: string; label: string }[] {
684
+ return SKIN_TONE_LABELS.map((label, tone) => ({
685
+ tone,
686
+ glyph: applySkinTone(SKIN_TONE_SAMPLE, tone),
687
+ label,
688
+ }));
689
+ }
690
+
691
+ get toneActiveId(): string {
692
+ return this.toneOptionId(this.toneActive);
693
+ }
694
+
695
+ isActiveTone = (tone: number): boolean => tone === this.toneActive;
696
+
697
+ toggleTones = () => {
698
+ this.toneOpen = !this.toneOpen;
699
+ if (this.toneOpen) {
700
+ this.toneActive = this.skinTone;
701
+ }
702
+ };
703
+
704
+ commitTone = (tone: number) => {
705
+ if (this.args.skinTone === undefined) {
706
+ this.internalTone = tone;
707
+ }
708
+ this.args.onSkinTone?.(tone);
709
+ this.toneOpen = false;
710
+ document.getElementById(this.toneButtonId)?.focus();
711
+ };
712
+
713
+ onToneKeydown = (rawEvent: Event) => {
714
+ let event = rawEvent as KeyboardEvent;
715
+ let last = SKIN_TONE_LABELS.length - 1;
716
+ switch (event.key) {
717
+ case 'ArrowDown':
718
+ case 'ArrowRight':
719
+ event.preventDefault();
720
+ this.toneActive = Math.min(last, this.toneActive + 1);
721
+ break;
722
+ case 'ArrowUp':
723
+ case 'ArrowLeft':
724
+ event.preventDefault();
725
+ this.toneActive = Math.max(0, this.toneActive - 1);
726
+ break;
727
+ case 'Home':
728
+ event.preventDefault();
729
+ this.toneActive = 0;
730
+ break;
731
+ case 'End':
732
+ event.preventDefault();
733
+ this.toneActive = last;
734
+ break;
735
+ case 'Enter':
736
+ case ' ':
737
+ event.preventDefault();
738
+ this.commitTone(this.toneActive);
739
+ break;
740
+ case 'Escape':
741
+ event.preventDefault();
742
+ event.stopPropagation();
743
+ this.toneOpen = false;
744
+ document.getElementById(this.toneButtonId)?.focus();
745
+ break;
746
+ default:
747
+ }
748
+ };
749
+
750
+ onToneButtonKeydown = (rawEvent: Event) => {
751
+ let event = rawEvent as KeyboardEvent;
752
+ if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {
753
+ event.preventDefault();
754
+ if (!this.toneOpen) {
755
+ this.toggleTones();
756
+ }
757
+ }
758
+ };
759
+
760
+ <template>
761
+ <div
762
+ class='pretui-emoji'
763
+ role='group'
764
+ aria-label={{this.label}}
765
+ style={{this.rootStyle}}
766
+ data-test-pretui-emoji-picker
767
+ data-status={{this.status}}
768
+ {{buildIndex this.load}}
769
+ {{announceWhenIdle
770
+ this.pendingAnnouncement
771
+ ANNOUNCE_DELAY
772
+ this.setAnnouncement
773
+ }}
774
+ ...attributes
775
+ >
776
+ <div class='epx-top'>
777
+ <span class='epx-searchwrap'>
778
+ <svg
779
+ class='epx-magnifier'
780
+ viewBox='0 0 16 16'
781
+ aria-hidden='true'
782
+ focusable='false'
783
+ ><circle
784
+ cx='7'
785
+ cy='7'
786
+ r='4.25'
787
+ fill='none'
788
+ stroke='currentColor'
789
+ stroke-width='1.5'
790
+ /><path
791
+ d='M10.2 10.2L14 14'
792
+ fill='none'
793
+ stroke='currentColor'
794
+ stroke-width='1.5'
795
+ stroke-linecap='round'
796
+ /></svg>
797
+ {{! A real <label>, visually hidden, rather than aria-label — realm
798
+ lint counts aria-label beside a placeholder as two labels, and
799
+ a placeholder was never a label. The visible hint is painted. }}
800
+ <label for={{this.searchId}} class='epx-sr'>Search emoji</label>
801
+ {{#unless this.query}}
802
+ <span class='epx-ghost' aria-hidden='true'>Search emoji</span>
803
+ {{/unless}}
804
+ <input
805
+ id={{this.searchId}}
806
+ class='epx-search'
807
+ type='search'
808
+ autocomplete='off'
809
+ autocapitalize='none'
810
+ spellcheck='false'
811
+ enterkeyhint='search'
812
+ aria-controls={{this.panelId}}
813
+ aria-describedby={{this.hintId}}
814
+ value={{this.query}}
815
+ data-test-pretui-emoji-search
816
+ {{focusOnce this.shouldAutofocus}}
817
+ {{on 'input' this.onSearchInput}}
818
+ {{on 'keydown' this.onSearchKeydown}}
819
+ />
820
+ {{#if this.query}}
821
+ <button
822
+ type='button'
823
+ class='epx-clear'
824
+ aria-label='Clear search'
825
+ data-test-pretui-emoji-clear
826
+ {{on 'click' this.clearSearch}}
827
+ >
828
+ <svg
829
+ width='12'
830
+ height='12'
831
+ viewBox='0 0 12 12'
832
+ aria-hidden='true'
833
+ focusable='false'
834
+ ><path
835
+ d='M3 3l6 6M9 3l-6 6'
836
+ fill='none'
837
+ stroke='currentColor'
838
+ stroke-width='1.5'
839
+ stroke-linecap='round'
840
+ /></svg>
841
+ </button>
842
+ {{/if}}
843
+ </span>
844
+
845
+ <span class='epx-tonewrap'>
846
+ <button
847
+ type='button'
848
+ id={{this.toneButtonId}}
849
+ class='epx-tonebutton'
850
+ aria-label={{this.toneLabel}}
851
+ aria-haspopup='listbox'
852
+ aria-expanded={{if this.toneOpen 'true' 'false'}}
853
+ aria-controls={{this.toneListId}}
854
+ data-test-pretui-emoji-tone-button
855
+ {{on 'click' this.toggleTones}}
856
+ {{on 'keydown' this.onToneButtonKeydown}}
857
+ >
858
+ <span class='epx-glyph' aria-hidden='true'>{{this.toneGlyph}}</span>
859
+ </button>
860
+ {{#if this.toneOpen}}
861
+ <div
862
+ id={{this.toneListId}}
863
+ class='epx-tonelist'
864
+ role='listbox'
865
+ aria-label='Skin tones'
866
+ aria-activedescendant={{this.toneActiveId}}
867
+ tabindex='0'
868
+ data-test-pretui-emoji-tone-list
869
+ {{focusOnce true}}
870
+ {{listen 'keydown' this.onToneKeydown}}
871
+ >
872
+ {{#each this.toneOptions key='tone' as |option|}}
873
+ <div
874
+ id={{this.toneOptionId option.tone}}
875
+ class='epx-toneoption'
876
+ role='option'
877
+ aria-selected={{if (this.isActiveTone option.tone) 'true' 'false'}}
878
+ data-active={{if (this.isActiveTone option.tone) 'true'}}
879
+ data-test-pretui-emoji-tone-option
880
+ {{on 'click' (fn this.commitTone option.tone)}}
881
+ >
882
+ <span class='epx-glyph' aria-hidden='true'>{{option.glyph}}</span>
883
+ <span class='epx-tonename'>{{option.label}}</span>
884
+ </div>
885
+ {{/each}}
886
+ </div>
887
+ {{/if}}
888
+ </span>
889
+ </div>
890
+
891
+ <div
892
+ class='epx-tabs'
893
+ role='tablist'
894
+ aria-label='Emoji categories'
895
+ data-test-pretui-emoji-tabs
896
+ {{listen 'keydown' this.onTabKeydown}}
897
+ >
898
+ {{#each this.tabs key='key' as |tab|}}
899
+ <button
900
+ type='button'
901
+ role='tab'
902
+ id={{this.tabId tab.id}}
903
+ class='epx-tab'
904
+ aria-label={{tab.label}}
905
+ aria-selected={{if (this.isSelectedTab tab.id) 'true' 'false'}}
906
+ aria-controls={{this.panelId}}
907
+ tabindex={{if (this.isSelectedTab tab.id) '0' '-1'}}
908
+ data-selected={{if (this.isSelectedTab tab.id) 'true'}}
909
+ data-test-pretui-emoji-tab
910
+ {{on 'click' (fn this.selectGroup tab.id)}}
911
+ >
912
+ <span class='epx-glyph' aria-hidden='true'>{{tab.sample}}</span>
913
+ </button>
914
+ {{/each}}
915
+ </div>
916
+
917
+ <span id={{this.hintId}} class='epx-sr'>Type to filter emoji, then press
918
+ the down arrow to move into the grid.</span>
919
+
920
+ <div
921
+ id={{this.panelId}}
922
+ class='epx-panel'
923
+ role='tabpanel'
924
+ aria-label={{this.panelLabel}}
925
+ aria-busy={{if this.isLoading 'true' 'false'}}
926
+ data-test-pretui-emoji-panel
927
+ >
928
+ {{#if this.isLoading}}
929
+ <div class='epx-state' data-test-pretui-emoji-loading>
930
+ <span class='epx-skeleton' aria-hidden='true'></span>
931
+ <span class='epx-statetext'>Loading emoji…</span>
932
+ </div>
933
+ {{else if this.isError}}
934
+ <div class='epx-state' data-test-pretui-emoji-error>
935
+ <span class='epx-stateglyph' aria-hidden='true'>⚠</span>
936
+ <span class='epx-statetext'>{{this.errorMessage}}</span>
937
+ </div>
938
+ {{else if this.isEmpty}}
939
+ {{! A magnifier EMOJI as the empty-state icon was the one place in
940
+ the kit where a colour pictogram stood in for an icon — and the
941
+ worst possible place for it, because the grid it replaces is
942
+ made of colour pictograms, so the mark had no figure/ground
943
+ distinction from the content that was missing. The empty state
944
+ now does what an empty state is for: name the term that found
945
+ nothing, and offer the way out. }}
946
+ <div class='epx-state' data-test-pretui-emoji-empty>
947
+ <span class='epx-statetext'>No emoji match
948
+ <span class='epx-stateterm'>{{this.query}}</span></span>
949
+ <button
950
+ type='button'
951
+ class='epx-stateaction'
952
+ data-test-pretui-emoji-empty-clear
953
+ {{on 'click' this.clearSearch}}
954
+ >Clear the search</button>
955
+ </div>
956
+ {{else}}
957
+ <div
958
+ class='epx-grid'
959
+ role='grid'
960
+ aria-label={{this.panelLabel}}
961
+ aria-rowcount={{this.rows.length}}
962
+ aria-colcount={{this.columns}}
963
+ data-test-pretui-emoji-grid
964
+ {{rovingGrid this.focusedIndex this.gridHasFocus this.gridKey}}
965
+ {{listen 'keydown' this.onGridKeydown}}
966
+ {{listen 'mouseleave' this.clearPreview}}
967
+ >
968
+ {{#each this.rows key='key' as |row|}}
969
+ <div class='epx-row' role='row'>
970
+ {{#each row.cells key='key' as |cell|}}
971
+ <button
972
+ type='button'
973
+ role='gridcell'
974
+ class='epx-cell'
975
+ aria-label={{cell.emoji.annotation}}
976
+ data-emoji-cell
977
+ data-test-pretui-emoji-cell
978
+ {{on 'click' (fn this.choose cell)}}
979
+ {{on 'focus' (fn this.onCellFocus cell.index)}}
980
+ {{on 'mouseenter' (fn this.setPreview cell.index)}}
981
+ >
982
+ <span class='epx-glyph' aria-hidden='true'>{{cell.glyph}}</span>
983
+ </button>
984
+ {{/each}}
985
+ </div>
986
+ {{/each}}
987
+ </div>
988
+ {{/if}}
989
+ </div>
990
+
991
+ <div class='epx-preview' data-test-pretui-emoji-preview>
992
+ {{#if this.preview}}
993
+ <span class='epx-glyph epx-previewglyph' aria-hidden='true'>
994
+ {{this.preview.glyph}}
995
+ </span>
996
+ <span class='epx-previewname'>{{this.preview.emoji.annotation}}</span>
997
+ {{else}}
998
+ <span class='epx-previewname epx-previewidle'>Pick an emoji</span>
999
+ {{/if}}
1000
+ </div>
1001
+
1002
+ {{! Polite, and only after the query has been still for a beat — a
1003
+ screen reader must not read a result count on every keystroke. }}
1004
+ <p class='epx-sr' role='status' data-test-pretui-emoji-live>
1005
+ {{this.announcement}}
1006
+ </p>
1007
+ </div>
1008
+
1009
+ <style scoped>
1010
+ @layer PretComponent {
1011
+ /* Zero dark branches: every value is a token with a light-value
1012
+ fallback, so the theme frame re-dresses the picker without this file
1013
+ knowing a theme exists. Upstream forks on prefers-color-scheme
1014
+ inside its shadow root, which is why a dark Pretui frame on a light
1015
+ OS gave you a light picker. */
1016
+ .pretui-emoji {
1017
+ --pretui-emoji-size: var(--pretui-emoji-cell, 2rem);
1018
+ --pretui-emoji-gap: 2px;
1019
+
1020
+ display: flex;
1021
+ flex-direction: column;
1022
+ gap: 8px;
1023
+ inline-size: 100%;
1024
+ max-inline-size: var(--pretui-emoji-width, 22rem);
1025
+ padding: 10px;
1026
+ border-radius: var(--radius-surface, 12px);
1027
+ background: var(--card);
1028
+ color: var(--foreground);
1029
+ /* Law 1 — depth is hairline + shadow, never a contrast border. */
1030
+ box-shadow: var(
1031
+ --pretui-shadow-card,
1032
+ 0 0 0 1px var(--border),
1033
+ 0 1px 2px rgb(0 0 0 / 0.2),
1034
+ 0 2px 6px rgb(0 0 0 / 0.2)
1035
+ );
1036
+ font-family: var(--font-sans);
1037
+ font-size: var(--text-ui-md, 12.5px);
1038
+ letter-spacing: var(--track-ui, 0.01em);
1039
+ }
1040
+
1041
+ .epx-sr {
1042
+ position: absolute;
1043
+ inline-size: 1px;
1044
+ block-size: 1px;
1045
+ margin: -1px;
1046
+ padding: 0;
1047
+ overflow: hidden;
1048
+ clip-path: inset(50%);
1049
+ white-space: nowrap;
1050
+ border: 0;
1051
+ }
1052
+
1053
+ /* ── Search row ─────────────────────────────────────────────────── */
1054
+ .epx-top {
1055
+ display: flex;
1056
+ align-items: center;
1057
+ gap: 6px;
1058
+ }
1059
+
1060
+ .epx-searchwrap {
1061
+ position: relative;
1062
+ display: flex;
1063
+ align-items: center;
1064
+ flex: 1 1 auto;
1065
+ min-inline-size: 0;
1066
+ }
1067
+
1068
+ .epx-magnifier {
1069
+ position: absolute;
1070
+ inset-inline-start: 8px;
1071
+ inline-size: 14px;
1072
+ block-size: 14px;
1073
+ color: var(--muted-foreground);
1074
+ pointer-events: none;
1075
+ }
1076
+
1077
+ .epx-ghost {
1078
+ position: absolute;
1079
+ inset-inline-start: 28px;
1080
+ color: var(--muted-foreground);
1081
+ pointer-events: none;
1082
+ }
1083
+
1084
+ .epx-search {
1085
+ inline-size: 100%;
1086
+ min-inline-size: 0;
1087
+ padding: 6px 28px 6px 28px;
1088
+ border: 0;
1089
+ border-radius: var(--radius);
1090
+ background: var(--field, var(--boxel-light));
1091
+ color: inherit;
1092
+ font: inherit;
1093
+ letter-spacing: inherit;
1094
+ box-shadow: inset 0 0 0 1px var(--input);
1095
+ }
1096
+
1097
+ .epx-search::-webkit-search-cancel-button {
1098
+ /* The picker ships its own clear button, with an accessible name and
1099
+ a focus ring; the UA one has neither. */
1100
+ appearance: none;
1101
+ }
1102
+
1103
+ .epx-search:focus-visible,
1104
+ .epx-tonebutton:focus-visible,
1105
+ .epx-tab:focus-visible,
1106
+ .epx-clear:focus-visible,
1107
+ .epx-cell:focus-visible,
1108
+ .epx-tonelist:focus-visible {
1109
+ outline: 2px solid var(--ring);
1110
+ outline-offset: 1px;
1111
+ }
1112
+
1113
+ .epx-clear {
1114
+ position: absolute;
1115
+ inset-inline-end: 4px;
1116
+ display: grid;
1117
+ place-items: center;
1118
+ inline-size: 20px;
1119
+ block-size: 20px;
1120
+ padding: 0;
1121
+ border: 0;
1122
+ border-radius: 999px;
1123
+ background: transparent;
1124
+ color: var(--muted-foreground);
1125
+ cursor: pointer;
1126
+ }
1127
+
1128
+ .epx-clear:hover {
1129
+ background: var(--muted);
1130
+ color: var(--foreground);
1131
+ }
1132
+
1133
+ /* ── Skin tone ──────────────────────────────────────────────────── */
1134
+ .epx-tonewrap {
1135
+ position: relative;
1136
+ flex: 0 0 auto;
1137
+ }
1138
+
1139
+ .epx-tonebutton {
1140
+ display: grid;
1141
+ place-items: center;
1142
+ inline-size: var(--pretui-emoji-size);
1143
+ block-size: var(--pretui-emoji-size);
1144
+ padding: 0;
1145
+ border: 0;
1146
+ border-radius: var(--radius);
1147
+ background: transparent;
1148
+ cursor: pointer;
1149
+ }
1150
+
1151
+ .epx-tonebutton:hover {
1152
+ background: var(--muted);
1153
+ }
1154
+
1155
+ .epx-tonelist {
1156
+ position: absolute;
1157
+ inset-inline-end: 0;
1158
+ inset-block-start: calc(100% + 4px);
1159
+ /* The one place this component stacks: a panel floating over the
1160
+ picker's own content. Token first, literal fallback mandatory. */
1161
+ z-index: var(--pretui-z-dropdown, 60);
1162
+ display: flex;
1163
+ flex-direction: column;
1164
+ min-inline-size: 10rem;
1165
+ padding: 4px;
1166
+ border-radius: var(--radius);
1167
+ background: var(--popover);
1168
+ box-shadow: var(
1169
+ --pretui-shadow-overlay,
1170
+ 0 0 0 1px var(--border),
1171
+ 0 8px 28px rgb(0 0 0 / 0.34)
1172
+ );
1173
+ }
1174
+
1175
+ .epx-toneoption {
1176
+ display: flex;
1177
+ align-items: center;
1178
+ gap: 8px;
1179
+ padding: 4px 8px;
1180
+ border-radius: var(--radius-sm, 8px);
1181
+ cursor: pointer;
1182
+ }
1183
+
1184
+ .epx-toneoption:hover,
1185
+ .epx-toneoption[data-active='true'] {
1186
+ background: var(--muted);
1187
+ }
1188
+
1189
+ /* Never colour alone: the active tone is named in text beside the
1190
+ swatch and carries aria-selected. */
1191
+ .epx-tonename {
1192
+ color: var(--muted-foreground);
1193
+ }
1194
+
1195
+ .epx-toneoption[data-active='true'] .epx-tonename {
1196
+ color: var(--foreground);
1197
+ font-weight: 600;
1198
+ }
1199
+
1200
+ /* ── Category tabs ──────────────────────────────────────────────── */
1201
+ .epx-tabs {
1202
+ display: grid;
1203
+ grid-auto-flow: column;
1204
+ grid-auto-columns: 1fr;
1205
+ gap: 2px;
1206
+ padding-block-end: 6px;
1207
+ box-shadow: inset 0 -1px 0 var(--border);
1208
+ }
1209
+
1210
+ .epx-tab {
1211
+ position: relative;
1212
+ display: grid;
1213
+ place-items: center;
1214
+ block-size: 1.75rem;
1215
+ padding: 0;
1216
+ border: 0;
1217
+ border-radius: var(--radius-sm, 8px);
1218
+ background: transparent;
1219
+ cursor: pointer;
1220
+ opacity: 0.55;
1221
+ }
1222
+
1223
+ .epx-tab:hover {
1224
+ opacity: 1;
1225
+ background: var(--muted);
1226
+ }
1227
+
1228
+ .epx-tab[data-selected='true'] {
1229
+ opacity: 1;
1230
+ }
1231
+
1232
+ /* The selected tab is marked by an underline AND by full opacity, so
1233
+ the state survives greyscale. */
1234
+ .epx-tab[data-selected='true']::after {
1235
+ content: '';
1236
+ position: absolute;
1237
+ inset-block-end: -6px;
1238
+ inset-inline: 15%;
1239
+ block-size: 2px;
1240
+ border-radius: 2px;
1241
+ background: var(--primary);
1242
+ }
1243
+
1244
+ /* ── Grid ───────────────────────────────────────────────────────── */
1245
+ .epx-panel {
1246
+ block-size: var(--pretui-emoji-height, 15rem);
1247
+ overflow-y: auto;
1248
+ overscroll-behavior: contain;
1249
+ scrollbar-width: thin;
1250
+ }
1251
+
1252
+ .epx-grid {
1253
+ display: flex;
1254
+ flex-direction: column;
1255
+ gap: var(--pretui-emoji-gap);
1256
+ }
1257
+
1258
+ .epx-row {
1259
+ display: grid;
1260
+ grid-template-columns: repeat(var(--pretui-emoji-columns, 9), 1fr);
1261
+ gap: var(--pretui-emoji-gap);
1262
+ }
1263
+
1264
+ .epx-cell {
1265
+ display: grid;
1266
+ place-items: center;
1267
+ aspect-ratio: 1;
1268
+ min-block-size: var(--pretui-emoji-size);
1269
+ padding: 0;
1270
+ border: 0;
1271
+ border-radius: var(--radius-sm, 8px);
1272
+ background: transparent;
1273
+ cursor: pointer;
1274
+ }
1275
+
1276
+ .epx-cell:hover {
1277
+ background: var(--muted);
1278
+ }
1279
+
1280
+ /* Emoji are painted by the colour-emoji font, never by currentColor —
1281
+ a colour font ignores it, so a "muted" emoji is a myth. Opacity is
1282
+ the only honest channel. */
1283
+ .epx-glyph {
1284
+ font-family: var(
1285
+ --pretui-emoji-font,
1286
+ 'Twemoji Mozilla',
1287
+ 'Apple Color Emoji',
1288
+ 'Segoe UI Emoji',
1289
+ 'Segoe UI Symbol',
1290
+ 'Noto Color Emoji',
1291
+ 'EmojiOne Color',
1292
+ 'Android Emoji',
1293
+ sans-serif
1294
+ );
1295
+ font-size: var(--pretui-emoji-glyph, 1.25rem);
1296
+ line-height: 1;
1297
+ }
1298
+
1299
+ /* ── States ─────────────────────────────────────────────────────── */
1300
+ .epx-state {
1301
+ display: flex;
1302
+ flex-direction: column;
1303
+ align-items: center;
1304
+ justify-content: center;
1305
+ gap: 8px;
1306
+ block-size: 100%;
1307
+ color: var(--muted-foreground);
1308
+ }
1309
+
1310
+ .epx-stateglyph {
1311
+ font-size: 1.5rem;
1312
+ }
1313
+
1314
+ /* Law 3: the term the reader typed is a machine value inside prose,
1315
+ so it is set in mono rather than quoted or emphasised. */
1316
+ .epx-stateterm {
1317
+ font-family: var(--font-mono);
1318
+ font-size: var(--text-ui-sm, 11.5px);
1319
+ color: var(--foreground);
1320
+ }
1321
+
1322
+ .epx-stateaction {
1323
+ padding: 0;
1324
+ border: 0;
1325
+ background: none;
1326
+ font: inherit;
1327
+ font-size: var(--text-ui-sm, 11.5px);
1328
+ color: var(--pretui-primary-ink, var(--primary));
1329
+ text-decoration: underline;
1330
+ text-underline-offset: 2px;
1331
+ cursor: pointer;
1332
+ }
1333
+ .epx-stateaction:focus-visible {
1334
+ outline: 2px solid var(--ring);
1335
+ outline-offset: 2px;
1336
+ border-radius: var(--radius-chip, 6px);
1337
+ }
1338
+
1339
+ .epx-skeleton {
1340
+ inline-size: 60%;
1341
+ block-size: 8px;
1342
+ border-radius: 999px;
1343
+ background: var(--muted);
1344
+ animation: epx-pulse 1.4s ease-in-out infinite;
1345
+ }
1346
+
1347
+ @keyframes epx-pulse {
1348
+ 50% {
1349
+ opacity: 0.45;
1350
+ }
1351
+ }
1352
+
1353
+ /* Reduced motion lands on the END state, never a frozen midpoint. */
1354
+ @media (prefers-reduced-motion: reduce) {
1355
+ .epx-skeleton {
1356
+ animation: none;
1357
+ opacity: 1;
1358
+ }
1359
+ }
1360
+
1361
+ /* ── Preview ────────────────────────────────────────────────────── */
1362
+ .epx-preview {
1363
+ display: flex;
1364
+ align-items: center;
1365
+ gap: 8px;
1366
+ min-block-size: 1.5rem;
1367
+ padding-block-start: 6px;
1368
+ box-shadow: inset 0 1px 0 var(--border);
1369
+ }
1370
+
1371
+ .epx-previewglyph {
1372
+ font-size: 1.25rem;
1373
+ }
1374
+
1375
+ .epx-previewname {
1376
+ overflow: hidden;
1377
+ text-overflow: ellipsis;
1378
+ white-space: nowrap;
1379
+ color: var(--foreground);
1380
+ }
1381
+
1382
+ .epx-previewidle {
1383
+ color: var(--muted-foreground);
1384
+ }
1385
+
1386
+ /* Coarse pointers get 44px targets. A card knows its pane, not the
1387
+ viewport, so this is a pointer query, not a width query. */
1388
+ @media (any-pointer: coarse) {
1389
+ .pretui-emoji {
1390
+ --pretui-emoji-size: 2.75rem;
1391
+ }
1392
+ }
1393
+ }
1394
+ </style>
1395
+ </template>
1396
+ }