@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,1618 @@
1
+ // Pretui — DataTable: the record listing: sort, filter, select, paginate and column visibility.
2
+ import Component from '@glimmer/component';
3
+ import { tracked } from '@glimmer/tracking';
4
+ import { fn } from '@ember/helper';
5
+ import { on } from '@ember/modifier';
6
+ import { guidFor } from '@ember/object/internals';
7
+ import { cssDeclaration, cssStyleFrom, cssValue } from '../pretui-css';
8
+ import { DataShell, DataSource, ExpansionState } from '../data-component';
9
+ import type { ExpansionView } from '../data-component';
10
+ import type {
11
+ DataArgs,
12
+ DataLoad,
13
+ RowKey,
14
+ RowKeyFn,
15
+ SelectionMode,
16
+ SortState,
17
+ } from '../data-component';
18
+ import { Button } from './button';
19
+ import { FilterChips } from './filter-chips';
20
+ import type { FilterChipOption } from './filter-chips';
21
+ import type { PretuiSize } from '../pretui-primitives';
22
+ import { EmptyState } from './empty-state';
23
+ import { Pagination } from './pagination';
24
+ import { Menu } from './menu';
25
+ import type { MenuEntry } from '../internal/menu';
26
+ import { rovingTabindex } from '../focus';
27
+ import {
28
+ printValue,
29
+ readField,
30
+ setsIndeterminate,
31
+ } from '../internal/reading-listing';
32
+ import type { ListingSizeArg } from '../internal/reading-listing';
33
+ import { resolveSize } from '../pretui-primitives';
34
+
35
+ // ═════════════════════════════════════════════════════════════════════════
36
+ // DataTable — the record listing
37
+ // ═════════════════════════════════════════════════════════════════════════
38
+
39
+ /** Where a column's content sits. Logical, so RTL is free. */
40
+ export type ColumnAlign = 'start' | 'end' | 'center';
41
+ /** Which edge a column pins to. */
42
+ export type ColumnPin = 'start' | 'end';
43
+ /** A filter's current value: a query string, or the chosen enum values. */
44
+ export type FilterValue = string | readonly string[];
45
+ /** The whole filter state, keyed by column. */
46
+ export type FilterState = Record<string, FilterValue>;
47
+
48
+ /** One choice in an `'options'` filter — the same shape `FilterChips` takes,
49
+ * because that is what renders it. */
50
+ export type ColumnFilterOption = FilterChipOption;
51
+
52
+ export interface ColumnFilter<T> {
53
+ /** `'text'` is a case-insensitive contains match over the cell's printed
54
+ * value; `'options'` is a multi-select over a fixed set. */
55
+ kind: 'text' | 'options';
56
+ /** the choices, for `kind: 'options'` */
57
+ options?: ColumnFilterOption[];
58
+ /** replaces the built-in matcher — the hook for dates, ranges, nested
59
+ * paths, or anything the printed value cannot express */
60
+ match?: (row: T, value: FilterValue) => boolean;
61
+ }
62
+
63
+ export interface DataColumn<T> {
64
+ /** identity, default field read, and sort key */
65
+ key: string;
66
+ /** header text, and the column's name in the column menu */
67
+ label: string;
68
+ /** read the cell's value; defaults to `row[key]` */
69
+ value?: (row: T) => unknown;
70
+ /** `false` opts this column out of sorting; unset follows `@sortable` */
71
+ sortable?: boolean;
72
+ /** `'start'` (default), `'end'` for numbers, `'center'` for glyphs */
73
+ align?: ColumnAlign;
74
+ /** machine value — mono, tabular numerals, `'end'` alignment implied for
75
+ * numbers (mono is for machine values only) */
76
+ mono?: boolean;
77
+ /** any CSS length. REQUIRED on a pinned column and on every pinned column
78
+ * before it — offsets are summed from declared widths, never measured. */
79
+ width?: string;
80
+ /** pin to the inline start or end while the table scrolls sideways */
81
+ pin?: ColumnPin;
82
+ /** Ant's spelling: `true` means `'start'` */
83
+ fixed?: ColumnPin | true;
84
+ /** start hidden (still listed, and re-showable, in the column menu) */
85
+ hidden?: boolean;
86
+ /** never hideable — the identity column */
87
+ alwaysVisible?: boolean;
88
+ /** per-column filter, surfaced in the toolbar */
89
+ filter?: ColumnFilter<T>;
90
+ }
91
+
92
+ interface HeaderCell<T> {
93
+ key: string;
94
+ col: DataColumn<T>;
95
+ label: string;
96
+ align: ColumnAlign;
97
+ mono: string | undefined;
98
+ sortable: boolean;
99
+ ariaSort: 'ascending' | 'descending' | 'none' | undefined;
100
+ mark: string;
101
+ hint: string;
102
+ pin: ColumnPin | undefined;
103
+ filtered: string | undefined;
104
+ style: ReturnType<typeof cssStyleFrom>;
105
+ }
106
+
107
+ interface BodyCell<T> {
108
+ key: string;
109
+ col: DataColumn<T>;
110
+ value: unknown;
111
+ text: string;
112
+ align: ColumnAlign;
113
+ mono: string | undefined;
114
+ pin: ColumnPin | undefined;
115
+ style: ReturnType<typeof cssStyleFrom>;
116
+ }
117
+
118
+ interface TableLine<T> {
119
+ key: RowKey;
120
+ row: T;
121
+ index: number;
122
+ cells: BodyCell<T>[];
123
+ selected: boolean;
124
+ ariaSelected: 'true' | 'false' | undefined;
125
+ selectedFlag: string | undefined;
126
+ expansion: ExpansionView;
127
+ label: string;
128
+ }
129
+
130
+ interface FilterControl<T> {
131
+ key: string;
132
+ col: DataColumn<T>;
133
+ isText: boolean;
134
+ label: string;
135
+ text: string;
136
+ values: string[];
137
+ options: ColumnFilterOption[];
138
+ }
139
+
140
+ export interface DataTableSignature<T> {
141
+ Args: {
142
+ /** the column model, in display order */
143
+ columns: DataColumn<T>[];
144
+ /** the records. `@rows` is the tabular-collection noun (the List-ish
145
+ * contract); `@dataSource` is Ant's spelling and is accepted. */
146
+ rows?: readonly T[];
147
+ /** alias for `@rows` */
148
+ dataSource?: readonly T[];
149
+ /** async loader — see `DataArgs.load`. Filters still apply, in the
150
+ * browser, over whatever the loader returned. To filter at the source
151
+ * instead, feed `@filters` into `@loadKey`. */
152
+ load?: DataLoad<T>;
153
+ /** re-run `@load` whenever this changes. No debounce — that is a timer. */
154
+ loadKey?: unknown;
155
+ /** stable identity for a row. Pass it: a listing sorts, and an
156
+ * index-keyed row's identity MOVES when it does. */
157
+ key?: RowKeyFn<T>;
158
+ /** the table's accessible name, rendered as a real `<caption>` */
159
+ caption?: string;
160
+ /** accessible name when there should be no visible caption */
161
+ label?: string;
162
+ /** density — `xs|s|m|l|xl`, `sm`/`md`/`lg`/`middle` accepted */
163
+ size?: ListingSizeArg;
164
+ /** every column is sortable unless it says otherwise (default true) */
165
+ sortable?: boolean;
166
+ /** controlled sort */
167
+ sort?: SortState | null;
168
+ /** uncontrolled seed */
169
+ defaultSort?: SortState | null;
170
+ /** fires on every step of the asc → desc → unsorted cycle */
171
+ onSortChange?: (sort: SortState | null) => void;
172
+ /** replaces the default field comparator; return ASCENDING order */
173
+ comparator?: (a: T, b: T, sort: SortState) => number;
174
+ /** `'none'` (default), `'single'` or `'multi'` */
175
+ selectionMode?: SelectionMode;
176
+ /** controlled selection */
177
+ selected?: readonly RowKey[];
178
+ /** uncontrolled seed */
179
+ defaultSelected?: readonly RowKey[];
180
+ /** fires with the next selection on every change */
181
+ onSelectionChange?: (keys: RowKey[], rows: T[]) => void;
182
+ /** controlled column visibility — the keys that are SHOWN */
183
+ visibleColumns?: readonly string[];
184
+ /** uncontrolled seed; defaults to every column without `hidden` */
185
+ defaultVisibleColumns?: readonly string[];
186
+ /** fires with the next visible set */
187
+ onVisibleColumnsChange?: (keys: string[]) => void;
188
+ /** show the column-visibility menu (default true when anything is
189
+ * hideable) */
190
+ columnMenu?: boolean;
191
+ /** controlled filter state, keyed by column */
192
+ filters?: Readonly<FilterState>;
193
+ /** uncontrolled seed */
194
+ defaultFilters?: Readonly<FilterState>;
195
+ /** fires with the next filter state on every change */
196
+ onFiltersChange?: (filters: FilterState) => void;
197
+ /** controlled expanded rows */
198
+ expandedKeys?: readonly RowKey[];
199
+ /** uncontrolled seed */
200
+ defaultExpandedKeys?: readonly RowKey[];
201
+ /** fires with the next expanded set */
202
+ onExpandedChange?: (keys: RowKey[]) => void;
203
+ /** rows per page. Unset (default) renders every row and no pager. */
204
+ pageSize?: number;
205
+ /** controlled page (1-based) */
206
+ page?: number;
207
+ /** uncontrolled seed */
208
+ defaultPage?: number;
209
+ /** fires with the next page */
210
+ onPageChange?: (page: number) => void;
211
+ /** the row's accessible name, used on its selection control and its
212
+ * expander. Defaults to `Row N` — pass this. */
213
+ rowLabel?: (row: T, index: number) => string;
214
+ /** zebra striping (default true) */
215
+ striped?: boolean;
216
+ /** header sticks while the body scrolls (default true) */
217
+ stickyHeader?: boolean;
218
+ /** minimum table width before the scroller takes over (any CSS length).
219
+ * Mantine's `Table.ScrollContainer` requires this and is right to. */
220
+ minWidth?: string;
221
+ /** a caller-driven pending state: `aria-busy` and a dimmed body, with
222
+ * focus and scroll position kept */
223
+ busy?: boolean;
224
+ /** alias for `@busy` */
225
+ loading?: boolean;
226
+ /** rendered for an empty cell (default '—') */
227
+ placeholder?: string;
228
+ /** noun for the polite result count ('lot' → '6 of 24 lots') */
229
+ itemNoun?: string;
230
+ emptyTitle?: string;
231
+ emptyMessage?: string;
232
+ loadingLabel?: string;
233
+ skeletonRows?: number;
234
+ };
235
+ Blocks: {
236
+ /**
237
+ * One cell. There is one block for every column, so switch on
238
+ * `col.key` — that is `<DataGrid>`'s contract and it stays the same one.
239
+ *
240
+ * The first param is the PRINTED value: a string, already through the
241
+ * `@placeholder` rule. It is not the raw field, and that is deliberate.
242
+ * A generic row's field is `unknown`, and a
243
+ * caller should never have to narrow `unknown` inside a template — if
244
+ * they must, the component's types are wrong. The row itself is the
245
+ * second param, fully typed, so `{{row.kg}}` is always available.
246
+ */
247
+ cell: [text: string, row: T, col: DataColumn<T>];
248
+ /** per-row detail. Supplying it turns on the expander column. */
249
+ expanded: [row: T, index: number];
250
+ /** the row's action affordance — a Menu, an IconButton */
251
+ actions: [row: T];
252
+ /** extra toolbar content, before the built-in filters */
253
+ toolbar: [];
254
+ /** replaces the default EmptyState */
255
+ empty: [];
256
+ /** replaces the default spinner + skeleton */
257
+ loading: [];
258
+ /** replaces the default Alert */
259
+ error: [];
260
+ };
261
+ Element: HTMLDivElement;
262
+ }
263
+
264
+ export class DataTable<T> extends Component<DataTableSignature<T>> {
265
+ private guid = guidFor(this);
266
+
267
+ /**
268
+ * TWO state machines, and the split is the design.
269
+ *
270
+ * `loader` owns the LOAD: status, `aria-busy`, retry, the four state
271
+ * slots. `table` owns the VIEW: sort, selection, the row-key contract —
272
+ * over rows that have ALREADY been filtered.
273
+ *
274
+ * One machine could not do both. Filtering has to happen before selection
275
+ * so that "select all" means "select all the rows you can see", and before
276
+ * sorting so the two never disagree; but `DataSource` deliberately does not
277
+ * filter (a filter model that cannot be `rows.filter(...)` is a query, not
278
+ * a component). Stacking the two is one line each and no new state.
279
+ */
280
+ loader = new DataSource<T>(() => this.loaderArgs);
281
+ table = new DataSource<T>(() => this.tableArgs);
282
+
283
+ @tracked private internalVisible: readonly string[] | undefined = undefined;
284
+ @tracked private internalFilters: FilterState | undefined = undefined;
285
+ expansion = new ExpansionState(() => this.args, guidFor(this));
286
+ @tracked private internalPage: number | undefined = undefined;
287
+
288
+ // ── args plumbing ──────────────────────────────────────────────────────
289
+
290
+ private get loaderArgs(): DataArgs<T> {
291
+ let a = this.args;
292
+ return {
293
+ rows: a.rows ?? a.dataSource,
294
+ load: a.load,
295
+ loadKey: a.loadKey,
296
+ key: a.key,
297
+ // This component owns its own count announcement, because the honest
298
+ // one is "6 of 24" and only this layer knows the 24.
299
+ silentCount: true,
300
+ emptyTitle: a.emptyTitle,
301
+ emptyMessage: a.emptyMessage,
302
+ loadingLabel: a.loadingLabel,
303
+ skeletonRows: a.skeletonRows,
304
+ };
305
+ }
306
+
307
+ private get tableArgs(): DataArgs<T> {
308
+ let a = this.args;
309
+ return {
310
+ rows: this.filteredRows,
311
+ key: a.key,
312
+ selectionMode: a.selectionMode,
313
+ selected: a.selected,
314
+ defaultSelected: a.defaultSelected,
315
+ onSelectionChange: a.onSelectionChange,
316
+ sort: a.sort,
317
+ defaultSort: a.defaultSort,
318
+ onSortChange: a.onSortChange,
319
+ comparator: a.comparator,
320
+ silentCount: true,
321
+ };
322
+ }
323
+
324
+ // ── shape ──────────────────────────────────────────────────────────────
325
+
326
+ get size(): PretuiSize {
327
+ return resolveSize(this.args.size);
328
+ }
329
+ get placeholder(): string {
330
+ return this.args.placeholder ?? '—';
331
+ }
332
+ get itemNoun(): string {
333
+ return this.args.itemNoun ?? 'result';
334
+ }
335
+ get striped(): string | undefined {
336
+ return (this.args.striped ?? true) ? 'true' : undefined;
337
+ }
338
+ get sticky(): string | undefined {
339
+ return (this.args.stickyHeader ?? true) ? 'true' : undefined;
340
+ }
341
+ get busy(): 'true' | undefined {
342
+ return (this.args.busy ?? this.args.loading) ? 'true' : undefined;
343
+ }
344
+ get selectionMode(): SelectionMode {
345
+ return this.table.selectionMode;
346
+ }
347
+ get selectable(): boolean {
348
+ return this.selectionMode !== 'none';
349
+ }
350
+ get multi(): boolean {
351
+ return this.selectionMode === 'multi';
352
+ }
353
+ get radioName(): string {
354
+ return this.guid + '-dt';
355
+ }
356
+ get scrollLabel(): string {
357
+ return this.args.label ?? this.args.caption ?? 'Table';
358
+ }
359
+ get scrollStyle() {
360
+ return cssStyleFrom([
361
+ cssDeclaration('--pretui-dt-min-w', this.args.minWidth),
362
+ ]);
363
+ }
364
+
365
+ labelFor = (row: T, index: number): string =>
366
+ this.args.rowLabel?.(row, index) ?? 'Row ' + String(index + 1);
367
+
368
+ // ── columns ────────────────────────────────────────────────────────────
369
+
370
+ get allColumns(): DataColumn<T>[] {
371
+ return this.args.columns ?? [];
372
+ }
373
+
374
+ private pinOf(col: DataColumn<T>): ColumnPin | undefined {
375
+ if (col.pin) {
376
+ return col.pin;
377
+ }
378
+ return col.fixed === true ? 'start' : (col.fixed ?? undefined);
379
+ }
380
+
381
+ get visibleKeys(): readonly string[] {
382
+ if (this.args.visibleColumns !== undefined) {
383
+ return this.args.visibleColumns;
384
+ }
385
+ if (this.internalVisible !== undefined) {
386
+ return this.internalVisible;
387
+ }
388
+ return (
389
+ this.args.defaultVisibleColumns ??
390
+ this.allColumns.filter((c) => !c.hidden).map((c) => c.key)
391
+ );
392
+ }
393
+
394
+ isColumnVisible = (key: string): boolean => this.visibleKeys.includes(key);
395
+
396
+ get columns(): DataColumn<T>[] {
397
+ let shown = this.visibleKeys;
398
+ return this.allColumns.filter(
399
+ (c) => c.alwaysVisible || shown.includes(c.key),
400
+ );
401
+ }
402
+
403
+ get hideableColumns(): DataColumn<T>[] {
404
+ return this.allColumns.filter((c) => !c.alwaysVisible);
405
+ }
406
+
407
+ get showColumnMenu(): boolean {
408
+ return (this.args.columnMenu ?? true) && this.hideableColumns.length > 0;
409
+ }
410
+
411
+ toggleColumn = (key: string) => {
412
+ let current = this.visibleKeys;
413
+ let next = current.includes(key)
414
+ ? current.filter((k) => k !== key)
415
+ : [
416
+ ...this.allColumns
417
+ .map((c) => c.key)
418
+ .filter((k) => k === key || current.includes(k)),
419
+ ];
420
+ if (this.args.visibleColumns === undefined) {
421
+ this.internalVisible = next;
422
+ }
423
+ this.args.onVisibleColumnsChange?.(next);
424
+ };
425
+
426
+ get columnMenuItems(): MenuEntry[] {
427
+ return this.hideableColumns.map((col) => ({
428
+ kind: 'toggle' as const,
429
+ label: col.label,
430
+ checked: this.isColumnVisible(col.key),
431
+ onSelect: () => this.toggleColumn(col.key),
432
+ }));
433
+ }
434
+
435
+ // ── pinning ────────────────────────────────────────────────────────────
436
+ //
437
+ // Offsets are SUMMED from declared widths. A pinned column whose
438
+ // predecessors are not all measurable is left unpinned rather than laid on
439
+ // top of one of them: a visible loss of the pin beats an invisible overlap.
440
+
441
+ get hasStartPin(): boolean {
442
+ return this.allColumns.some((c) => this.pinOf(c) === 'start');
443
+ }
444
+ get hasEndPin(): boolean {
445
+ return this.allColumns.some((c) => this.pinOf(c) === 'end');
446
+ }
447
+ /** the pin the leading control columns wear, when anything pins start */
448
+ get leadPin(): ColumnPin | undefined {
449
+ return this.hasStartPin ? 'start' : undefined;
450
+ }
451
+ /** the pin the trailing actions column wears, when anything pins end */
452
+ get tailPin(): ColumnPin | undefined {
453
+ return this.hasEndPin ? 'end' : undefined;
454
+ }
455
+
456
+ private get pinOffsets(): Map<string, string | undefined> {
457
+ let out = new Map<string, string | undefined>();
458
+ // The control columns' combined width is resolved in CSS, not here:
459
+ // whether the expander and actions columns exist is a `has-block` fact,
460
+ // and `has-block` only exists inside the template. `--pretui-dt-lead`
461
+ // and `--pretui-dt-tail` are computed from data attributes and classes
462
+ // the template sets, so the offset arithmetic works either way.
463
+ let parts: string[] = ['var(--pretui-dt-lead, 0px)'];
464
+ let broken = false;
465
+ for (let col of this.columns) {
466
+ if (this.pinOf(col) !== 'start') {
467
+ continue;
468
+ }
469
+ out.set(col.key, broken ? undefined : this.offsetExpression(parts));
470
+ let width = cssValue(col.width);
471
+ if (width === undefined) {
472
+ broken = true;
473
+ } else {
474
+ parts.push(width);
475
+ }
476
+ }
477
+ // End pins accumulate from the trailing edge, so walk backwards.
478
+ let tail: string[] = ['var(--pretui-dt-tail, 0px)'];
479
+ let tailBroken = false;
480
+ let reversed = this.columns.slice().reverse();
481
+ for (let col of reversed) {
482
+ if (this.pinOf(col) !== 'end') {
483
+ continue;
484
+ }
485
+ out.set(col.key, tailBroken ? undefined : this.offsetExpression(tail));
486
+ let width = cssValue(col.width);
487
+ if (width === undefined) {
488
+ tailBroken = true;
489
+ } else {
490
+ tail.push(width);
491
+ }
492
+ }
493
+ return out;
494
+ }
495
+
496
+ /** Every part is already through `cssValue` or an authored literal, so the
497
+ * declaration is built rather than re-validated (pretui-css's contract). */
498
+ private offsetExpression(parts: readonly string[]): string {
499
+ if (parts.length === 0) {
500
+ return '0px';
501
+ }
502
+ if (parts.length === 1) {
503
+ return parts[0] as string;
504
+ }
505
+ return 'calc(' + parts.join(' + ') + ')';
506
+ }
507
+
508
+ private cellStyle(col: DataColumn<T>): ReturnType<typeof cssStyleFrom> {
509
+ let pin = this.pinOf(col);
510
+ let offset = pin ? this.pinOffsets.get(col.key) : undefined;
511
+ let side = pin === 'end' ? 'inset-inline-end' : 'inset-inline-start';
512
+ return cssStyleFrom([
513
+ cssDeclaration('width', col.width),
514
+ offset === undefined ? undefined : side + ': ' + offset,
515
+ ]);
516
+ }
517
+
518
+ private pinAttr(col: DataColumn<T>): ColumnPin | undefined {
519
+ let pin = this.pinOf(col);
520
+ if (!pin) {
521
+ return undefined;
522
+ }
523
+ return this.pinOffsets.get(col.key) === undefined ? undefined : pin;
524
+ }
525
+
526
+ private alignOf(col: DataColumn<T>): ColumnAlign {
527
+ return col.align ?? 'start';
528
+ }
529
+
530
+ // ── filtering ──────────────────────────────────────────────────────────
531
+
532
+ get filterState(): FilterState {
533
+ if (this.args.filters !== undefined) {
534
+ return this.args.filters as FilterState;
535
+ }
536
+ return (
537
+ this.internalFilters ?? (this.args.defaultFilters as FilterState) ?? {}
538
+ );
539
+ }
540
+
541
+ get filterControls(): FilterControl<T>[] {
542
+ let state = this.filterState;
543
+ let out: FilterControl<T>[] = [];
544
+ for (let col of this.columns) {
545
+ let spec = col.filter;
546
+ if (!spec) {
547
+ continue;
548
+ }
549
+ let raw = state[col.key];
550
+ out.push({
551
+ key: col.key,
552
+ col,
553
+ isText: spec.kind !== 'options',
554
+ label: col.label,
555
+ text: typeof raw === 'string' ? raw : '',
556
+ values: Array.isArray(raw) ? [...(raw as string[])] : [],
557
+ options: spec.options ?? [],
558
+ });
559
+ }
560
+ return out;
561
+ }
562
+
563
+ get hasFilters(): boolean {
564
+ return this.activeFilterKeys.length > 0;
565
+ }
566
+
567
+ get activeFilterKeys(): string[] {
568
+ let state = this.filterState;
569
+ return Object.keys(state).filter((key) => {
570
+ let value = state[key];
571
+ return typeof value === 'string'
572
+ ? value.trim().length > 0
573
+ : Array.isArray(value) && value.length > 0;
574
+ });
575
+ }
576
+
577
+ isFiltered = (key: string): boolean => this.activeFilterKeys.includes(key);
578
+
579
+ private commitFilters(next: FilterState) {
580
+ if (this.args.filters === undefined) {
581
+ this.internalFilters = next;
582
+ }
583
+ // A filter change moves the reader to a different result set; page 1 is
584
+ // the only page guaranteed to exist in it.
585
+ this.goToPage(1);
586
+ this.args.onFiltersChange?.(next);
587
+ }
588
+
589
+ setTextFilter = (key: string, event: Event) => {
590
+ let field = event.target as HTMLInputElement;
591
+ this.commitFilters({ ...this.filterState, [key]: field.value });
592
+ // controlled @filters: show what the owner holds, not the rejected keystroke
593
+ let held = this.filterState[key];
594
+ let text = typeof held === 'string' ? held : '';
595
+ if (field.value !== text) {
596
+ field.value = text;
597
+ }
598
+ };
599
+
600
+ setOptionFilter = (key: string, values: string[]) => {
601
+ this.commitFilters({ ...this.filterState, [key]: values });
602
+ };
603
+
604
+ clearFilters = () => {
605
+ this.commitFilters({});
606
+ };
607
+
608
+ private matches(col: DataColumn<T>, row: T, value: FilterValue): boolean {
609
+ let spec = col.filter;
610
+ if (!spec) {
611
+ return true;
612
+ }
613
+ if (spec.match) {
614
+ return spec.match(row, value);
615
+ }
616
+ if (spec.kind === 'options') {
617
+ let wanted = value as readonly string[];
618
+ return wanted.includes(String(this.rawValue(col, row)));
619
+ }
620
+ let query = String(value).trim().toLowerCase();
621
+ if (query.length === 0) {
622
+ return true;
623
+ }
624
+ return printValue(this.rawValue(col, row), '')
625
+ .toLowerCase()
626
+ .includes(query);
627
+ }
628
+
629
+ private rawValue(col: DataColumn<T>, row: T): unknown {
630
+ return col.value ? col.value(row) : readField(row, col.key);
631
+ }
632
+
633
+ /** Filter over the RAW loaded rows, before sort and before selection. */
634
+ get filteredRows(): readonly T[] {
635
+ let rows = this.loader.rows;
636
+ let keys = this.activeFilterKeys;
637
+ if (keys.length === 0) {
638
+ return rows;
639
+ }
640
+ let state = this.filterState;
641
+ let cols = this.allColumns.filter(
642
+ (c) => c.filter !== undefined && keys.includes(c.key),
643
+ );
644
+ if (cols.length === 0) {
645
+ return rows;
646
+ }
647
+ return rows.filter((row) =>
648
+ cols.every((col) =>
649
+ this.matches(col, row, state[col.key] as FilterValue),
650
+ ),
651
+ );
652
+ }
653
+
654
+ // ── expansion ──────────────────────────────────────────────────────────
655
+ //
656
+ // Whether the expander and actions columns exist is a `has-block` fact, and
657
+ // `has-block` only exists inside the template. It is NOT smuggled into a
658
+ // tracked field through a modifier: that field is read during the same
659
+ // render that would write it, which is the backtracking re-render
660
+ // assertion. Everything that needs the fact takes it as an argument
661
+ // (`colspanFor`, `showToolbarWith`) or resolves it in CSS.
662
+
663
+ toggleExpanded = (key: RowKey) => this.expansion.toggle(key);
664
+
665
+ // ── paging ─────────────────────────────────────────────────────────────
666
+
667
+ get pageSize(): number {
668
+ let n = this.args.pageSize ?? 0;
669
+ return n > 0 ? Math.floor(n) : 0;
670
+ }
671
+ get paged(): boolean {
672
+ return this.pageSize > 0;
673
+ }
674
+ get pageCount(): number {
675
+ return this.paged
676
+ ? Math.max(1, Math.ceil(this.table.count / this.pageSize))
677
+ : 1;
678
+ }
679
+ get page(): number {
680
+ let raw = this.args.page ?? this.internalPage ?? this.args.defaultPage ?? 1;
681
+ return Math.min(this.pageCount, Math.max(1, Math.floor(raw)));
682
+ }
683
+ goToPage = (next: number) => {
684
+ if (this.args.page === undefined) {
685
+ this.internalPage = next;
686
+ }
687
+ this.args.onPageChange?.(next);
688
+ };
689
+
690
+ get pageRows(): T[] {
691
+ let rows = this.table.visibleRows;
692
+ if (!this.paged) {
693
+ return rows;
694
+ }
695
+ let start = (this.page - 1) * this.pageSize;
696
+ return rows.slice(start, start + this.pageSize);
697
+ }
698
+
699
+ // ── the rendered model ─────────────────────────────────────────────────
700
+
701
+ get headers(): HeaderCell<T>[] {
702
+ let sortableDefault = this.args.sortable ?? true;
703
+ return this.columns.map((col) => {
704
+ let sortable = col.sortable ?? sortableDefault;
705
+ let state = this.table.ariaSort(col.key);
706
+ return {
707
+ key: col.key,
708
+ col,
709
+ label: col.label,
710
+ align: this.alignOf(col),
711
+ mono: col.mono ? 'true' : undefined,
712
+ sortable,
713
+ ariaSort: sortable ? state : undefined,
714
+ mark: state === 'ascending' ? '↑' : state === 'descending' ? '↓' : '↕',
715
+ hint: this.sortHint(state),
716
+ pin: this.pinAttr(col),
717
+ filtered: this.isFiltered(col.key) ? 'true' : undefined,
718
+ style: this.cellStyle(col),
719
+ };
720
+ });
721
+ }
722
+
723
+ /** The visually hidden mirror inside the sort button. MUI's demo ships the
724
+ * current state only; naming the NEXT one is what makes the button's
725
+ * behaviour predictable without activating it. */
726
+ private sortHint(state: 'ascending' | 'descending' | 'none'): string {
727
+ if (state === 'ascending') {
728
+ return 'sorted ascending — activate to sort descending';
729
+ }
730
+ if (state === 'descending') {
731
+ return 'sorted descending — activate to remove the sort';
732
+ }
733
+ return 'not sorted — activate to sort ascending';
734
+ }
735
+
736
+ sortBy = (key: string) => {
737
+ this.table.toggleSort(key);
738
+ };
739
+
740
+ /** Where the current page starts inside the filtered set. Every index
741
+ * handed to the row-key contract is ABSOLUTE, not page-local: without a
742
+ * `@key` the documented fallback is the index, and a page-local index
743
+ * would give page 2's first row the same identity as page 1's — selection
744
+ * and expansion would leak between pages. */
745
+ get pageOffset(): number {
746
+ return this.paged ? (this.page - 1) * this.pageSize : 0;
747
+ }
748
+
749
+ get lines(): TableLine<T>[] {
750
+ let cols = this.columns;
751
+ let offset = this.pageOffset;
752
+ return this.pageRows.map((row, i) => {
753
+ let index = offset + i;
754
+ let key = this.table.keyFor(row, index);
755
+ let selected = this.table.isSelected(row, index);
756
+ let label = this.labelFor(row, index);
757
+ return {
758
+ key,
759
+ row,
760
+ index,
761
+ selected,
762
+ ariaSelected: this.selectable
763
+ ? selected
764
+ ? ('true' as const)
765
+ : ('false' as const)
766
+ : undefined,
767
+ selectedFlag: selected ? 'true' : undefined,
768
+ expansion: this.expansion.viewFor(key, index, label),
769
+ label,
770
+ cells: cols.map((col) => {
771
+ let value = this.rawValue(col, row);
772
+ return {
773
+ key: col.key,
774
+ col,
775
+ value,
776
+ text: printValue(value, this.placeholder),
777
+ align: this.alignOf(col),
778
+ mono: col.mono ? 'true' : undefined,
779
+ pin: this.pinAttr(col),
780
+ style: this.cellStyle(col),
781
+ };
782
+ }),
783
+ };
784
+ });
785
+ }
786
+
787
+ /** Columns spanned by every detail row. Takes the two block facts as
788
+ * arguments because they are only knowable inside the template. */
789
+ colspanFor = (expandable: boolean, actions: boolean): number =>
790
+ this.columns.length +
791
+ (this.selectable ? 1 : 0) +
792
+ (expandable ? 1 : 0) +
793
+ (actions ? 1 : 0);
794
+
795
+ /** The toolbar earns its space when it has something in it — an empty bar
796
+ * above a table is chrome pretending to be a feature. A selectable table
797
+ * only grows one once something IS selected. */
798
+ showToolbarWith = (extra: boolean): boolean =>
799
+ extra ||
800
+ this.filterControls.length > 0 ||
801
+ this.showColumnMenu ||
802
+ this.hasSelection;
803
+
804
+ // ── selection ──────────────────────────────────────────────────────────
805
+
806
+ /**
807
+ * Select-all covers the WHOLE filtered result set, not the current page.
808
+ *
809
+ * shadcn and Ant both scope it to the page and then bolt on a second
810
+ * "select all N" affordance, which leaves the reader to work out which of
811
+ * two checkboxes they just clicked. One meaning is better than two, and
812
+ * the ambiguity that makes whole-set selection a footgun is removed by
813
+ * naming the count in the control's accessible name — "Select all 24
814
+ * lots" cannot be mistaken for "select these six".
815
+ */
816
+ get allSelected(): boolean {
817
+ return this.table.allSelected;
818
+ }
819
+ get someSelected(): boolean {
820
+ return !this.allSelected && this.selectedCount > 0;
821
+ }
822
+ get selectedCount(): number {
823
+ return this.table.selectedKeys.length;
824
+ }
825
+ get hasSelection(): boolean {
826
+ return this.selectedCount > 0;
827
+ }
828
+ get selectAllLabel(): string {
829
+ let verb = this.allSelected ? 'Deselect all ' : 'Select all ';
830
+ let noun = this.shown === 1 ? this.itemNoun : this.itemNoun + 's';
831
+ return verb + String(this.shown) + ' ' + noun;
832
+ }
833
+
834
+ // A controlled @selected may not take the change; the browser has already
835
+ // flipped the box, so set it back from the selection state.
836
+ toggleRow = (row: T, index: number, event: Event) => {
837
+ let box = event.target as HTMLInputElement;
838
+ this.table.toggleSelected(row, index);
839
+ if (box.type === 'radio') {
840
+ // the browser unchecked the group's previous radio too; put every radio
841
+ // back to what its row says, which is the owner's selection
842
+ let table = box.closest('table');
843
+ table
844
+ ?.querySelectorAll<HTMLInputElement>('input.pretui-dt-radio')
845
+ .forEach((radio) => {
846
+ radio.checked =
847
+ radio.closest('tr')?.getAttribute('aria-selected') === 'true';
848
+ });
849
+ box.checked = this.table.isSelected(row, index);
850
+ } else {
851
+ box.checked = this.table.isSelected(row, index);
852
+ }
853
+ };
854
+ toggleAll = (event: Event) => {
855
+ let box = event.target as HTMLInputElement;
856
+ this.table.selectAll();
857
+ box.checked = this.allSelected;
858
+ box.indeterminate = this.someSelected;
859
+ };
860
+ clearSelection = () => {
861
+ this.table.clearSelection();
862
+ };
863
+
864
+ // ── counts and the announcement ────────────────────────────────────────
865
+
866
+ get total(): number {
867
+ return this.loader.rows.length;
868
+ }
869
+ get shown(): number {
870
+ return this.table.count;
871
+ }
872
+ get noResults(): boolean {
873
+ return this.loader.status === 'ready' && this.shown === 0;
874
+ }
875
+
876
+ /**
877
+ * Derived only from SETTLED state, so a filter keystroke that re-queries
878
+ * announces once when the results land rather than once per key — the same
879
+ * rule `DataSource` enforces, restated here because this layer knows the
880
+ * honest number ("6 of 24") and that one does not.
881
+ */
882
+ get announcement(): string {
883
+ let status = this.loader.status;
884
+ if (status === 'loading' || status === 'idle') {
885
+ return '';
886
+ }
887
+ let noun = this.itemNoun;
888
+ let plural = noun + 's';
889
+ if (this.shown === 0) {
890
+ return 'No ' + plural;
891
+ }
892
+ if (this.shown === this.total) {
893
+ return String(this.shown) + ' ' + (this.shown === 1 ? noun : plural);
894
+ }
895
+ return String(this.shown) + ' of ' + String(this.total) + ' ' + plural;
896
+ }
897
+
898
+ get selectionSummary(): string {
899
+ return (
900
+ String(this.selectedCount) + ' of ' + String(this.shown) + ' selected'
901
+ );
902
+ }
903
+
904
+ <template>
905
+ <div
906
+ class='pretui-dt'
907
+ data-test-pretui-datatable
908
+ data-size={{this.size}}
909
+ data-pick={{if this.selectable 'true'}}
910
+ data-detail={{if (has-block 'expanded') 'true'}}
911
+ data-actions={{if (has-block 'actions') 'true'}}
912
+ data-striped={{this.striped}}
913
+ data-sticky={{this.sticky}}
914
+ aria-busy={{this.busy}}
915
+ ...attributes
916
+ >
917
+ {{! The live region is always present and always empty to start: an
918
+ aria-live element inserted with text already in it is not
919
+ reliably announced. }}
920
+ <p class='pretui-sr' role='status' data-test-pretui-dt-live>
921
+ {{this.announcement}}
922
+ </p>
923
+
924
+ {{#if (this.showToolbarWith (has-block 'toolbar'))}}
925
+ <div class='pretui-dt-bar'>
926
+ {{#if (has-block 'toolbar')}}
927
+ <div class='pretui-dt-bar-slot'>{{yield to='toolbar'}}</div>
928
+ {{/if}}
929
+
930
+ {{#each this.filterControls key='key' as |control|}}
931
+ {{#if control.isText}}
932
+ <label class='pretui-dt-filter'>
933
+ <span class='pretui-dt-filter-label'>{{control.label}}</span>
934
+ <input
935
+ type='search'
936
+ class='pretui-dt-filter-input'
937
+ value={{control.text}}
938
+ data-test-pretui-dt-filter
939
+ {{on 'input' (fn this.setTextFilter control.key)}}
940
+ />
941
+ </label>
942
+ {{else}}
943
+ <div class='pretui-dt-filter pretui-dt-filter-chips'>
944
+ <FilterChips
945
+ @label={{control.label}}
946
+ @options={{control.options}}
947
+ @multiple={{true}}
948
+ @values={{control.values}}
949
+ @onValuesChange={{fn this.setOptionFilter control.key}}
950
+ />
951
+ </div>
952
+ {{/if}}
953
+ {{/each}}
954
+
955
+ {{#if this.hasFilters}}
956
+ <Button
957
+ @appearance='plain'
958
+ @size='s'
959
+ data-test-pretui-dt-clear
960
+ {{on 'click' this.clearFilters}}
961
+ >Clear filters</Button>
962
+ {{/if}}
963
+
964
+ <span class='pretui-dt-bar-gap'></span>
965
+
966
+ {{#if this.hasSelection}}
967
+ <span class='pretui-dt-selcount'>{{this.selectionSummary}}</span>
968
+ <Button
969
+ @appearance='plain'
970
+ @size='s'
971
+ {{on 'click' this.clearSelection}}
972
+ >Clear</Button>
973
+ {{/if}}
974
+
975
+ {{#if this.showColumnMenu}}
976
+ <Menu @items={{this.columnMenuItems}} @label='Columns' @align='end'>
977
+ <:trigger as |isOpen toggle|>
978
+ <Button
979
+ @appearance='outlined'
980
+ @size='s'
981
+ data-open={{if isOpen 'true'}}
982
+ data-test-pretui-dt-columns
983
+ {{on 'click' toggle}}
984
+ >Columns</Button>
985
+ </:trigger>
986
+ </Menu>
987
+ {{/if}}
988
+ </div>
989
+ {{/if}}
990
+
991
+ <DataShell
992
+ @state={{this.loader}}
993
+ @hasLoading={{has-block 'loading'}}
994
+ @hasEmpty={{has-block 'empty'}}
995
+ @hasError={{has-block 'error'}}
996
+ @emptyTitle={{@emptyTitle}}
997
+ @emptyMessage={{@emptyMessage}}
998
+ @loadingLabel={{@loadingLabel}}
999
+ @skeletonRows={{@skeletonRows}}
1000
+ >
1001
+ <:default>
1002
+ {{! A scrollable box is a keyboard trap when it has no tab stop.
1003
+ MUI, Tremor and shadcn all ship it without one; this is the
1004
+ documented fix — a named region that can be reached and
1005
+ scrolled with the keyboard. }}
1006
+ <div
1007
+ class='pretui-dt-scroll'
1008
+ role='region'
1009
+ aria-label={{this.scrollLabel}}
1010
+ style={{this.scrollStyle}}
1011
+ {{rovingTabindex true}}
1012
+ >
1013
+ <table class='pretui-dt-table'>
1014
+ {{#if @caption}}
1015
+ <caption class='pretui-dt-caption'>{{@caption}}</caption>
1016
+ {{/if}}
1017
+ <thead>
1018
+ <tr>
1019
+ {{#if this.selectable}}
1020
+ <th
1021
+ scope='col'
1022
+ class='pretui-dt-pick-h'
1023
+ data-pin={{this.leadPin}}
1024
+ >
1025
+ {{#if this.multi}}
1026
+ <input
1027
+ type='checkbox'
1028
+ class='pretui-dt-box'
1029
+ checked={{this.allSelected}}
1030
+ aria-label={{this.selectAllLabel}}
1031
+ data-test-pretui-dt-selectall
1032
+ {{setsIndeterminate this.someSelected}}
1033
+ {{on 'change' this.toggleAll}}
1034
+ />
1035
+ {{else}}
1036
+ <span class='pretui-sr'>Selection</span>
1037
+ {{/if}}
1038
+ </th>
1039
+ {{/if}}
1040
+ {{#if (has-block 'expanded')}}
1041
+ <th
1042
+ scope='col'
1043
+ class='pretui-dt-exp-h'
1044
+ data-pin={{this.leadPin}}
1045
+ >
1046
+ <span class='pretui-sr'>Detail</span>
1047
+ </th>
1048
+ {{/if}}
1049
+ {{#each this.headers key='key' as |head|}}
1050
+ <th
1051
+ scope='col'
1052
+ data-align={{head.align}}
1053
+ data-mono={{head.mono}}
1054
+ data-pin={{head.pin}}
1055
+ data-filtered={{head.filtered}}
1056
+ aria-sort={{head.ariaSort}}
1057
+ style={{head.style}}
1058
+ data-test-pretui-dt-head
1059
+ >
1060
+ {{#if head.sortable}}
1061
+ <button
1062
+ type='button'
1063
+ class='pretui-dt-sort'
1064
+ data-test-pretui-dt-sort
1065
+ {{on 'click' (fn this.sortBy head.key)}}
1066
+ >
1067
+ <span
1068
+ class='pretui-dt-sort-text'
1069
+ >{{head.label}}</span>
1070
+ <span
1071
+ class='pretui-dt-mark'
1072
+ aria-hidden='true'
1073
+ >{{head.mark}}</span>
1074
+ <span class='pretui-sr'>{{head.hint}}</span>
1075
+ </button>
1076
+ {{else}}
1077
+ {{head.label}}
1078
+ {{/if}}
1079
+ </th>
1080
+ {{/each}}
1081
+ {{#if (has-block 'actions')}}
1082
+ <th
1083
+ scope='col'
1084
+ class='pretui-dt-act-h'
1085
+ data-pin={{this.tailPin}}
1086
+ >
1087
+ <span class='pretui-sr'>Actions</span>
1088
+ </th>
1089
+ {{/if}}
1090
+ </tr>
1091
+ </thead>
1092
+ <tbody>
1093
+ {{#each this.lines key='key' as |line|}}
1094
+ <tr
1095
+ class='pretui-dt-row'
1096
+ aria-selected={{line.ariaSelected}}
1097
+ data-selected={{line.selectedFlag}}
1098
+ data-test-pretui-dt-row
1099
+ >
1100
+ {{#if this.selectable}}
1101
+ <td class='pretui-dt-pick' data-pin={{this.leadPin}}>
1102
+ {{#if this.multi}}
1103
+ <input
1104
+ type='checkbox'
1105
+ class='pretui-dt-box'
1106
+ checked={{line.selected}}
1107
+ aria-label={{line.label}}
1108
+ data-test-pretui-dt-select
1109
+ {{on
1110
+ 'change'
1111
+ (fn this.toggleRow line.row line.index)
1112
+ }}
1113
+ />
1114
+ {{else}}
1115
+ <input
1116
+ type='radio'
1117
+ class='pretui-dt-box pretui-dt-radio'
1118
+ name={{this.radioName}}
1119
+ checked={{line.selected}}
1120
+ aria-label={{line.label}}
1121
+ data-test-pretui-dt-select
1122
+ {{on
1123
+ 'change'
1124
+ (fn this.toggleRow line.row line.index)
1125
+ }}
1126
+ />
1127
+ {{/if}}
1128
+ </td>
1129
+ {{/if}}
1130
+ {{#if (has-block 'expanded')}}
1131
+ <td class='pretui-dt-exp' data-pin={{this.leadPin}}>
1132
+ <button
1133
+ type='button'
1134
+ class='pretui-dt-expbtn'
1135
+ aria-expanded={{line.expansion.expandedFlag}}
1136
+ aria-controls={{line.expansion.controls}}
1137
+ aria-label={{line.expansion.expandLabel}}
1138
+ data-test-pretui-dt-expand
1139
+ {{on 'click' (fn this.toggleExpanded line.key)}}
1140
+ >
1141
+ <span
1142
+ class='pretui-dt-chev'
1143
+ aria-hidden='true'
1144
+ >›</span>
1145
+ </button>
1146
+ </td>
1147
+ {{/if}}
1148
+ {{#each line.cells key='key' as |cell|}}
1149
+ <td
1150
+ data-align={{cell.align}}
1151
+ data-mono={{cell.mono}}
1152
+ data-pin={{cell.pin}}
1153
+ style={{cell.style}}
1154
+ data-test-pretui-dt-cell
1155
+ >
1156
+ {{#if (has-block 'cell')}}
1157
+ {{yield cell.text line.row cell.col to='cell'}}
1158
+ {{else}}
1159
+ {{cell.text}}
1160
+ {{/if}}
1161
+ </td>
1162
+ {{/each}}
1163
+ {{#if (has-block 'actions')}}
1164
+ <td class='pretui-dt-act' data-pin={{this.tailPin}}>
1165
+ {{yield line.row to='actions'}}
1166
+ </td>
1167
+ {{/if}}
1168
+ </tr>
1169
+ {{#if line.expansion.expanded}}
1170
+ <tr class='pretui-dt-detail' id={{line.expansion.detailId}}>
1171
+ <td
1172
+ colspan={{this.colspanFor
1173
+ (has-block 'expanded')
1174
+ (has-block 'actions')
1175
+ }}
1176
+ >
1177
+ {{yield line.row line.index to='expanded'}}
1178
+ </td>
1179
+ </tr>
1180
+ {{/if}}
1181
+ {{/each}}
1182
+ </tbody>
1183
+ </table>
1184
+ </div>
1185
+
1186
+ {{#if this.noResults}}
1187
+ {{! Distinct from DataShell's empty state, which means "this
1188
+ dataset has no rows". This one means "your filters matched
1189
+ nothing", and it has to offer a way back out. }}
1190
+ <div class='pretui-dt-noresults' data-test-pretui-dt-noresults>
1191
+ <EmptyState
1192
+ @title='Nothing matches these filters'
1193
+ @message='Every row was filtered out. Widen a filter, or clear them all and start again.'
1194
+ @texture={{false}}
1195
+ >
1196
+ <:action>
1197
+ <Button
1198
+ @appearance='outlined'
1199
+ @size='s'
1200
+ {{on 'click' this.clearFilters}}
1201
+ >Clear filters</Button>
1202
+ </:action>
1203
+ </EmptyState>
1204
+ </div>
1205
+ {{/if}}
1206
+
1207
+ {{#if this.paged}}
1208
+ <div class='pretui-dt-foot'>
1209
+ <span class='pretui-dt-count'>{{this.announcement}}</span>
1210
+ <Pagination
1211
+ @page={{this.page}}
1212
+ @pages={{this.pageCount}}
1213
+ @onPageChange={{this.goToPage}}
1214
+ />
1215
+ </div>
1216
+ {{/if}}
1217
+ </:default>
1218
+ <:loading>{{yield to='loading'}}</:loading>
1219
+ <:empty>{{yield to='empty'}}</:empty>
1220
+ <:error>{{yield to='error'}}</:error>
1221
+ </DataShell>
1222
+ </div>
1223
+ <style scoped>
1224
+ @layer PretComponent {
1225
+ .pretui-dt {
1226
+ display: grid;
1227
+ gap: var(--space-3, 8px);
1228
+ min-width: 0;
1229
+ font-size: var(--text-ui-md, 12.5px);
1230
+ letter-spacing: var(--track-ui, 0.01em);
1231
+ color: var(--foreground);
1232
+ /* The control columns' effective widths. A pin offset computed in
1233
+ JS cannot know whether the expander or actions column exists —
1234
+ that is a has-block fact and has-block lives in the template — so
1235
+ the template stamps the facts and the arithmetic happens here.
1236
+ Custom properties substitute at computed-value time, so the
1237
+ overrides below are picked up by these two calc()s. */
1238
+ --pretui-dt-pick-eff: 0px;
1239
+ --pretui-dt-exp-eff: 0px;
1240
+ --pretui-dt-act-eff: 0px;
1241
+ --pretui-dt-lead: calc(
1242
+ var(--pretui-dt-pick-eff) + var(--pretui-dt-exp-eff)
1243
+ );
1244
+ --pretui-dt-tail: var(--pretui-dt-act-eff);
1245
+ }
1246
+ .pretui-dt[data-pick='true'] {
1247
+ --pretui-dt-pick-eff: var(--pretui-dt-pick-w, 2.6em);
1248
+ }
1249
+ .pretui-dt[data-detail='true'] {
1250
+ --pretui-dt-exp-eff: var(--pretui-dt-exp-w, 2.2em);
1251
+ }
1252
+ .pretui-dt[data-actions='true'] {
1253
+ --pretui-dt-act-eff: var(--pretui-dt-act-w, 3em);
1254
+ }
1255
+ .pretui-dt[data-size='xs'] {
1256
+ font-size: 10.5px;
1257
+ }
1258
+ .pretui-dt[data-size='s'] {
1259
+ font-size: var(--text-ui-sm, 11.5px);
1260
+ }
1261
+ .pretui-dt[data-size='l'] {
1262
+ font-size: 14px;
1263
+ }
1264
+ .pretui-dt[data-size='xl'] {
1265
+ font-size: 16px;
1266
+ }
1267
+ .pretui-dt[aria-busy='true'] .pretui-dt-scroll {
1268
+ opacity: 0.62;
1269
+ }
1270
+ .pretui-sr {
1271
+ position: absolute;
1272
+ width: 1px;
1273
+ height: 1px;
1274
+ overflow: hidden;
1275
+ clip: rect(0 0 0 0);
1276
+ white-space: nowrap;
1277
+ margin: 0;
1278
+ }
1279
+ .pretui-dt-bar {
1280
+ display: flex;
1281
+ flex-wrap: wrap;
1282
+ align-items: flex-end;
1283
+ gap: var(--space-3, 8px);
1284
+ min-width: 0;
1285
+ }
1286
+ .pretui-dt-bar-gap {
1287
+ flex: 1 1 auto;
1288
+ }
1289
+ .pretui-dt-bar-slot {
1290
+ display: flex;
1291
+ align-items: center;
1292
+ gap: var(--space-2, 6px);
1293
+ }
1294
+ .pretui-dt-filter {
1295
+ display: grid;
1296
+ gap: 3px;
1297
+ min-width: 0;
1298
+ }
1299
+ .pretui-dt-filter-label {
1300
+ font-family: var(--font-mono);
1301
+ font-size: 0.82em;
1302
+ letter-spacing: var(--track-eyebrow, 0.08em);
1303
+ text-transform: uppercase;
1304
+ color: var(--muted-foreground);
1305
+ }
1306
+ .pretui-dt-filter-input {
1307
+ font: inherit;
1308
+ letter-spacing: inherit;
1309
+ block-size: 2.24em;
1310
+ min-inline-size: 9em;
1311
+ padding-inline: 0.7em;
1312
+ color: var(--foreground);
1313
+ background: var(
1314
+ --pretui-control-rest,
1315
+ var(--field, var(--boxel-light))
1316
+ );
1317
+ border: 0;
1318
+ border-radius: var(--radius);
1319
+ box-shadow: 0 0 0 1px var(--pretui-control-border, var(--input));
1320
+ }
1321
+ .pretui-dt-filter-input:focus-visible {
1322
+ outline: 2px solid var(--ring);
1323
+ outline-offset: 1px;
1324
+ }
1325
+ .pretui-dt-selcount {
1326
+ font-variant-numeric: tabular-nums;
1327
+ color: var(--muted-foreground);
1328
+ }
1329
+ .pretui-dt-scroll {
1330
+ overflow: auto;
1331
+ min-width: 0;
1332
+ max-width: 100%;
1333
+ border-radius: var(--radius-surface, 10px);
1334
+ background: var(--card);
1335
+ box-shadow: var(--pretui-shadow-hairline, 0 0 0 1px var(--border));
1336
+ }
1337
+ .pretui-dt-scroll:focus-visible {
1338
+ outline: 2px solid var(--ring);
1339
+ outline-offset: -2px;
1340
+ }
1341
+ .pretui-dt-table {
1342
+ width: 100%;
1343
+ min-inline-size: var(--pretui-dt-min-w, 0);
1344
+ border-collapse: separate;
1345
+ border-spacing: 0;
1346
+ background: var(--card);
1347
+ }
1348
+ .pretui-dt-caption {
1349
+ caption-side: top;
1350
+ text-align: start;
1351
+ padding: 0.62em var(--space-4, 11px);
1352
+ color: var(--muted-foreground);
1353
+ font-size: 0.94em;
1354
+ }
1355
+ .pretui-dt-table th {
1356
+ height: 2.4em;
1357
+ padding: 0 0.8em;
1358
+ text-align: start;
1359
+ font-family: var(--font-mono);
1360
+ font-size: 0.82em;
1361
+ font-weight: 500;
1362
+ letter-spacing: var(--track-eyebrow, 0.08em);
1363
+ text-transform: uppercase;
1364
+ color: var(--muted-foreground);
1365
+ background: var(--inset, var(--boxel-100));
1366
+ box-shadow: inset 0 -1px 0 var(--line-strong, var(--boxel-400));
1367
+ white-space: nowrap;
1368
+ vertical-align: middle;
1369
+ }
1370
+ .pretui-dt[data-sticky] .pretui-dt-table th {
1371
+ position: sticky;
1372
+ top: 0;
1373
+ z-index: var(--pretui-z-sticky-header, 11);
1374
+ }
1375
+ .pretui-dt-table th[aria-sort='ascending'],
1376
+ .pretui-dt-table th[aria-sort='descending'] {
1377
+ color: var(--foreground);
1378
+ }
1379
+ .pretui-dt-table th[data-filtered='true']::after {
1380
+ content: '';
1381
+ display: inline-block;
1382
+ inline-size: 4px;
1383
+ block-size: 4px;
1384
+ margin-inline-start: 5px;
1385
+ border-radius: 50%;
1386
+ vertical-align: 0.28em;
1387
+ background: var(--primary);
1388
+ }
1389
+ .pretui-dt-sort {
1390
+ display: inline-flex;
1391
+ align-items: center;
1392
+ gap: 5px;
1393
+ background: none;
1394
+ border: 0;
1395
+ padding: 0;
1396
+ font: inherit;
1397
+ letter-spacing: inherit;
1398
+ text-transform: inherit;
1399
+ color: inherit;
1400
+ cursor: pointer;
1401
+ }
1402
+ .pretui-dt-sort:focus-visible {
1403
+ outline: 2px solid var(--ring);
1404
+ outline-offset: 2px;
1405
+ border-radius: 3px;
1406
+ }
1407
+ .pretui-dt-mark {
1408
+ opacity: 0.4;
1409
+ font-family: var(--font-sans);
1410
+ }
1411
+ th[aria-sort='ascending'] .pretui-dt-mark,
1412
+ th[aria-sort='descending'] .pretui-dt-mark {
1413
+ opacity: 1;
1414
+ }
1415
+ .pretui-dt-table td {
1416
+ height: 2.56em;
1417
+ padding: 0.4em 0.8em;
1418
+ vertical-align: middle;
1419
+ box-shadow: inset 0 -1px 0 var(--border);
1420
+ background: var(--card);
1421
+ }
1422
+ .pretui-dt-table th[data-align='end'],
1423
+ .pretui-dt-table td[data-align='end'] {
1424
+ text-align: end;
1425
+ }
1426
+ .pretui-dt-table th[data-align='center'],
1427
+ .pretui-dt-table td[data-align='center'] {
1428
+ text-align: center;
1429
+ }
1430
+ .pretui-dt-table td[data-mono='true'] {
1431
+ font-family: var(--font-mono);
1432
+ font-size: 0.94em;
1433
+ font-variant-numeric: tabular-nums;
1434
+ }
1435
+ .pretui-dt[data-striped] .pretui-dt-row:nth-child(odd) td {
1436
+ background: var(--stripe, var(--boxel-100));
1437
+ }
1438
+ .pretui-dt-row:hover td {
1439
+ background: var(--hover, var(--boxel-100));
1440
+ }
1441
+ .pretui-dt-row[data-selected='true'] td {
1442
+ background: var(--pretui-selected, var(--boxel-100));
1443
+ }
1444
+ /* Selection reads without colour too (Law 8): a rule down the inline
1445
+ start of the row. */
1446
+ .pretui-dt-row[data-selected='true'] td:first-child {
1447
+ box-shadow:
1448
+ inset 2px 0 0 var(--primary),
1449
+ inset 0 -1px 0 var(--border);
1450
+ }
1451
+ /* Pinned cells inherit the row's computed background, so zebra,
1452
+ hover and selection all survive the pin. */
1453
+ .pretui-dt-table td[data-pin],
1454
+ .pretui-dt-table th[data-pin] {
1455
+ position: sticky;
1456
+ z-index: var(--pretui-z-sticky, 10);
1457
+ background: inherit;
1458
+ }
1459
+ .pretui-dt-table td[data-pin='start'],
1460
+ .pretui-dt-table th[data-pin='start'] {
1461
+ box-shadow:
1462
+ inset -1px 0 0 var(--line-strong, var(--boxel-400)),
1463
+ inset 0 -1px 0 var(--border);
1464
+ }
1465
+ .pretui-dt-table td[data-pin='end'],
1466
+ .pretui-dt-table th[data-pin='end'] {
1467
+ box-shadow:
1468
+ inset 1px 0 0 var(--line-strong, var(--boxel-400)),
1469
+ inset 0 -1px 0 var(--border);
1470
+ }
1471
+ .pretui-dt[data-sticky] .pretui-dt-table th[data-pin] {
1472
+ z-index: var(--pretui-z-sticky-header, 11);
1473
+ }
1474
+ .pretui-dt-pick-h,
1475
+ .pretui-dt-pick {
1476
+ inline-size: var(--pretui-dt-pick-w, 2.6em);
1477
+ inset-inline-start: 0;
1478
+ }
1479
+ .pretui-dt-exp-h,
1480
+ .pretui-dt-exp {
1481
+ inline-size: var(--pretui-dt-exp-w, 2.2em);
1482
+ inset-inline-start: var(--pretui-dt-pick-eff, 0px);
1483
+ }
1484
+ .pretui-dt-act-h,
1485
+ .pretui-dt-act {
1486
+ inline-size: var(--pretui-dt-act-w, 3em);
1487
+ inset-inline-end: 0;
1488
+ text-align: end;
1489
+ }
1490
+ .pretui-dt-box {
1491
+ appearance: none;
1492
+ width: 15px;
1493
+ height: 15px;
1494
+ margin: 0;
1495
+ border-radius: 5px;
1496
+ background: var(
1497
+ --pretui-control-rest,
1498
+ var(--field, var(--boxel-light))
1499
+ );
1500
+ box-shadow: 0 0 0 1px var(--pretui-control-border, var(--input));
1501
+ cursor: pointer;
1502
+ display: inline-grid;
1503
+ place-content: center;
1504
+ vertical-align: middle;
1505
+ }
1506
+ .pretui-dt-radio {
1507
+ border-radius: 50%;
1508
+ }
1509
+ .pretui-dt-box:checked {
1510
+ background: var(--primary);
1511
+ box-shadow:
1512
+ 0 0 0 1px color-mix(in oklch, var(--primary) 70%, var(--border)),
1513
+ var(--pretui-edge-highlight, inset 0 1px 0 rgb(255 255 255 / 0.14));
1514
+ }
1515
+ .pretui-dt-box:checked::before {
1516
+ content: '';
1517
+ width: 9px;
1518
+ height: 9px;
1519
+ background: var(--primary-foreground);
1520
+ clip-path: polygon(
1521
+ 14% 47%,
1522
+ 38% 70%,
1523
+ 86% 18%,
1524
+ 96% 30%,
1525
+ 39% 89%,
1526
+ 4% 58%
1527
+ );
1528
+ }
1529
+ .pretui-dt-radio:checked::before {
1530
+ clip-path: circle(50%);
1531
+ width: 7px;
1532
+ height: 7px;
1533
+ }
1534
+ /* The mixed state gets a non-colour channel too — a dash, not a tint. */
1535
+ .pretui-dt-box:indeterminate {
1536
+ background: var(--primary);
1537
+ }
1538
+ .pretui-dt-box:indeterminate::before {
1539
+ content: '';
1540
+ width: 9px;
1541
+ height: 2px;
1542
+ border-radius: 1px;
1543
+ background: var(--primary-foreground);
1544
+ }
1545
+ .pretui-dt-box:focus-visible {
1546
+ outline: 2px solid var(--ring);
1547
+ outline-offset: 2px;
1548
+ }
1549
+ .pretui-dt-expbtn {
1550
+ display: inline-grid;
1551
+ place-content: center;
1552
+ inline-size: 1.7em;
1553
+ block-size: 1.7em;
1554
+ padding: 0;
1555
+ border: 0;
1556
+ border-radius: 6px;
1557
+ background: none;
1558
+ color: var(--muted-foreground);
1559
+ cursor: pointer;
1560
+ }
1561
+ .pretui-dt-expbtn:hover {
1562
+ background: var(--hover, var(--boxel-100));
1563
+ color: var(--foreground);
1564
+ }
1565
+ .pretui-dt-expbtn:focus-visible {
1566
+ outline: 2px solid var(--ring);
1567
+ outline-offset: 1px;
1568
+ }
1569
+ .pretui-dt-chev {
1570
+ display: block;
1571
+ line-height: 1;
1572
+ transition: transform var(--pretui-dur-snap, 180ms)
1573
+ var(--pretui-ease-snap, cubic-bezier(0.2, 0.9, 0.25, 1.05));
1574
+ }
1575
+ .pretui-dt-expbtn[aria-expanded='true'] .pretui-dt-chev {
1576
+ transform: rotate(90deg);
1577
+ }
1578
+ .pretui-dt-detail td {
1579
+ padding: var(--space-4, 11px) var(--space-5, 14px);
1580
+ background: var(--inset, var(--boxel-100));
1581
+ box-shadow: inset 0 -1px 0 var(--border);
1582
+ }
1583
+ .pretui-dt-noresults {
1584
+ padding: var(--space-4, 11px) 0;
1585
+ }
1586
+ .pretui-dt-foot {
1587
+ display: flex;
1588
+ flex-wrap: wrap;
1589
+ align-items: center;
1590
+ justify-content: space-between;
1591
+ gap: var(--space-3, 8px);
1592
+ }
1593
+ .pretui-dt-count {
1594
+ color: var(--muted-foreground);
1595
+ font-variant-numeric: tabular-nums;
1596
+ }
1597
+ @media (prefers-reduced-motion: reduce) {
1598
+ .pretui-dt-chev {
1599
+ transition: none;
1600
+ }
1601
+ }
1602
+ @media (pointer: coarse) {
1603
+ .pretui-dt-table td {
1604
+ height: 44px;
1605
+ }
1606
+ .pretui-dt-box {
1607
+ width: 20px;
1608
+ height: 20px;
1609
+ }
1610
+ .pretui-dt-expbtn {
1611
+ inline-size: 2.4em;
1612
+ block-size: 2.4em;
1613
+ }
1614
+ }
1615
+ }
1616
+ </style>
1617
+ </template>
1618
+ }