@panphora/bevel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +226 -0
  3. package/bevel-fonts.css +16 -0
  4. package/bevel.css +3075 -0
  5. package/bevel.js +2126 -0
  6. package/dist/react/components/activity-feed.d.ts +89 -0
  7. package/dist/react/components/activity-feed.js +54 -0
  8. package/dist/react/components/alert-dialog.d.ts +14 -0
  9. package/dist/react/components/alert-dialog.js +19 -0
  10. package/dist/react/components/app-shell.d.ts +98 -0
  11. package/dist/react/components/app-shell.js +86 -0
  12. package/dist/react/components/app-toolbar.d.ts +19 -0
  13. package/dist/react/components/app-toolbar.js +22 -0
  14. package/dist/react/components/avatar-group.d.ts +67 -0
  15. package/dist/react/components/avatar-group.js +49 -0
  16. package/dist/react/components/badge-and-pill.d.ts +34 -0
  17. package/dist/react/components/badge-and-pill.js +12 -0
  18. package/dist/react/components/breadcrumbs.d.ts +56 -0
  19. package/dist/react/components/breadcrumbs.js +44 -0
  20. package/dist/react/components/bulk-bar.d.ts +22 -0
  21. package/dist/react/components/bulk-bar.js +59 -0
  22. package/dist/react/components/button.d.ts +15 -0
  23. package/dist/react/components/button.js +20 -0
  24. package/dist/react/components/callout-and-hint.d.ts +17 -0
  25. package/dist/react/components/callout-and-hint.js +8 -0
  26. package/dist/react/components/checkbox.d.ts +5 -0
  27. package/dist/react/components/checkbox.js +13 -0
  28. package/dist/react/components/chip.d.ts +149 -0
  29. package/dist/react/components/chip.js +29 -0
  30. package/dist/react/components/code-block.d.ts +50 -0
  31. package/dist/react/components/code-block.js +77 -0
  32. package/dist/react/components/code-editor.d.ts +122 -0
  33. package/dist/react/components/code-editor.js +695 -0
  34. package/dist/react/components/column-manager.d.ts +28 -0
  35. package/dist/react/components/column-manager.js +85 -0
  36. package/dist/react/components/combobox.d.ts +32 -0
  37. package/dist/react/components/combobox.js +37 -0
  38. package/dist/react/components/data-grid.d.ts +108 -0
  39. package/dist/react/components/data-grid.js +159 -0
  40. package/dist/react/components/data-table.d.ts +2 -0
  41. package/dist/react/components/data-table.js +6 -0
  42. package/dist/react/components/date.d.ts +23 -0
  43. package/dist/react/components/date.js +11 -0
  44. package/dist/react/components/details.d.ts +13 -0
  45. package/dist/react/components/details.js +20 -0
  46. package/dist/react/components/dialog.d.ts +74 -0
  47. package/dist/react/components/dialog.js +31 -0
  48. package/dist/react/components/diff-view.d.ts +73 -0
  49. package/dist/react/components/diff-view.js +68 -0
  50. package/dist/react/components/documents.d.ts +70 -0
  51. package/dist/react/components/documents.js +10 -0
  52. package/dist/react/components/drawer.d.ts +45 -0
  53. package/dist/react/components/drawer.js +35 -0
  54. package/dist/react/components/editable-grid-cells.d.ts +32 -0
  55. package/dist/react/components/editable-grid-cells.js +116 -0
  56. package/dist/react/components/eyebrow-kicker-lede-pull-quote.d.ts +39 -0
  57. package/dist/react/components/eyebrow-kicker-lede-pull-quote.js +12 -0
  58. package/dist/react/components/field.d.ts +32 -0
  59. package/dist/react/components/field.js +27 -0
  60. package/dist/react/components/file-tree.d.ts +75 -0
  61. package/dist/react/components/file-tree.js +247 -0
  62. package/dist/react/components/file.d.ts +43 -0
  63. package/dist/react/components/file.js +73 -0
  64. package/dist/react/components/files-table.d.ts +174 -0
  65. package/dist/react/components/files-table.js +237 -0
  66. package/dist/react/components/filter-builder.d.ts +37 -0
  67. package/dist/react/components/filter-builder.js +109 -0
  68. package/dist/react/components/form-error-summary.d.ts +16 -0
  69. package/dist/react/components/form-error-summary.js +49 -0
  70. package/dist/react/components/icon-button.d.ts +8 -0
  71. package/dist/react/components/icon-button.js +14 -0
  72. package/dist/react/components/icon.d.ts +7 -0
  73. package/dist/react/components/icon.js +15 -0
  74. package/dist/react/components/image.d.ts +72 -0
  75. package/dist/react/components/image.js +24 -0
  76. package/dist/react/components/inline-edit.d.ts +70 -0
  77. package/dist/react/components/inline-edit.js +149 -0
  78. package/dist/react/components/input.d.ts +29 -0
  79. package/dist/react/components/input.js +20 -0
  80. package/dist/react/components/kanban-board.d.ts +140 -0
  81. package/dist/react/components/kanban-board.js +374 -0
  82. package/dist/react/components/layout.d.ts +51 -0
  83. package/dist/react/components/layout.js +28 -0
  84. package/dist/react/components/list.d.ts +28 -0
  85. package/dist/react/components/list.js +6 -0
  86. package/dist/react/components/masthead-and-verdict.d.ts +60 -0
  87. package/dist/react/components/masthead-and-verdict.js +8 -0
  88. package/dist/react/components/menu.d.ts +26 -0
  89. package/dist/react/components/menu.js +31 -0
  90. package/dist/react/components/multi-select-picker.d.ts +49 -0
  91. package/dist/react/components/multi-select-picker.js +20 -0
  92. package/dist/react/components/note.d.ts +33 -0
  93. package/dist/react/components/note.js +8 -0
  94. package/dist/react/components/number-field.d.ts +16 -0
  95. package/dist/react/components/number-field.js +17 -0
  96. package/dist/react/components/pagination.d.ts +45 -0
  97. package/dist/react/components/pagination.js +87 -0
  98. package/dist/react/components/persistent-action-banner.d.ts +71 -0
  99. package/dist/react/components/persistent-action-banner.js +39 -0
  100. package/dist/react/components/popconfirm.d.ts +42 -0
  101. package/dist/react/components/popconfirm.js +59 -0
  102. package/dist/react/components/popover.d.ts +16 -0
  103. package/dist/react/components/popover.js +21 -0
  104. package/dist/react/components/progress-and-gauge.d.ts +44 -0
  105. package/dist/react/components/progress-and-gauge.js +19 -0
  106. package/dist/react/components/radio.d.ts +7 -0
  107. package/dist/react/components/radio.js +13 -0
  108. package/dist/react/components/rich-text-toolbar.d.ts +26 -0
  109. package/dist/react/components/rich-text-toolbar.js +64 -0
  110. package/dist/react/components/rows-and-card.d.ts +88 -0
  111. package/dist/react/components/rows-and-card.js +10 -0
  112. package/dist/react/components/save-status-indicator.d.ts +11 -0
  113. package/dist/react/components/save-status-indicator.js +33 -0
  114. package/dist/react/components/segmented-control.d.ts +21 -0
  115. package/dist/react/components/segmented-control.js +15 -0
  116. package/dist/react/components/select.d.ts +29 -0
  117. package/dist/react/components/select.js +29 -0
  118. package/dist/react/components/selectable-cards.d.ts +30 -0
  119. package/dist/react/components/selectable-cards.js +29 -0
  120. package/dist/react/components/settings-rows.d.ts +51 -0
  121. package/dist/react/components/settings-rows.js +8 -0
  122. package/dist/react/components/sidebar-nav.d.ts +77 -0
  123. package/dist/react/components/sidebar-nav.js +41 -0
  124. package/dist/react/components/skeleton-and-empty.d.ts +51 -0
  125. package/dist/react/components/skeleton-and-empty.js +14 -0
  126. package/dist/react/components/slider.d.ts +19 -0
  127. package/dist/react/components/slider.js +17 -0
  128. package/dist/react/components/small-charts.d.ts +60 -0
  129. package/dist/react/components/small-charts.js +76 -0
  130. package/dist/react/components/sortable.d.ts +30 -0
  131. package/dist/react/components/sortable.js +85 -0
  132. package/dist/react/components/split-button.d.ts +38 -0
  133. package/dist/react/components/split-button.js +43 -0
  134. package/dist/react/components/split-panes.d.ts +35 -0
  135. package/dist/react/components/split-panes.js +102 -0
  136. package/dist/react/components/stat-tiles.d.ts +54 -0
  137. package/dist/react/components/stat-tiles.js +8 -0
  138. package/dist/react/components/steps.d.ts +11 -0
  139. package/dist/react/components/steps.js +13 -0
  140. package/dist/react/components/switch.d.ts +6 -0
  141. package/dist/react/components/switch.js +13 -0
  142. package/dist/react/components/table.d.ts +61 -0
  143. package/dist/react/components/table.js +6 -0
  144. package/dist/react/components/tabs.d.ts +7 -0
  145. package/dist/react/components/tabs.js +13 -0
  146. package/dist/react/components/tags.d.ts +33 -0
  147. package/dist/react/components/tags.js +83 -0
  148. package/dist/react/components/textarea.d.ts +10 -0
  149. package/dist/react/components/textarea.js +6 -0
  150. package/dist/react/components/toast.d.ts +35 -0
  151. package/dist/react/components/toast.js +90 -0
  152. package/dist/react/components/tooltip-and-key.d.ts +20 -0
  153. package/dist/react/components/tooltip-and-key.js +20 -0
  154. package/dist/react/components/tree-view.d.ts +34 -0
  155. package/dist/react/components/tree-view.js +118 -0
  156. package/dist/react/components/upload-dropzone.d.ts +92 -0
  157. package/dist/react/components/upload-dropzone.js +116 -0
  158. package/dist/react/components/wizard-shell.d.ts +78 -0
  159. package/dist/react/components/wizard-shell.js +176 -0
  160. package/dist/react/fonts.css.d.ts +1 -0
  161. package/dist/react/index.d.ts +76 -0
  162. package/dist/react/index.js +77 -0
  163. package/dist/react/integrations/quickcrop.d.ts +58 -0
  164. package/dist/react/integrations/quickcrop.js +137 -0
  165. package/dist/react/integrations/richclay.d.ts +43 -0
  166. package/dist/react/integrations/richclay.js +129 -0
  167. package/dist/react/internal/classes.d.ts +3 -0
  168. package/dist/react/internal/classes.js +10 -0
  169. package/dist/react/internal/close-mark.d.ts +1 -0
  170. package/dist/react/internal/close-mark.js +10 -0
  171. package/dist/react/internal/controllable-state.d.ts +9 -0
  172. package/dist/react/internal/controllable-state.js +22 -0
  173. package/dist/react/internal/drop-effect.d.ts +28 -0
  174. package/dist/react/internal/drop-effect.js +8 -0
  175. package/dist/react/internal/form-reset.d.ts +2 -0
  176. package/dist/react/internal/form-reset.js +22 -0
  177. package/dist/react/internal/format.d.ts +1 -0
  178. package/dist/react/internal/format.js +14 -0
  179. package/dist/react/internal/link.d.ts +2 -0
  180. package/dist/react/internal/link.js +8 -0
  181. package/dist/react/internal/part.d.ts +20 -0
  182. package/dist/react/internal/part.js +47 -0
  183. package/dist/react/internal/pointer-session.d.ts +8 -0
  184. package/dist/react/internal/pointer-session.js +60 -0
  185. package/dist/react/internal/refs.d.ts +2 -0
  186. package/dist/react/internal/refs.js +22 -0
  187. package/dist/react/internal/rich-text.d.ts +28 -0
  188. package/dist/react/internal/rich-text.js +4 -0
  189. package/dist/react/internal/table-context.d.ts +39 -0
  190. package/dist/react/internal/table-context.js +12 -0
  191. package/dist/react/internal/use-object-url.d.ts +1 -0
  192. package/dist/react/internal/use-object-url.js +15 -0
  193. package/dist/react/layout.css +274 -0
  194. package/dist/react/layout.css.d.ts +1 -0
  195. package/dist/react/models/filter.d.ts +31 -0
  196. package/dist/react/models/filter.js +79 -0
  197. package/dist/react/models/kanban.d.ts +51 -0
  198. package/dist/react/models/kanban.js +35 -0
  199. package/dist/react/models/reorder.d.ts +9 -0
  200. package/dist/react/models/reorder.js +23 -0
  201. package/dist/react/models/table.d.ts +85 -0
  202. package/dist/react/models/table.js +144 -0
  203. package/dist/react/models/tree.d.ts +16 -0
  204. package/dist/react/models/tree.js +26 -0
  205. package/dist/react/provider.d.ts +18 -0
  206. package/dist/react/provider.js +31 -0
  207. package/dist/react/recipes/context-hypercms.d.ts +17 -0
  208. package/dist/react/recipes/context-hypercms.js +71 -0
  209. package/dist/react/recipes/context-quickcrop.d.ts +8 -0
  210. package/dist/react/recipes/context-quickcrop.js +49 -0
  211. package/dist/react/theme.css +8004 -0
  212. package/dist/react/theme.css.d.ts +1 -0
  213. package/examples/README.md +34 -0
  214. package/examples/components/activity-feed.html +28 -0
  215. package/examples/components/app-shell.html +12 -0
  216. package/examples/components/app-toolbar.html +38 -0
  217. package/examples/components/avatar-group.html +27 -0
  218. package/examples/components/breadcrumbs.html +26 -0
  219. package/examples/components/bulk-bar.html +22 -0
  220. package/examples/components/code-block.html +12 -0
  221. package/examples/components/code-editor.html +25 -0
  222. package/examples/components/column-manager.html +9 -0
  223. package/examples/components/combobox.html +13 -0
  224. package/examples/components/context-hypercms.css +41 -0
  225. package/examples/components/context-hypercms.html +40 -0
  226. package/examples/components/context-hypercms.js +62 -0
  227. package/examples/components/context-quickcrop.html +137 -0
  228. package/examples/components/diff-view.html +9 -0
  229. package/examples/components/drawer.html +11 -0
  230. package/examples/components/editable-grid-cells.html +9 -0
  231. package/examples/components/file-browser.html +53 -0
  232. package/examples/components/file-tree.html +34 -0
  233. package/examples/components/files-table.html +80 -0
  234. package/examples/components/filter-builder.html +11 -0
  235. package/examples/components/form-error-summary.html +11 -0
  236. package/examples/components/index.html +51 -0
  237. package/examples/components/inline-edit.html +42 -0
  238. package/examples/components/kanban-board.html +42 -0
  239. package/examples/components/manifest.json +3279 -0
  240. package/examples/components/modal.html +11 -0
  241. package/examples/components/multi-select-picker.html +13 -0
  242. package/examples/components/pagination.html +32 -0
  243. package/examples/components/persistent-action-banner.html +23 -0
  244. package/examples/components/popconfirm.html +13 -0
  245. package/examples/components/popover-menu.html +13 -0
  246. package/examples/components/reference/baseline/DECISIONS.md +85 -0
  247. package/examples/components/reference/baseline/README.md +58 -0
  248. package/examples/components/reference/baseline/bevel-fonts.css +16 -0
  249. package/examples/components/reference/baseline/bevel.css +1339 -0
  250. package/examples/components/reference/baseline/bevel.js +496 -0
  251. package/examples/components/reference/baseline/fonts/LICENSE-ibm-plex-mono.txt +93 -0
  252. package/examples/components/reference/baseline/fonts/LICENSE-ibm-plex-sans.txt +93 -0
  253. package/examples/components/reference/baseline/fonts/LICENSE-newsreader.txt +93 -0
  254. package/examples/components/reference/baseline/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
  255. package/examples/components/reference/baseline/fonts/ibm-plex-mono-latin-500-normal.woff2 +0 -0
  256. package/examples/components/reference/baseline/fonts/ibm-plex-mono-latin-600-normal.woff2 +0 -0
  257. package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-400-italic.woff2 +0 -0
  258. package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-400-normal.woff2 +0 -0
  259. package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-500-normal.woff2 +0 -0
  260. package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-600-normal.woff2 +0 -0
  261. package/examples/components/reference/baseline/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  262. package/examples/components/reference/baseline/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  263. package/examples/components/reference/fable/IMPROVEMENTS.md +106 -0
  264. package/examples/components/reference/fable/PARENT-REPAIRS.md +17 -0
  265. package/examples/components/reference/fable/__pycache__/build_repairs.cpython-311.pyc +0 -0
  266. package/examples/components/reference/fable/__pycache__/kanban.cpython-311.pyc +0 -0
  267. package/examples/components/reference/fable/as-authored/IMPROVEMENTS-completed.md +106 -0
  268. package/examples/components/reference/fable/as-authored/base-astra.css +17 -0
  269. package/examples/components/reference/fable/as-authored/base-parent.css +416 -0
  270. package/examples/components/reference/fable/as-authored/build.py +858 -0
  271. package/examples/components/reference/fable/as-authored/fable.css +823 -0
  272. package/examples/components/reference/fable/as-authored/kanban-completed.css +235 -0
  273. package/examples/components/reference/fable/as-authored/kanban-completed.html +53 -0
  274. package/examples/components/reference/fable/as-authored/kanban-completed.py +212 -0
  275. package/examples/components/reference/fable/as-authored/kanban.py +207 -0
  276. package/examples/components/reference/fable/base-astra.css +17 -0
  277. package/examples/components/reference/fable/base-parent.css +416 -0
  278. package/examples/components/reference/fable/build.py +858 -0
  279. package/examples/components/reference/fable/build_repairs.py +25 -0
  280. package/examples/components/reference/fable/components/activity-feed.html +3 -0
  281. package/examples/components/reference/fable/components/app-toolbar.html +3 -0
  282. package/examples/components/reference/fable/components/avatar-group.html +4 -0
  283. package/examples/components/reference/fable/components/breadcrumbs.html +3 -0
  284. package/examples/components/reference/fable/components/code-block.html +9 -0
  285. package/examples/components/reference/fable/components/column-manager.html +3 -0
  286. package/examples/components/reference/fable/components/combobox.html +6 -0
  287. package/examples/components/reference/fable/components/context-hypercms.html +3 -0
  288. package/examples/components/reference/fable/components/context-quickcrop.html +4 -0
  289. package/examples/components/reference/fable/components/diff-view.html +13 -0
  290. package/examples/components/reference/fable/components/drawer.html +3 -0
  291. package/examples/components/reference/fable/components/editable-grid-cells.html +3 -0
  292. package/examples/components/reference/fable/components/filter-builder.html +3 -0
  293. package/examples/components/reference/fable/components/form-error-summary.html +4 -0
  294. package/examples/components/reference/fable/components/inline-edit.html +3 -0
  295. package/examples/components/reference/fable/components/kanban-board.html +53 -0
  296. package/examples/components/reference/fable/components/modal.html +3 -0
  297. package/examples/components/reference/fable/components/multi-select-picker.html +5 -0
  298. package/examples/components/reference/fable/components/pagination.html +3 -0
  299. package/examples/components/reference/fable/components/persistent-action-banner.html +4 -0
  300. package/examples/components/reference/fable/components/popconfirm.html +5 -0
  301. package/examples/components/reference/fable/components/popover-menu.html +3 -0
  302. package/examples/components/reference/fable/components/rich-text-toolbar.html +3 -0
  303. package/examples/components/reference/fable/components/save-status-indicator.html +2 -0
  304. package/examples/components/reference/fable/components/selectable-cards.html +3 -0
  305. package/examples/components/reference/fable/components/settings-rows.html +3 -0
  306. package/examples/components/reference/fable/components/sidebar-nav.html +4 -0
  307. package/examples/components/reference/fable/components/small-charts.html +5 -0
  308. package/examples/components/reference/fable/components/split-button.html +4 -0
  309. package/examples/components/reference/fable/components/split-panes.html +8 -0
  310. package/examples/components/reference/fable/components/stat-tiles.html +3 -0
  311. package/examples/components/reference/fable/components/toast-stack.html +5 -0
  312. package/examples/components/reference/fable/components/tree-view.html +4 -0
  313. package/examples/components/reference/fable/components/upload-dropzone.html +6 -0
  314. package/examples/components/reference/fable/components/wizard-shell.html +3 -0
  315. package/examples/components/reference/fable/coverage.json +414 -0
  316. package/examples/components/reference/fable/fable.css +823 -0
  317. package/examples/components/reference/fable/index.html +5 -0
  318. package/examples/components/reference/fable/kanban.css +237 -0
  319. package/examples/components/reference/fable/kanban.py +212 -0
  320. package/examples/components/reference/fable/parent-repairs.css +9 -0
  321. package/examples/components/reference/fixtures/data.json +102 -0
  322. package/examples/components/reference/fixtures/host.js +47 -0
  323. package/examples/components/reference/fixtures/static-host.js +39 -0
  324. package/examples/components/reference/fixtures/workspace.jpg +0 -0
  325. package/examples/components/reference/parent/CHANGES.md +179 -0
  326. package/examples/components/reference/parent/__pycache__/kanban.cpython-311.pyc +0 -0
  327. package/examples/components/reference/parent/base-astra.css +17 -0
  328. package/examples/components/reference/parent/base-parent.css +416 -0
  329. package/examples/components/reference/parent/build.py +148 -0
  330. package/examples/components/reference/parent/components/activity-feed.html +2 -0
  331. package/examples/components/reference/parent/components/app-toolbar.html +2 -0
  332. package/examples/components/reference/parent/components/avatar-group.html +4 -0
  333. package/examples/components/reference/parent/components/breadcrumbs.html +2 -0
  334. package/examples/components/reference/parent/components/code-block.html +8 -0
  335. package/examples/components/reference/parent/components/column-manager.html +2 -0
  336. package/examples/components/reference/parent/components/combobox.html +6 -0
  337. package/examples/components/reference/parent/components/context-hypercms.html +2 -0
  338. package/examples/components/reference/parent/components/context-quickcrop.html +4 -0
  339. package/examples/components/reference/parent/components/diff-view.html +4 -0
  340. package/examples/components/reference/parent/components/drawer.html +2 -0
  341. package/examples/components/reference/parent/components/editable-grid-cells.html +2 -0
  342. package/examples/components/reference/parent/components/filter-builder.html +2 -0
  343. package/examples/components/reference/parent/components/form-error-summary.html +2 -0
  344. package/examples/components/reference/parent/components/inline-edit.html +2 -0
  345. package/examples/components/reference/parent/components/kanban-board.html +84 -0
  346. package/examples/components/reference/parent/components/modal.html +2 -0
  347. package/examples/components/reference/parent/components/multi-select-picker.html +5 -0
  348. package/examples/components/reference/parent/components/pagination.html +2 -0
  349. package/examples/components/reference/parent/components/persistent-action-banner.html +4 -0
  350. package/examples/components/reference/parent/components/popconfirm.html +5 -0
  351. package/examples/components/reference/parent/components/popover-menu.html +2 -0
  352. package/examples/components/reference/parent/components/rich-text-toolbar.html +2 -0
  353. package/examples/components/reference/parent/components/save-status-indicator.html +2 -0
  354. package/examples/components/reference/parent/components/selectable-cards.html +2 -0
  355. package/examples/components/reference/parent/components/settings-rows.html +2 -0
  356. package/examples/components/reference/parent/components/sidebar-nav.html +4 -0
  357. package/examples/components/reference/parent/components/small-charts.html +2 -0
  358. package/examples/components/reference/parent/components/split-button.html +5 -0
  359. package/examples/components/reference/parent/components/split-panes.html +8 -0
  360. package/examples/components/reference/parent/components/stat-tiles.html +2 -0
  361. package/examples/components/reference/parent/components/toast-stack.html +5 -0
  362. package/examples/components/reference/parent/components/tree-view.html +4 -0
  363. package/examples/components/reference/parent/components/upload-dropzone.html +6 -0
  364. package/examples/components/reference/parent/components/wizard-shell.html +2 -0
  365. package/examples/components/reference/parent/coverage.json +414 -0
  366. package/examples/components/reference/parent/index.html +1 -0
  367. package/examples/components/reference/parent/kanban.css +114 -0
  368. package/examples/components/reference/parent/kanban.py +55 -0
  369. package/examples/components/reference/parent/refinement.css +53 -0
  370. package/examples/components/reference/selected/build.py +70 -0
  371. package/examples/components/reference/selected/components/activity-feed.html +3 -0
  372. package/examples/components/reference/selected/components/app-toolbar.html +3 -0
  373. package/examples/components/reference/selected/components/avatar-group.html +4 -0
  374. package/examples/components/reference/selected/components/breadcrumbs.html +3 -0
  375. package/examples/components/reference/selected/components/code-block.html +9 -0
  376. package/examples/components/reference/selected/components/column-manager.html +3 -0
  377. package/examples/components/reference/selected/components/combobox.html +6 -0
  378. package/examples/components/reference/selected/components/context-hypercms.html +3 -0
  379. package/examples/components/reference/selected/components/context-quickcrop.html +4 -0
  380. package/examples/components/reference/selected/components/diff-view.html +13 -0
  381. package/examples/components/reference/selected/components/drawer.html +3 -0
  382. package/examples/components/reference/selected/components/editable-grid-cells.html +3 -0
  383. package/examples/components/reference/selected/components/filter-builder.html +3 -0
  384. package/examples/components/reference/selected/components/form-error-summary.html +4 -0
  385. package/examples/components/reference/selected/components/inline-edit.html +3 -0
  386. package/examples/components/reference/selected/components/kanban-board.html +53 -0
  387. package/examples/components/reference/selected/components/modal.html +2 -0
  388. package/examples/components/reference/selected/components/multi-select-picker.html +5 -0
  389. package/examples/components/reference/selected/components/pagination.html +3 -0
  390. package/examples/components/reference/selected/components/persistent-action-banner.html +4 -0
  391. package/examples/components/reference/selected/components/popconfirm.html +5 -0
  392. package/examples/components/reference/selected/components/popover-menu.html +3 -0
  393. package/examples/components/reference/selected/components/rich-text-toolbar.html +3 -0
  394. package/examples/components/reference/selected/components/save-status-indicator.html +2 -0
  395. package/examples/components/reference/selected/components/selectable-cards.html +3 -0
  396. package/examples/components/reference/selected/components/settings-rows.html +3 -0
  397. package/examples/components/reference/selected/components/sidebar-nav.html +4 -0
  398. package/examples/components/reference/selected/components/small-charts.html +5 -0
  399. package/examples/components/reference/selected/components/split-button.html +4 -0
  400. package/examples/components/reference/selected/components/split-panes.html +8 -0
  401. package/examples/components/reference/selected/components/stat-tiles.html +3 -0
  402. package/examples/components/reference/selected/components/toast-stack.html +5 -0
  403. package/examples/components/reference/selected/components/tree-view.html +4 -0
  404. package/examples/components/reference/selected/components/upload-dropzone.html +6 -0
  405. package/examples/components/reference/selected/components/wizard-shell.html +3 -0
  406. package/examples/components/reference/selected/corrections.css +11 -0
  407. package/examples/components/reference/selected/coverage.json +413 -0
  408. package/examples/components/reference/selected/gallery-build.mjs +49 -0
  409. package/examples/components/reference/selected/gallery-spec.json +12 -0
  410. package/examples/components/reference/selected/index.html +1 -0
  411. package/examples/components/reference/selected/kanban-comparison.json +6 -0
  412. package/examples/components/reference/selected/manifest.json +476 -0
  413. package/examples/components/reference/sha256.json +142 -0
  414. package/examples/components/reference/sources/diagonal-close.svg +1 -0
  415. package/examples/components/reference/sources/hyperclay/public-assets/css/hyperclay-app-source.css +614 -0
  416. package/examples/components/reference/sources/hyperclay/public-assets/js/app.js +94 -0
  417. package/examples/components/reference/sources/hyperclayjs/src/ui/theModal.js +897 -0
  418. package/examples/components/reference/sources/hypercms/scripts/build-theme.js +203 -0
  419. package/examples/components/reference/sources/hypercms/src/anchor.js +24 -0
  420. package/examples/components/reference/sources/hypercms/src/apply-loop.js +167 -0
  421. package/examples/components/reference/sources/hypercms/src/diagnostics.js +44 -0
  422. package/examples/components/reference/sources/hypercms/src/enhance.js +173 -0
  423. package/examples/components/reference/sources/hypercms/src/events.js +955 -0
  424. package/examples/components/reference/sources/hypercms/src/form-builder.js +518 -0
  425. package/examples/components/reference/sources/hypercms/src/form-rules.js +208 -0
  426. package/examples/components/reference/sources/hypercms/src/hooks.js +100 -0
  427. package/examples/components/reference/sources/hypercms/src/hypercms-bundle.js +10 -0
  428. package/examples/components/reference/sources/hypercms/src/hypercms.js +347 -0
  429. package/examples/components/reference/sources/hypercms/src/morph.js +10 -0
  430. package/examples/components/reference/sources/hypercms/src/path.js +61 -0
  431. package/examples/components/reference/sources/hypercms/src/place.js +131 -0
  432. package/examples/components/reference/sources/hypercms/src/platform.js +131 -0
  433. package/examples/components/reference/sources/hypercms/src/refresh.js +87 -0
  434. package/examples/components/reference/sources/hypercms/src/richclay-bridge.js +140 -0
  435. package/examples/components/reference/sources/hypercms/src/row-identity.js +111 -0
  436. package/examples/components/reference/sources/hypercms/src/scaffold.js +10 -0
  437. package/examples/components/reference/sources/hypercms/src/session.js +303 -0
  438. package/examples/components/reference/sources/hypercms/src/shell.js +248 -0
  439. package/examples/components/reference/sources/hypercms/src/styles.css +298 -0
  440. package/examples/components/reference/sources/hypercms/src/targets.js +144 -0
  441. package/examples/components/reference/sources/hypercms/src/templates.js +656 -0
  442. package/examples/components/reference/sources/hypercms/src/theme/pixel-quiet.overrides.css +761 -0
  443. package/examples/components/reference/sources/hypercms/src/theme.generated.css +1772 -0
  444. package/examples/components/reference/sources/hypercms/src/toggle.js +666 -0
  445. package/examples/components/reference/sources/hypercms/src/unresolved.js +211 -0
  446. package/examples/components/reference/sources/hypercms/src/vendor/mirk.vendor.js +212 -0
  447. package/examples/components/reference/sources/hypercms/src/views/inline-layer.js +421 -0
  448. package/examples/components/reference/sources/hypercms/src/views/inline.js +1072 -0
  449. package/examples/components/reference/sources/hypercms/src/views/sidebar.js +97 -0
  450. package/examples/components/reference/sources/modal-reference.html +301 -0
  451. package/examples/components/reference/sources/quickcrop/quickcrop.css +124 -0
  452. package/examples/components/reference/sources/quickcrop/quickcrop.js +400 -0
  453. package/examples/components/reference/sources/richclay/richclay.css +416 -0
  454. package/examples/components/reference/sources/richclay/richclay.js +2962 -0
  455. package/examples/components/reference/sources/richclay/src/a11y.js +67 -0
  456. package/examples/components/reference/sources/richclay/src/browser-global.js +7 -0
  457. package/examples/components/reference/sources/richclay/src/buttons.js +254 -0
  458. package/examples/components/reference/sources/richclay/src/hyperclay.js +470 -0
  459. package/examples/components/reference/sources/richclay/src/normalize.js +380 -0
  460. package/examples/components/reference/sources/richclay/src/richclay.js +1356 -0
  461. package/examples/components/reference/sources/richclay/src/sanitize.js +189 -0
  462. package/examples/components/reference/sources/richclay/src/styles.js +23 -0
  463. package/examples/components/reference/sources/richclay/src/toolbar-float.js +175 -0
  464. package/examples/components/reference/sources/richclay/src/toolbar.js +394 -0
  465. package/examples/components/reference/sources/richclay/src/vendor-bundle.js +15 -0
  466. package/examples/components/reference/sources/richclay/vendor/DOMPURIFY-LICENSE +202 -0
  467. package/examples/components/reference/sources/richclay/vendor/DOMPURIFY-LICENSE-MPL +373 -0
  468. package/examples/components/reference/sources/richclay/vendor/SQUIRE-LICENSE +21 -0
  469. package/examples/components/reference/sources/richclay/vendor/purify.es.mjs +2249 -0
  470. package/examples/components/reference/sources/richclay/vendor/purify.min.js +3 -0
  471. package/examples/components/reference/sources/richclay/vendor/squire.js +22 -0
  472. package/examples/components/reference/sources/richclay/vendor/squire.mjs +22 -0
  473. package/examples/components/reference/sources/richclay/vendor/squire.provenance.json +19 -0
  474. package/examples/components/rich-text-toolbar.html +43 -0
  475. package/examples/components/save-status-indicator.html +11 -0
  476. package/examples/components/selectable-cards.html +9 -0
  477. package/examples/components/settings-rows.html +10 -0
  478. package/examples/components/sidebar-nav.html +9 -0
  479. package/examples/components/small-charts.html +21 -0
  480. package/examples/components/split-button.html +13 -0
  481. package/examples/components/split-panes-editor.html +6 -0
  482. package/examples/components/split-panes.html +9 -0
  483. package/examples/components/stat-tiles.html +23 -0
  484. package/examples/components/toast-stack.html +21 -0
  485. package/examples/components/tree-view.html +9 -0
  486. package/examples/components/upload-dropzone.html +88 -0
  487. package/examples/components/wizard-shell.html +50 -0
  488. package/examples/datastar/index.html +38 -0
  489. package/examples/datastar/server.mjs +31 -0
  490. package/examples/fixtures/field-guide.pdf +14 -0
  491. package/examples/fixtures/workspace.jpg +0 -0
  492. package/examples/setup-peers.mjs +35 -0
  493. package/fonts/LICENSE-ibm-plex-mono.txt +93 -0
  494. package/fonts/LICENSE-ibm-plex-sans.txt +93 -0
  495. package/fonts/LICENSE-newsreader.txt +93 -0
  496. package/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
  497. package/fonts/ibm-plex-mono-latin-500-normal.woff2 +0 -0
  498. package/fonts/ibm-plex-mono-latin-600-normal.woff2 +0 -0
  499. package/fonts/ibm-plex-sans-latin-400-italic.woff2 +0 -0
  500. package/fonts/ibm-plex-sans-latin-400-normal.woff2 +0 -0
  501. package/fonts/ibm-plex-sans-latin-500-normal.woff2 +0 -0
  502. package/fonts/ibm-plex-sans-latin-600-normal.woff2 +0 -0
  503. package/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  504. package/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  505. package/icons/LICENSE +21 -0
  506. package/icons/house.json +71 -0
  507. package/icons/icons.d.ts +17 -0
  508. package/icons/icons.js +648 -0
  509. package/icons/icons.svg +126 -0
  510. package/icons/marks/build-tray.source.mjs +45 -0
  511. package/icons/marks/hyperclay-local.svg +11 -0
  512. package/icons/phosphor.json +53 -0
  513. package/icons/round.json +8 -0
  514. package/integrations/datastar.js +202 -0
  515. package/integrations/quickcrop.css +26 -0
  516. package/integrations/quickcrop.js +56 -0
  517. package/integrations/richclay.css +100 -0
  518. package/integrations/richclay.js +131 -0
  519. package/package.json +630 -0
  520. package/react/README.md +244 -0
  521. package/src/README.md +83 -0
  522. package/vendor/datastar/datastar-1.0.3.js +10 -0
  523. package/vendor/datastar/provenance.json +6 -0
  524. package/vendor/floating-ui/LICENSE-core +20 -0
  525. package/vendor/floating-ui/LICENSE-dom +20 -0
  526. package/vendor/floating-ui/floating-ui.core.umd.min.js +1 -0
  527. package/vendor/floating-ui/floating-ui.dom.umd.min.js +1 -0
  528. package/vendor/floating-ui/provenance.json +17 -0
  529. package/vendor/richclay/LICENSE +16 -0
  530. package/vendor/richclay/THIRD-PARTY-NOTICES.md +45 -0
  531. package/vendor/richclay/provenance.json +17 -0
  532. package/vendor/richclay/richclay.css +404 -0
  533. package/vendor/richclay/richclay.js +2940 -0
  534. package/vendor/richclay/vendor/DOMPURIFY-LICENSE +202 -0
  535. package/vendor/richclay/vendor/DOMPURIFY-LICENSE-MPL +373 -0
  536. package/vendor/richclay/vendor/SQUIRE-LICENSE +21 -0
  537. package/vendor/richclay/vendor/purify.min.js +3 -0
  538. package/vendor/richclay/vendor/squire.js +22 -0
  539. package/vendor/richclay/vendor/squire.provenance.json +30 -0
@@ -0,0 +1,244 @@
1
+ # Bevel for React
2
+
3
+ Bevel's React entry points use React 19 and Base UI. They are independent of the classic `bevel.js` runtime. Applications own requests, records, routing, permissions and persistence.
4
+
5
+ ```sh
6
+ npm install @panphora/bevel react@^19 react-dom@^19 @base-ui/react@^1.8
7
+ ```
8
+
9
+ Import functional layout once. Theme and fonts are separate, optional imports. JavaScript imports never load CSS or fonts automatically.
10
+
11
+ ```tsx
12
+ import '@panphora/bevel/react/layout.css';
13
+ import '@panphora/bevel/react/theme.css';
14
+ import { BevelProvider } from '@panphora/bevel/react/provider';
15
+ import { Button } from '@panphora/bevel/react/button';
16
+
17
+ export function App() {
18
+ return <BevelProvider appearance="bevel" mode="system">
19
+ <Button variant="primary">Save changes</Button>
20
+ </BevelProvider>;
21
+ }
22
+ ```
23
+
24
+ For plain controls, omit `theme.css` and use `appearance="plain"`, the default. The component tree and state APIs stay the same. To load the packaged IBM Plex and Newsreader fonts, explicitly import `@panphora/bevel/react/fonts.css`. CSS exports include declarations for strict TypeScript side-effect import checking.
25
+
26
+ ## Theme boundaries and portals
27
+
28
+ `BevelProvider` accepts `appearance`, `mode`, `tokens`, ordinary div props and a div ref. Nested providers inherit unspecified settings. An explicit plain provider restores neutral typography and surfaces, including inside an editorial Page.
29
+
30
+ ```tsx
31
+ <BevelProvider appearance="bevel" mode="dark" tokens={{ '--bevel-brass': '#d9a445' }}>
32
+ <Page>{children}</Page>
33
+ </BevelProvider>
34
+ ```
35
+
36
+ Page supplies the editorial surface, typography and flow rhythm. Provider alone does not restyle the document body. Theme CSS uses modern CSS layers, scopes and `light-dark()`; functional layout contains no Bevel palette.
37
+
38
+ Wrapped Portal parts apply the current provider settings to Base UI's existing portal host. Mode and token updates reach open overlays. Use provider `tokens` for portable custom-property overrides. Arbitrary ancestor CSS does not cross a body portal; supply a Portal `container` when DOM inheritance must remain in a particular element or ShadowRoot.
39
+
40
+ ## Composition and state
41
+
42
+ Base UI parts preserve their upstream props, generics, render callbacks, state-dependent className/style callbacks, cancellation details and ref targets. React 19 receives ref as a prop. Base UI controls can expose an HTMLElement ref; checkbox `inputRef` points to its native form input.
43
+
44
+ ```tsx
45
+ <Button nativeButton={false} role="link" render={<a href="/projects" />}>
46
+ Projects
47
+ </Button>
48
+ ```
49
+
50
+ Explicit `role="link"` opts into link semantics when rendering an anchor. Base UI Button otherwise retains button semantics even with an anchor render element.
51
+
52
+ Use controlled values with change callbacks or uncontrolled default values. False, zero and empty values remain controlled. A controlled callback proposes a change; leaving the prop unchanged rejects it. Bevel never mirrors React state into serialized DOM attributes or registers the classic delegated event handlers.
53
+
54
+ ```tsx
55
+ <Field.Root name="title">
56
+ <Field.Label>Title</Field.Label>
57
+ <Input required value={title} onValueChange={setTitle} />
58
+ <Field.Description>Shown to everyone with access.</Field.Description>
59
+ <Field.Error />
60
+ </Field.Root>
61
+ ```
62
+
63
+ Field and Form retain native name, form, reset, validity and submission behavior. Use Form.Fields and Form.Actions to group controls and actions. Form's default layout is one column so a composed dialog body and footer retain their positions.
64
+
65
+ `AppShell.SidebarToggle` is labelled Collapse sidebar or Expand sidebar unless you pass `label`. In classic markup, `data-bevel-label-collapse` and `data-bevel-label-expand` on the `[data-bevel-shell-collapse]` button replace those two labels.
66
+
67
+ ## Dialogs
68
+
69
+ ```tsx
70
+ <Dialog.Root>
71
+ <Dialog.Trigger>Share project</Dialog.Trigger>
72
+ <Dialog.Portal>
73
+ <Dialog.Backdrop />
74
+ <Dialog.Popup>
75
+ <Dialog.CornerClose />
76
+ <Dialog.Header>
77
+ <Dialog.Title>Share project</Dialog.Title>
78
+ <Dialog.Description>Choose who can access this project.</Dialog.Description>
79
+ </Dialog.Header>
80
+ <Dialog.Body>{fields}</Dialog.Body>
81
+ <Dialog.Footer><Dialog.Close>Done</Dialog.Close></Dialog.Footer>
82
+ </Dialog.Popup>
83
+ </Dialog.Portal>
84
+ </Dialog.Root>
85
+ ```
86
+
87
+ Dialog.CornerClose draws the corner close control; place it first inside Dialog.Popup. It is labelled Close unless you pass aria-label, and a title that starts the header leaves room for it. Dialog also exposes Viewport, handle utilities and the native Base UI root API. Modal is an alias. Popover follows Base UI's Root, Trigger, Portal, Positioner and Popup anatomy. Keep nested overlays inside their owning React tree so Base UI coordinates focus and dismissal.
88
+
89
+ ## Tables and collections
90
+
91
+ `useDataTable` derives rows from immutable application records and accessor based column definitions. Compose its result through `DataGrid.Root` or the equivalent `DataTable.Root`, with Table, Search, Status, ColumnManager, FilterBuilder and Pagination. The pure types and functions are available from `@panphora/bevel/react/models/table`, `@panphora/bevel/react/models/filter`, `@panphora/bevel/react/models/reorder` and `@panphora/bevel/react/models/kanban`.
92
+
93
+ ```tsx
94
+ const table = useDataTable({
95
+ rows,
96
+ getRowId: row => row.id,
97
+ columns: [
98
+ { id: 'name', label: 'Name', required: true, getValue: row => row.name },
99
+ { id: 'amount', label: 'Amount', type: 'number', editable: true, getValue: row => row.amount },
100
+ ],
101
+ onCellCommit: ({ rowId, columnId, value }) => {
102
+ setRows(rows => rows.map(row => row.id === rowId ? { ...row, [columnId]: value } : row));
103
+ },
104
+ });
105
+ return <DataGrid.Root table={table}>
106
+ <DataGrid.Search />
107
+ <DataGrid.Scroll><DataGrid.Table selection resizable /></DataGrid.Scroll>
108
+ <DataGrid.Status />
109
+ <Pagination.Root><Pagination.Range /><Pagination.Pages /></Pagination.Root>
110
+ </DataGrid.Root>;
111
+ ```
112
+
113
+ Client mode searches and filters, counts views, sorts within groups, computes aggregates, then pages. Selection acts on eligible rows on the visible page and retains IDs from other pages. Required columns remain visible and pinned. Column order and numeric widths drive every table section. The table uses their total width, including its pinned 44px selection column, so pinned offsets match actual cells. Use the generic `DataGrid.Table<Row>` when a custom renderDetail callback needs its row type.
114
+
115
+ For server processed pages, pass `mode="manual"`, controlled state, `totalRows` or `hasNextPage`, and server aggregates/counts as needed. Manual mode renders supplied rows without sorting, filtering or slicing them again. Change callbacks describe user intent; the application fetches and replaces the records. Unknown totals never invent a last page.
116
+
117
+ FilterBuilder edits a draft and validates before Apply. Its shared filter model accepts strict numbers and real ISO dates. Empty filters match all records. EditableCell keeps one active draft per table, reports `{ rowId, columnId, previous, value }`, and returns focus after a commit changes the visible rows. Cancel discards the draft. Changing the row ID, column ID or edited value cancels a stale editor. Equivalent mapped row objects preserve the draft.
118
+
119
+ Sortable uses stable string IDs and supports pointer movement and arrows/Home/End. SplitPanes uses a percentage ratio, measured pixel minimums, a keyboard separator and mobile stacking. Escape or pointer cancellation discards the preview. KanbanBoard receives ordered column card IDs and immutable card records. Its inspector, editor, checklist, archive controls and explicit Move operation use application callbacks. Filtered boards disable ambiguous dragging while preserving explicit moves. Supply `today` as an ISO date when due styling is needed. New cards, checklist items, filter rules and accepted uploads receive random UUIDs that remain independent of React tree IDs after reload.
120
+
121
+ ## Forms, drafts and feedback
122
+
123
+ `FormErrorSummary` accepts ordered `{ id, message }` errors. `nativeFormErrors(form)` collects invalid controls with stable IDs from that form. Increment `focusToken` for each failed submission to focus the summary, or pass `focus="first-field"`. Rendering existing server errors alone does not move focus. Error links retain the control's existing descriptions.
124
+
125
+ Wizard.Root is a native form. Forward navigation validates enabled steps before changing the keyed step; Finish validates every enabled panel and reaches the application's live submit event. Hidden panels preserve state and remain inert. InlineEdit separates committed value from draft text and supports text, number, multiline and an application supplied rich editor. It accepts pending/error props, permits a retry after a pending failure, and cancels a stale draft when value or recordKey changes.
126
+
127
+ FileInput retains native FileList and multipart FormData behavior. FileField controls a selected File collection through callbacks; submit that collection explicitly if it differs from the latest native chooser selection. Never give a browser file input a nonempty value. UploadDropzone reports accepted original Files and rejected files with reasons; the application owns upload requests, retry, progress and durable URLs. ImagePreview.Image belongs inside ImagePreview.Frame. Created preview URLs are released on replacement and unmount; supplied durable URLs are never revoked.
128
+
129
+ SaveStatus receives explicit clean/dirty/saving/saved/error state. A new eventKey restarts saved feedback; duration zero keeps it visible. CodeBlock copies the exact code prop and provides selectable text if clipboard permission fails. DiffView renders escaped keyed records in unified or split layouts. SmallChart receives finite values or null gaps and always renders a matching accessible data table; series toggles update both representations.
130
+
131
+ Tooltip follows [Base UI's visual hint contract](https://base-ui.com/react/components/tooltip). Give its trigger a matching accessible name. Put essential descriptions in inline text or Popover; Tooltip.Popup does not add a tooltip role or an automatic accessible description.
132
+
133
+ ## Optional integrations and recipes
134
+
135
+ These entries are excluded from the root barrel and basic component graphs. They accept consumer supplied peers and do not fetch or install them.
136
+
137
+ `@panphora/bevel/react/integrations/richclay` exports RichclayEditor. Pass the RichClay constructor and Squire after loading them in the browser. The adapter mounts its own editor into an empty host, calls the actual registry commands, preserves selection and subscribes to peer history. `onReady` supplies a RichTextController for RichTextToolbar. Static, floating and view toolbar modes use the same controller. The application owns HTML state; controlled updates do not reset undo history when the HTML already matches. Sanitization follows the supplied Richclay configuration. Initial placeholder and sanitize options are constructor settings; remount with a new key to change them.
138
+
139
+ `@panphora/bevel/react/integrations/quickcrop` exports useQuickcrop and QuickcropDialog. Pass the browser loaded async Quickcrop function. The adapter hosts its supplied stage inside a Bevel dialog, returns encoded results, and cancels owned sessions on unmount. Quickcrop owns its source URL and has one module wide active crop. It cannot synchronously abort an image decode. Stale requests are invalidated before mounting; late results cannot replace newer state. Preset and reset actions cancel, await settlement, and reopen the same File.
140
+
141
+ `@panphora/bevel/react/recipes/context-quickcrop` exports CropImageField, a FileInput, image preview and square/free/reset composition. Its onResult receives `{ blob, dataURL, width, height }`; the application chooses upload or download. `@panphora/bevel/react/recipes/context-hypercms` exports CMSContext, composing metadata form, contributor ordering, image/document parts and a consumer supplied iframe URL. The external CMS owns that iframe's DOM, edit lifecycle and HTML serialization. The recipe does not instantiate a CMS or run its mutation runtime inside the React root. Its onApply proposes metadata to the application.
142
+
143
+ Both recipes and the real Richclay/Quickcrop adapters have [typechecked consumer examples](../tests/react/consumer/optional.tsx).
144
+
145
+ Quickcrop converts its display selection back to source pixels with separate rounding on each axis. A square preset can therefore differ by one output pixel; the adapter returns the peer's actual encoded dimensions.
146
+
147
+ The crop stage fits the viewport when opened. If the viewport narrows during a crop, the stage keeps its pixel coordinates and becomes scrollable. Closing and reopening fits the new viewport.
148
+
149
+ ## Verification
150
+
151
+ The repository's packed consumer fixture uses the same component tree for plain and themed pages. Its tests check the actual npm tarball, strict TypeScript in NodeNext and Bundler modes, server rendering, hydration, form values, controlled rejection, portal inheritance and browser focus. The Button-only bundle is inspected separately for unrelated imports.
152
+
153
+ ```sh
154
+ npm run build
155
+ npm run build:check
156
+ npm run test:react
157
+ npm run test:react:types
158
+ npm run test:react:catalog
159
+ npm run test:react:package
160
+ npm run test:react:browser
161
+ node tests/react/optional-browser.mjs
162
+ npm run dev:react
163
+ ```
164
+
165
+ ## Catalog
166
+
167
+ Each row links to a real example compiled against the installed package. Each component entry includes declarations for its props and exported model types. Base UI utility handles and hook exports remain on the matching entry.
168
+
169
+ | Family | Entry | Components and parts | Typechecked example |
170
+ | --- | --- | --- | --- |
171
+ | button | `@panphora/bevel/react/button` | Button; ButtonGroup; IconButton | [Example](../tests/react/consumer/fixture.tsx#L41) |
172
+ | icon-button | `@panphora/bevel/react/icon-button` | IconButton (label, variant raised or flat); also re-exported from `@panphora/bevel/react/button` | [Example](../tests/react/consumer/catalog-cases.tsx#L126) |
173
+ | text-input | `@panphora/bevel/react/input` | Input; InputGroup (Prefix, Suffix) | [Example](../tests/react/consumer/fixture.tsx#L45) |
174
+ | textarea | `@panphora/bevel/react/textarea` | Textarea | [Example](../tests/react/consumer/catalog-cases.tsx#L60) |
175
+ | number | `@panphora/bevel/react/number-field` | NumberField (Root, Group, Input, Increment, Decrement, ScrubArea, ScrubAreaCursor); NumberSteps | [Example](../tests/react/consumer/catalog-cases.tsx#L61) |
176
+ | select | `@panphora/bevel/react/select` | NativeSelect; Select (Root, Label, Trigger, Value, Icon, Portal, Backdrop, Positioner, Popup, List, Item, ItemText, ItemIndicator, Arrow, ScrollDownArrow, ScrollUpArrow, Group, GroupLabel, Separator) | [Example](../tests/react/consumer/catalog-cases.tsx#L62) |
177
+ | checkbox | `@panphora/bevel/react/checkbox` | Checkbox (Root, Indicator); CheckboxGroup | [Example](../tests/react/consumer/fixture.tsx#L46) |
178
+ | radio | `@panphora/bevel/react/radio` | Radio (Root, Indicator); RadioGroup | [Example](../tests/react/consumer/catalog-cases.tsx#L63) |
179
+ | toggle | `@panphora/bevel/react/switch` | Switch (Root, Thumb); ToggleButton | [Example](../tests/react/consumer/catalog-cases.tsx#L64) |
180
+ | slider | `@panphora/bevel/react/slider` | Slider (Root, Label, Value, Control, Track, Indicator, Thumb); SliderRow | [Example](../tests/react/consumer/catalog-cases.tsx#L65) |
181
+ | date | `@panphora/bevel/react/date` | DateInput (Root, Input, Icon) | [Example](../tests/react/consumer/catalog-cases.tsx#L66) |
182
+ | file | `@panphora/bevel/react/file` | FileField (Root, Input, Trigger, Name, Remove, Link); FileInput | [Example](../tests/react/consumer/fixture.tsx#L26) |
183
+ | image | `@panphora/bevel/react/image` | ImageField (Root, Input, Trigger, Name, Remove, Link, Preview, Frame, Placeholder); ImagePreview (Root, Frame, Thumb, Image, Placeholder, Remove) | [Example](../tests/react/consumer/catalog-cases.tsx#L67) |
184
+ | tags | `@panphora/bevel/react/tags` | Tags (Root, Input, List, Item, Remove) | [Example](../tests/react/consumer/catalog-cases.tsx#L68) |
185
+ | sortable | `@panphora/bevel/react/sortable` | Sortable (Root, Item, Handle, Body) | [Example](../tests/react/consumer/catalog-cases.tsx#L69) |
186
+ | chip | `@panphora/bevel/react/chip` | Chip (Root, Trigger, Collapse, Panel, Header, Heading, Eyebrow, Meta, Actions, Restore, Keep, Changes, ChangesTrigger, Preview, Row, Key, Old, New); RecoveryChip (Root, Trigger, Collapse, Panel, Header, Heading, Eyebrow, Meta, Actions, Restore, Keep, Changes, ChangesTrigger, Preview, Row, Key, Old, New) | [Example](../tests/react/consumer/catalog-cases.tsx#L70) |
187
+ | field | `@panphora/bevel/react/field` | Field (Root, Label, Description, Error, Control, Item, Validity); Fieldset (Root, Legend); Form (Fields, Actions) | [Example](../tests/react/consumer/fixture.tsx#L51) |
188
+ | note | `@panphora/bevel/react/note` | Note (Root, Tag, Body); Notes | [Example](../tests/react/consumer/catalog-cases.tsx#L71) |
189
+ | callout-and-hint | `@panphora/bevel/react/callout-and-hint` | Callout; Hint | [Example](../tests/react/consumer/catalog-cases.tsx#L72) |
190
+ | list | `@panphora/bevel/react/list` | List (Ordered, Item) | [Example](../tests/react/consumer/catalog-cases.tsx#L73) |
191
+ | badge-and-pill | `@panphora/bevel/react/badge-and-pill` | Badge; LabelDot; Pill; PillGroup | [Example](../tests/react/consumer/catalog-cases.tsx#L74) |
192
+ | progress-and-gauge | `@panphora/bevel/react/progress-and-gauge` | Gauge (Root, Label, Value); GaugeGroup; NativeProgress; Progress (Root, Track, Indicator, Value, Label) | [Example](../tests/react/consumer/catalog-cases.tsx#L75) |
193
+ | table | `@panphora/bevel/react/table` | Table (Root, Caption, Head, Body, Foot, Row, HeaderCell, Cell) | [Example](../tests/react/consumer/catalog-cases.tsx#L76) |
194
+ | data-grid | `@panphora/bevel/react/data-grid` | DataGrid (Root, Table, Search, Status, View, Scroll, Bar, Tools, Title, Description, Masthead, Stats, Stat, Views, Footer) | [Example](../tests/react/consumer/catalog-cases.tsx#L77) |
195
+ | skeleton-and-empty | `@panphora/bevel/react/skeleton-and-empty` | EmptyState (Root, Title, Description, Actions); Skeleton (Root, Line) | [Example](../tests/react/consumer/catalog-cases.tsx#L78) |
196
+ | rows-and-card | `@panphora/bevel/react/rows-and-card` | Card (Root, Header, Body, Footer); EvidenceRows (Row, Title, Body); RevisionRows (Row, Key, Body) | [Example](../tests/react/consumer/catalog-cases.tsx#L79) |
197
+ | eyebrow-kicker-lede-pull-quote | `@panphora/bevel/react/eyebrow-kicker-lede-pull-quote` | Eyebrow (Count); Kicker; Lede; PullQuote | [Example](../tests/react/consumer/catalog-cases.tsx#L80) |
198
+ | tabs | `@panphora/bevel/react/tabs` | Tabs (Root, List, Tab, Panel, Indicator) | [Example](../tests/react/consumer/catalog-cases.tsx#L81) |
199
+ | details | `@panphora/bevel/react/details` | Accordion (Root, Item, Header, Trigger, Panel); Details (Root, Trigger, Panel) | [Example](../tests/react/consumer/catalog-cases.tsx#L82) |
200
+ | segmented-control | `@panphora/bevel/react/segmented-control` | SegmentedControl (Root, Item, Links, Link) | [Example](../tests/react/consumer/catalog-cases.tsx#L83) |
201
+ | steps | `@panphora/bevel/react/steps` | Step; Steps | [Example](../tests/react/consumer/catalog-cases.tsx#L84) |
202
+ | tooltip-and-key | `@panphora/bevel/react/tooltip-and-key` | Key; Tooltip (Root, Trigger, Portal, Positioner, Popup, Arrow, Viewport, Handle) | [Example](../tests/react/consumer/catalog-cases.tsx#L85) |
203
+ | masthead-and-verdict | `@panphora/bevel/react/masthead-and-verdict` | Masthead (Root, Row, Headline, Dek, Tape); Verdict (Root, Title, Summary) | [Example](../tests/react/consumer/catalog-cases.tsx#L86) |
204
+ | data-table | `@panphora/bevel/react/data-table` | DataTable (Root, Table, Search, Status, View, Scroll, Bar, Tools, Title, Description, Masthead, Stats, Stat, Views, Footer) | [Example](../tests/react/consumer/catalog-cases.tsx#L87) |
205
+ | modal | `@panphora/bevel/react/dialog` | Dialog (Root, Trigger, Portal, Backdrop, Viewport, Popup, Title, Description, Close, CornerClose, Header, Body, Footer, Handle); Modal (Root, Trigger, Portal, Backdrop, Viewport, Popup, Title, Description, Close, CornerClose, Header, Body, Footer, Handle) | [Example](../tests/react/consumer/fixture.tsx#L56) |
206
+ | popover-menu | `@panphora/bevel/react/menu` | Menu (Root, SubmenuRoot, Trigger, UnstyledTrigger, SubmenuTrigger, Portal, Positioner, Popup, Arrow, Backdrop, Viewport, Item, LinkItem, CheckboxItem, CheckboxItemIndicator, RadioGroup, RadioItem, RadioItemIndicator, Group, GroupLabel, Separator, Handle) | [Example](../tests/react/consumer/catalog-cases.tsx#L88) |
207
+ | drawer | `@panphora/bevel/react/drawer` | Drawer (Root, VirtualKeyboardProvider, Trigger, Portal, Backdrop, Viewport, Popup, Content, Title, Description, Close, CornerClose, Indent, IndentBackground, SwipeArea, Handle, Header, Body, Footer) | [Example](../tests/react/consumer/catalog-cases.tsx#L89) |
208
+ | popconfirm | `@panphora/bevel/react/popconfirm` | Popconfirm (Root, Trigger, Portal, Positioner, Popup, Backdrop, Arrow, Title, Description, Close, Viewport, Handle, Cancel, Confirm, Header, Actions) | [Example](../tests/react/consumer/fixture.tsx#L17) |
209
+ | combobox | `@panphora/bevel/react/combobox` | Combobox (Root, Label, Value, Input, InputGroup, Trigger, List, Status, Portal, Backdrop, Positioner, Popup, Arrow, Icon, Group, GroupLabel, Item, ItemIndicator, Chips, Chip, ChipRemove, Row, Collection, Empty, Clear, Separator) | [Example](../tests/react/consumer/catalog-cases.tsx#L90) |
210
+ | multi-select-picker | `@panphora/bevel/react/multi-select-picker` | MultiSelectPicker (Root, Label, Value, Input, InputGroup, Trigger, List, Status, Portal, Backdrop, Positioner, Popup, Arrow, Icon, Group, GroupLabel, Item, ItemIndicator, Chips, Chip, ChipRemove, Row, Collection, Empty, Clear, Separator, Control, Summary, Count) | [Example](../tests/react/consumer/catalog-cases.tsx#L91) |
211
+ | selectable-cards | `@panphora/bevel/react/selectable-cards` | CheckboxCards (Root, Item, Indicator, Copy); RadioCards (Root, Item, Indicator, Copy) | [Example](../tests/react/consumer/catalog-cases.tsx#L92) |
212
+ | upload-dropzone | `@panphora/bevel/react/upload-dropzone` | UploadDropzone (Root, Input, Trigger, List, Row, Copy, Actions, Name, Status, Progress, Rejection) | [Example](../tests/react/consumer/catalog-cases.tsx#L93) |
213
+ | inline-edit | `@panphora/bevel/react/inline-edit` | InlineEdit (Root, Value, Trigger, Editor, Input, Save, Cancel, Error, Actions) | [Example](../tests/react/consumer/catalog-cases.tsx#L94) |
214
+ | settings-rows | `@panphora/bevel/react/settings-rows` | SettingsRow (Root, Copy, Label, Description, Control, Actions); SettingsRows | [Example](../tests/react/consumer/catalog-cases.tsx#L95) |
215
+ | form-error-summary | `@panphora/bevel/react/form-error-summary` | ErrorLink; FormErrorSummary | [Example](../tests/react/consumer/catalog-cases.tsx#L96) |
216
+ | split-button | `@panphora/bevel/react/split-button` | SplitButton (Root, Primary, Trigger, Item, Portal, Positioner, Popup, Group, GroupLabel, Separator) | [Example](../tests/react/consumer/catalog-cases.tsx#L97) |
217
+ | sidebar-nav | `@panphora/bevel/react/sidebar-nav` | SidebarNav (Root, Toggle, Link, Label, Links, Group, GroupLabel, Brand, Count, Identity, IdentityCopy, Mobile) | [Example](../tests/react/consumer/catalog-cases.tsx#L98) |
218
+ | app-shell | `@panphora/bevel/react/app-shell` | AppShell (Bar, Brand, Mark, Wordmark, Rule, Switcher, Tabs, Tab, Spacer, NavToggle, Account, Body, Sidebar, SidebarHead, SidebarToggle, Main, Content) | [Example](../tests/react/consumer/catalog-cases.tsx#L127) |
219
+ | app-toolbar | `@panphora/bevel/react/app-toolbar` | AppToolbar (Root, Group, Button, Link, Input, Separator); ToolbarSpacer; ToolbarToggle; ToolbarToggleGroup | [Example](../tests/react/consumer/catalog-cases.tsx#L99) |
220
+ | breadcrumbs | `@panphora/bevel/react/breadcrumbs` | Breadcrumbs (Root, List, Item, Link, Separator, Middle, Overflow, OverflowLinks, OverflowTrigger, Path) | [Example](../tests/react/consumer/catalog-cases.tsx#L100) |
221
+ | pagination | `@panphora/bevel/react/pagination` | Pagination (Root, Range, Pages, Page, Previous, Next, PageSize, Gap) | [Example](../tests/react/consumer/catalog-cases.tsx#L101) |
222
+ | tree-view | `@panphora/bevel/react/tree-view` | TreeView (Root, Items, Header, Empty) | [Example](../tests/react/consumer/catalog-cases.tsx#L102) |
223
+ | wizard-shell | `@panphora/bevel/react/wizard-shell` | Wizard (Root, Steps, Step, Panel, Back, Next, Finish, Marker, StepNote, Content, Actions, Lede, Note) | [Example](../tests/react/consumer/catalog-cases.tsx#L103) |
224
+ | toast-stack | `@panphora/bevel/react/toast` | Toast (Viewport, Root, Content, Description, Title, Close, Action, Portal, Positioner, Arrow, Icon, Host) | [Example](../tests/react/consumer/catalog-cases.tsx#L104) |
225
+ | persistent-action-banner | `@panphora/bevel/react/persistent-action-banner` | ActionBanner (Root, Dismiss, Body, Icon, Actions, Observation, Meta, Head, Count, Progress, Status) | [Example](../tests/react/consumer/catalog-cases.tsx#L105) |
226
+ | save-status-indicator | `@panphora/bevel/react/save-status-indicator` | SaveStatus; SavedNotification | [Example](../tests/react/consumer/catalog-cases.tsx#L106) |
227
+ | code-block | `@panphora/bevel/react/code-block` | CodeBlock (Root, Code, Copy, Wrap, Feedback, Header, Name, Language, Meta) | [Example](../tests/react/consumer/catalog-cases.tsx#L108) |
228
+ | code-editor | `@panphora/bevel/react/code-editor` | CodeEditor (Root, Tab, Name, Host, Dirty, Spacer, Toolbar, Tool, Save, Surface, Status, Meta, KeyboardBar, BarTools). CodeMirror 6 and its grammars are optional peers, so this entry is not re-exported from `@panphora/bevel/react` and a consumer that never opens it pays nothing. Give the root a definite height. | [Example](../tests/react/consumer/catalog-cases.tsx#L107) |
229
+ | diff-view | `@panphora/bevel/react/diff-view` | DiffView (Root, Body, Line, Count, Layout, Hunk, Header, Controls, Footer) | [Example](../tests/react/consumer/catalog-cases.tsx#L109) |
230
+ | activity-feed | `@panphora/bevel/react/activity-feed` | ActivityFeed (Root, Groups, More, Day, List, Item, Head, Detail, Avatar) | [Example](../tests/react/consumer/catalog-cases.tsx#L110) |
231
+ | stat-tiles | `@panphora/bevel/react/stat-tiles` | StatTile (Root, Label, Value, Delta, Spark, Description); StatTiles | [Example](../tests/react/consumer/catalog-cases.tsx#L111) |
232
+ | avatar-group | `@panphora/bevel/react/avatar-group` | Avatar (Root, Image, Fallback); AvatarGroup (Root, Group, Stack, Person, Members, Directory, Member, OverflowTrigger, Popup, Presence) | [Example](../tests/react/consumer/catalog-cases.tsx#L112) |
233
+ | small-charts | `@panphora/bevel/react/small-charts` | SeriesToggle; SmallChart (Root, Plot, DataTable, SeriesToggle, Header, Legend, Total) | [Example](../tests/react/consumer/catalog-cases.tsx#L113) |
234
+ | filter-builder | `@panphora/bevel/react/filter-builder` | FilterBuilder (Root, Rules, Match, Edit, Add, Apply, Cancel, Heading, Actions) | [Example](../tests/react/consumer/catalog-cases.tsx#L114) |
235
+ | column-manager | `@panphora/bevel/react/column-manager` | ColumnManager (Root, List, Summary, ResizeHandle, Heading, Footer); ColumnResizeHandle | [Example](../tests/react/consumer/catalog-cases.tsx#L115) |
236
+ | editable-grid-cells | `@panphora/bevel/react/editable-grid-cells` | EditableCell (Root, Value, Editor, Error) | [Example](../tests/react/consumer/catalog-cases.tsx#L116) |
237
+ | split-panes | `@panphora/bevel/react/split-panes` | SplitPanes (Root, Pane, Handle, Caption, Item) | [Example](../tests/react/consumer/catalog-cases.tsx#L117) |
238
+ | rich-text-toolbar | `@panphora/bevel/react/rich-text-toolbar` | RichTextToolbar (Root, Command, Commands, BlockMenu, Group, Separator) | [Example](../tests/react/consumer/catalog-cases.tsx#L118) |
239
+ | kanban-board | `@panphora/bevel/react/kanban-board` | KanbanBoard (Root, Columns, Column, ColumnHead, List, Card, DragHandle, Search, Filter, DateFilter, Create, Inspector, Move, Checklist, Editor, Work, Toolbar, CardTitle, CardDescription, Labels, Label, Due, Priority, Footer) | [Example](../tests/react/consumer/catalog-cases.tsx#L119) |
240
+ | files-table | `@panphora/bevel/react/files-table` | FilesTable (Root, Table, Tool, Pill, Avatar, Kind, DropHint, More, Footer, Spacer, Blank, BlankTile, BlankTitle, BlankText) | [Example](../tests/react/consumer/catalog-cases.tsx#L120) |
241
+ | file-tree | `@panphora/bevel/react/file-tree` | FileTree, useFileTree, fileTreeOptions, useFileTreeOutsideDrop, UPLOAD_MARK, fileTreeIcons, fileTreeSpriteSheet, fileTreeUnsafeCSS. Needs the optional peer `@pierre/trees`. `useFileTree` freezes its options at mount, so a later change to them is ignored; mutate the model instead. `sort` and `presorted` are rejected by the type and stripped at runtime, because a comparator makes pierre restore expansion on the wrong row. Uploads are the paths carrying `UPLOAD_MARK` on the leaf. | [Example](../tests/react/consumer/catalog-cases.tsx#L121) |
242
+ | bulk-bar | `@panphora/bevel/react/bulk-bar` | BulkBar (Root, Count, Action, Rule, Clear) | [Example](../tests/react/consumer/catalog-cases.tsx#L122) |
243
+
244
+ Additional entries are `layout` (Page, Section, AppShell, AppContent, ScrollContainer, Measure, VisuallyHidden, ScrollArea), `documents` (DocumentCard, DocumentPanel, DocumentRow), `popover` and `alert-dialog`. They have cases in the same consumer. Convenience aliases are `modal`, `number`, `toggle`, `tooltip`, `popover-menu` and `toast-stack`.
package/src/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Editing Bevel
2
+
3
+ Edit component sources here, then run `npm run build`. The public `bevel.js`, `bevel.css`, root `index.html` and component example pages are generated. Consumers still use one classic script and one stylesheet without a build step.
4
+
5
+ ## Work on one component
6
+
7
+ ```sh
8
+ npm run preview -- pagination
9
+ ```
10
+
11
+ This builds the outputs, prints that component's source files and tests, serves its individual page on port 7383, and rebuilds when sources change. Refresh the page after a rebuild. Ctrl+C closes the watcher and server. `PORT=7384 npm run preview -- modal` uses another port. Run `npm run examples:peers` first when working on optional editor, crop or CMS examples. `npm run dev` prepares those peers and serves the whole showcase.
12
+
13
+ ```sh
14
+ npm run build
15
+ npm run build:check
16
+ BEVEL_ONLY=pagination npm run acceptance:layout
17
+ ```
18
+
19
+ The focused layout check runs eight viewport, theme and zoom cases for that component. Its report has a separate output folder, so it cannot overwrite the full acceptance report. Component behavior tests are listed in the manifest and printed by the preview command.
20
+
21
+ ## Source map
22
+
23
+ | Source | Purpose |
24
+ | --- | --- |
25
+ | `components/<name>/example.html` | Shared markup for the standalone example and combined showcase |
26
+ | `components/<name>/style.css` | Component CSS, in explicitly ordered fragments |
27
+ | `components/<name>/behavior.js` | Component runtime definitions and handlers, where needed |
28
+ | `components/<name>/demo.js` | Application glue scoped to the example root |
29
+ | `components/<name>/page.json` | Standalone head, body attributes and dependency scripts |
30
+ | `components/<name>/docs.html` | Existing basic-control documentation and examples |
31
+ | `components/context-*/` | Complete optional-peer applications, linked from the showcase |
32
+ | `runtime/` | Shared stores, lifecycle, overlay handling, state mirroring and public API |
33
+ | `base/` and `shared/` | Tokens, layer framing and shared component styles |
34
+ | `docs/page.html` and `docs/showcase.css` | Documentation shell and showcase layout |
35
+ | `templates/standalone.html` | Common standalone document structure |
36
+
37
+ `examples/components/manifest.json` is authored metadata. Its component array determines showcase order and records sources, tests and public URLs. Its `build.javascript` and `build.stylesheet` arrays determine exact assembly order. The `css` and `js` fields identify component-owned files; shared rules and lifecycle code remain in the shared folders. Some visual components use only shared runtime behavior and need no private behavior file.
38
+
39
+ The output map is available programmatically from `outputs()` in `scripts/build.mjs`. Supplemental pages, context assets and example-only styles are also declared in the manifest. Preserved design references are historical inputs, not an alternate source of current components.
40
+
41
+ ## Ordered fragments
42
+
43
+ The build preserves the original runtime closure, event order and CSS cascade. Source files contain numbered fragments because declarations and later overrides sometimes occupy different positions in those outputs. Edit inside the relevant markers. Do not move, renumber or add fragments without updating the explicit build order.
44
+
45
+ ```js
46
+ // @fragment 1
47
+ function example() {}
48
+ // @endfragment
49
+ ```
50
+
51
+ ```css
52
+ /* @fragment 1 */
53
+ .bevel-example { display: block; }
54
+ /* @endfragment */
55
+ ```
56
+
57
+ A fragment can contain part of an enclosing runtime or CSS block. These files are assembly inputs, not independent ESM modules or standalone stylesheets. `base/layers-and-tokens/style.css` opens the component layer; the framing and machine fragments close it and retain the unlayered rules. The JS prelude and boot fragments retain the single private IIFE. The checker rejects missing, repeated or unreferenced fragments and nonempty content outside markers in listed files.
58
+
59
+ Shared runtime helpers such as `emit`, `change`, `openOverlay`, `closeOverlay` and `refresh` remain in the same closure. Search their definitions in `runtime/` before changing component calls. A component may also call another component's helper, particularly grids and pickers. This extraction deliberately retains those existing relationships; it does not promise independent component bundles. A static identifier census across the 25 new components with private behavior found a median of 4 references to shared runtime bindings, ranging from 0 to 11. This lexical count is a context estimate, not a resolved dependency graph.
60
+
61
+ ## Composing examples
62
+
63
+ Use globally unique authored IDs. Scope demo queries and listeners to the supplied `host`; global `document.querySelector('tbody')` would bind to another example in the combined page. A demo file exports no module: it contains a function expression receiving `(host, {standalone, assetRoot, ready})`. `ready(callback)` runs once the DOM is ready. Use `standalone` to avoid automatically opening toast stacks in the full showcase.
64
+
65
+ Use `{{assetRoot}}` for markup URLs relative to the repository root. The build supplies an empty prefix for the showcase and `../../` for standalone component pages. For assets under `examples/`, use `{{examplesRoot}}`, which preserves the original standalone `../fixtures/` paths and becomes `examples/` in the showcase. The build does not rewrite arbitrary JavaScript or generate IDs. `<!-- include: src/components/button/docs.html -->` includes an authored documentation fragment into the shell.
66
+
67
+ Upload and inline editing have `showcase: "static"`: their inert previews link to fully functional standalone pages. The rich-text toolbar is live in both pages. Its manifest `showcaseScripts` supplies local classic scripts, deduplicated and loaded after Bevel before demo initialization. The main page requires no module loader or remote CDN.
68
+
69
+ `vendor/richclay/` contains the hash-verified Richclay distribution already used by the integration fixtures, including Squire, DOMPurify, provenance and licenses. These dependencies are loaded by the showcase, not by the Bevel runtime. Keep that directory's files consistent with its provenance when updating it. The standalone example still supports consumer-supplied peers.
70
+
71
+ Small mode-specific markup belongs in manifest `partials`, with `standalone` and `showcase` source paths, not a second complete example. The avatar standalone retains its intentional missing-image fixture; the showcase uses the rendered initials fallback directly.
72
+
73
+ ## Verification
74
+
75
+ `npm run check` includes output freshness, CSS rules, ID uniqueness and label/control/description references. `npm run test:build` verifies determinism, unchanged output mtimes on a no-op build, stale detection and fragment ownership. `npm run test:showcase` exercises composed interactions and layout, including the file protocol. `npm test` runs these plus the existing component, snapshot, Datastar, integration, packaging and layout suites in sequence.
76
+
77
+ Generated files stay checked in. `npm pack` verifies freshness without rebuilding stale outputs silently. Never edit generated files to repair a failing check; change their sources and rebuild.
78
+
79
+ ## React sources
80
+
81
+ React implementations live in `react/components/`, with shared pure models in `react/models/`, optional adapters in `react/integrations/` and context recipes in `react/recipes/`. They never import the classic IIFE fragments. `react/styles/source-map.json` records classic CSS ownership; the React build projects the assembled design into the separate `bevel-r-` namespace, then applies the Base UI state adapters. Functional layout remains separate from the optional theme.
82
+
83
+ `npm run build` builds both output sets. `npm run build:react` rebuilds only ESM, declarations and React CSS. `npm run test:react` executes Jest behavior/model tests; `npm run test:react:catalog` verifies the 66 families, 123 source directories and fixture registry. `npm run test:react:package` tests an actual tarball with isolated consumers. `npm run test:react:browser` exercises that packaged consumer; `node tests/react/optional-browser.mjs` adds real supplied peer checks. `npm run dev:react` opens a local server for the same plain and themed consumer pages.
@@ -0,0 +1,10 @@
1
+ // Datastar v1.0.3
2
+ var W="datastar-fetch",be="datastar-prop-change",At="datastar-ready",et="datastar-scope-children",re="datastar-signal-patch",p=document,J=HTMLInputElement,R=MutationObserver;var wt="data-nonce",Mt=p.documentElement,tt=Mt.getAttribute(wt),nt=tt!==null,ve;if(nt){if(!tt)throw new Error("Datastar CSP requires a nonempty html data-nonce.");Mt.removeAttribute(wt),ve=window.trustedTypes?.createPolicy("datastar",{createHTML:e=>e,createScript:e=>e})}var Ee=(e,t)=>{nt&&(e.nonce=tt),e.text=ve?ve.createScript(t):t},rt=e=>ve?ve.createHTML(e):e,Rt=new Map,_e=(e,t)=>{if(!nt)return Function(...e,t);let n=`function(${e.join(",")}){${t}
3
+ }`,r=Rt.get(n);if(r)return r;let s=p.createElement("script");Ee(s,`document.currentScript.x=${n}`),p.head.appendChild(s),s.remove();let i=s.x;if(!i)throw new Error("CSP blocked Datastar expression compilation.");return Rt.set(n,i),i};var N=Object.hasOwn??Object.prototype.hasOwnProperty.call;var Y=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),xt=e=>{for(let t in e)if(N(e,t))return!1;return!0},se=(e,t)=>{for(let n in e){let r=e[n];Y(r)||Array.isArray(r)?se(r,t):e[n]=t(r)}},He=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,c)=>a[c]??={},t);o[i]=r}return t};var ke=[],st=[],Ge=0,De=0,it=0,Se,K,Ie=0,O=()=>{Ge++},P=()=>{--Ge||(Nt(),X())},F=e=>{Se={t:K,u:Se},K=e},_=()=>{K=Se?.t,Se=Se?.u},Te=e=>yn.bind(0,{g:e,t:e,e:1}),ot=Symbol("computed"),je=e=>{let t=bn.bind(0,{e:17,h:e});return t[ot]=1,t},T=e=>{let t={T:e,e:2};K&&ct(t,K),F(t),O();try{t.T()}finally{P(),_()}return _t.bind(0,t)},Nt=()=>{for(;De<it;){let e=st[De];st[De++]=void 0,Ft(e,e.e&=-65)}De=0,it=0},Lt=e=>"h"in e?Ot(e):Pt(e,e.t),Ot=e=>{F(e),Ht(e);try{let t=e.t;return t!==(e.t=e.h(t))}finally{_(),kt(e)}},Pt=(e,t)=>(e.e=1,e.g!==(e.g=t)),at=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?at(n.c):st[it++]=e}},Ft=(e,t)=>{if(t&16||t&32&&Dt(e.s,e)){F(e),Ht(e),O();try{e.T()}finally{P(),_(),kt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.p,s=r.e;s&64&&Ft(r,r.e=s&-65),n=n.i}},yn=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(vn(r),Ge||Nt()),!0}return!1}let n=e.t;if(e.e&16&&Pt(e,n)){let r=e.r;r&&qe(r)}return K&&ct(e,K),n},bn=e=>{let t=e.e;if(t&16||t&32&&Dt(e.s,e)){if(Ot(e)){let n=e.r;n&&qe(n)}}else t&32&&(e.e=t&-33);return K&&ct(e,K),e.t},_t=e=>{let t=e.s;for(;t;)t=$e(t,e);let n=e.r;n&&$e(n),e.e=0},ct=(e,t)=>{let n=t.l;if(n&&n.p===e)return;let r=n?n.i:t.s;if(r&&r.p===e){r.S=Ie,t.l=r;return}let s=e.A;if(s&&s.S===Ie&&s.c===t)return;let i=t.l=e.A={S:Ie,p:e,c:t,d:n,i:r,y:s};r&&(r.d=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},$e=(e,t=e.c)=>{let n=e.p,r=e.d,s=e.i,i=e.n,o=e.y;if(s?s.d=r:t.l=r,r?r.i=s:t.s=s,i?i.y=o:n.A=o,o)o.n=i;else if(!(n.r=i))if("h"in n){let a=n.s;if(a){n.e=17;do a=$e(a,n);while(a)}}else"g"in n||_t(n);return s},vn=e=>{let t=e.n,n;e:for(;;){let r=e.c,s=r.e;if(s&60?s&12?s&4?!(s&48)&&En(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&at(r),s&1){let i=r.r;if(i){let o=(e=i).n;o&&(n={t,u:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.u,e){t=e.n;continue e}break}},Ht=e=>{Ie++,e.l=void 0,e.e=e.e&-57|4},kt=e=>{let t=e.l,n=t?t.i:e.s;for(;n;)n=$e(n,e);e.e&=-5},Dt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.p,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(Lt(i)){let a=i.r;a.n&&qe(a),s=!0}}else if((o&33)===33){(e.n||e.y)&&(n={t:e,u:n}),e=i.s,t=i,++r;continue}if(!s){let a=e.i;if(a){e=a;continue}}for(;r--;){let a=t.r,c=a.n;if(c?(e=n.t,n=n.u):e=a,s){if(Lt(t)){c&&qe(a),t=e.c;continue}s=!1}else t.e&=-33;if(t=e.c,e.i){e=e.i;continue e}}return s}},qe=e=>{do{let t=e.c,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&at(t))}while(e=e.n)},En=(e,t)=>{let n=t.l;for(;n;){if(n===e)return!0;n=n.d}return!1},oe=e=>{let t=ie,n=e.split(".");for(let r of n){if(t==null||!N(t,r))return;t=t[r]}return t},Ve=(e,t="")=>{let n=Array.isArray(e);if(n||Y(e)){let r=n?[]:{};for(let i in e)r[i]=Te(Ve(e[i],`${t+i}.`));let s=Te(0);return new Proxy(r,{get(i,o){if(!(o==="toJSON"&&!N(r,o)))return n&&o in Array.prototype?(s(),r[o]):typeof o=="symbol"?r[o]:((!N(r,o)||r[o]()==null)&&(r[o]=Te(""),X(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let c=t+o;if(n&&o==="length"){let l=r[o]-a;if(r[o]=a,l>0){let f={};for(let u=a;u<r[o];u++)f[u]=null;X(t.slice(0,-1),f),s(s()+1)}}else if(N(r,o))if(a==null)delete r[o];else if(N(a,ot))r[o]=a,X(c,"");else{let l=r[o](),f=`${c}.`;if(Y(l)&&Y(a)){for(let u in l)N(a,u)||(delete l[u],X(f+u,null));for(let u in a){let g=a[u];l[u]!==g&&(l[u]=g)}}else r[o](Ve(a,f))&&X(c,a)}else a!=null&&(N(a,ot)?(r[o]=a,X(c,"")):(r[o]=Te(Ve(a,`${c}.`)),X(c,a)),s(s()+1));return!0},deleteProperty(i,o){return delete r[o],s(s()+1),!0},ownKeys(){return s(),Reflect.ownKeys(r)},has(i,o){return s(),o in r}})}return e},X=(e,t)=>{if(e!==void 0&&t!==void 0&&ke.push([e,t]),!Ge&&ke.length){let n=He(ke);ke.length=0,p.dispatchEvent(new CustomEvent(re,{detail:n}))}},I=(e,{ifMissing:t}={})=>{O();for(let n in e)e[n]==null?t||delete ie[n]:It(e[n],n,ie,"",t);P()},S=(e,t)=>I(He(e),t),It=(e,t,n,r,s)=>{if(Y(e)){N(n,t)&&(Y(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:It(e[i],i,n[t],`${r+t}.`,s)}else s&&N(n,t)||(n[t]=e)},Ct=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,G=({include:e=/.*/,exclude:t=/(?!)/}={},n=ie)=>{let r=Ct(e),s=Ct(t),i=[],o=[[n,""]];for(;o.length;){let[a,c]=o.pop();for(let l in a){let f=c+l;Y(a[l])?o.push([a[l],`${f}.`]):r.test(f)&&!s.test(f)&&i.push([f,oe(f)])}}return He(i)},ie=Ve({});var ee=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ue=e=>e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([a-z])([0-9]+)/gi,"$1-$2").replace(/([0-9]+)([a-z])/gi,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase(),$t=e=>ue(e).replace(/-./g,t=>t[1].toUpperCase()),qt=e=>ue(e).replace(/-/g,"_");var Be=e=>typeof e=="string"&&e.trim()==="true",Tn=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,Vt=e=>_e([],`return (${e})`)(),pe=(e,t={})=>{let{reviveFunctionStrings:n=!1}=t;try{return n?JSON.parse(e,(r,s)=>{if(typeof s!="string")return s;let i=s.trim();if(!Tn.test(i))return s;try{let o=Vt(i);return typeof o=="function"?o:s}catch{return s}}):JSON.parse(e)}catch{return Vt(e)}},Gt={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Gt.camel(e.slice(1))},H=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Gt[r]?.(e)||e;return e},z=e=>`data-${e}`,lt=e=>e;var Sn="https://data-star.dev/errors",Ae=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=qt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t}
4
+ More info: ${Sn}/${s}?${i}
5
+ Context: ${o}`,r},Re=new Map,ft=new Map,Wt=new Map,Jt=new Proxy({},{get:(e,t)=>Re.get(t)?.apply,has:(e,t)=>Re.has(t),ownKeys:()=>Reflect.ownKeys(Re),set:()=>!1,deleteProperty:()=>!1}),Me=new Map,Ue=[],ut=new Set,we=new Set,jt=!1,m=e=>{Ue.push(e),Ue.length===1&&setTimeout(()=>{for(let n of Ue)ut.add(n.name),ft.set(n.name,n);Ue.length=0;let t=we.size?[...we]:[p.documentElement];for(let n of t)Cn(n,!we.has(n));ut.clear()})},V=e=>{Re.set(e.name,e)};p.addEventListener(W,(e=>{let t=Wt.get(e.detail.type);t&&t.apply({error:Ae.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)}));var xe=e=>{Wt.set(e.name,e)},Bt=e=>{for(let t of e){let n=Me.get(t);if(n&&Me.delete(t))for(let r of n.values())for(let s of r.values())s()}},Kt=z("ignore"),An=`[${Kt}]`,zt=e=>e.hasAttribute(`${Kt}__self`)||!!e.closest(An),We=(e,t)=>{for(let n of e)if(!zt(n)){let r=new Set;for(let s in n.dataset){let i=s.replace(/[A-Z]/g,"-$&").toLowerCase();r.add(i),pt(n,i,n.dataset[s],t)}for(let s of Array.from(n.attributes)){if(!s.name.startsWith("data-"))continue;let i=s.name.slice(5);r.has(i)||pt(n,i,s.value,t)}}},Rn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)ee(o)&&(Bt([o]),Bt(o.querySelectorAll("*")));for(let o of s)ee(o)&&(We([o]),We(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&ee(t)&&!zt(t)){let o=r.slice(5),a=lt(o);if(!a)continue;let c=t.getAttribute(r);if(c===null){let l=Me.get(t);if(l){let f=l.get(a);if(f){for(let u of f.values())u();l.delete(a)}}}else pt(t,o,c)}},wn=new R(Rn),Mn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...c]=o.split(".");i.set(a,new Set(c))}return{pluginName:r,key:s,mods:i}},xn=()=>we.has(p.documentElement),Ln=()=>{jt||!xn()||(jt=!0,p.dispatchEvent(new Event(At)))},Cn=(e=p.documentElement,t=!0)=>{ee(e)&&We([e],!0),We(e.querySelectorAll("*"),!0),t&&(wn.observe(e,{subtree:!0,childList:!0,attributes:!0}),we.add(e),Ln())};var pt=(e,t,n,r)=>{let s=lt(t);if(!s)return;let{pluginName:i,key:o,mods:a}=Mn(s),c=ft.get(i);if((!r||ut.has(i))&&!!c){let f={el:e,rawKey:s,mods:a,error:Ae.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(Re.keys()),attributes:new Set(ft.keys())},rx:void 0},u=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",g=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",w=o!=null&&o!=="",y=n!=null&&n!=="";if(w){if(u==="denied")throw f.error("KeyNotAllowed")}else if(u==="must")throw f.error("KeyRequired");if(y){if(g==="denied")throw f.error("ValueNotAllowed")}else if(g==="must")throw f.error("ValueRequired");if(u==="exclusive"||g==="exclusive"){if(w&&y)throw f.error("KeyAndValueProvided");if(!w&&!y)throw f.error("KeyOrValueRequired")}let A=new Map;if(y){let M;f.rx=(...k)=>(M||(M=Nn(n,{R:c.returnsValue,w:c.argNames,M:A})),M(e,...k))}let d=c.apply(f);d&&A.set("attribute",d);let h=Me.get(e);if(h){let M=h.get(s);if(M)for(let k of M.values())k()}else h=new Map,Me.set(e,h);h.set(s,A)}},Ut=e=>e.split(".").reduce((t,n)=>`${t}['${n}']`,"$"),Nn=(e,{R:t=!1,w:n=[],M:r=new Map}={})=>{let s="";if(t){let i=/(?:\/(?:\\\/|[^/])*\/|"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|`(?:\\`|[^`])*`|\(\s*(?:(?:function)\s*\(\s*\)|(?:\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,o=e.trim().match(i);if(o){let a=o.length-1,c=o[a].trim();c.startsWith("return")||(o[a]=`return (${c});`),s=o.join(`;
6
+ `)}}else s=e.trim();s=s.replace(/(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\$]*(?:(?:\\.|\$(?!\{))[^`\\$]*)*`)|\$\{([^{}]*)\}|\$(\w+(?:[.-]\w+)*)/g,(i,o,a)=>o===void 0&&a===void 0?i:o!==void 0?`\${${o.replace(/\$(\w+(?:[.-]\w+)*)/g,(c,l)=>Ut(l))}}`:Ut(a)),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');try{let i=_e(["el","$","__action","evt",...n],s);return(o,...a)=>{let c=(l,f,...u)=>{let g=Ae.bind(0,{plugin:{type:"action",name:l},element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e}}),w=Jt[l];if(w)return w({el:o,evt:f,error:g,cleanups:r},...u);throw g("UndefinedAction")};try{return i(o,ie,c,void 0,...a)}catch(l){throw console.error(l),Ae({element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e},error:l.message},"ExecuteExpression")}}}catch(i){throw console.error(i),Ae({expression:{fnContent:s,value:e},error:i.message},"GenerateExpression")}};V({name:"peek",apply(e,t){F();try{return t()}finally{_()}}});V({name:"setAll",apply(e,t,n){F();let r=G(n);se(r,()=>t),I(r),_()}});V({name:"toggleAll",apply(e,t){F();let n=G(t);se(n,r=>!r),I(n),_()}});var Qt=new Map,dt=e=>!["GET","DELETE"].includes(e),Le=(e,t,n=!0)=>V({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:c,headers:l,contentType:f="json",filterSignals:{include:u=/.*/,exclude:g=/(^|\.)_/}={},openWhenHidden:w=n,payload:y,requestCancellation:A="auto",retry:d="auto",retryInterval:h=1e3,retryScaler:M=2,retryMaxWait:k=3e4,retryMaxCount:le=10}={})=>{let L=A instanceof AbortController?A:new AbortController,q=`@${e}`;if(A==="auto"||A==="cleanup"){let B=Qt.get(t)??new Map;B.get(a)?.abort(),B.set(a,L),Qt.set(t,B)}A==="cleanup"&&(o.get(q)?.(),o.set(q,async()=>{L.abort(),await Promise.resolve()}));let j=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:V});let B={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};f==="json"&&dt(t)&&(B["Content-Type"]="application/json"),Object.assign(B,l);let Q={b:"",method:t,headers:B,L:w,v:d,C:h,N:M,O:k,P:le,signal:L.signal,F:async v=>{v.status>=400&&ae(On,r,{status:v.status.toString()})},_:v=>{if(!v.E.startsWith("datastar"))return;let Z=v.E,b={};for(let x of v.m.split(`
7
+ `)){let C=x.indexOf(" "),fe=x.slice(0,C),D=x.slice(C+1);(b[fe]||=[]).push(D)}let E=Object.fromEntries(Object.entries(b).map(([x,C])=>[x,C.join(`
8
+ `)]));ae(Z,r,E)},onerror:v=>{if(Zt(v))throw i("FetchExpectedTextEventStream",{url:a})}},Oe=()=>{let v=new URL(a,p.baseURI),Z=new URLSearchParams(v.search);if(f==="json"){F();let b=y!==void 0?y:G({include:u,exclude:g});_();let E=JSON.stringify(b);dt(t)?Q.body=E:Z.set("datastar",E)}else if(f==="form"){let b=c?p.querySelector(c):r.closest("form");if(!b)throw i("FetchFormNotFound",{action:V,selector:c});if(!b.noValidate&&!b.checkValidity()){b.reportValidity();return}let E=new FormData(b),x=r;if(r===b&&s instanceof SubmitEvent)x=s.submitter;else{let D=he=>he.preventDefault();b.addEventListener("submit",D),j=()=>{b.removeEventListener("submit",D)}}if(x instanceof HTMLButtonElement||x instanceof J&&x.type==="submit"){let D=x.getAttribute("name");D&&E.append(D,x.value)}let C=b.getAttribute("enctype")==="multipart/form-data";C||(B["Content-Type"]="application/x-www-form-urlencoded");let fe=new URLSearchParams(E);if(dt(t))Q.body=C?E:fe;else for(let[D,he]of fe)Z.append(D,he)}else throw i("FetchInvalidContentType",{action:V,contentType:f});return v.search=Z.toString(),Q.b=v.toString(),Q};ae(mt,r,{});try{await Dn(r,Oe)}catch(v){if(!Zt(v))throw i("FetchFailed",{method:t,url:a,error:v.message})}}finally{ae(gt,r,{}),j(),o.delete(q)}}});Le("get","GET",!1);Le("patch","PATCH");Le("post","POST");Le("put","PUT");Le("delete","DELETE");var mt="started",gt="finished",On="error",Pn="retrying",Fn="retries-failed",ae=(e,t,n)=>p.dispatchEvent(new CustomEvent(W,{detail:{type:e,el:t,argsRaw:n}})),Zt=e=>`${e}`.includes("text/event-stream"),_n=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},Hn=e=>{let t,n,r,s=!1;return i=>{if(!t)t=i,n=0,r=-1;else{let c=new Uint8Array(t.length+i.length);c.set(t),c.set(i,t.length),t=c}let o=t.length,a=0;for(;n<o;){s&&(t[n]===10&&(a=++n),s=!1);let c=-1;for(;n<o&&c===-1;++n)switch(t[n]){case 58:r===-1&&(r=n-a);break;case 13:s=!0;case 10:c=n;break}if(c===-1)break;e(t.subarray(a,c),r),a=n,r=-1}a===o?t=void 0:a&&(t=t.subarray(a),n-=a)}},kn=(e,t,n)=>{let r=Yt(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=Yt();else if(o>0){let a=s.decode(i.subarray(0,o)),c=o+(i[o+1]===32?2:1),l=s.decode(i.subarray(c));switch(a){case"data":r.m=r.m?`${r.m}
9
+ ${l}`:l;break;case"event":r.E=l;break;case"id":e(r.H=l);break;case"retry":{let f=+l;Number.isNaN(f)||t(r.v=f);break}}}}},Yt=()=>({m:"",E:"",H:"",v:void 0}),Dn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{b:i,signal:o,headers:a,F:c,_:l,L:f,v:u,C:g,N:w,O:y,P:A,$:d,...h}=s,M={...a},k,le=()=>{let b=t();b&&(i=b.b,h.body=b.body,Z())},L=()=>{k.abort(),p.hidden||le()};f||p.addEventListener("visibilitychange",L);let q,j=()=>{p.removeEventListener("visibilitychange",L),clearTimeout(q),k.abort()};o.addEventListener("abort",()=>{j(),n()});let B=c,Q=0,Oe=g,v=()=>{Q<A?(ae(Pn,e,{}),clearTimeout(q),q=setTimeout(le,g),Q++,g=Math.min(g*w,y)):(ae(Fn,e,{}),j(),r("Max retries reached."))},Z=async()=>{k=new AbortController;let b=k.signal;try{let E=await fetch(i,{...h,headers:M,signal:b});await B(E);let x=async(U,ye,Qe,Pe,...Ze)=>{let St={[Qe]:await ye.text()};for(let Ye of Ze){let Xe=ye.headers.get(`datastar-${ue(Ye)}`);if(Pe){let Fe=Pe[Ye];Fe&&(Xe=typeof Fe=="string"?Fe:JSON.stringify(Fe))}Xe&&(St[Ye]=Xe)}ae(U,e,St),j(),n()},C=E.status,fe=C===204,D=C>=300&&C<400,he=C>=400&&C<600;if(C!==200){if(u!=="never"&&!fe&&!D&&(u==="always"||u==="error"&&he)){v();return}j(),n();return}Q=0,g=Oe;let ze=E.headers.get("Content-Type");if(ze?.includes("text/html"))return await x("datastar-patch-elements",E,"elements",d,"selector","mode","namespace","useViewTransition");if(ze?.includes("application/json"))return await x("datastar-patch-signals",E,"signals",d,"onlyIfMissing");if(ze?.includes("text/javascript")){let U=p.createElement("script"),ye=E.headers.get("datastar-script-attributes");if(ye)for(let[Pe,Ze]of Object.entries(JSON.parse(ye)))U.setAttribute(Pe,Ze);let Qe=await E.text();Ee(U,Qe),p.head.appendChild(U),j();return}if(await _n(E.body,Hn(kn(U=>{U?M["last-event-id"]=U:delete M["last-event-id"]},U=>{Oe=g=U},l))),u==="always"&&!D){v();return}j(),n()}catch{if(!b.aborted)try{v()}catch(E){j(),r(E)}}};Z()});m({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,c)=>{c===""||c===!0?e.setAttribute(a,""):c===!1||c==null?e.removeAttribute(a):typeof c=="string"?e.setAttribute(a,c):typeof c=="function"?e.setAttribute(a,c.toString()):e.setAttribute(a,JSON.stringify(c,(l,f)=>typeof f=="function"?f.toString():f))},s=t?()=>{i.disconnect();let a=n();r(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),c=Object.keys(a);for(let l of c)r(l,a[l]);i.observe(e,{attributeFilter:c})},i=new R(s),o=T(s);return()=>{i.disconnect(),o()}}});var Je=(e,...t)=>({a:n=>n[e],f:(n,r)=>{n[e]=r},o:t}),Xt=(e,...t)=>({a:n=>n.getAttribute(e),f:(n,r)=>{n.setAttribute(e,`${r}`)},o:t}),en=(e=!1,...t)=>({a:(n,r)=>r==="string"||e&&r==="undefined"?n.value:+n.value,f:(n,r)=>{n.value=`${r}`},o:t}),In=()=>{let e=new Set;return{a:(t,n)=>t.multiple?[...t.selectedOptions].map(r=>e.has(r.value)?+r.value:r.value):n==="string"||n==="undefined"?t.value:+t.value,f:(t,n)=>{if(!t.multiple){t.value=`${n}`;return}for(let r of t.options)n.includes(r.value)?(e.delete(r.value),r.selected=!0):n.includes(+r.value)?(e.add(r.value),r.selected=!0):r.selected=!1},o:["change"]}},Vn=/^data:(?<mime>[^;]+);base64,(?<contents>.*)$/,tn=Symbol("empty"),nn=(e,t,n,r,s,i)=>{let o=z(CSS.escape(n)),a=t?`[${o}]`:`[${o}="${CSS.escape(r)}"]`;if(i===void 0&&e instanceof J&&e.type==="radio"){let u=[...p.querySelectorAll(a)].find(g=>g instanceof J&&g.checked);u&&S([[r,u.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return S([[r,s.a(e,typeof i)]],{ifMissing:!0}),r;let c=p.querySelectorAll(a),l=[],f=0;for(let u of c){if(l.push([`${r}.${f}`,s.a(u,typeof(N(i,f)?i[f]:void 0))]),e===u)break;f++}return S(l,{ifMissing:!0}),`${r}.${f}`};m({name:"bind",requirement:"exclusive",apply({el:e,key:t,rawKey:n,mods:r,value:s,error:i}){let o=t!=null?H(t,r):s,a=r.get("prop"),c=r.get("event"),l=null;if(e instanceof J)switch(e.type){case"range":case"number":l=en(!1,"input");break;case"checkbox":l={a:(d,h)=>d.value!=="on"?h==="boolean"?d.checked:d.checked?d.value:"":h==="string"?d.checked?d.value:"":d.checked,f:(d,h)=>{d.checked=typeof h=="string"?h===d.value:h},o:["input"]};break;case"radio":e.getAttribute("name")?.length||e.setAttribute("name",o),l={a:(d,h)=>d.checked?h==="number"?+d.value:d.value:tn,f:(d,h)=>{d.checked=h===(typeof h=="number"?+d.value:d.value)},o:["input"]};break;case"file":{let d=()=>{let h=[...e.files||[]],M=[];Promise.all(h.map(k=>new Promise(le=>{let L=new FileReader;L.onload=()=>{if(typeof L.result!="string")throw i("InvalidFileResultType",{resultType:typeof L.result});let q=L.result.match(Vn);if(!q?.groups)throw i("InvalidDataUri",{result:L.result});M.push({name:k.name,contents:q.groups.contents,mime:q.groups.mime})},L.onloadend=()=>le(),L.readAsDataURL(k)}))).then(()=>{S([[o,M]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:l=en(!0,"input")}else e instanceof HTMLSelectElement?l=In():e instanceof HTMLTextAreaElement?l=Je("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?l="value"in e?Je("value","input","change"):Xt("value","input","change"):e instanceof HTMLElement&&"value"in e?l=Je("value","change"):l=Xt("value","change");if(!l)throw i("InvalidBindAdapter");let f=a&&[...a][0];if(a&&!f)throw i("BindPropNameMissing");if(f){let d=$t(f);l=Je(d,...c?[...c]:l.o)}else c&&(l.o=[...c]);let u=nn(e,t,n,o,l,oe(o)),g=()=>{let d=oe(u);if(d!=null){let h=l.a(e,typeof d);h!==tn&&S([[u,h]])}},w=()=>{l.f(e,oe(u))};for(let d of l.o)e.addEventListener(d,g);e.addEventListener(be,g);let y=T(w),A=e instanceof HTMLSelectElement?new R(()=>{y(),u=nn(e,t,n,o,l,oe(o)),y=T(w)}):null;return A?.observe(e,{attributeFilter:["multiple"]}),()=>{A?.disconnect(),y();for(let d of l.o)e.removeEventListener(d,g);e.removeEventListener(be,g)}}});m({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=H(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let c in s){let l=c.split(/\s+/).filter(f=>f.length>0);if(s[c])for(let f of l)t.classList.contains(f)||t.classList.add(f);else for(let f of l)t.classList.contains(f)&&t.classList.remove(f)}o.observe(t,{attributeFilter:["class"]})},o=new R(i),a=T(i);return()=>{o.disconnect(),a();for(let c in s){let l=c.split(/\s+/).filter(f=>f.length>0);for(let f of l)t.classList.remove(f)}}}});m({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)S([[H(e,t),je(n)]]);else{let s=Object.assign({},n());se(s,i=>{if(typeof i=="function")return je(i);throw r("ComputedExpectedFunction")}),I(s)}}});m({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>T(e)});m({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?H(t,n):r,i=0;S([[s,!1]]);let o=(a=>{let{type:c,el:l}=a.detail;if(l===e)switch(c){case mt:i++,S([[s,!0]]);break;case gt:i=Math.max(0,i-1),S([[s,i>0]]);break}});return p.addEventListener(W,o),()=>{i=0,S([[s,!1]]),p.removeEventListener(W,o)}}});var te=e=>{for(let t of e)return t.endsWith("ms")?+t.slice(0,-2):t.endsWith("s")?+t.slice(0,-1)*1e3:Number.parseFloat(t);return 0},ce=(e,t)=>e.has(t.toLowerCase()),rn=(e,t="")=>{if(e)for(let n of e)return n;return t};var ht=(e,t)=>(...n)=>{setTimeout(e,t,...n)},sn=(e,t,n=!0,r=!1,s=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||s)&&(o&&clearTimeout(o),o=setTimeout(()=>{r&&i!==null&&e(...i),i=null,o=0},t))}},de=(e,t)=>{let n=t.get("delay");if(n){let i=te(n);e=ht(e,i)}let r=t.get("debounce");if(r){let i=te(r),o=ce(r,"leading"),a=!ce(r,"notrailing");e=sn(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=te(s),o=!ce(s,"noleading"),a=ce(s,"trailing");e=sn(e,i,o,a)}return e};var yt=e=>"startViewTransition"in e,ne=(e,t)=>{if(t.has("viewtransition")&&yt(p)){let n=e;e=(...r)=>p.startViewTransition(()=>n(...r))}return e};m({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{O();try{e()}finally{P()}};n=ne(n,t);let r=0,s=t.get("delay");s&&(r=te(s),r>0&&(n=ht(n,r))),n()}});m({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let r=n.has("terse")?0:2,s={};t&&(s=pe(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(G(s),null,r),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new R(i),a=T(i);return()=>{o.disconnect(),a()}}});m({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:r}){let s=e;n.has("window")?s=window:n.has("document")&&(s=p);let i=l=>{O();try{r(l)}finally{P()}};i=ne(i,n),i=de(i,n);let o=H(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=p;let l=i;i=f=>{e.contains(f?.target)||l(f)}}(o===W||o===re)&&(s=p);let c=l=>{l&&(n.has("prevent")&&l.preventDefault(),n.has("stop")&&l.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&l.preventDefault()),i(l)};return s.addEventListener(o,c,a),()=>{s.removeEventListener(o,c,a)}}});var on=(e,t,n)=>Math.max(t,Math.min(n,e));var bt=new WeakSet;m({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{O();try{n()}finally{P()}};r=ne(r,t),r=de(r,t);let s={threshold:0};if(t.has("full"))s.threshold=1;else if(t.has("half"))s.threshold=.5;else{let a=t.get("threshold");a&&(s.threshold=on(Number(rn(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==i&&(r(),o&&bt.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&&bt.add(e),()=>{t.has("once")||bt.delete(e),o&&(o.disconnect(),o=null)}}});m({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{O();try{t()}finally{P()}};n=ne(n,e);let r=1e3,s=e.get("duration");s&&(r=te(s),ce(s,"leading")&&n());let i=setInterval(n,r);return()=>{clearInterval(i)}}});m({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:r,error:s}){if(t&&t!=="filter")throw s("KeyNotAllowed");let i=z(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=pe(o));let c=!1,l=de(f=>{if(c)return;F();let u=G(a,f.detail);if(_(),!xt(u)){c=!0,O();try{r(u)}finally{P(),c=!1}}},n);return p.addEventListener(re,l),()=>{p.removeEventListener(re,l)}}});m({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?H(t,n):r;S([[s,e]])}});var an="none",cn="display";m({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===an&&e.style.removeProperty(cn):e.style.setProperty(cn,an),r.observe(e,{attributeFilter:["style"]})},r=new R(n),s=T(n);return()=>{r.disconnect(),s()}}});m({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let r=t.has("ifmissing");if(e){e=H(e,t);let s=n?.();S([[e,s]],{ifMissing:r})}else{let s=Object.assign({},n?.());I(s,{ifMissing:r})}}});m({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:r}=t,s=new Map,i=(l,f)=>{let u=s.get(l);!f&&f!==0?u!==void 0&&(u?r.setProperty(l,u):r.removeProperty(l)):(u===void 0&&s.set(l,r.getPropertyValue(l)),r.setProperty(l,String(f)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let l=n();for(let[f,u]of s)f in l||(u?r.setProperty(f,u):r.removeProperty(f));for(let f in l)i(ue(f),l[f])}a.observe(t,{attributeFilter:["style"]})},a=new R(o),c=T(o);return()=>{a.disconnect(),c();for(let[l,f]of s)f?r.setProperty(l,f):r.removeProperty(l)}}});m({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),e.textContent=`${t()}`,r.observe(e,{childList:!0,characterData:!0,subtree:!0})},r=new R(n),s=T(n);return()=>{r.disconnect(),s()}}});var $n=["remove","outer","inner","replace","prepend","append","before","after"],qn=["html","svg","mathml"];xe({name:"datastar-patch-elements",apply(e,t){let n=typeof t.selector=="string"?t.selector:"",r=typeof t.mode=="string"?t.mode:"outer",s=typeof t.namespace=="string"?t.namespace:"html",i=Be(t.useViewTransition),o=typeof t.viewTransitionSelector=="string"?t.viewTransitionSelector:"",a=t.elements;if(!$n.includes(r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!qn.includes(s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let c={k:n,D:r,I:s,V:a};if(i){let l=p;if(o){let f=p.querySelector(o);f&&(l=f)}yt(l)?l.startViewTransition(()=>vt(e,c)):vt(e,c)}else vt(e,c)}});var vt=({error:e},{k:t,D:n,I:r,V:s})=>{let i=p.createDocumentFragment(),o=typeof s!="string"&&!!s;if(typeof s=="string"){let a=s.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim,""),c=/<\/html>/.test(a),l=/<\/head>/.test(a),f=/<\/body>/.test(a),u=r==="svg"?"svg":r==="mathml"?"math":"",g=u?`<${u}>${s}</${u}>`:s,w=c||l||f?s:`<body><template>${g}</template></body>`,y=new DOMParser().parseFromString(rt(w),"text/html");if(c)i.appendChild(y.documentElement);else if(l&&f)i.appendChild(y.head),i.appendChild(y.body);else if(l)i.appendChild(y.head);else if(f)i.appendChild(y.body);else if(u){let A=y.querySelector("template").content.querySelector(u);for(let d of A.childNodes)i.appendChild(d)}else i=y.querySelector("template").content}else s&&(s instanceof DocumentFragment?i=s:s instanceof Element&&i.appendChild(s));if(!t&&(n==="outer"||n==="replace")){let a=Array.from(i.children);for(let c of a){let l;if(c instanceof HTMLHtmlElement)l=p.documentElement;else if(c instanceof HTMLBodyElement)l=p.body;else if(c instanceof HTMLHeadElement)l=p.head;else if(l=p.getElementById(c.id),!l){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:c.id}});continue}fn(n,c,[l],!0)}}else{let a=p.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let c=o&&n!=="remove"?[a[0]]:a;c.length===1&&(o=!0),fn(n,i,c,o)}},Tt=new WeakSet;for(let e of p.querySelectorAll("script"))Tt.add(e);var mn=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!Tt.has(n)){let r=p.createElement("script");for(let{name:s,value:i}of n.attributes)r.setAttribute(s,i);Ee(r,n.text),n.replaceWith(r),Tt.add(r)}},ln=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);mn(o),i[n](o),s=!0}},fn=(e,t,n,r)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":{let s=!1;for(let i of n){if(r&&s)break;let o=r?t:t.cloneNode(!0);jn(i,o,e),mn(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(et,{bubbles:!1})),s=!0}}break;case"replace":ln(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":ln(n,t,e,r)}},$=new Map,ge=new Set,me=new Map,Ce=new Set,Ke=p.createElement("div");Ke.hidden=!0;var Ne=z("ignore-morph"),Gn=`[${Ne}]`,jn=(e,t,n="outer")=>{if(ee(e)&&ee(t)&&e.hasAttribute(Ne)&&t.hasAttribute(Ne)||e.parentElement?.closest(Gn))return;let r=p.createElement("div");r.append(t),p.body.insertAdjacentElement("afterend",Ke);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:c}of s)me.has(a)?Ce.add(a):me.set(a,c);e instanceof Element&&e.id&&(me.has(e.id)?Ce.add(e.id):me.set(e.id,e.tagName)),ge.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:c}of i)ge.has(a)?Ce.add(a):me.get(a)===c&&ge.add(a);for(let a of Ce)ge.delete(a);me.clear(),Ce.clear(),$.clear();let o=n==="outer"?e.parentElement:e;dn(o,s),dn(r,i),gn(o,r,n==="outer"?e:null,e.nextSibling),Ke.remove()},gn=(e,t,n=null,r=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let s of t.childNodes){if(n&&n!==r){let i=Bn(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,pn(a)}}Et(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&ge.has(s.id)){let i=p.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=$.get(o);a&&(a.delete(s.id),a.size||$.delete(o))}hn(e,i,n),Et(i,s),n=i.nextSibling;continue}if($.has(s)){let i=s.namespaceURI,o=s.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?p.createElementNS(i,o):p.createElement(o);e.insertBefore(a,n),Et(a,s),n=a.nextSibling}else{let i=p.importNode(s,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==r;){let s=n;n=n.nextSibling,pn(s)}},Bn=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=$.get(e)?.size||0,c=t;for(;c&&c!==n;){if(un(c,e)){let l=!1,f=$.get(c),u=$.get(e);if(u&&f){for(let g of f)if(u.has(g)){l=!0;break}}if(l)return c;if(!r&&!$.has(c)){if(!a)return c;r=c}}if(o+=$.get(c)?.size||0,o>a)break;r===null&&s&&un(c,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),c=c.nextSibling}return r||null},un=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),pn=e=>{$.has(e)?hn(Ke,e,null):e.parentNode?.removeChild(e)},hn=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},Un=z("preserve-attr"),Et=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(Ne)&&s.hasAttribute(Ne))return e;let o=(t.getAttribute(Un)??"").split(" "),a=(l,f,u)=>{let g=f.hasAttribute(u);return l.hasAttribute(u)!==g&&!o.includes(u)?(l[u]=g,!0):!1},c=!1;if(r instanceof J&&s instanceof J&&s.type!=="file"){let l=s.getAttribute("value");r.getAttribute("value")!==l&&!o.includes("value")&&(r.value=l??"",c=!0),c=a(r,s,"checked")||c,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let l=s.value;r.defaultValue!==l&&(r.value=l,c=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(c=a(r,s,"selected")||c);for(let{name:l,value:f}of s.attributes)r.getAttribute(l)!==f&&!o.includes(l)&&r.setAttribute(l,f);for(let{name:l}of Array.from(r.attributes))!s.hasAttribute(l)&&!o.includes(l)&&r.removeAttribute(l);c&&(r instanceof HTMLOptionElement?r.closest("select"):r)?.dispatchEvent(new Event(be,{bubbles:!0})),i&&!r.hasAttribute("data-scope-children")&&r.setAttribute("data-scope-children",""),r instanceof HTMLTemplateElement&&s instanceof HTMLTemplateElement?r.innerHTML=rt(s.innerHTML):r.isEqualNode(s)||gn(r,s),i&&r.dispatchEvent(new CustomEvent(et,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},dn=(e,t)=>{for(let n of t)if(ge.has(n.id)){let r=n;for(;r&&r!==e;){let s=$.get(r);s||(s=new Set,$.set(r,s)),s.add(n.id),r=r.parentElement}}};xe({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(typeof t!="string")throw e("PatchSignalsExpectedSignals");let r=Be(n);I(pe(t),{ifMissing:r})}});export{V as action,Jt as actions,m as attribute,O as beginBatch,je as computed,T as effect,P as endBatch,G as filtered,oe as getPath,I as mergePatch,S as mergePaths,ie as root,Te as signal,F as startPeeking,_ as stopPeeking,xe as watcher};
10
+ //# sourceMappingURL=datastar.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "package": "@starfederation/datastar",
3
+ "version": "1.0.3",
4
+ "source": "official release bundle preserved by the project fixture",
5
+ "sha256": "5d6b7794a50a83d82da962aec5e382f5ae83ac7afbc751f903f7a9c6bd433c65"
6
+ }
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021-present Floating UI contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021-present Floating UI contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).FloatingUICore={})}(this,(function(t){"use strict";const e=["top","right","bottom","left"],n=["start","end"],i=e.reduce(((t,e)=>t.concat(e,e+"-"+n[0],e+"-"+n[1])),[]),r=Math.min,o=Math.max,l={left:"right",right:"left",bottom:"top",top:"bottom"};function a(t,e,n){return o(t,r(e,n))}function s(t,e){return"function"==typeof t?t(e):t}function f(t){return t.split("-")[0]}function c(t){return t.split("-")[1]}function u(t){return"x"===t?"y":"x"}function m(t){return"y"===t?"height":"width"}function d(t){const e=t[0];return"t"===e||"b"===e?"y":"x"}function g(t){return u(d(t))}function p(t,e,n){void 0===n&&(n=!1);const i=c(t),r=g(t),o=m(r);let l="x"===r?i===(n?"end":"start")?"right":"left":"start"===i?"bottom":"top";return e.reference[o]>e.floating[o]&&(l=A(l)),[l,A(l)]}function h(t){return t.includes("start")?t.replace("start","end"):t.replace("end","start")}const y=["left","right"],w=["right","left"],x=["top","bottom"],v=["bottom","top"];function b(t,e,n,i){const r=c(t);let o=function(t,e,n){switch(t){case"top":case"bottom":return n?e?w:y:e?y:w;case"left":case"right":return e?x:v;default:return[]}}(f(t),"start"===n,i);return r&&(o=o.map((t=>t+"-"+r)),e&&(o=o.concat(o.map(h)))),o}function A(t){const e=f(t);return l[e]+t.slice(e.length)}function R(t){return"number"!=typeof t?function(t){var e,n,i,r;return{top:null!=(e=t.top)?e:0,right:null!=(n=t.right)?n:0,bottom:null!=(i=t.bottom)?i:0,left:null!=(r=t.left)?r:0}}(t):{top:t,right:t,bottom:t,left:t}}function O(t){const{x:e,y:n,width:i,height:r}=t;return{width:i,height:r,top:n,left:e,right:e+i,bottom:n+r,x:e,y:n}}function P(t,e,n){let{reference:i,floating:r}=t;const o=d(e),l=g(e),a=m(l),s=f(e),u="y"===o,p=i.x+i.width/2-r.width/2,h=i.y+i.height/2-r.height/2,y=i[a]/2-r[a]/2;let w;switch(s){case"top":w={x:p,y:i.y-r.height};break;case"bottom":w={x:p,y:i.y+i.height};break;case"right":w={x:i.x+i.width,y:h};break;case"left":w={x:i.x-r.width,y:h};break;default:w={x:i.x,y:i.y}}const x=c(e);return x&&(w[l]+=y*("end"===x?1:-1)*(n&&u?-1:1)),w}async function T(t,e){var n;void 0===e&&(e={});const{x:i,y:r,platform:o,rects:l,elements:a,strategy:f}=t,{boundary:c="clippingAncestors",rootBoundary:u="viewport",elementContext:m="floating",altBoundary:d=!1,padding:g=0}=s(e,t),p=R(g),h=a[d?"floating"===m?"reference":"floating":m],y=O(await o.getClippingRect({element:null==(n=await(null==o.isElement?void 0:o.isElement(h)))||n?h:h.contextElement||await(null==o.getDocumentElement?void 0:o.getDocumentElement(a.floating)),boundary:c,rootBoundary:u,strategy:f})),w="floating"===m?{x:i,y:r,width:l.floating.width,height:l.floating.height}:l.reference,x=await(null==o.getOffsetParent?void 0:o.getOffsetParent(a.floating)),v=await(null==o.isElement?void 0:o.isElement(x))&&await(null==o.getScale?void 0:o.getScale(x))||{x:1,y:1},b=O(o.convertOffsetParentRelativeRectToViewportRelativeRect?await o.convertOffsetParentRelativeRectToViewportRelativeRect({elements:a,rect:w,offsetParent:x,strategy:f}):w);return{top:(y.top-b.top+p.top)/v.y,bottom:(b.bottom-y.bottom+p.bottom)/v.y,left:(y.left-b.left+p.left)/v.x,right:(b.right-y.right+p.right)/v.x}}function D(t,e){return{top:t.top-e.height,right:t.right-e.width,bottom:t.bottom-e.height,left:t.left-e.width}}function E(t){return e.some((e=>t[e]>=0))}function L(t){const e=r(...t.map((t=>t.left))),n=r(...t.map((t=>t.top)));return{x:e,y:n,width:o(...t.map((t=>t.right)))-e,height:o(...t.map((t=>t.bottom)))-n}}const k=new Set(["left","top"]);t.arrow=t=>({name:"arrow",options:t,async fn(e){const{x:n,y:i,placement:o,rects:l,platform:f,elements:u,middlewareData:d}=e,{element:p,padding:h=0}=s(t,e)||{};if(null==p)return{};const y=R(h),w={x:n,y:i},x=g(o),v=m(x),b=await f.getDimensions(p),A="y"===x,O=A?"top":"left",P=A?"bottom":"right",T=A?"clientHeight":"clientWidth",D=l.reference[v]+l.reference[x]-w[x]-l.floating[v],E=w[x]-l.reference[x],L=await(null==f.getOffsetParent?void 0:f.getOffsetParent(p));let k=L?L[T]:0;k&&await(null==f.isElement?void 0:f.isElement(L))||(k=u.floating[T]||l.floating[v]);const C=D/2-E/2,H=k/2-b[v]/2-1,S=r(y[O],H),B=r(y[P],H),F=k-b[v]-B,j=k/2-b[v]/2+C,z=a(S,j,F),M=!d.arrow&&null!=c(o)&&j!==z&&l.reference[v]/2-(j<S?S:B)-b[v]/2<0,V=M?j<S?j-S:j-F:0;return{[x]:w[x]+V,data:{[x]:z,centerOffset:j-z-V,...M&&{alignmentOffset:V}},reset:M}}}),t.autoPlacement=function(t){return void 0===t&&(t={}),{name:"autoPlacement",options:t,async fn(e){var n,r,o;const{rects:l,middlewareData:a,placement:u,platform:m,elements:d}=e,{crossAxis:g=!1,alignment:y,allowedPlacements:w=i,autoAlignment:x=!0,...v}=s(t,e),b=void 0!==y||w===i?function(t,e,n){return(t?[...n.filter((e=>c(e)===t)),...n.filter((e=>c(e)!==t))]:n.filter((t=>f(t)===t))).filter((n=>!t||c(n)===t||!!e&&h(n)!==n))}(y||null,x,w):w,A=(null==(n=a.autoPlacement)?void 0:n.index)||0,R=b[A];if(null==R)return{};if(u!==R)return{reset:{placement:b[0]}};const O=await m.detectOverflow(e,v),P=p(R,l,await(null==m.isRTL?void 0:m.isRTL(d.floating))),T=[O[f(R)],O[P[0]],O[P[1]]],D=[...(null==(r=a.autoPlacement)?void 0:r.overflows)||[],{placement:R,overflows:T}],E=b[A+1];if(E)return{data:{index:A+1,overflows:D},reset:{placement:E}};const L=D.map((t=>{const e=c(t.placement);return[t.placement,e&&g?t.overflows.slice(0,2).reduce(((t,e)=>t+e),0):t.overflows[0],t.overflows]})).sort(((t,e)=>t[1]-e[1])),k=(null==(o=L.filter((t=>t[2].slice(0,c(t[0])?2:3).every((t=>t<=0))))[0])?void 0:o[0])||L[0][0];return k!==u?{data:{index:A+1,overflows:D},reset:{placement:k}}:{}}}},t.computePosition=async(t,e,n)=>{const{placement:i="bottom",strategy:r="absolute",middleware:o=[],platform:l}=n,a=l.detectOverflow?l:{...l,detectOverflow:T},s=await(null==l.isRTL?void 0:l.isRTL(e));let f=await l.getElementRects({reference:t,floating:e,strategy:r}),{x:c,y:u}=P(f,i,s),m=i,d=0;const g={};for(let n=0;n<o.length;n++){const p=o[n];if(!p)continue;const{name:h,fn:y}=p,{x:w,y:x,data:v,reset:b}=await y({x:c,y:u,initialPlacement:i,placement:m,strategy:r,middlewareData:g,rects:f,platform:a,elements:{reference:t,floating:e}});c=null!=w?w:c,u=null!=x?x:u,g[h]={...g[h],...v},b&&d<50&&(d++,"object"==typeof b&&(b.placement&&(m=b.placement),b.rects&&(f=!0===b.rects?await l.getElementRects({reference:t,floating:e,strategy:r}):b.rects),({x:c,y:u}=P(f,m,s))),n=-1)}return{x:c,y:u,placement:m,strategy:r,middlewareData:g}},t.detectOverflow=T,t.flip=function(t){return void 0===t&&(t={}),{name:"flip",options:t,async fn(e){var n,i;const{placement:r,middlewareData:o,rects:l,initialPlacement:a,platform:c,elements:u}=e,{mainAxis:m=!0,crossAxis:g=!0,fallbackPlacements:y,fallbackStrategy:w="bestFit",fallbackAxisSideDirection:x="none",flipAlignment:v=!0,...R}=s(t,e);if(null!=(n=o.arrow)&&n.alignmentOffset)return{};const O=f(r),P=d(a),T=f(a)===a,D=await(null==c.isRTL?void 0:c.isRTL(u.floating)),E=y||(T||!v?[A(a)]:function(t){const e=A(t);return[h(t),e,h(e)]}(a)),L="none"!==x;!y&&L&&E.push(...b(a,v,x,D));const k=[a,...E],C=await c.detectOverflow(e,R),H=[];let S=(null==(i=o.flip)?void 0:i.overflows)||[];if(m&&H.push(C[O]),g){const t=p(r,l,D);H.push(C[t[0]],C[t[1]])}if(S=[...S,{placement:r,overflows:H}],!H.every((t=>t<=0))){var B,F;const t=((null==(B=o.flip)?void 0:B.index)||0)+1,e=k[t];if(e){if(!("alignment"===g&&P!==d(e))||S.every((t=>d(t.placement)!==P||t.overflows[0]>0)))return{data:{index:t,overflows:S},reset:{placement:e}}}let n=null==(F=S.filter((t=>t.overflows[0]<=0)).sort(((t,e)=>t.overflows[1]-e.overflows[1]))[0])?void 0:F.placement;if(!n)switch(w){case"bestFit":{var j;const t=null==(j=S.filter((t=>{if(L){const e=d(t.placement);return e===P||"y"===e}return!0})).map((t=>[t.placement,t.overflows.filter((t=>t>0)).reduce(((t,e)=>t+e),0)])).sort(((t,e)=>t[1]-e[1]))[0])?void 0:j[0];t&&(n=t);break}case"initialPlacement":n=a}if(r!==n)return{reset:{placement:n}}}return{}}}},t.hide=function(t){return void 0===t&&(t={}),{name:"hide",options:t,async fn(e){const{rects:n,platform:i}=e,{strategy:r="referenceHidden",...o}=s(t,e);switch(r){case"referenceHidden":{const t=D(await i.detectOverflow(e,{...o,elementContext:"reference"}),n.reference);return{data:{referenceHiddenOffsets:t,referenceHidden:E(t)}}}case"escaped":{const t=D(await i.detectOverflow(e,{...o,altBoundary:!0}),n.floating);return{data:{escapedOffsets:t,escaped:E(t)}}}default:return{}}}}},t.inline=function(t){return void 0===t&&(t={}),{name:"inline",options:t,async fn(e){const{placement:n,elements:i,rects:l,platform:a,strategy:c}=e,{padding:u=2,x:m,y:g}=s(t,e),p=Array.from(await(null==a.getClientRects?void 0:a.getClientRects(i.reference))||[]);if(!p.length)return{};const h=function(t){const e=t.slice().sort(((t,e)=>t.y-e.y)),n=[];let i=null;for(let t=0;t<e.length;t++){const r=e[t];!i||r.y-i.y>i.height/2?n.push([r]):n[n.length-1].push(r),i=r}return n.map((t=>O(L(t))))}(p),y=O(L(p)),w=R(u);const x=await a.getElementRects({reference:{getBoundingClientRect:function(){if(2===h.length&&(h[0].left>h[1].right||h[1].left>h[0].right)&&null!=m&&null!=g)return h.find((t=>m>t.left-w.left&&m<t.right+w.right&&g>t.top-w.top&&g<t.bottom+w.bottom))||y;if(h.length>=2){if("y"===d(n)){const t=h[0],e=h[h.length-1],i="top"===f(n),r=t.top,o=e.bottom,l=i?t.left:e.left;return O({x:l,y:r,width:(i?t.right:e.right)-l,height:o-r})}const t="left"===f(n),e=o(...h.map((t=>t.right))),i=r(...h.map((t=>t.left))),l=h.filter((n=>t?n.left===i:n.right===e)),a=l[0].top,s=l[l.length-1].bottom;return O({x:i,y:a,width:e-i,height:s-a})}return y}},floating:i.floating,strategy:c});return l.reference.x!==x.reference.x||l.reference.y!==x.reference.y||l.reference.width!==x.reference.width||l.reference.height!==x.reference.height?{reset:{rects:x}}:{}}}},t.limitShift=function(t){return void 0===t&&(t={}),{options:t,fn(e){var n,i;const{x:r,y:o,placement:l,rects:a,middlewareData:c}=e,{offset:m=0,mainAxis:g=!0,crossAxis:p=!0}=s(t,e),h={x:r,y:o},y=d(l),w=u(y);let x=h[w],v=h[y];const b=s(m,e),A="number"==typeof b?{mainAxis:b,crossAxis:0}:{mainAxis:null!=(n=b.mainAxis)?n:0,crossAxis:null!=(i=b.crossAxis)?i:0};if(g){const t="y"===w?"height":"width",e=a.reference[w]-a.floating[t]+A.mainAxis,n=a.reference[w]+a.reference[t]-A.mainAxis;x<e?x=e:x>n&&(x=n)}if(p){var R,O;const t="y"===w?"width":"height",e=k.has(f(l)),n=a.reference[y]-a.floating[t]+(e&&(null==(R=c.offset)?void 0:R[y])||0)+(e?0:A.crossAxis),i=a.reference[y]+a.reference[t]+(e?0:(null==(O=c.offset)?void 0:O[y])||0)-(e?A.crossAxis:0);v<n?v=n:v>i&&(v=i)}return{[w]:x,[y]:v}}}},t.offset=function(t){return void 0===t&&(t=0),{name:"offset",options:t,async fn(e){var n,i;const{x:r,y:o,placement:l,middlewareData:a}=e,u=await async function(t,e){const{placement:n,platform:i,elements:r}=t,o=await(null==i.isRTL?void 0:i.isRTL(r.floating)),l=f(n),a=c(n),u="y"===d(n),m=k.has(l)?-1:1,g=o&&u?-1:1,p=s(e,t);let{mainAxis:h,crossAxis:y,alignmentAxis:w}="number"==typeof p?{mainAxis:p,crossAxis:0,alignmentAxis:null}:{mainAxis:p.mainAxis||0,crossAxis:p.crossAxis||0,alignmentAxis:p.alignmentAxis};return a&&"number"==typeof w&&(y="end"===a?-1*w:w),u?{x:y*g,y:h*m}:{x:h*m,y:y*g}}(e,t);return l===(null==(n=a.offset)?void 0:n.placement)&&null!=(i=a.arrow)&&i.alignmentOffset?{}:{x:r+u.x,y:o+u.y,data:{...u,placement:l}}}}},t.rectToClientRect=O,t.shift=function(t){return void 0===t&&(t={}),{name:"shift",options:t,async fn(e){const{x:n,y:i,placement:r,platform:o}=e,{mainAxis:l=!0,crossAxis:f=!1,limiter:c={fn:t=>{let{x:e,y:n}=t;return{x:e,y:n}}},...m}=s(t,e),g={x:n,y:i},p=await o.detectOverflow(e,m),h=d(r),y=u(h);let w=g[y],x=g[h];const v=(t,e)=>a(e+p["y"===t?"top":"left"],e,e-p["y"===t?"bottom":"right"]);l&&(w=v(y,w)),f&&(x=v(h,x));const b=c.fn({...e,[y]:w,[h]:x});return{...b,data:{x:b.x-n,y:b.y-i,enabled:{[y]:l,[h]:f}}}}}},t.size=function(t){return void 0===t&&(t={}),{name:"size",options:t,async fn(e){const{placement:n,rects:i,platform:l,elements:a}=e,{apply:u=()=>{},...m}=s(t,e),g=await l.detectOverflow(e,m),p=f(n),h=c(n),y="y"===d(n),{width:w,height:x}=i.floating;let v,b;"top"===p||"bottom"===p?(v=p,b=h===(await(null==l.isRTL?void 0:l.isRTL(a.floating))?"start":"end")?"left":"right"):(b=p,v="end"===h?"top":"bottom");const A=x-g.top-g.bottom,R=w-g.left-g.right,O=r(x-g[v],A),P=r(w-g[b],R),T=e.middlewareData.shift,D=!T;let E=O,L=P;null!=T&&T.enabled.x&&(L=R),null!=T&&T.enabled.y&&(E=A),D&&!h&&(y?L=w-2*o(g.left,g.right):E=x-2*o(g.top,g.bottom)),await u({...e,availableWidth:L,availableHeight:E});const k=await l.getDimensions(a.floating);return w!==k.width||x!==k.height?{reset:{rects:!0}}:{}}}}}));
@@ -0,0 +1 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@floating-ui/core")):"function"==typeof define&&define.amd?define(["exports","@floating-ui/core"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).FloatingUIDOM={},t.FloatingUICore)}(this,(function(t,e){"use strict";const n=Math.min,o=Math.max,i=Math.round,r=Math.floor,l=t=>({x:t,y:t});function c(){return"undefined"!=typeof window}function s(t){return a(t)?(t.nodeName||"").toLowerCase():"#document"}function f(t){var e;return(null==t||null==(e=t.ownerDocument)?void 0:e.defaultView)||window}function u(t){var e;return null==(e=(a(t)?t.ownerDocument:t.document)||window.document)?void 0:e.documentElement}function a(t){return!!c()&&(t instanceof Node||t instanceof f(t).Node)}function d(t){return!!c()&&(t instanceof Element||t instanceof f(t).Element)}function h(t){return!!c()&&(t instanceof HTMLElement||t instanceof f(t).HTMLElement)}function p(t){return!(!c()||"undefined"==typeof ShadowRoot)&&(t instanceof ShadowRoot||t instanceof f(t).ShadowRoot)}function g(t){const{overflow:e,overflowX:n,overflowY:o,display:i}=C(t);return/auto|scroll|overlay|hidden|clip/.test(e+o+n)&&"inline"!==i&&"contents"!==i}function m(t){return/^(table|td|th)$/.test(s(t))}function y(t){try{if(t.matches(":popover-open"))return!0}catch(t){}try{return t.matches(":modal")}catch(t){return!1}}const w=/transform|translate|scale|rotate|perspective|filter/,v=/paint|layout|strict|content/,x=t=>!!t&&"none"!==t;let b;function L(t){const e=d(t)?C(t):t;return x(e.transform)||x(e.translate)||x(e.scale)||x(e.rotate)||x(e.perspective)||!R()&&(x(e.backdropFilter)||x(e.filter))||w.test(e.willChange||"")||v.test(e.contain||"")}function R(){return null==b&&(b="undefined"!=typeof CSS&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),b}function T(t){return/^(html|body|#document)$/.test(s(t))}function C(t){return f(t).getComputedStyle(t)}function S(t){return d(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function E(t){if("html"===s(t))return t;const e=t.assignedSlot||t.parentNode||p(t)&&t.host||u(t);return p(e)?e.host:e}function F(t){const e=E(t);return T(e)?(t.ownerDocument||t).body:h(e)&&g(e)?e:F(e)}function O(t,e,n){var o;void 0===e&&(e=[]),void 0===n&&(n=!0);const i=F(t),r=i===(null==(o=t.ownerDocument)?void 0:o.body),l=f(i);if(r){const t=D(l);return e.concat(l,l.visualViewport||[],g(i)?i:[],t&&n?O(t):[])}return e.concat(i,O(i,[],n))}function D(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function W(t){const e=C(t);let n=parseFloat(e.width)||0,o=parseFloat(e.height)||0;const r=h(t),l=r?t.offsetWidth:n,c=r?t.offsetHeight:o,s=i(n)!==l||i(o)!==c;return s&&(n=l,o=c),{width:n,height:o,$:s}}function M(t){return d(t)?t:t.contextElement}function z(t){const e=M(t);if(!h(e))return l(1);const n=e.getBoundingClientRect(),{width:o,height:r,$:c}=W(e);let s=(c?i(n.width):n.width)/o,f=(c?i(n.height):n.height)/r;return s&&Number.isFinite(s)||(s=1),f&&Number.isFinite(f)||(f=1),{x:s,y:f}}const H=l(0);function P(t){const e=f(t);return R()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:H}function V(t,n,o,i){void 0===n&&(n=!1),void 0===o&&(o=!1);const r=t.getBoundingClientRect(),c=M(t);let s=l(1);n&&(i?d(i)&&(s=z(i)):s=z(t));const u=function(t,e,n){return void 0===e&&(e=!1),!!n&&e&&n===f(t)}(c,o,i)?P(c):l(0);let a=(r.left+u.x)/s.x,h=(r.top+u.y)/s.y,p=r.width/s.x,g=r.height/s.y;if(c&&i){const t=f(c),e=d(i)?f(i):i;let n=t,o=D(n);for(;o&&e!==n;){const t=z(o),e=o.getBoundingClientRect(),i=C(o),r=e.left+(o.clientLeft+parseFloat(i.paddingLeft))*t.x,l=e.top+(o.clientTop+parseFloat(i.paddingTop))*t.y;a*=t.x,h*=t.y,p*=t.x,g*=t.y,a+=r,h+=l,n=f(o),o=D(n)}}return e.rectToClientRect({width:p,height:g,x:a,y:h})}function A(t,e){const n=S(t).scrollLeft;return e?e.left+n:V(u(t)).left+n}function B(t,e){const n=t.getBoundingClientRect();return{x:n.left+e.scrollLeft-A(t,n),y:n.top+e.scrollTop}}function N(t,n,i){let r;if("viewport"===n||"layoutViewport"===n)r=function(t,e,n){void 0===n&&(n="viewport");const o="layoutViewport"===n,i=f(t),r=u(t),l=i.visualViewport;let c=r.clientWidth,s=r.clientHeight,a=0,d=0;if(l){const t=!R()||"fixed"===e;o?t||(a=-l.offsetLeft,d=-l.offsetTop):(c=l.width,s=l.height,t&&(a=l.offsetLeft,d=l.offsetTop))}if(A(r)<=0){const t=r.ownerDocument,e=t.body,n=getComputedStyle(e),o="CSS1Compat"===t.compatMode&&parseFloat(n.marginLeft)+parseFloat(n.marginRight)||0,i=Math.abs(r.clientWidth-e.clientWidth-o),l="stable both-edges"===getComputedStyle(r).scrollbarGutter?i/2:i;l<=25&&(c-=l)}return{width:c,height:s,x:a,y:d}}(t,i,n);else if("document"===n)r=function(t){const e=S(t),n=t.ownerDocument.body,i=o(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),r=o(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight);let l=-e.scrollLeft+A(t);const c=-e.scrollTop;return"rtl"===C(n).direction&&(l+=o(t.clientWidth,n.clientWidth)-i),{width:i,height:r,x:l,y:c}}(u(t));else if(d(n))r=function(t,e){const n=V(t,!0,"fixed"===e),o=n.top+t.clientTop,i=n.left+t.clientLeft,r=z(t);return{width:t.clientWidth*r.x,height:t.clientHeight*r.y,x:i*r.x,y:o*r.y}}(n,i);else{const e=P(t);r={x:n.x-e.x,y:n.y-e.y,width:n.width,height:n.height}}return e.rectToClientRect(r)}function I(t,e,n){const o=h(e),i=u(e),r="fixed"===n,c=V(t,!0,r,e);let f={scrollLeft:0,scrollTop:0};const a=l(0);if((o||!r)&&(("body"!==s(e)||g(i))&&(f=S(e)),o)){const t=V(e,!0,r,e);a.x=t.x+e.clientLeft,a.y=t.y+e.clientTop}!o&&i&&(a.x=A(i));const d=!i||o||r?l(0):B(i,f);return{x:c.left+f.scrollLeft-a.x-d.x,y:c.top+f.scrollTop-a.y-d.y,width:c.width,height:c.height}}function $(t){return"static"===C(t).position}function k(t,e){if(!h(t)||"fixed"===C(t).position)return null;if(e)return e(t);let n=t.offsetParent;return u(t)===n&&(n=n.ownerDocument.body),n}function q(t,e){const n=f(t);if(y(t))return n;if(!h(t)){let e=E(t);for(;e&&!T(e);){if(d(e)&&!$(e))return e;e=E(e)}return n}let o=k(t,e);for(;o&&m(o)&&$(o);)o=k(o,e);return o&&T(o)&&$(o)&&!L(o)?n:o||function(t){let e=E(t);for(;h(e)&&!T(e);){if(L(e))return e;if(y(e))return null;e=E(e)}return null}(t)||n}const U={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){let{elements:e,rect:n,offsetParent:o,strategy:i}=t;const r="fixed"===i,c=u(o),f=!!e&&y(e.floating);if(o===c||f&&r)return n;let a={scrollLeft:0,scrollTop:0},d=l(1);const p=l(0),m=h(o);if((m||!r)&&(("body"!==s(o)||g(c))&&(a=S(o)),m)){const t=V(o);d=z(o),p.x=t.x+o.clientLeft,p.y=t.y+o.clientTop}const w=!c||m||r?l(0):B(c,a);return{width:n.width*d.x,height:n.height*d.y,x:n.x*d.x-a.scrollLeft*d.x+p.x+w.x,y:n.y*d.y-a.scrollTop*d.y+p.y+w.y}},getDocumentElement:u,getClippingRect:function(t){let{element:e,boundary:i,rootBoundary:r,strategy:l}=t;const c=[..."clippingAncestors"===i?y(e)?[]:function(t,e){const n=e.get(t);if(n)return n;let o=O(t,[],!1).filter((t=>d(t)&&"body"!==s(t))),i=null;const r="fixed"===C(t).position;let l=r?E(t):t;for(;d(l)&&!T(l);){const t=C(l),e=L(l),n=i?i.position:r?"fixed":"";e||"fixed"!==n&&("absolute"!==n||"static"!==t.position)?i=t:o=o.filter((t=>t!==l)),l=E(l)}return e.set(t,o),o}(e,this._c):[].concat(i),r],f=N(e,c[0],l);let u=f.top,a=f.right,h=f.bottom,p=f.left;for(let t=1;t<c.length;t++){const i=N(e,c[t],l);u=o(i.top,u),a=n(i.right,a),h=n(i.bottom,h),p=o(i.left,p)}return{width:a-p,height:h-u,x:p,y:u}},getOffsetParent:q,getElementRects:async function(t){const e=this.getOffsetParent||q,n=this.getDimensions,o=await n(t.floating);return{reference:I(t.reference,await e(t.floating),t.strategy),floating:{x:0,y:0,width:o.width,height:o.height}}},getClientRects:function(t){return t.getClientRects?Array.from(t.getClientRects()):[]},getDimensions:function(t){const{width:e,height:n}=W(t);return{width:e,height:n}},getScale:z,isElement:d,isRTL:function(t){return"rtl"===C(t).direction}};function j(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}const X=e.detectOverflow,Y=e.offset,_=e.autoPlacement,G=e.shift,J=e.flip,K=e.size,Q=e.hide,Z=e.arrow,tt=e.inline,et=e.limitShift;t.arrow=Z,t.autoPlacement=_,t.autoUpdate=function(t,e,i,l){void 0===l&&(l={});const{ancestorScroll:c=!0,ancestorResize:s=!0,elementResize:a="function"==typeof ResizeObserver,layoutShift:d="function"==typeof IntersectionObserver,animationFrame:h=!1}=l,p=M(t),g=c||s?[...p?O(p):[],...e?O(e):[]]:[];g.forEach((t=>{c&&t.addEventListener("scroll",i),s&&t.addEventListener("resize",i)}));const m=p&&d?function(t,e,i){let l,c=null;const s=u(t);function a(){var t;clearTimeout(l),null==(t=c)||t.disconnect(),c=null}function d(i,f){void 0===i&&(i=!1),void 0===f&&(f=1),a();const u=t.getBoundingClientRect(),{left:h,top:p,width:g,height:m}=u;if(i||e(),!g||!m)return;const y={rootMargin:-r(p)+"px "+-r(s.clientWidth-(h+g))+"px "+-r(s.clientHeight-(p+m))+"px "+-r(h)+"px",threshold:o(0,n(1,f))||1};let w=!0;function v(e){const n=e[0].intersectionRatio;if(!j(u,t.getBoundingClientRect()))return d();if(n!==f){if(!w)return d();n?d(!1,n):l=setTimeout((()=>{d(!1,1e-7)}),1e3)}w=!1}try{c=new IntersectionObserver(v,{...y,root:s.ownerDocument})}catch(t){c=new IntersectionObserver(v,y)}c.observe(t)}const h=f(t),p=()=>d(i);return h.addEventListener("resize",p),d(!0),()=>{h.removeEventListener("resize",p),a()}}(p,i,s):null;let y,w=-1,v=null;a&&(v=new ResizeObserver((t=>{let[n]=t;n&&n.target===p&&v&&e&&(v.unobserve(e),cancelAnimationFrame(w),w=requestAnimationFrame((()=>{var t;null==(t=v)||t.observe(e)}))),i()})),p&&!h&&v.observe(p),e&&v.observe(e));let x=h?V(t):null;return h&&function e(){const n=V(t);x&&!j(x,n)&&i();x=n,y=requestAnimationFrame(e)}(),i(),()=>{var t;g.forEach((t=>{c&&t.removeEventListener("scroll",i),s&&t.removeEventListener("resize",i)})),null==m||m(),null==(t=v)||t.disconnect(),v=null,h&&cancelAnimationFrame(y)}},t.computePosition=(t,n,o)=>{const i=new Map,r=null!=o?o:{},l={...U,...r.platform,_c:i};return e.computePosition(t,n,{...r,platform:l})},t.detectOverflow=X,t.flip=J,t.getOverflowAncestors=O,t.hide=Q,t.inline=tt,t.limitShift=et,t.offset=Y,t.platform=U,t.shift=G,t.size=K}));
@@ -0,0 +1,17 @@
1
+ {
2
+ "generatedBy": "npm run vendor:floating",
3
+ "packages": [
4
+ {
5
+ "package": "@floating-ui/core",
6
+ "version": "1.8.0",
7
+ "file": "floating-ui.core.umd.min.js",
8
+ "sha256": "65940d866a6b6d831394a4bbed99ed0a39330bac98b643386d9a2f87a1a1d5da"
9
+ },
10
+ {
11
+ "package": "@floating-ui/dom",
12
+ "version": "1.8.0",
13
+ "file": "floating-ui.dom.umd.min.js",
14
+ "sha256": "61a46f943c4e99379eaf073447811aec7e8b8f120d2f646316e01b7694bc90a3"
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,16 @@
1
+ MIT No Attribution
2
+
3
+ Copyright (c) 2026 David Miranda
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this
6
+ software and associated documentation files (the "Software"), to deal in the Software
7
+ without restriction, including without limitation the rights to use, copy, modify,
8
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
12
+ INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
13
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
14
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
15
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
16
+ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.