@threadlabs/looma 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/README.md +43 -12
  2. package/components/shared/editor.js +69 -0
  3. package/components/shared/input-modality.d.ts +8 -0
  4. package/components/shared/input-modality.js +22 -0
  5. package/components/shared/overlay.js +281 -0
  6. package/components/shared/trigger.js +17 -0
  7. package/components/ui-affordance-scope/ui-affordance-scope.html +22 -0
  8. package/components/ui-affordance-scope/ui-affordance-scope.js +76 -0
  9. package/components/ui-avatar/ui-avatar.html +59 -0
  10. package/components/ui-avatar/ui-avatar.js +47 -0
  11. package/components/ui-avatar-group/ui-avatar-group.html +62 -0
  12. package/components/ui-avatar-group/ui-avatar-group.js +27 -0
  13. package/components/ui-badge/ui-badge.html +94 -0
  14. package/components/ui-button/ui-button.html +226 -0
  15. package/components/ui-callout/ui-callout.html +104 -0
  16. package/components/ui-checkbox/ui-checkbox.html +107 -0
  17. package/components/ui-checkbox/ui-checkbox.js +24 -0
  18. package/components/ui-cluster/ui-cluster.html +49 -0
  19. package/components/ui-combobox/ui-combobox.html +377 -0
  20. package/components/ui-combobox/ui-combobox.js +432 -0
  21. package/components/ui-container/ui-container.html +39 -0
  22. package/components/ui-context-menu/ui-context-menu.html +75 -0
  23. package/components/ui-context-menu/ui-context-menu.js +143 -0
  24. package/components/ui-dialog/ui-dialog.html +178 -0
  25. package/components/ui-dialog/ui-dialog.js +105 -0
  26. package/components/ui-disclosure/ui-disclosure.html +109 -0
  27. package/components/ui-disclosure/ui-disclosure.js +28 -0
  28. package/components/ui-editable/ui-editable.html +163 -0
  29. package/components/ui-editable/ui-editable.js +113 -0
  30. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +97 -0
  31. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.js +71 -0
  32. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +157 -0
  33. package/components/ui-editor-mention-menu/ui-editor-mention-menu.js +50 -0
  34. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +197 -0
  35. package/components/ui-editor-slash-menu/ui-editor-slash-menu.js +44 -0
  36. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +164 -0
  37. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.js +75 -0
  38. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +422 -0
  39. package/components/ui-editor-table-overlay/ui-editor-table-overlay.js +119 -0
  40. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +271 -0
  41. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.js +54 -0
  42. package/components/ui-editor-toolbar/ui-editor-toolbar.html +110 -0
  43. package/components/ui-floating-action-button/ui-floating-action-button.html +83 -0
  44. package/components/ui-form-field/ui-form-field.html +45 -0
  45. package/components/ui-form-field/ui-form-field.js +71 -0
  46. package/components/ui-grid/ui-grid.html +46 -0
  47. package/components/ui-icon/ui-icon.html +34 -0
  48. package/components/ui-icon/ui-icon.js +8 -0
  49. package/components/ui-icon-button/ui-icon-button.html +180 -0
  50. package/components/ui-icon-button/ui-icon-button.js +7 -0
  51. package/components/ui-input/ui-input.html +81 -0
  52. package/components/ui-input/ui-input.js +7 -0
  53. package/components/ui-menu/ui-menu.html +87 -0
  54. package/components/ui-menu/ui-menu.js +114 -0
  55. package/components/ui-menu-item/ui-menu-item.html +37 -0
  56. package/components/ui-popover/ui-popover.html +85 -0
  57. package/components/ui-popover/ui-popover.js +70 -0
  58. package/components/ui-radio/ui-radio.html +57 -0
  59. package/components/ui-radio/ui-radio.js +25 -0
  60. package/components/ui-radio-group/ui-radio-group.html +51 -0
  61. package/components/ui-radio-group/ui-radio-group.js +42 -0
  62. package/components/ui-reel/ui-reel.html +67 -0
  63. package/components/ui-search-result-row/ui-search-result-row.html +101 -0
  64. package/components/ui-search-shell/ui-search-shell.html +142 -0
  65. package/components/ui-search-shell/ui-search-shell.js +60 -0
  66. package/components/ui-select/ui-select.html +87 -0
  67. package/components/ui-select/ui-select.js +16 -0
  68. package/components/ui-separator/ui-separator.html +22 -0
  69. package/components/ui-sidebar/ui-sidebar.html +183 -0
  70. package/components/ui-sidebar/ui-sidebar.js +178 -0
  71. package/components/ui-stack/ui-stack.html +59 -0
  72. package/components/ui-switch/ui-switch.html +95 -0
  73. package/components/ui-switch/ui-switch.js +24 -0
  74. package/components/ui-switcher/ui-switcher.html +65 -0
  75. package/components/ui-tabs/ui-tabs.html +134 -0
  76. package/components/ui-tabs/ui-tabs.js +81 -0
  77. package/components/ui-textarea/ui-textarea.html +80 -0
  78. package/components/ui-textarea/ui-textarea.js +7 -0
  79. package/components/ui-toast-region/ui-toast-region.html +127 -0
  80. package/components/ui-toast-region/ui-toast-region.js +119 -0
  81. package/components/ui-tooltip/ui-tooltip.html +122 -0
  82. package/components/ui-tooltip/ui-tooltip.js +134 -0
  83. package/components/ui-top-bar/ui-top-bar.html +53 -0
  84. package/components/ui-tree/ui-tree.html +29 -0
  85. package/components/ui-tree/ui-tree.js +250 -0
  86. package/components/ui-tree-item/ui-tree-item.html +326 -0
  87. package/components/ui-tree-item/ui-tree-item.js +94 -0
  88. package/dist/index.d.ts +4 -414
  89. package/dist/index.js +55 -657
  90. package/editor/chunks/extensions.js +7267 -0
  91. package/editor/chunks/table-backgrounds.js +51 -0
  92. package/editor/chunks/ui.js +92 -0
  93. package/editor/extensions/callout.d.ts +20 -0
  94. package/editor/extensions/index.d.ts +12 -441
  95. package/editor/extensions/index.js +3 -64
  96. package/editor/extensions/list-behavior.d.ts +7 -0
  97. package/editor/extensions/mention.d.ts +35 -0
  98. package/editor/extensions/preset.d.ts +42 -0
  99. package/editor/extensions/slash-command.d.ts +80 -0
  100. package/editor/extensions/smart-paste.d.ts +13 -0
  101. package/editor/extensions/table-commands.d.ts +114 -0
  102. package/editor/extensions/table-formatting.d.ts +60 -0
  103. package/editor/icons.d.ts +55 -0
  104. package/editor/index.d.ts +8 -6
  105. package/editor/index.js +96 -71
  106. package/editor/insert-table-grid.d.ts +7 -0
  107. package/editor/mention-contract.d.ts +78 -0
  108. package/editor/mention-menu.d.ts +9 -0
  109. package/editor/slash-menu.d.ts +29 -0
  110. package/editor/table-backgrounds.d.ts +43 -0
  111. package/editor/table-context-menu.d.ts +12 -0
  112. package/editor/table-overlay.d.ts +79 -0
  113. package/editor/ui.d.ts +10 -50
  114. package/editor/ui.js +3 -14
  115. package/editor/viewport.d.ts +15 -0
  116. package/package.json +84 -60
  117. package/styles/ui-affordance-scope.css +19 -0
  118. package/styles/ui-avatar-group.css +56 -0
  119. package/styles/ui-avatar.css +47 -0
  120. package/styles/ui-badge.css +91 -0
  121. package/styles/ui-button.css +236 -0
  122. package/styles/ui-callout.css +76 -0
  123. package/styles/ui-checkbox.css +98 -0
  124. package/styles/ui-cluster.css +46 -0
  125. package/styles/ui-combobox.css +213 -0
  126. package/styles/ui-container.css +36 -0
  127. package/styles/ui-context-menu.css +68 -0
  128. package/styles/ui-dialog.css +160 -0
  129. package/styles/ui-disclosure.css +95 -0
  130. package/styles/ui-editable.css +139 -0
  131. package/styles/ui-editor-insert-table-grid.css +65 -0
  132. package/styles/ui-editor-mention-menu.css +121 -0
  133. package/styles/ui-editor-slash-menu.css +179 -0
  134. package/styles/ui-editor-table-context-menu.css +118 -0
  135. package/styles/ui-editor-table-overlay.css +318 -0
  136. package/styles/ui-editor-table-toolbar.css +191 -0
  137. package/styles/ui-editor-toolbar.css +115 -0
  138. package/styles/ui-floating-action-button.css +82 -0
  139. package/styles/ui-form-field.css +36 -0
  140. package/styles/ui-grid.css +43 -0
  141. package/styles/ui-icon-button.css +184 -0
  142. package/styles/ui-icon.css +23 -0
  143. package/styles/ui-input.css +82 -0
  144. package/styles/ui-menu-item.css +34 -0
  145. package/styles/ui-menu.css +80 -0
  146. package/styles/ui-popover.css +76 -0
  147. package/styles/ui-radio-group.css +38 -0
  148. package/styles/ui-radio.css +46 -0
  149. package/styles/ui-reel.css +63 -0
  150. package/styles/ui-search-result-row.css +92 -0
  151. package/styles/ui-search-shell.css +128 -0
  152. package/styles/ui-select.css +86 -0
  153. package/styles/ui-separator.css +16 -0
  154. package/styles/ui-sidebar.css +166 -0
  155. package/styles/ui-stack.css +55 -0
  156. package/styles/ui-switch.css +88 -0
  157. package/styles/ui-switcher.css +61 -0
  158. package/styles/ui-tabs.css +114 -0
  159. package/styles/ui-textarea.css +77 -0
  160. package/styles/ui-toast-region.css +103 -0
  161. package/styles/ui-tooltip.css +113 -0
  162. package/styles/ui-top-bar.css +51 -0
  163. package/styles/ui-tree-item.css +267 -0
  164. package/styles/ui-tree.css +16 -0
  165. package/vanilla/UiAffordanceScope.d.ts +14 -0
  166. package/vanilla/UiAffordanceScope.js +30 -0
  167. package/vanilla/UiAvatar.d.ts +17 -0
  168. package/vanilla/UiAvatar.js +41 -0
  169. package/vanilla/UiAvatarGroup.d.ts +15 -0
  170. package/vanilla/UiAvatarGroup.js +40 -0
  171. package/vanilla/UiBadge.d.ts +15 -0
  172. package/vanilla/UiBadge.js +30 -0
  173. package/vanilla/UiButton.d.ts +16 -0
  174. package/vanilla/UiButton.js +32 -0
  175. package/vanilla/UiCallout.d.ts +14 -0
  176. package/vanilla/UiCallout.js +124 -0
  177. package/vanilla/UiCheckbox.d.ts +19 -0
  178. package/vanilla/UiCheckbox.js +47 -0
  179. package/vanilla/UiCluster.d.ts +15 -0
  180. package/vanilla/UiCluster.js +30 -0
  181. package/vanilla/UiCombobox.d.ts +42 -0
  182. package/vanilla/UiCombobox.js +194 -0
  183. package/vanilla/UiContainer.d.ts +15 -0
  184. package/vanilla/UiContainer.js +30 -0
  185. package/vanilla/UiContextMenu.d.ts +18 -0
  186. package/vanilla/UiContextMenu.js +35 -0
  187. package/vanilla/UiDialog.d.ts +19 -0
  188. package/vanilla/UiDialog.js +53 -0
  189. package/vanilla/UiDisclosure.d.ts +18 -0
  190. package/vanilla/UiDisclosure.js +49 -0
  191. package/vanilla/UiEditable.d.ts +22 -0
  192. package/vanilla/UiEditable.js +59 -0
  193. package/vanilla/UiEditorInsertTableGrid.d.ts +18 -0
  194. package/vanilla/UiEditorInsertTableGrid.js +46 -0
  195. package/vanilla/UiEditorMentionMenu.d.ts +21 -0
  196. package/vanilla/UiEditorMentionMenu.js +63 -0
  197. package/vanilla/UiEditorSlashMenu.d.ts +20 -0
  198. package/vanilla/UiEditorSlashMenu.js +74 -0
  199. package/vanilla/UiEditorTableContextMenu.d.ts +17 -0
  200. package/vanilla/UiEditorTableContextMenu.js +69 -0
  201. package/vanilla/UiEditorTableOverlay.d.ts +16 -0
  202. package/vanilla/UiEditorTableOverlay.js +113 -0
  203. package/vanilla/UiEditorTableToolbar.d.ts +18 -0
  204. package/vanilla/UiEditorTableToolbar.js +121 -0
  205. package/vanilla/UiEditorToolbar.d.ts +14 -0
  206. package/vanilla/UiEditorToolbar.js +30 -0
  207. package/vanilla/UiFloatingActionButton.d.ts +16 -0
  208. package/vanilla/UiFloatingActionButton.js +35 -0
  209. package/vanilla/UiFormField.d.ts +16 -0
  210. package/vanilla/UiFormField.js +54 -0
  211. package/vanilla/UiGrid.d.ts +15 -0
  212. package/vanilla/UiGrid.js +30 -0
  213. package/vanilla/UiIcon.d.ts +14 -0
  214. package/vanilla/UiIcon.js +40 -0
  215. package/vanilla/UiIconButton.d.ts +19 -0
  216. package/vanilla/UiIconButton.js +37 -0
  217. package/vanilla/UiInput.d.ts +18 -0
  218. package/vanilla/UiInput.js +37 -0
  219. package/vanilla/UiMenu.d.ts +19 -0
  220. package/vanilla/UiMenu.js +35 -0
  221. package/vanilla/UiMenuItem.d.ts +15 -0
  222. package/vanilla/UiMenuItem.js +43 -0
  223. package/vanilla/UiPopover.d.ts +18 -0
  224. package/vanilla/UiPopover.js +33 -0
  225. package/vanilla/UiRadio.d.ts +19 -0
  226. package/vanilla/UiRadio.js +48 -0
  227. package/vanilla/UiRadioGroup.d.ts +21 -0
  228. package/vanilla/UiRadioGroup.js +35 -0
  229. package/vanilla/UiReel.d.ts +16 -0
  230. package/vanilla/UiReel.js +34 -0
  231. package/vanilla/UiSearchResultRow.d.ts +15 -0
  232. package/vanilla/UiSearchResultRow.js +82 -0
  233. package/vanilla/UiSearchShell.d.ts +18 -0
  234. package/vanilla/UiSearchShell.js +74 -0
  235. package/vanilla/UiSelect.d.ts +18 -0
  236. package/vanilla/UiSelect.js +42 -0
  237. package/vanilla/UiSeparator.d.ts +14 -0
  238. package/vanilla/UiSeparator.js +28 -0
  239. package/vanilla/UiSidebar.d.ts +24 -0
  240. package/vanilla/UiSidebar.js +47 -0
  241. package/vanilla/UiStack.d.ts +16 -0
  242. package/vanilla/UiStack.js +32 -0
  243. package/vanilla/UiSwitch.d.ts +18 -0
  244. package/vanilla/UiSwitch.js +46 -0
  245. package/vanilla/UiSwitcher.d.ts +16 -0
  246. package/vanilla/UiSwitcher.js +32 -0
  247. package/vanilla/UiTabs.d.ts +18 -0
  248. package/vanilla/UiTabs.js +47 -0
  249. package/vanilla/UiTextarea.d.ts +19 -0
  250. package/vanilla/UiTextarea.js +40 -0
  251. package/vanilla/UiToastRegion.d.ts +20 -0
  252. package/vanilla/UiToastRegion.js +58 -0
  253. package/vanilla/UiTooltip.d.ts +21 -0
  254. package/vanilla/UiTooltip.js +34 -0
  255. package/vanilla/UiTopBar.d.ts +13 -0
  256. package/vanilla/UiTopBar.js +59 -0
  257. package/vanilla/UiTree.d.ts +18 -0
  258. package/vanilla/UiTree.js +31 -0
  259. package/vanilla/UiTreeItem.d.ts +26 -0
  260. package/vanilla/UiTreeItem.js +164 -0
  261. package/vanilla/index.js +48 -0
  262. package/vue/UiAffordanceScope.d.ts +18 -0
  263. package/vue/UiAffordanceScope.js +2 -0
  264. package/vue/UiAffordanceScope.vue +118 -0
  265. package/vue/UiAvatar.d.ts +23 -0
  266. package/vue/UiAvatar.js +2 -0
  267. package/vue/UiAvatar.vue +152 -0
  268. package/vue/UiAvatarGroup.d.ts +20 -0
  269. package/vue/UiAvatarGroup.js +2 -0
  270. package/vue/UiAvatarGroup.vue +167 -0
  271. package/vue/UiBadge.d.ts +20 -0
  272. package/vue/UiBadge.js +2 -0
  273. package/vue/UiBadge.vue +123 -0
  274. package/vue/UiButton.d.ts +22 -0
  275. package/vue/UiButton.js +2 -0
  276. package/vue/UiButton.vue +257 -0
  277. package/vue/UiCallout.d.ts +18 -0
  278. package/vue/UiCallout.js +2 -0
  279. package/vue/UiCallout.vue +104 -0
  280. package/vue/UiCheckbox.d.ts +38 -0
  281. package/vue/UiCheckbox.js +2 -0
  282. package/vue/UiCheckbox.vue +216 -0
  283. package/vue/UiCluster.d.ts +17 -0
  284. package/vue/UiCluster.js +2 -0
  285. package/vue/UiCluster.vue +75 -0
  286. package/vue/UiCombobox.d.ts +255 -0
  287. package/vue/UiCombobox.js +2 -0
  288. package/vue/UiCombobox.vue +466 -0
  289. package/vue/UiContainer.d.ts +17 -0
  290. package/vue/UiContainer.js +2 -0
  291. package/vue/UiContainer.vue +65 -0
  292. package/vue/UiContextMenu.d.ts +50 -0
  293. package/vue/UiContextMenu.js +2 -0
  294. package/vue/UiContextMenu.vue +166 -0
  295. package/vue/UiDialog.d.ts +39 -0
  296. package/vue/UiDialog.js +2 -0
  297. package/vue/UiDialog.vue +273 -0
  298. package/vue/UiDisclosure.d.ts +44 -0
  299. package/vue/UiDisclosure.js +2 -0
  300. package/vue/UiDisclosure.vue +211 -0
  301. package/vue/UiEditable.d.ts +48 -0
  302. package/vue/UiEditable.js +2 -0
  303. package/vue/UiEditable.vue +267 -0
  304. package/vue/UiEditorInsertTableGrid.d.ts +26 -0
  305. package/vue/UiEditorInsertTableGrid.js +2 -0
  306. package/vue/UiEditorInsertTableGrid.vue +210 -0
  307. package/vue/UiEditorMentionMenu.d.ts +44 -0
  308. package/vue/UiEditorMentionMenu.js +2 -0
  309. package/vue/UiEditorMentionMenu.vue +284 -0
  310. package/vue/UiEditorSlashMenu.d.ts +41 -0
  311. package/vue/UiEditorSlashMenu.js +2 -0
  312. package/vue/UiEditorSlashMenu.vue +306 -0
  313. package/vue/UiEditorTableContextMenu.d.ts +19 -0
  314. package/vue/UiEditorTableContextMenu.js +2 -0
  315. package/vue/UiEditorTableContextMenu.vue +252 -0
  316. package/vue/UiEditorTableOverlay.d.ts +66 -0
  317. package/vue/UiEditorTableOverlay.js +2 -0
  318. package/vue/UiEditorTableOverlay.vue +455 -0
  319. package/vue/UiEditorTableToolbar.d.ts +21 -0
  320. package/vue/UiEditorTableToolbar.js +2 -0
  321. package/vue/UiEditorTableToolbar.vue +339 -0
  322. package/vue/UiEditorToolbar.d.ts +18 -0
  323. package/vue/UiEditorToolbar.js +2 -0
  324. package/vue/UiEditorToolbar.vue +138 -0
  325. package/vue/UiFloatingActionButton.d.ts +22 -0
  326. package/vue/UiFloatingActionButton.js +2 -0
  327. package/vue/UiFloatingActionButton.vue +116 -0
  328. package/vue/UiFormField.d.ts +28 -0
  329. package/vue/UiFormField.js +2 -0
  330. package/vue/UiFormField.vue +124 -0
  331. package/vue/UiGrid.d.ts +17 -0
  332. package/vue/UiGrid.js +2 -0
  333. package/vue/UiGrid.vue +72 -0
  334. package/vue/UiIcon.d.ts +8 -0
  335. package/vue/UiIcon.js +2 -0
  336. package/vue/UiIcon.vue +135 -0
  337. package/vue/UiIconButton.d.ts +27 -0
  338. package/vue/UiIconButton.js +2 -0
  339. package/vue/UiIconButton.vue +281 -0
  340. package/vue/UiInput.d.ts +20 -0
  341. package/vue/UiInput.js +2 -0
  342. package/vue/UiInput.vue +177 -0
  343. package/vue/UiMenu.d.ts +52 -0
  344. package/vue/UiMenu.js +2 -0
  345. package/vue/UiMenu.vue +194 -0
  346. package/vue/UiMenuItem.d.ts +20 -0
  347. package/vue/UiMenuItem.js +2 -0
  348. package/vue/UiMenuItem.vue +55 -0
  349. package/vue/UiPopover.d.ts +44 -0
  350. package/vue/UiPopover.js +2 -0
  351. package/vue/UiPopover.vue +188 -0
  352. package/vue/UiRadio.d.ts +38 -0
  353. package/vue/UiRadio.js +2 -0
  354. package/vue/UiRadio.vue +166 -0
  355. package/vue/UiRadioGroup.d.ts +50 -0
  356. package/vue/UiRadioGroup.js +2 -0
  357. package/vue/UiRadioGroup.vue +161 -0
  358. package/vue/UiReel.d.ts +18 -0
  359. package/vue/UiReel.js +2 -0
  360. package/vue/UiReel.vue +93 -0
  361. package/vue/UiSearchResultRow.d.ts +28 -0
  362. package/vue/UiSearchResultRow.js +2 -0
  363. package/vue/UiSearchResultRow.vue +124 -0
  364. package/vue/UiSearchShell.d.ts +42 -0
  365. package/vue/UiSearchShell.js +2 -0
  366. package/vue/UiSearchShell.vue +233 -0
  367. package/vue/UiSelect.d.ts +30 -0
  368. package/vue/UiSelect.js +2 -0
  369. package/vue/UiSelect.vue +183 -0
  370. package/vue/UiSeparator.d.ts +8 -0
  371. package/vue/UiSeparator.js +2 -0
  372. package/vue/UiSeparator.vue +38 -0
  373. package/vue/UiSidebar.d.ts +54 -0
  374. package/vue/UiSidebar.js +2 -0
  375. package/vue/UiSidebar.vue +288 -0
  376. package/vue/UiStack.d.ts +18 -0
  377. package/vue/UiStack.js +2 -0
  378. package/vue/UiStack.vue +85 -0
  379. package/vue/UiSwitch.d.ts +36 -0
  380. package/vue/UiSwitch.js +2 -0
  381. package/vue/UiSwitch.vue +203 -0
  382. package/vue/UiSwitcher.d.ts +18 -0
  383. package/vue/UiSwitcher.js +2 -0
  384. package/vue/UiSwitcher.vue +91 -0
  385. package/vue/UiTabs.d.ts +36 -0
  386. package/vue/UiTabs.js +2 -0
  387. package/vue/UiTabs.vue +269 -0
  388. package/vue/UiTextarea.d.ts +22 -0
  389. package/vue/UiTextarea.js +2 -0
  390. package/vue/UiTextarea.vue +177 -0
  391. package/vue/UiToastRegion.d.ts +48 -0
  392. package/vue/UiToastRegion.js +2 -0
  393. package/vue/UiToastRegion.vue +256 -0
  394. package/vue/UiTooltip.d.ts +50 -0
  395. package/vue/UiTooltip.js +2 -0
  396. package/vue/UiTooltip.vue +230 -0
  397. package/vue/UiTopBar.d.ts +19 -0
  398. package/vue/UiTopBar.js +2 -0
  399. package/vue/UiTopBar.vue +56 -0
  400. package/vue/UiTree.d.ts +62 -0
  401. package/vue/UiTree.js +2 -0
  402. package/vue/UiTree.vue +117 -0
  403. package/vue/UiTreeItem.d.ts +56 -0
  404. package/vue/UiTreeItem.js +2 -0
  405. package/vue/UiTreeItem.vue +418 -0
  406. package/vue/chunks/UiAffordanceScope.js +112 -0
  407. package/vue/chunks/UiAvatar.js +144 -0
  408. package/vue/chunks/UiAvatarGroup.js +142 -0
  409. package/vue/chunks/UiBadge.js +33 -0
  410. package/vue/chunks/UiButton.js +47 -0
  411. package/vue/chunks/UiCallout.js +117 -0
  412. package/vue/chunks/UiCheckbox.js +167 -0
  413. package/vue/chunks/UiCluster.js +33 -0
  414. package/vue/chunks/UiCombobox.js +684 -0
  415. package/vue/chunks/UiContainer.js +33 -0
  416. package/vue/chunks/UiContextMenu.js +153 -0
  417. package/vue/chunks/UiDialog.js +162 -0
  418. package/vue/chunks/UiDisclosure.js +185 -0
  419. package/vue/chunks/UiEditable.js +223 -0
  420. package/vue/chunks/UiEditorInsertTableGrid.js +221 -0
  421. package/vue/chunks/UiEditorMentionMenu.js +245 -0
  422. package/vue/chunks/UiEditorSlashMenu.js +210 -0
  423. package/vue/chunks/UiEditorTableContextMenu.js +201 -0
  424. package/vue/chunks/UiEditorTableOverlay.js +301 -0
  425. package/vue/chunks/UiEditorTableToolbar.js +299 -0
  426. package/vue/chunks/UiEditorToolbar.js +37 -0
  427. package/vue/chunks/UiFloatingActionButton.js +56 -0
  428. package/vue/chunks/UiFormField.js +113 -0
  429. package/vue/chunks/UiGrid.js +33 -0
  430. package/vue/chunks/UiIcon.js +170 -0
  431. package/vue/chunks/UiIconButton.js +141 -0
  432. package/vue/chunks/UiInput.js +136 -0
  433. package/vue/chunks/UiMenu.js +163 -0
  434. package/vue/chunks/UiMenuItem.js +37 -0
  435. package/vue/chunks/UiPopover.js +149 -0
  436. package/vue/chunks/UiRadio.js +164 -0
  437. package/vue/chunks/UiRadioGroup.js +160 -0
  438. package/vue/chunks/UiReel.js +42 -0
  439. package/vue/chunks/UiSearchResultRow.js +63 -0
  440. package/vue/chunks/UiSearchShell.js +152 -0
  441. package/vue/chunks/UiSelect.js +134 -0
  442. package/vue/chunks/UiSeparator.js +24 -0
  443. package/vue/chunks/UiSidebar.js +180 -0
  444. package/vue/chunks/UiStack.js +38 -0
  445. package/vue/chunks/UiSwitch.js +162 -0
  446. package/vue/chunks/UiSwitcher.js +38 -0
  447. package/vue/chunks/UiTabs.js +210 -0
  448. package/vue/chunks/UiTextarea.js +139 -0
  449. package/vue/chunks/UiToastRegion.js +227 -0
  450. package/vue/chunks/UiTooltip.js +163 -0
  451. package/vue/chunks/UiTopBar.js +25 -0
  452. package/vue/chunks/UiTree.js +140 -0
  453. package/vue/chunks/UiTreeItem.js +315 -0
  454. package/vue/chunks/_plugin-vue_export-helper.js +8 -0
  455. package/vue/components.css +4442 -0
  456. package/vue/editor/LoomaEditor.d.ts +171 -0
  457. package/vue/editor/image-delivery.d.ts +61 -0
  458. package/vue/editor/index.d.ts +4 -386
  459. package/vue/editor/index.js +995 -1134
  460. package/vue/editor/primitives.d.ts +23 -0
  461. package/vue/index.d.ts +49 -604
  462. package/vue/index.js +50 -86
  463. package/dist/chunk-MLKGABMK.js +0 -9
  464. package/dist/chunk-RWLYVQY6.js +0 -5719
  465. package/dist/chunk-XDNZIKNI.js +0 -2721
  466. package/dist/declarative-generated.cjs +0 -149
  467. package/dist/declarative-generated.d.cts +0 -16
  468. package/dist/declarative-generated.d.ts +0 -16
  469. package/dist/declarative-generated.js +0 -124
  470. package/dist/declarative.cjs +0 -2750
  471. package/dist/declarative.d.cts +0 -101
  472. package/dist/declarative.d.ts +0 -101
  473. package/dist/declarative.js +0 -15
  474. package/dist/index.cjs +0 -9077
  475. package/dist/index.d.cts +0 -414
  476. package/dist/loader.cjs +0 -8442
  477. package/dist/loader.d.cts +0 -4
  478. package/dist/loader.d.ts +0 -4
  479. package/dist/loader.js +0 -16
  480. package/editor/chunk-EUIH3TBV.js +0 -6826
  481. package/editor/chunk-JK53ENSG.js +0 -29
  482. package/editor/chunk-U36XNFJN.js +0 -2592
  483. package/editor/table-overlay-DZFGHQDt.d.ts +0 -138
  484. package/editor.css +0 -1592
  485. package/layout/index.cjs +0 -356
  486. package/layout/index.d.cts +0 -18
  487. package/layout/index.d.ts +0 -18
  488. package/layout/index.js +0 -341
  489. package/layout.css +0 -191
  490. package/styles.css +0 -940
  491. package/vue/chunk-OX3EACZ7.js +0 -4369
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "type": "module",
5
- "description": "Looma declarative components, responsive layout primitives, a complete editor, and supported Vue adapters.",
5
+ "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
7
7
  "author": "Threadlabs Studio",
8
8
  "repository": {
@@ -18,42 +18,27 @@
18
18
  "access": "public",
19
19
  "provenance": true
20
20
  },
21
- "main": "dist/index.cjs",
22
- "module": "dist/index.js",
23
- "types": "dist/index.d.ts",
24
21
  "exports": {
25
22
  ".": {
26
23
  "types": "./dist/index.d.ts",
27
24
  "import": "./dist/index.js",
28
- "require": "./dist/index.cjs"
25
+ "default": "./dist/index.js"
29
26
  },
30
- "./core": {
31
- "types": "./dist/index.d.ts",
32
- "import": "./dist/index.js",
33
- "require": "./dist/index.cjs"
34
- },
35
- "./loader": {
36
- "types": "./dist/loader.d.ts",
37
- "import": "./dist/loader.js"
38
- },
39
- "./core/declarative": {
40
- "types": "./dist/declarative.d.ts",
41
- "import": "./dist/declarative.js",
42
- "require": "./dist/declarative.cjs"
43
- },
44
- "./core/declarative-generated": {
45
- "types": "./dist/declarative-generated.d.ts",
46
- "import": "./dist/declarative-generated.js",
47
- "require": "./dist/declarative-generated.cjs"
27
+ "./vue": {
28
+ "types": "./vue/index.d.ts",
29
+ "import": "./vue/index.js",
30
+ "default": "./vue/index.js"
48
31
  },
49
- "./layout": {
50
- "types": "./layout/index.d.ts",
51
- "import": "./layout/index.js",
52
- "require": "./layout/index.cjs"
32
+ "./vue.css": "./vue/components.css",
33
+ "./vue/editor": {
34
+ "types": "./vue/editor/index.d.ts",
35
+ "import": "./vue/editor/index.js",
36
+ "default": "./vue/editor/index.js"
53
37
  },
54
38
  "./editor": {
55
39
  "types": "./editor/index.d.ts",
56
- "import": "./editor/index.js"
40
+ "import": "./editor/index.js",
41
+ "default": "./editor/index.js"
57
42
  },
58
43
  "./editor/ui": {
59
44
  "types": "./editor/ui.d.ts",
@@ -62,50 +47,40 @@
62
47
  },
63
48
  "./editor/extensions": {
64
49
  "types": "./editor/extensions/index.d.ts",
65
- "import": "./editor/extensions/index.js"
66
- },
67
- "./vue": {
68
- "types": "./vue/index.d.ts",
69
- "import": "./vue/index.js"
70
- },
71
- "./vue/editor": {
72
- "types": "./vue/editor/index.d.ts",
73
- "import": "./vue/editor/index.js"
50
+ "import": "./editor/extensions/index.js",
51
+ "default": "./editor/extensions/index.js"
74
52
  },
53
+ "./vue/*": "./vue/*",
54
+ "./vanilla": "./vanilla/index.js",
55
+ "./vanilla/*": "./vanilla/*",
56
+ "./components/*": "./components/*",
75
57
  "./tokens.css": "./tokens.css",
76
58
  "./theme-light.css": "./theme-light.css",
77
59
  "./theme-dark.css": "./theme-dark.css",
78
- "./theme-high-contrast.css": "./theme-high-contrast.css",
79
- "./layout.css": "./layout.css",
80
- "./styles.css": "./styles.css",
81
- "./editor.css": "./editor.css"
60
+ "./theme-high-contrast.css": "./theme-high-contrast.css"
82
61
  },
83
62
  "files": [
84
63
  "dist/",
85
- "layout/",
86
- "editor/",
87
64
  "vue/",
88
- "tokens.css",
89
- "theme-light.css",
90
- "theme-dark.css",
91
- "theme-high-contrast.css",
92
- "layout.css",
93
- "styles.css",
94
- "editor.css",
65
+ "editor/",
66
+ "vanilla/",
67
+ "components/",
68
+ "styles/",
69
+ "*.css",
95
70
  "README.md",
96
71
  "LICENSE"
97
72
  ],
98
73
  "sideEffects": [
99
74
  "./dist/index.js",
100
- "./layout/index.js",
101
- "./editor/*.js",
102
- "./vue/index.js",
103
- "./vue/editor/*.js",
75
+ "./vanilla/*.js",
76
+ "./styles/*.css",
104
77
  "./*.css"
105
78
  ],
106
79
  "dependencies": {
107
- "lucide": "~0.554.0",
108
- "lowlight": "^3.3.0"
80
+ "@nextwebwg/declarative-components": "^1.0.0-alpha.1",
81
+ "lowlight": "^3.3.0",
82
+ "markdown-it": "14.3.1",
83
+ "lucide": "~0.554.0"
109
84
  },
110
85
  "peerDependencies": {
111
86
  "@tiptap/core": ">=2 <3",
@@ -127,12 +102,61 @@
127
102
  "optional": true
128
103
  }
129
104
  },
105
+ "devDependencies": {
106
+ "@vitejs/plugin-vue": "^6.0.9",
107
+ "vite": "^8.3.0",
108
+ "vue": "^3.5.43",
109
+ "vue-tsc": "^3.3.11",
110
+ "typescript": "~5.9.3",
111
+ "playwright": "~1.60.0",
112
+ "vitest": "^3.2.6",
113
+ "@tiptap/core": "^2.11.5",
114
+ "@tiptap/extension-blockquote": "^2.11.5",
115
+ "@tiptap/extension-bold": "^2.11.5",
116
+ "@tiptap/extension-bullet-list": "^2.11.5",
117
+ "@tiptap/extension-code": "^2.11.5",
118
+ "@tiptap/extension-code-block-lowlight": "^2.11.5",
119
+ "@tiptap/extension-document": "^2.11.5",
120
+ "@tiptap/extension-dropcursor": "^2.11.5",
121
+ "@tiptap/extension-gapcursor": "^2.11.5",
122
+ "@tiptap/extension-hard-break": "^2.11.5",
123
+ "@tiptap/extension-heading": "^2.11.5",
124
+ "@tiptap/extension-highlight": "^2.11.5",
125
+ "@tiptap/extension-history": "^2.11.5",
126
+ "@tiptap/extension-horizontal-rule": "^2.11.5",
127
+ "@tiptap/extension-image": "^2.11.5",
128
+ "@tiptap/extension-italic": "^2.11.5",
129
+ "@tiptap/extension-link": "^2.11.5",
130
+ "@tiptap/extension-list-item": "^2.11.5",
131
+ "@tiptap/extension-mention": "^2.11.5",
132
+ "@tiptap/extension-ordered-list": "^2.11.5",
133
+ "@tiptap/extension-paragraph": "^2.11.5",
134
+ "@tiptap/extension-placeholder": "^2.11.5",
135
+ "@tiptap/extension-strike": "^2.11.5",
136
+ "@tiptap/extension-table": "^2.11.5",
137
+ "@tiptap/extension-table-cell": "^2.11.5",
138
+ "@tiptap/extension-table-header": "^2.11.5",
139
+ "@tiptap/extension-table-row": "^2.11.5",
140
+ "@tiptap/extension-task-item": "^2.11.5",
141
+ "@tiptap/extension-task-list": "^2.11.5",
142
+ "@tiptap/extension-text": "^2.11.5",
143
+ "@tiptap/extension-typography": "^2.11.5",
144
+ "@tiptap/extension-underline": "^2.11.5",
145
+ "@tiptap/pm": "^2.11.5",
146
+ "@tiptap/suggestion": "^2.11.5",
147
+ "@tiptap/vue-3": "^2.11.5",
148
+ "@types/markdown-it": "14.2.0",
149
+ "@vitest/browser": "~3.2.6",
150
+ "jsdom": "^27.0.0"
151
+ },
130
152
  "engines": {
131
153
  "node": ">=20"
132
154
  },
133
155
  "scripts": {
134
- "build": "node ../../tools/scripts/build-facade.mjs",
135
- "test": "node --test ../../tools/scripts/facade-*.test.mjs",
136
- "typecheck": "node ../../tools/scripts/verify-facade.mjs --definition-only"
156
+ "build": "node build.mjs",
157
+ "lint": "vue-tsc -p tsconfig.json --noEmit",
158
+ "typecheck": "vue-tsc -p tsconfig.json --noEmit",
159
+ "test": "vitest run",
160
+ "test:browser": "vitest run && vitest run --config vitest.browser.config.ts"
137
161
  }
138
162
  }
@@ -0,0 +1,19 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.1. Do not edit. */
2
+ @scope ([data-component~="ui-affordance-scope"]) to ([data-component], [data-slotted]) {
3
+ :scope {
4
+ display: contents;
5
+ --ui-affordance-scope-engaged: 0;
6
+ }
7
+
8
+ :scope[data-ui-affordance-scope-state~="engaged"] {
9
+ --ui-affordance-scope-engaged: 1;
10
+ }
11
+
12
+ /* A component that sets its display still honours the hidden attribute on its root. */
13
+ :scope[hidden] {
14
+ display: none;
15
+ }
16
+ }
17
+ @scope ([data-component~="ui-affordance-scope"]) to ([data-component]) {
18
+ /* A component that sets its display still honours the hidden attribute on its root. */
19
+ }
@@ -0,0 +1,56 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.1. Do not edit. */
2
+ @scope ([data-component~="ui-avatar-group"]) to ([data-component], [data-slotted]) {
3
+ :scope {
4
+ display: flex;
5
+ align-items: center;
6
+ flex-direction: row;
7
+ gap: 0;
8
+ }
9
+
10
+ /* Overlap and the separating shadow are applied by the controller: slotted avatars are nested
11
+ * component roots outside this style scope. */
12
+
13
+ .overflow {
14
+ margin-inline-start: -0.625rem;
15
+ display: inline-flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ inline-size: 2.5rem;
19
+ block-size: 2.5rem;
20
+ border-radius: 999px;
21
+ border: 1px solid var(--ui-border-strong);
22
+ background: var(--ui-surface-elevated);
23
+ color: var(--ui-text-primary);
24
+ box-shadow:
25
+ var(--ui-avatar-group-overlap-shadow, -2px 0 5px -1px rgb(0 0 0 / 0.28)),
26
+ 0 0 0 1px rgb(0 0 0 / 0.06);
27
+ font: inherit;
28
+ font-size: 0.75rem;
29
+ font-weight: 600;
30
+ flex-shrink: 0;
31
+ }
32
+
33
+ .overflow[hidden] {
34
+ display: none;
35
+ }
36
+
37
+ /* A component that sets its display still honours the hidden attribute on its root. */
38
+ :scope[hidden] {
39
+ display: none;
40
+ }
41
+ }
42
+ @scope ([data-component~="ui-avatar-group"]) to ([data-component]) {
43
+ /* Overlap and the separating shadow are applied by the controller: slotted avatars are nested
44
+ * component roots outside this style scope. */
45
+ :where([data-slotted], [data-slotted] *):is(*) {
46
+ margin-inline-start: -0.625rem;
47
+ flex-shrink: 0;
48
+ border-radius: 999px;
49
+ }
50
+
51
+ :where([data-slotted], [data-slotted] *):is(*:first-child) {
52
+ margin-inline-start: 0;
53
+ }
54
+
55
+ /* A component that sets its display still honours the hidden attribute on its root. */
56
+ }
@@ -0,0 +1,47 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.1. Do not edit. */
2
+ @scope ([data-component~="ui-avatar"]) to ([data-component], [data-slotted]) {
3
+ :scope {
4
+ display: inline-grid;
5
+ place-items: center;
6
+ overflow: hidden;
7
+ inline-size: 2.5rem;
8
+ block-size: 2.5rem;
9
+ border-radius: 999px;
10
+ border: 1px solid var(--ui-avatar-border, var(--ui-border-strong));
11
+ background: var(--ui-avatar-surface, var(--ui-accent-soft));
12
+ color: var(--ui-avatar-text, var(--ui-accent-solid));
13
+ font: inherit;
14
+ font-size: 0.875rem;
15
+ font-weight: 600;
16
+ text-transform: uppercase;
17
+ }
18
+
19
+ .fallback {
20
+ grid-area: 1 / 1;
21
+ display: inline-flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ inline-size: 100%;
25
+ block-size: 100%;
26
+ }
27
+
28
+ [hidden] {
29
+ display: none;
30
+ }
31
+
32
+ /* A component that sets its display still honours the hidden attribute on its root. */
33
+ :scope[hidden] {
34
+ display: none;
35
+ }
36
+ }
37
+ @scope ([data-component~="ui-avatar"]) to ([data-component]) {
38
+ .image,
39
+ :where([data-slotted], [data-slotted] *):is(img) {
40
+ grid-area: 1 / 1;
41
+ inline-size: 100%;
42
+ block-size: 100%;
43
+ object-fit: cover;
44
+ }
45
+
46
+ /* A component that sets its display still honours the hidden attribute on its root. */
47
+ }
@@ -0,0 +1,91 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.1. Do not edit. */
2
+ @scope ([data-component~="ui-badge"]) to ([data-component], [data-slotted]) {
3
+ :scope {
4
+ --_badge-surface: var(--ui-surface-subtle);
5
+ --_badge-text: var(--ui-text-secondary);
6
+ --_badge-border: color-mix(in srgb, var(--ui-text-secondary) 30%, transparent);
7
+
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ max-width: 100%;
12
+ padding: var(--ui-badge-padding-block, var(--ui-space-0-5)) var(--ui-badge-padding-inline, var(--ui-space-2));
13
+ border: 1px solid var(--ui-badge-border, var(--_badge-border));
14
+ border-radius: var(--ui-radius-round);
15
+ background: var(--ui-badge-surface, var(--_badge-surface));
16
+ color: var(--ui-badge-text, var(--_badge-text));
17
+ font-family: var(--ui-font-family-sans);
18
+ font-size: var(--ui-badge-font-size, var(--ui-font-size-sm));
19
+ font-weight: var(--ui-badge-font-weight, var(--ui-font-medium));
20
+ line-height: var(--ui-badge-line-height, var(--ui-line-height-tight));
21
+ white-space: nowrap;
22
+ }
23
+
24
+ :scope[data-ui-badge-state~="tone=accent"] {
25
+ --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
26
+ --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
27
+ --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
28
+ }
29
+
30
+ :scope[data-ui-badge-state~="tone=danger"] {
31
+ --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
32
+ --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
33
+ --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
34
+ }
35
+
36
+ :scope[data-ui-badge-state~="tone=success"] {
37
+ --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
38
+ --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
39
+ --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
40
+ }
41
+
42
+ :scope[data-ui-badge-state~="tone=warning"] {
43
+ --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
44
+ --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
45
+ --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
46
+ }
47
+
48
+ :scope[data-ui-badge-state~="tone=info"] {
49
+ --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
50
+ --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
51
+ --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
52
+ }
53
+
54
+ :scope[data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"] {
55
+ --_badge-surface: var(--ui-accent-soft);
56
+ --_badge-border: var(--ui-accent-soft);
57
+ --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
58
+ }
59
+
60
+ :scope[data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"] {
61
+ --_badge-surface: var(--ui-danger-soft);
62
+ --_badge-border: var(--ui-danger-soft);
63
+ --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
64
+ }
65
+
66
+ :scope[data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"] {
67
+ --_badge-surface: var(--ui-success-soft);
68
+ --_badge-border: var(--ui-success-soft);
69
+ --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
70
+ }
71
+
72
+ :scope[data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"] {
73
+ --_badge-surface: var(--ui-warning-soft);
74
+ --_badge-border: var(--ui-warning-soft);
75
+ --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
76
+ }
77
+
78
+ :scope[data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"] {
79
+ --_badge-surface: var(--ui-info-soft);
80
+ --_badge-border: var(--ui-info-soft);
81
+ --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
82
+ }
83
+
84
+ /* A component that sets its display still honours the hidden attribute on its root. */
85
+ :scope[hidden] {
86
+ display: none;
87
+ }
88
+ }
89
+ @scope ([data-component~="ui-badge"]) to ([data-component]) {
90
+ /* A component that sets its display still honours the hidden attribute on its root. */
91
+ }
@@ -0,0 +1,236 @@
1
+ /* Generated by HTML Next 1.0.0-alpha.1. Do not edit. */
2
+ @scope ([data-component~="ui-button"]) to ([data-component], [data-slotted]) {
3
+ :scope {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ vertical-align: middle;
8
+ color: var(--ui-action-secondary-text, var(--ui-text-primary));
9
+ }
10
+
11
+ :scope[data-ui-button-state~="variant=solid"] {
12
+ color: var(--ui-action-primary-text, var(--ui-text-on-accent));
13
+ }
14
+
15
+ :scope {
16
+ appearance: none;
17
+ min-block-size: var(--ui-button-min-block-size, var(--ui-control-size-md, 2.5rem));
18
+ border: 1px solid var(--ui-button-border, var(--ui-border-strong));
19
+ border-radius: var(--ui-button-radius, var(--ui-radius-2));
20
+ background: var(--ui-button-surface, var(--ui-surface-elevated));
21
+ color: var(--ui-button-text, var(--ui-action-secondary-text, var(--ui-text-primary)));
22
+ font: inherit;
23
+ font-weight: var(--ui-font-medium, 500);
24
+ line-height: var(--ui-line-height-tight);
25
+ padding: var(--ui-space-2) var(--ui-space-3);
26
+ background-image: var(--ui-raised-highlight, none);
27
+ box-shadow: var(--ui-button-shadow, var(--ui-raised, var(--ui-shadow-xs)));
28
+ cursor: pointer;
29
+ transition:
30
+ background-color var(--ui-motion-fast) var(--ui-motion-ease),
31
+ border-color var(--ui-motion-fast) var(--ui-motion-ease),
32
+ color var(--ui-motion-fast) var(--ui-motion-ease),
33
+ box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
34
+ transform var(--ui-motion-fast) var(--ui-motion-ease);
35
+ margin: 0;
36
+ }
37
+
38
+ @supports (text-box-trim: trim-both) {
39
+ :scope {
40
+ text-box-trim: trim-both;
41
+ text-box-edge: cap alphabetic;
42
+ }
43
+ }
44
+
45
+ :scope[data-ui-button-state~="size=sm"] {
46
+ min-block-size: var(--ui-control-size-sm, 2rem);
47
+ padding: var(--ui-space-1) var(--ui-space-2);
48
+ font-size: 0.875rem;
49
+ }
50
+
51
+ :scope[data-ui-button-state~="size=lg"] {
52
+ min-block-size: var(--ui-control-size-lg, 3rem);
53
+ padding: var(--ui-space-3) var(--ui-space-4);
54
+ font-size: 1rem;
55
+ }
56
+
57
+ :scope:hover:enabled {
58
+ background: var(--ui-action-secondary-surface-hover, var(--ui-surface-muted));
59
+ border-color: var(--ui-control-border-hover, var(--ui-border-strong));
60
+ }
61
+
62
+ :scope:active:enabled {
63
+ background: var(--ui-surface-subtle);
64
+ }
65
+
66
+ :scope[data-ui-button-state~="variant=solid"] {
67
+ border-color: var(--ui-action-primary-surface, var(--ui-accent-solid));
68
+ background: var(--ui-action-primary-surface, var(--ui-accent-solid));
69
+ color: var(--ui-action-primary-text, var(--ui-text-on-accent));
70
+ box-shadow: var(--ui-button-solid-shadow, inset 0 1px rgb(255 255 255 / 0.16), var(--ui-shadow-xs));
71
+ }
72
+
73
+ :scope[data-ui-button-state~="variant=solid"]:hover:enabled {
74
+ background: var(--ui-action-primary-surface-hover, var(--ui-accent-hover));
75
+ border-color: var(--ui-action-primary-surface-hover, var(--ui-accent-hover));
76
+ box-shadow: var(--ui-shadow-sm);
77
+ transform: translateY(-1px);
78
+ }
79
+
80
+ :scope[data-ui-button-state~="variant=solid"]:active:enabled {
81
+ background: var(--ui-action-primary-surface-active, var(--ui-accent-active));
82
+ border-color: var(--ui-action-primary-surface-active, var(--ui-accent-active));
83
+ box-shadow: none;
84
+ transform: translateY(0);
85
+ }
86
+
87
+ :scope[data-ui-button-state~="variant=danger"] {
88
+ border-color: var(--ui-danger-solid);
89
+ background: var(--ui-danger-solid);
90
+ color: var(--ui-text-on-accent);
91
+ box-shadow: var(--ui-button-danger-shadow, inset 0 1px rgb(255 255 255 / 0.14), var(--ui-shadow-xs));
92
+ }
93
+
94
+ :scope[data-ui-button-state~="variant=danger"]:hover:enabled {
95
+ background: var(--ui-danger-hover);
96
+ border-color: var(--ui-danger-hover);
97
+ box-shadow: var(--ui-shadow-sm);
98
+ transform: translateY(-1px);
99
+ }
100
+
101
+ :scope[data-ui-button-state~="variant=danger"]:active:enabled {
102
+ box-shadow: none;
103
+ transform: translateY(0);
104
+ }
105
+
106
+ :scope[data-ui-button-state~="variant=ghost"] {
107
+ border-color: transparent;
108
+ background: transparent;
109
+ box-shadow: none;
110
+ color: var(--ui-button-ghost-text, var(--ui-action-secondary-text, var(--ui-text-primary)));
111
+ }
112
+
113
+ /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
114
+ :scope[data-ui-button-state~="variant=ghost"]:hover:enabled {
115
+ background: var(--ui-button-ghost-hover, color-mix(in srgb, currentColor 8%, transparent));
116
+ border-color: transparent;
117
+ }
118
+
119
+ :scope[data-ui-button-state~="variant=ghost"]:active:enabled {
120
+ background: var(--ui-button-ghost-active, color-mix(in srgb, currentColor 14%, transparent));
121
+ border-color: transparent;
122
+ }
123
+
124
+ /* A soft halo that transitions in with the other box-shadow changes, layered on the raised shadow. */
125
+ :scope:focus-visible {
126
+ outline: none;
127
+ box-shadow:
128
+ var(--ui-button-shadow, var(--ui-raised, var(--ui-shadow-xs))),
129
+ var(--ui-focus-halo);
130
+ }
131
+
132
+ :scope[data-ui-button-state~="variant=solid"]:focus-visible {
133
+ box-shadow:
134
+ var(--ui-button-solid-shadow, inset 0 1px rgb(255 255 255 / 0.16), var(--ui-shadow-xs)),
135
+ var(--ui-focus-halo);
136
+ }
137
+
138
+ /* Disabled colours fall back to each variant's own; ghost and link take only the text colour. */
139
+ :scope:disabled {
140
+ opacity: var(--ui-button-disabled-opacity, 0.6);
141
+ cursor: not-allowed;
142
+ border-color: var(--ui-button-disabled-border, var(--ui-button-border, var(--ui-border-strong)));
143
+ background-color: var(--ui-button-disabled-surface, var(--ui-button-surface, var(--ui-surface-elevated)));
144
+ color: var(--ui-button-disabled-text, var(--ui-button-text, var(--ui-action-secondary-text, var(--ui-text-primary))));
145
+ }
146
+
147
+ :scope[data-ui-button-state~="variant=solid"]:disabled {
148
+ border-color: var(--ui-button-disabled-border, var(--ui-action-primary-surface, var(--ui-accent-solid)));
149
+ background-color: var(--ui-button-disabled-surface, var(--ui-action-primary-surface, var(--ui-accent-solid)));
150
+ color: var(--ui-button-disabled-text, var(--ui-action-primary-text, var(--ui-text-on-accent)));
151
+ }
152
+
153
+ :scope[data-ui-button-state~="variant=danger"]:disabled {
154
+ border-color: var(--ui-button-disabled-border, var(--ui-danger-solid));
155
+ background-color: var(--ui-button-disabled-surface, var(--ui-danger-solid));
156
+ color: var(--ui-button-disabled-text, var(--ui-text-on-accent));
157
+ }
158
+
159
+ :scope[data-ui-button-state~="variant=ghost"]:disabled {
160
+ border-color: transparent;
161
+ background-color: transparent;
162
+ color: var(--ui-button-disabled-text, var(--ui-button-ghost-text, var(--ui-action-secondary-text, var(--ui-text-primary))));
163
+ }
164
+
165
+ @media (pointer: coarse) {
166
+ :scope {
167
+ min-block-size: var(--ui-control-min-block-size, 2.75rem);
168
+ }
169
+ }
170
+
171
+ /* Link: an inline text action. No box, padding, or minimum height (inline targets are exempt under
172
+ WCAG 2.5.8); the inherited font; an underline that strengthens on hover; a visible focus ring. */
173
+ :scope[data-ui-button-state~="variant=link"] {
174
+ display: inline;
175
+ min-block-size: 0;
176
+ padding: 0;
177
+ border: 0;
178
+ border-radius: var(--ui-radius-sm, 4px);
179
+ background: none;
180
+ box-shadow: none;
181
+ font: inherit;
182
+ color: var(--ui-button-link-color, var(--ui-text-secondary));
183
+ text-decoration-line: underline;
184
+ text-decoration-thickness: 1px;
185
+ text-decoration-color: color-mix(in srgb, currentColor 40%, transparent);
186
+ text-underline-offset: 0.2em;
187
+ transition: color var(--ui-motion-fast) var(--ui-motion-ease), text-decoration-color var(--ui-motion-fast) var(--ui-motion-ease);
188
+ }
189
+
190
+ :scope[data-ui-button-state~="variant=link"]:hover:enabled {
191
+ color: var(--ui-button-link-hover-color, var(--ui-text-primary));
192
+ text-decoration-color: currentColor;
193
+ background: none;
194
+ transform: none;
195
+ }
196
+
197
+ :scope[data-ui-button-state~="variant=link"]:active:enabled {
198
+ background: none;
199
+ transform: none;
200
+ }
201
+
202
+ :scope[data-ui-button-state~="variant=link"]:disabled {
203
+ background: none;
204
+ color: var(--ui-button-disabled-text, var(--ui-button-link-color, var(--ui-text-secondary)));
205
+ }
206
+
207
+ :scope[data-ui-button-state~="variant=link"]:focus-visible {
208
+ box-shadow: none;
209
+ /* Fallback keeps the ring if the token is missing: an unresolved var() would void the outline. */
210
+ outline: 2px solid var(--ui-focus-ring, currentColor);
211
+ outline-offset: 2px;
212
+ }
213
+
214
+ /* A component that sets its display still honours the hidden attribute on its root. */
215
+ :scope[hidden] {
216
+ display: none;
217
+ }
218
+ }
219
+ @scope ([data-component~="ui-button"]) to ([data-component]) {
220
+ @supports (text-box-trim: trim-both) {
221
+ }
222
+
223
+ /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
224
+
225
+ /* A soft halo that transitions in with the other box-shadow changes, layered on the raised shadow. */
226
+
227
+ /* Disabled colours fall back to each variant's own; ghost and link take only the text colour. */
228
+
229
+ @media (pointer: coarse) {
230
+ }
231
+
232
+ /* Link: an inline text action. No box, padding, or minimum height (inline targets are exempt under
233
+ WCAG 2.5.8); the inherited font; an underline that strengthens on hover; a visible focus ring. */
234
+
235
+ /* A component that sets its display still honours the hidden attribute on its root. */
236
+ }