@threadlabs/looma 0.14.8 → 0.15.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 (336) hide show
  1. package/components/shared/icons.js +5 -0
  2. package/components/shared/menu-navigation.js +49 -0
  3. package/components/shared/overlay.js +33 -60
  4. package/components/ui-avatar/ui-avatar.html +19 -2
  5. package/components/ui-avatar/ui-avatar.js +7 -1
  6. package/components/ui-avatar-group/ui-avatar-group.html +8 -3
  7. package/components/ui-avatar-group/ui-avatar-group.js +6 -2
  8. package/components/ui-badge/ui-badge.html +70 -4
  9. package/components/ui-button/ui-button.html +21 -5
  10. package/components/ui-button/ui-button.js +10 -0
  11. package/components/ui-callout/ui-callout.html +13 -5
  12. package/components/ui-checkbox/ui-checkbox.html +11 -0
  13. package/components/ui-combobox/ui-combobox.html +46 -10
  14. package/components/ui-combobox/ui-combobox.js +5 -5
  15. package/components/ui-context-menu/ui-context-menu.html +33 -5
  16. package/components/ui-context-menu/ui-context-menu.js +26 -17
  17. package/components/ui-dialog/ui-dialog.html +51 -8
  18. package/components/ui-dialog/ui-dialog.js +28 -7
  19. package/components/ui-disclosure/ui-disclosure.html +14 -5
  20. package/components/ui-disclosure/ui-disclosure.js +51 -4
  21. package/components/ui-editable/ui-editable.html +17 -3
  22. package/components/ui-editable/ui-editable.js +7 -0
  23. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +48 -14
  24. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.js +40 -6
  25. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +22 -9
  26. package/components/ui-editor-mention-menu/ui-editor-mention-menu.js +33 -11
  27. package/components/ui-editor-mention-menu-item/ui-editor-mention-menu-item.html +67 -0
  28. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +33 -30
  29. package/components/ui-editor-slash-menu/ui-editor-slash-menu.js +42 -8
  30. package/components/ui-editor-slash-menu-group/ui-editor-slash-menu-group.html +31 -0
  31. package/components/ui-editor-slash-menu-item/ui-editor-slash-menu-item.html +75 -0
  32. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +16 -5
  33. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.js +10 -2
  34. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +5 -5
  35. package/components/ui-editor-table-overlay/ui-editor-table-overlay.js +5 -2
  36. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +14 -4
  37. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.js +2 -2
  38. package/components/ui-editor-toolbar/ui-editor-toolbar.html +1 -1
  39. package/components/ui-editor-toolbar/ui-editor-toolbar.js +46 -0
  40. package/components/ui-floating-action-button/ui-floating-action-button.html +1 -1
  41. package/components/ui-form-field/ui-form-field.html +16 -3
  42. package/components/ui-form-field/ui-form-field.js +1 -1
  43. package/components/ui-grid/ui-grid.html +17 -2
  44. package/components/ui-icon/ui-icon.html +5 -0
  45. package/components/ui-icon-button/ui-icon-button.html +25 -6
  46. package/components/ui-icon-button/ui-icon-button.js +11 -1
  47. package/components/ui-input/ui-input.html +3 -3
  48. package/components/ui-input-group/ui-input-group.html +18 -4
  49. package/components/ui-listbox/ui-listbox.html +81 -0
  50. package/components/ui-listbox/ui-listbox.js +27 -0
  51. package/components/ui-menu/ui-menu.html +33 -5
  52. package/components/ui-menu/ui-menu.js +18 -12
  53. package/components/ui-menu-group/ui-menu-group.html +27 -0
  54. package/components/ui-menu-item/ui-menu-item.html +80 -8
  55. package/components/ui-menu-item/ui-menu-item.js +47 -0
  56. package/components/ui-popover/ui-popover.html +33 -5
  57. package/components/ui-popover/ui-popover.js +9 -1
  58. package/components/ui-radio-group/ui-radio-group.html +13 -1
  59. package/components/ui-search-shell/ui-search-shell.html +6 -6
  60. package/components/ui-search-shell/ui-search-shell.js +21 -5
  61. package/components/ui-select/ui-select.html +14 -4
  62. package/components/ui-switch/ui-switch.html +2 -2
  63. package/components/ui-switcher/ui-switcher.html +8 -1
  64. package/components/ui-switcher/ui-switcher.js +15 -0
  65. package/components/ui-tabs/ui-tabs.html +17 -12
  66. package/components/ui-tabs/ui-tabs.js +43 -7
  67. package/components/ui-textarea/ui-textarea.html +28 -5
  68. package/components/ui-toast/ui-toast.html +88 -0
  69. package/components/ui-toast/ui-toast.js +68 -0
  70. package/components/ui-toast-region/ui-toast-region.html +102 -19
  71. package/components/ui-toast-region/ui-toast-region.js +10 -18
  72. package/components/ui-tooltip/ui-tooltip.html +51 -7
  73. package/components/ui-tooltip/ui-tooltip.js +29 -3
  74. package/components/ui-tree/ui-tree.html +12 -0
  75. package/components/ui-tree/ui-tree.js +191 -12
  76. package/components/ui-tree-item/ui-tree-item.html +87 -8
  77. package/components/ui-tree-item/ui-tree-item.js +3 -1
  78. package/dist/index.js +38 -32
  79. package/editor/chunks/extensions.js +82 -2
  80. package/editor/extensions/table-commands.d.ts +8 -0
  81. package/editor/icons.d.ts +5 -0
  82. package/editor/index.js +7 -2
  83. package/editor/insert-table-grid.d.ts +1 -1
  84. package/editor/mention-menu.d.ts +2 -0
  85. package/editor/slash-menu.d.ts +3 -0
  86. package/editor/table-context-menu.d.ts +1 -1
  87. package/editor/table-overlay.d.ts +2 -2
  88. package/package.json +1 -1
  89. package/styles/ui-avatar-group.css +1 -2
  90. package/styles/ui-avatar.css +11 -1
  91. package/styles/ui-badge.css +73 -1
  92. package/styles/ui-button.css +9 -1
  93. package/styles/ui-callout.css +1 -1
  94. package/styles/ui-checkbox.css +9 -0
  95. package/styles/ui-combobox.css +38 -7
  96. package/styles/ui-context-menu.css +32 -4
  97. package/styles/ui-dialog.css +42 -5
  98. package/styles/ui-editor-insert-table-grid.css +48 -11
  99. package/styles/ui-editor-mention-menu-item.css +57 -0
  100. package/styles/ui-editor-mention-menu.css +11 -1
  101. package/styles/ui-editor-slash-menu-group.css +21 -0
  102. package/styles/ui-editor-slash-menu-item.css +62 -0
  103. package/styles/ui-editor-slash-menu.css +10 -21
  104. package/styles/ui-editor-table-context-menu.css +1 -1
  105. package/styles/ui-floating-action-button.css +1 -1
  106. package/styles/ui-form-field.css +14 -1
  107. package/styles/ui-grid.css +14 -1
  108. package/styles/ui-icon-button.css +17 -5
  109. package/styles/ui-input-group.css +18 -4
  110. package/styles/ui-input.css +3 -3
  111. package/styles/ui-listbox.css +69 -0
  112. package/styles/ui-menu-group.css +19 -0
  113. package/styles/ui-menu-item.css +48 -9
  114. package/styles/ui-menu.css +32 -4
  115. package/styles/ui-popover.css +28 -4
  116. package/styles/ui-radio-group.css +9 -0
  117. package/styles/ui-search-shell.css +5 -5
  118. package/styles/ui-select.css +14 -4
  119. package/styles/ui-switch.css +2 -2
  120. package/styles/ui-switcher.css +4 -0
  121. package/styles/ui-textarea.css +27 -4
  122. package/styles/ui-toast-region.css +88 -4
  123. package/styles/ui-toast.css +74 -0
  124. package/styles/ui-tooltip.css +46 -6
  125. package/styles/ui-tree-item.css +72 -4
  126. package/styles/ui-tree.css +8 -0
  127. package/tokens.css +3 -0
  128. package/vanilla/UiAvatar.d.ts +2 -0
  129. package/vanilla/UiAvatar.js +8 -1
  130. package/vanilla/UiAvatarGroup.d.ts +2 -0
  131. package/vanilla/UiAvatarGroup.js +1 -1
  132. package/vanilla/UiBadge.d.ts +1 -1
  133. package/vanilla/UiBadge.js +1 -1
  134. package/vanilla/UiButton.d.ts +1 -0
  135. package/vanilla/UiButton.js +22 -6
  136. package/vanilla/UiCallout.d.ts +1 -1
  137. package/vanilla/UiCallout.js +1 -1
  138. package/vanilla/UiCheckbox.d.ts +1 -0
  139. package/vanilla/UiCheckbox.js +12 -9
  140. package/vanilla/UiCombobox.d.ts +3 -0
  141. package/vanilla/UiCombobox.js +30 -15
  142. package/vanilla/UiContextMenu.d.ts +1 -1
  143. package/vanilla/UiContextMenu.js +1 -1
  144. package/vanilla/UiDialog.d.ts +5 -2
  145. package/vanilla/UiDialog.js +1 -1
  146. package/vanilla/UiDisclosure.d.ts +2 -0
  147. package/vanilla/UiDisclosure.js +32 -18
  148. package/vanilla/UiEditable.d.ts +5 -0
  149. package/vanilla/UiEditable.js +7 -3
  150. package/vanilla/UiEditorInsertTableGrid.js +1 -6
  151. package/vanilla/UiEditorMentionMenu.d.ts +4 -2
  152. package/vanilla/UiEditorMentionMenu.js +49 -31
  153. package/vanilla/UiEditorMentionMenuItem.d.ts +16 -0
  154. package/vanilla/UiEditorMentionMenuItem.js +56 -0
  155. package/vanilla/UiEditorSlashMenu.d.ts +4 -3
  156. package/vanilla/UiEditorSlashMenu.js +59 -46
  157. package/vanilla/UiEditorSlashMenuGroup.d.ts +14 -0
  158. package/vanilla/UiEditorSlashMenuGroup.js +48 -0
  159. package/vanilla/UiEditorSlashMenuItem.d.ts +18 -0
  160. package/vanilla/UiEditorSlashMenuItem.js +57 -0
  161. package/vanilla/UiEditorTableContextMenu.d.ts +5 -2
  162. package/vanilla/UiEditorTableContextMenu.js +1 -2
  163. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  164. package/vanilla/UiEditorTableOverlay.js +5 -5
  165. package/vanilla/UiEditorTableToolbar.d.ts +4 -2
  166. package/vanilla/UiEditorTableToolbar.js +1 -2
  167. package/vanilla/UiEditorToolbar.js +2 -0
  168. package/vanilla/UiGrid.d.ts +1 -0
  169. package/vanilla/UiGrid.js +8 -7
  170. package/vanilla/UiIcon.js +1 -1
  171. package/vanilla/UiIconButton.d.ts +1 -0
  172. package/vanilla/UiIconButton.js +11 -2
  173. package/vanilla/UiListbox.d.ts +20 -0
  174. package/vanilla/UiListbox.js +45 -0
  175. package/vanilla/UiMenu.d.ts +1 -1
  176. package/vanilla/UiMenu.js +1 -1
  177. package/vanilla/UiMenuGroup.d.ts +14 -0
  178. package/vanilla/UiMenuGroup.js +35 -0
  179. package/vanilla/UiMenuItem.d.ts +5 -1
  180. package/vanilla/UiMenuItem.js +91 -30
  181. package/vanilla/UiPopover.d.ts +1 -1
  182. package/vanilla/UiPopover.js +1 -1
  183. package/vanilla/UiRadioGroup.d.ts +1 -0
  184. package/vanilla/UiRadioGroup.js +6 -3
  185. package/vanilla/UiSwitcher.d.ts +1 -0
  186. package/vanilla/UiSwitcher.js +7 -9
  187. package/vanilla/UiTabs.d.ts +1 -0
  188. package/vanilla/UiTabs.js +9 -1
  189. package/vanilla/UiTextarea.d.ts +1 -0
  190. package/vanilla/UiTextarea.js +4 -1
  191. package/vanilla/UiToast.d.ts +16 -0
  192. package/vanilla/UiToast.js +53 -0
  193. package/vanilla/UiToastRegion.d.ts +1 -4
  194. package/vanilla/UiToastRegion.js +3 -11
  195. package/vanilla/UiTooltip.d.ts +1 -1
  196. package/vanilla/UiTooltip.js +1 -1
  197. package/vanilla/UiTree.d.ts +2 -0
  198. package/vanilla/UiTree.js +1 -1
  199. package/vanilla/UiTreeItem.d.ts +1 -0
  200. package/vanilla/UiTreeItem.js +45 -31
  201. package/vanilla/index.js +6 -0
  202. package/vue/UiAvatar.d.ts +4 -0
  203. package/vue/UiAvatar.vue +23 -3
  204. package/vue/UiAvatarGroup.d.ts +3 -0
  205. package/vue/UiAvatarGroup.vue +7 -4
  206. package/vue/UiBadge.d.ts +2 -2
  207. package/vue/UiBadge.vue +74 -2
  208. package/vue/UiButton.d.ts +5 -3
  209. package/vue/UiButton.vue +41 -7
  210. package/vue/UiCallout.d.ts +2 -2
  211. package/vue/UiCallout.vue +3 -2
  212. package/vue/UiCheckbox.d.ts +2 -0
  213. package/vue/UiCheckbox.vue +16 -0
  214. package/vue/UiCombobox.d.ts +11 -3
  215. package/vue/UiCombobox.vue +60 -11
  216. package/vue/UiContextMenu.d.ts +2 -0
  217. package/vue/UiContextMenu.vue +47 -6
  218. package/vue/UiDialog.d.ts +18 -4
  219. package/vue/UiDialog.vue +86 -11
  220. package/vue/UiDisclosure.d.ts +8 -2
  221. package/vue/UiDisclosure.vue +38 -14
  222. package/vue/UiEditable.d.ts +10 -0
  223. package/vue/UiEditable.vue +14 -2
  224. package/vue/UiEditorInsertTableGrid.vue +52 -15
  225. package/vue/UiEditorMentionMenu.d.ts +24 -2
  226. package/vue/UiEditorMentionMenu.vue +27 -11
  227. package/vue/UiEditorMentionMenuItem.d.ts +24 -0
  228. package/vue/UiEditorMentionMenuItem.js +2 -0
  229. package/vue/UiEditorMentionMenuItem.vue +88 -0
  230. package/vue/UiEditorSlashMenu.d.ts +24 -1
  231. package/vue/UiEditorSlashMenu.vue +33 -33
  232. package/vue/UiEditorSlashMenuGroup.d.ts +18 -0
  233. package/vue/UiEditorSlashMenuGroup.js +2 -0
  234. package/vue/UiEditorSlashMenuGroup.vue +43 -0
  235. package/vue/UiEditorSlashMenuItem.d.ts +26 -0
  236. package/vue/UiEditorSlashMenuItem.js +2 -0
  237. package/vue/UiEditorSlashMenuItem.vue +101 -0
  238. package/vue/UiEditorTableContextMenu.d.ts +9 -3
  239. package/vue/UiEditorTableContextMenu.vue +53 -3
  240. package/vue/UiEditorTableOverlay.d.ts +2 -2
  241. package/vue/UiEditorTableOverlay.vue +8 -6
  242. package/vue/UiEditorTableToolbar.d.ts +7 -3
  243. package/vue/UiEditorTableToolbar.vue +50 -2
  244. package/vue/UiEditorToolbar.vue +14 -1
  245. package/vue/UiFloatingActionButton.vue +1 -1
  246. package/vue/UiFormField.vue +28 -3
  247. package/vue/UiGrid.d.ts +1 -0
  248. package/vue/UiGrid.vue +26 -2
  249. package/vue/UiIcon.vue +16 -0
  250. package/vue/UiIconButton.d.ts +5 -3
  251. package/vue/UiIconButton.vue +40 -6
  252. package/vue/UiInput.vue +10 -3
  253. package/vue/UiInputGroup.vue +32 -11
  254. package/vue/UiListbox.d.ts +33 -0
  255. package/vue/UiListbox.js +2 -0
  256. package/vue/UiListbox.vue +131 -0
  257. package/vue/UiMenu.d.ts +2 -0
  258. package/vue/UiMenu.vue +43 -6
  259. package/vue/UiMenuGroup.d.ts +18 -0
  260. package/vue/UiMenuGroup.js +2 -0
  261. package/vue/UiMenuGroup.vue +39 -0
  262. package/vue/UiMenuItem.d.ts +34 -2
  263. package/vue/UiMenuItem.vue +145 -9
  264. package/vue/UiPopover.d.ts +2 -2
  265. package/vue/UiPopover.vue +44 -5
  266. package/vue/UiRadioGroup.d.ts +2 -0
  267. package/vue/UiRadioGroup.vue +17 -0
  268. package/vue/UiSearchShell.vue +12 -5
  269. package/vue/UiSelect.vue +18 -4
  270. package/vue/UiSwitch.vue +2 -2
  271. package/vue/UiSwitcher.d.ts +1 -0
  272. package/vue/UiSwitcher.vue +22 -1
  273. package/vue/UiTabs.d.ts +6 -2
  274. package/vue/UiTabs.vue +14 -12
  275. package/vue/UiTextarea.d.ts +2 -0
  276. package/vue/UiTextarea.vue +32 -4
  277. package/vue/UiToast.d.ts +34 -0
  278. package/vue/UiToast.js +2 -0
  279. package/vue/UiToast.vue +173 -0
  280. package/vue/UiToastRegion.d.ts +2 -18
  281. package/vue/UiToastRegion.vue +123 -48
  282. package/vue/UiTooltip.d.ts +2 -2
  283. package/vue/UiTooltip.vue +67 -12
  284. package/vue/UiTree.d.ts +10 -0
  285. package/vue/UiTree.vue +27 -0
  286. package/vue/UiTreeItem.d.ts +2 -0
  287. package/vue/UiTreeItem.vue +96 -4
  288. package/vue/chunks/UiAvatar.js +19 -5
  289. package/vue/chunks/UiAvatarGroup.js +10 -4
  290. package/vue/chunks/UiBadge.js +1 -1
  291. package/vue/chunks/UiButton.js +58 -11
  292. package/vue/chunks/UiCallout.js +2 -2
  293. package/vue/chunks/UiCheckbox.js +12 -2
  294. package/vue/chunks/UiCombobox.js +29 -13
  295. package/vue/chunks/UiContextMenu.js +6 -2
  296. package/vue/chunks/UiDialog.js +25 -8
  297. package/vue/chunks/UiDisclosure.js +36 -12
  298. package/vue/chunks/UiEditable.js +22 -8
  299. package/vue/chunks/UiEditorInsertTableGrid.js +11 -14
  300. package/vue/chunks/UiEditorMentionMenu.js +30 -19
  301. package/vue/chunks/UiEditorMentionMenuItem.js +36 -0
  302. package/vue/chunks/UiEditorSlashMenu.js +33 -35
  303. package/vue/chunks/UiEditorSlashMenuGroup.js +26 -0
  304. package/vue/chunks/UiEditorSlashMenuItem.js +51 -0
  305. package/vue/chunks/UiEditorTableContextMenu.js +39 -5
  306. package/vue/chunks/UiEditorTableOverlay.js +6 -6
  307. package/vue/chunks/UiEditorTableToolbar.js +37 -4
  308. package/vue/chunks/UiEditorToolbar.js +18 -4
  309. package/vue/chunks/UiFloatingActionButton.js +1 -1
  310. package/vue/chunks/UiFormField.js +13 -9
  311. package/vue/chunks/UiGrid.js +6 -2
  312. package/vue/chunks/UiIcon.js +40 -2
  313. package/vue/chunks/UiIconButton.js +35 -4
  314. package/vue/chunks/UiInput.js +1 -1
  315. package/vue/chunks/UiInputGroup.js +1 -1
  316. package/vue/chunks/UiListbox.js +70 -0
  317. package/vue/chunks/UiMenu.js +6 -2
  318. package/vue/chunks/UiMenuGroup.js +25 -0
  319. package/vue/chunks/UiMenuItem.js +128 -7
  320. package/vue/chunks/UiPopover.js +1 -1
  321. package/vue/chunks/UiRadioGroup.js +8 -2
  322. package/vue/chunks/UiSearchShell.js +1 -1
  323. package/vue/chunks/UiSelect.js +1 -1
  324. package/vue/chunks/UiSwitch.js +1 -1
  325. package/vue/chunks/UiSwitcher.js +20 -3
  326. package/vue/chunks/UiTabs.js +4 -3
  327. package/vue/chunks/UiTextarea.js +7 -2
  328. package/vue/chunks/UiToast.js +81 -0
  329. package/vue/chunks/UiToastRegion.js +25 -49
  330. package/vue/chunks/UiTooltip.js +3 -7
  331. package/vue/chunks/UiTree.js +8 -4
  332. package/vue/chunks/UiTreeItem.js +28 -10
  333. package/vue/components.css +1840 -851
  334. package/vue/editor/index.js +263 -2
  335. package/vue/index.d.ts +6 -0
  336. package/vue/index.js +9 -3
@@ -9,6 +9,7 @@ type __VLS_Slots = {} & {
9
9
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
10
  select: (detail: {
11
11
  readonly value: string;
12
+ readonly checked?: boolean;
12
13
  readonly trigger: "keyboard" | "pointer" | "programmatic";
13
14
  }) => any;
14
15
  close: (detail: {
@@ -25,6 +26,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
25
26
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
26
27
  onSelect?: ((detail: {
27
28
  readonly value: string;
29
+ readonly checked?: boolean;
28
30
  readonly trigger: "keyboard" | "pointer" | "programmatic";
29
31
  }) => any) | undefined;
30
32
  onClose?: ((detail: {
@@ -33,7 +33,11 @@ const emit = defineEmits<{
33
33
  },
34
34
  ]
35
35
  select: [
36
- detail: { readonly value: string; readonly trigger: 'keyboard' | 'pointer' | 'programmatic' },
36
+ detail: {
37
+ readonly value: string
38
+ readonly checked?: boolean
39
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
40
+ },
37
41
  ]
38
42
  }>()
39
43
 
@@ -55,10 +59,12 @@ const isOpenDetail = (detail: unknown): boolean =>
55
59
  const isSelectDetail = (detail: unknown): boolean =>
56
60
  detail !== null && typeof detail === 'object' && !Array.isArray(detail)
57
61
  && typeof (detail as Record<string, unknown>)['value'] === 'string'
62
+ && ((detail as Record<string, unknown>)['checked'] === undefined
63
+ || typeof (detail as Record<string, unknown>)['checked'] === 'boolean')
58
64
  && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
59
65
  || (detail as Record<string, unknown>)['trigger'] === 'pointer'
60
66
  || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
61
- && Object.keys(detail as object).every((key) => ['value', 'trigger'].includes(key))
67
+ && Object.keys(detail as object).every((key) => ['value', 'checked', 'trigger'].includes(key))
62
68
  const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
63
69
  checks: {
64
70
  open: isOpenDetail,
@@ -90,6 +96,22 @@ useComponentHost(controllerModule.default, {
90
96
 
91
97
  <style scoped>
92
98
  /* This component's hooks style the element they are set on, and never a nested one. */
99
+ @property --ui-context-menu-surface {
100
+ syntax: "*";
101
+ inherits: false;
102
+ }
103
+ @property --ui-context-menu-border {
104
+ syntax: "*";
105
+ inherits: false;
106
+ }
107
+ @property --ui-context-menu-radius {
108
+ syntax: "*";
109
+ inherits: false;
110
+ }
111
+ @property --ui-context-menu-shadow {
112
+ syntax: "*";
113
+ inherits: false;
114
+ }
93
115
  @property --ui-context-menu-z-index {
94
116
  syntax: "*";
95
117
  inherits: false;
@@ -97,6 +119,10 @@ useComponentHost(controllerModule.default, {
97
119
 
98
120
  [data-component~="ui-context-menu"] {
99
121
  /* Hooks do not inherit, so the parts below read them from the root. */
122
+ --_ui-context-menu-surface: var(--ui-context-menu-surface);
123
+ --_ui-context-menu-border: var(--ui-context-menu-border);
124
+ --_ui-context-menu-radius: var(--ui-context-menu-radius);
125
+ --_ui-context-menu-shadow: var(--ui-context-menu-shadow);
100
126
  --_ui-context-menu-z-index: var(--ui-context-menu-z-index);
101
127
 
102
128
  display: contents;
@@ -110,10 +136,17 @@ useComponentHost(controllerModule.default, {
110
136
  flex-direction: column;
111
137
  box-sizing: border-box;
112
138
  padding: var(--ui-space-1);
113
- background: var(--ui-surface-elevated);
114
- border: 1px solid var(--ui-border-default);
115
- border-radius: var(--ui-radius-lg);
116
- box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
139
+ background: var(
140
+ --_ui-context-menu-surface,
141
+ var(--ui-overlay-surface, var(--ui-surface-elevated))
142
+ );
143
+ border: 1px solid
144
+ var(--_ui-context-menu-border, var(--ui-overlay-border, var(--ui-border-default)));
145
+ border-radius: var(--_ui-context-menu-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
146
+ box-shadow: var(
147
+ --_ui-context-menu-shadow,
148
+ var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))
149
+ );
117
150
  outline: 0;
118
151
  overflow: auto;
119
152
  z-index: var(--_ui-context-menu-z-index, 1000);
@@ -127,6 +160,14 @@ useComponentHost(controllerModule.default, {
127
160
  overlay var(--ui-motion-fast) allow-discrete;
128
161
  }
129
162
 
163
+ .menu hr {
164
+ align-self: stretch;
165
+ block-size: 0;
166
+ margin: var(--ui-space-1) 0;
167
+ border: 0;
168
+ border-block-start: 1px solid var(--ui-border-default);
169
+ }
170
+
130
171
  .menu:popover-open {
131
172
  opacity: 1;
132
173
  transform: translateY(0) scale(1);
package/vue/UiDialog.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  type __VLS_Props = {
2
- dismissible?: boolean;
2
+ alert?: boolean;
3
+ closedby?: 'any' | 'closerequest' | 'none';
3
4
  for?: string;
4
5
  label?: string;
5
- modal?: boolean;
6
+ modeless?: boolean;
6
7
  open?: boolean;
8
+ size?: 'sm' | 'md' | 'lg' | 'fullscreen';
7
9
  };
8
10
  declare var __VLS_1: {}, __VLS_3: {};
9
11
  type __VLS_Slots = {} & {
@@ -17,6 +19,11 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
17
19
  readonly reason: "action" | "programmatic" | "light-dismiss" | "escape";
18
20
  readonly trigger: "keyboard" | "pointer" | "programmatic";
19
21
  }) => any;
22
+ open: (detail: {
23
+ readonly open: boolean;
24
+ readonly reason: "action" | "programmatic";
25
+ readonly trigger: "keyboard" | "pointer" | "programmatic";
26
+ }) => any;
20
27
  "update:open": (value: boolean) => any;
21
28
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
22
29
  onClose?: ((detail: {
@@ -24,12 +31,19 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
24
31
  readonly reason: "action" | "programmatic" | "light-dismiss" | "escape";
25
32
  readonly trigger: "keyboard" | "pointer" | "programmatic";
26
33
  }) => any) | undefined;
34
+ onOpen?: ((detail: {
35
+ readonly open: boolean;
36
+ readonly reason: "action" | "programmatic";
37
+ readonly trigger: "keyboard" | "pointer" | "programmatic";
38
+ }) => any) | undefined;
27
39
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
28
40
  }>, {
41
+ size: "sm" | "md" | "lg" | "fullscreen";
29
42
  for: string;
30
43
  open: boolean;
31
- dismissible: boolean;
32
- modal: boolean;
44
+ alert: boolean;
45
+ closedby: "any" | "closerequest" | "none";
46
+ modeless: boolean;
33
47
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
34
48
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
35
49
  declare const _default: typeof __VLS_export;
package/vue/UiDialog.vue CHANGED
@@ -1,6 +1,6 @@
1
1
  <!-- Generated by HTML Next 1.0.0-alpha.7 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { ref, useTemplateRef } from 'vue'
3
+ import { computed, ref, useTemplateRef } from 'vue'
4
4
  import * as controllerModule from '../components/ui-dialog/ui-dialog.js'
5
5
  import { createDispatch, useComponentHost } from './host'
6
6
 
@@ -8,21 +8,32 @@ defineOptions({ inheritAttrs: false })
8
8
 
9
9
  const props = withDefaults(
10
10
  defineProps<{
11
- dismissible?: boolean
11
+ alert?: boolean
12
+ closedby?: 'any' | 'closerequest' | 'none'
12
13
  for?: string
13
14
  label?: string
14
- modal?: boolean
15
+ modeless?: boolean
15
16
  open?: boolean
17
+ size?: 'sm' | 'md' | 'lg' | 'fullscreen'
16
18
  }>(),
17
19
  {
18
- dismissible: false,
20
+ alert: false,
21
+ closedby: 'closerequest',
19
22
  for: '',
20
- modal: false,
23
+ modeless: false,
21
24
  open: false,
25
+ size: 'md',
22
26
  },
23
27
  )
24
28
  const emit = defineEmits<{
25
29
  'update:open': [value: boolean]
30
+ open: [
31
+ detail: {
32
+ readonly open: boolean
33
+ readonly reason: 'action' | 'programmatic'
34
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
35
+ },
36
+ ]
26
37
  close: [
27
38
  detail: {
28
39
  readonly open: boolean
@@ -37,6 +48,23 @@ const closeElement = useTemplateRef<HTMLElement>('close')
37
48
  const internalOpen = ref(false)
38
49
  const accessibleLabel = ref('Dialog')
39
50
 
51
+ /** The values the styles' :host-state() rules test. */
52
+ const hostState = computed(() =>
53
+ [
54
+ props.size && `size size=${props.size}`,
55
+ props.alert && 'alert',
56
+ ].filter(Boolean).join(' ')
57
+ )
58
+
59
+ const isOpenDetail = (detail: unknown): boolean =>
60
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
61
+ && typeof (detail as Record<string, unknown>)['open'] === 'boolean'
62
+ && ((detail as Record<string, unknown>)['reason'] === 'action'
63
+ || (detail as Record<string, unknown>)['reason'] === 'programmatic')
64
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
65
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
66
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
67
+ && Object.keys(detail as object).every((key) => ['open', 'reason', 'trigger'].includes(key))
40
68
  const isCloseDetail = (detail: unknown): boolean =>
41
69
  detail !== null && typeof detail === 'object' && !Array.isArray(detail)
42
70
  && typeof (detail as Record<string, unknown>)['open'] === 'boolean'
@@ -50,6 +78,7 @@ const isCloseDetail = (detail: unknown): boolean =>
50
78
  && Object.keys(detail as object).every((key) => ['open', 'reason', 'trigger'].includes(key))
51
79
  const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
52
80
  checks: {
81
+ open: isOpenDetail,
53
82
  close: isCloseDetail,
54
83
  },
55
84
  modeled: ['open'],
@@ -65,7 +94,13 @@ useComponentHost(controllerModule.default, {
65
94
  </script>
66
95
 
67
96
  <template>
68
- <dialog data-component="ui-dialog" v-bind="$attrs" :aria-label="accessibleLabel" ref="root">
97
+ <dialog
98
+ data-component="ui-dialog"
99
+ v-bind="$attrs"
100
+ :aria-label="accessibleLabel"
101
+ :data-ui-dialog-state="hostState || undefined"
102
+ ref="root"
103
+ >
69
104
  <header>
70
105
  <h2 v-if="label" class="title">{{ label }}</h2>
71
106
  <button class="close" type="button" aria-label="Close" ref="close"></button>
@@ -81,6 +116,22 @@ useComponentHost(controllerModule.default, {
81
116
  syntax: "*";
82
117
  inherits: false;
83
118
  }
119
+ @property --ui-dialog-surface {
120
+ syntax: "*";
121
+ inherits: false;
122
+ }
123
+ @property --ui-dialog-border {
124
+ syntax: "*";
125
+ inherits: false;
126
+ }
127
+ @property --ui-dialog-radius {
128
+ syntax: "*";
129
+ inherits: false;
130
+ }
131
+ @property --ui-dialog-shadow {
132
+ syntax: "*";
133
+ inherits: false;
134
+ }
84
135
  @property --ui-dialog-max-width {
85
136
  syntax: "*";
86
137
  inherits: false;
@@ -99,7 +150,7 @@ useComponentHost(controllerModule.default, {
99
150
  box-sizing: border-box;
100
151
  inline-size: min(
101
152
  calc(100% - var(--ui-dialog-viewport-gap, var(--ui-space-4)) * 2),
102
- var(--ui-dialog-max-width, 440px)
153
+ var(--ui-dialog-max-width, var(--_ui-dialog-size, 440px))
103
154
  );
104
155
  max-inline-size: none;
105
156
  max-block-size: calc(100dvh - var(--ui-dialog-viewport-gap, var(--ui-space-4)) * 2);
@@ -107,10 +158,13 @@ useComponentHost(controllerModule.default, {
107
158
  padding: 0;
108
159
  overflow: hidden;
109
160
  flex-direction: column;
110
- background: var(--ui-surface-elevated);
111
- border: 1px solid var(--ui-border-default);
112
- border-radius: var(--ui-radius-dialog);
113
- box-shadow: var(--ui-elevation-dialog, var(--ui-shadow-xl));
161
+ background: var(--ui-dialog-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
162
+ border: 1px solid var(--ui-dialog-border, var(--ui-overlay-border, var(--ui-border-default)));
163
+ border-radius: var(--ui-dialog-radius, var(--ui-overlay-radius, var(--ui-radius-dialog)));
164
+ box-shadow: var(
165
+ --ui-dialog-shadow,
166
+ var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)))
167
+ );
114
168
  visibility: hidden;
115
169
  pointer-events: none;
116
170
  opacity: 0;
@@ -132,6 +186,27 @@ useComponentHost(controllerModule.default, {
132
186
  animation: ui-dialog-enter var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
133
187
  }
134
188
 
189
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=sm"] {
190
+ --_ui-dialog-size: 360px;
191
+ }
192
+
193
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=lg"] {
194
+ --_ui-dialog-size: 640px;
195
+ }
196
+
197
+ [data-component~="ui-dialog"][data-ui-dialog-state~="size=fullscreen"] {
198
+ inset: 0;
199
+ inline-size: 100%;
200
+ block-size: 100dvh;
201
+ max-block-size: none;
202
+ margin: 0;
203
+ border-radius: var(--ui-dialog-radius, 0);
204
+ }
205
+
206
+ [data-component~="ui-dialog"][data-ui-dialog-state~="alert"] .close {
207
+ display: none;
208
+ }
209
+
135
210
  /* Header and actions stay pinned; only the body scrolls when content is long. */
136
211
  header {
137
212
  display: flex;
@@ -1,12 +1,16 @@
1
1
  type __VLS_Props = {
2
2
  density?: 'comfortable' | 'compact';
3
3
  disabled?: boolean;
4
+ headingLevel?: number;
5
+ name?: string;
4
6
  open?: boolean;
5
7
  summary?: string;
6
8
  };
7
- declare var __VLS_1: {};
9
+ declare var __VLS_1: {}, __VLS_3: {};
8
10
  type __VLS_Slots = {} & {
9
- default?: (props: typeof __VLS_1) => any;
11
+ summary?: (props: typeof __VLS_1) => any;
12
+ } & {
13
+ default?: (props: typeof __VLS_3) => any;
10
14
  };
11
15
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
12
16
  close: (detail: {
@@ -34,9 +38,11 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
34
38
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
35
39
  }>, {
36
40
  summary: string;
41
+ name: string;
37
42
  disabled: boolean;
38
43
  open: boolean;
39
44
  density: "comfortable" | "compact";
45
+ headingLevel: number;
40
46
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
41
47
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
42
48
  declare const _default: typeof __VLS_export;
@@ -10,12 +10,16 @@ const props = withDefaults(
10
10
  defineProps<{
11
11
  density?: 'comfortable' | 'compact'
12
12
  disabled?: boolean
13
+ headingLevel?: number
14
+ name?: string
13
15
  open?: boolean
14
16
  summary?: string
15
17
  }>(),
16
18
  {
17
19
  density: 'comfortable',
18
20
  disabled: false,
21
+ headingLevel: 0,
22
+ name: '',
19
23
  open: false,
20
24
  summary: 'Details',
21
25
  },
@@ -40,8 +44,11 @@ const emit = defineEmits<{
40
44
 
41
45
  const root = ref<HTMLElement | null>(null)
42
46
  const triggerElement = useTemplateRef<HTMLElement>('trigger')
47
+ const panelElement = useTemplateRef<HTMLElement>('panel')
43
48
  const internalOpen = ref(false)
44
49
  const contentId = ref('')
50
+ const headingRole = ref<any>(null)
51
+ const headingAriaLevel = ref<any>(null)
45
52
 
46
53
  /** The values the styles' :host-state() rules test. */
47
54
  const hostState = computed(() =>
@@ -74,9 +81,22 @@ useComponentHost(controllerModule.default, {
74
81
  root,
75
82
  dispatch,
76
83
  props,
77
- refs: { trigger: triggerElement },
78
- state: { internalOpen, contentId },
84
+ refs: { trigger: triggerElement, panel: panelElement },
85
+ state: { internalOpen, contentId, headingRole, headingAriaLevel },
79
86
  })
87
+
88
+ function text(value: unknown): string {
89
+ if (Array.isArray(value)) return value.map(text).join(' ')
90
+ return value === null || value === undefined || typeof value === 'object' ? '' : String(value)
91
+ }
92
+
93
+ function attribute(value: unknown): any {
94
+ if (
95
+ value === null || value === undefined || value === false
96
+ || (typeof value === 'object' && !Array.isArray(value))
97
+ ) return undefined
98
+ return value === true ? '' : text(value)
99
+ }
80
100
  </script>
81
101
 
82
102
  <template>
@@ -86,20 +106,24 @@ useComponentHost(controllerModule.default, {
86
106
  :data-ui-disclosure-state="hostState || undefined"
87
107
  ref="root"
88
108
  >
89
- <button
90
- class="trigger"
91
- type="button"
92
- :aria-controls="contentId"
93
- :aria-expanded="internalOpen"
94
- :disabled="disabled"
95
- ref="trigger"
109
+ <div
110
+ class="heading"
111
+ :role="attribute(headingRole)"
112
+ :aria-level="typeof headingAriaLevel === 'boolean' ? String(headingAriaLevel) : attribute(headingAriaLevel)"
96
113
  >
97
- <span>{{ summary }}</span>
98
- <span class="chevron" aria-hidden="true"></span>
99
- </button>
100
- <div class="panel" :id="contentId" :inert="!internalOpen">
101
- <div class="panel-inner"><slot /></div>
114
+ <button
115
+ class="trigger"
116
+ type="button"
117
+ :aria-controls="contentId"
118
+ :aria-expanded="internalOpen"
119
+ :disabled="disabled"
120
+ ref="trigger"
121
+ >
122
+ <span class="summary"><slot name="summary">{{ summary }}</slot></span>
123
+ <span class="chevron" aria-hidden="true"></span>
124
+ </button>
102
125
  </div>
126
+ <div class="panel" :id="contentId" ref="panel"><div class="panel-inner"><slot /></div></div>
103
127
  </div>
104
128
  </template>
105
129
 
@@ -1,9 +1,14 @@
1
1
  type __VLS_Props = {
2
2
  actions?: boolean;
3
+ cancelLabel?: string;
3
4
  disabled?: boolean;
4
5
  edit?: boolean;
5
6
  hint?: string;
6
7
  label?: string;
8
+ maxLength?: number;
9
+ placeholder?: string;
10
+ required?: boolean;
11
+ saveLabel?: string;
7
12
  value?: string;
8
13
  };
9
14
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
@@ -44,9 +49,14 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
44
49
  label: string;
45
50
  value: string;
46
51
  disabled: boolean;
52
+ required: boolean;
53
+ placeholder: string;
47
54
  actions: boolean;
55
+ cancelLabel: string;
48
56
  edit: boolean;
49
57
  hint: string;
58
+ maxLength: number;
59
+ saveLabel: string;
50
60
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
51
61
  declare const _default: typeof __VLS_export;
52
62
  export default _default;
@@ -9,18 +9,28 @@ defineOptions({ inheritAttrs: false })
9
9
  const props = withDefaults(
10
10
  defineProps<{
11
11
  actions?: boolean
12
+ cancelLabel?: string
12
13
  disabled?: boolean
13
14
  edit?: boolean
14
15
  hint?: string
15
16
  label?: string
17
+ maxLength?: number
18
+ placeholder?: string
19
+ required?: boolean
20
+ saveLabel?: string
16
21
  value?: string
17
22
  }>(),
18
23
  {
19
24
  actions: false,
25
+ cancelLabel: 'Cancel',
20
26
  disabled: false,
21
27
  edit: false,
22
28
  hint: '',
23
29
  label: 'Edit value',
30
+ maxLength: 0,
31
+ placeholder: '',
32
+ required: false,
33
+ saveLabel: 'Save',
24
34
  value: '',
25
35
  },
26
36
  )
@@ -132,13 +142,15 @@ useComponentHost(controllerModule.default, {
132
142
  type="text"
133
143
  :value.prop="draft"
134
144
  :aria-label="label"
145
+ :placeholder="placeholder"
146
+ :required="required"
135
147
  :disabled="disabled || !internalEdit"
136
148
  ref="input"
137
149
  >
138
150
  </div>
139
151
  <div v-if="actions" class="actions">
140
- <button class="save" type="button">Save</button>
141
- <button class="cancel" type="button">Cancel</button>
152
+ <button class="save" type="button">{{ saveLabel }}</button>
153
+ <button class="cancel" type="button">{{ cancelLabel }}</button>
142
154
  </div>
143
155
  </div>
144
156
  </template>
@@ -27,9 +27,11 @@ const emit = defineEmits<{
27
27
  }>()
28
28
 
29
29
  const root = ref<HTMLElement | null>(null)
30
+ const gridElement = useTemplateRef<HTMLElement>('grid')
30
31
  const headerElement = useTemplateRef<HTMLElement>('header')
31
- const insertElement = useTemplateRef<HTMLElement>('insert')
32
- const cells = ref<{ key: string; row: number; col: number; label: string; selected: boolean }[]>([])
32
+ const cells = ref<
33
+ { key: string; row: number; col: number; label: string; selected: boolean; tabIndex: number }[]
34
+ >([])
33
35
  const rows = ref(8)
34
36
  const cols = ref(8)
35
37
  const hint = ref('')
@@ -51,7 +53,7 @@ useComponentHost(controllerModule.default, {
51
53
  root,
52
54
  dispatch,
53
55
  props,
54
- refs: { header: headerElement, insert: insertElement },
56
+ refs: { grid: gridElement, header: headerElement },
55
57
  state: { cells, rows, cols, hint, withHeaderRow },
56
58
  })
57
59
  </script>
@@ -64,6 +66,7 @@ useComponentHost(controllerModule.default, {
64
66
  role="group"
65
67
  aria-label="Table dimensions"
66
68
  :style="{ '--_rows': rows, '--_cols': cols }"
69
+ ref="grid"
67
70
  >
68
71
  <button
69
72
  v-for="cell in cells"
@@ -74,13 +77,13 @@ useComponentHost(controllerModule.default, {
74
77
  :data-col="cell.col"
75
78
  :aria-label="cell.label"
76
79
  :aria-pressed="cell.selected"
80
+ :tabindex="cell.tabIndex"
77
81
  :class="{ selected: cell.selected }"
78
82
  >
79
83
  </button>
80
84
  </div>
81
85
  <label class="header"><input type="checkbox" :checked.prop="withHeaderRow" ref="header"> Header
82
86
  row</label>
83
- <button type="button" class="insert" ref="insert">Insert table</button>
84
87
  </div>
85
88
  </template>
86
89
 
@@ -105,6 +108,32 @@ useComponentHost(controllerModule.default, {
105
108
  grid-template-rows: repeat(var(--_rows, 8), 1.25rem);
106
109
  gap: 2px;
107
110
  margin-bottom: var(--ui-space-2);
111
+ max-inline-size: 100%;
112
+ overflow: auto;
113
+ --_ui-scroll-fade-direction: to right;
114
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
115
+ mask-image: linear-gradient(
116
+ var(--_ui-scroll-fade-direction),
117
+ transparent,
118
+ #000 var(--_ui-scroll-fade-start),
119
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
120
+ transparent
121
+ );
122
+ animation:
123
+ ui-scroll-fade-start linear,
124
+ ui-scroll-fade-start-hold linear,
125
+ ui-scroll-fade-end-hold linear,
126
+ ui-scroll-fade-end linear;
127
+ animation-timeline: scroll(self inline);
128
+ animation-range:
129
+ 0 var(--_ui-scroll-fade-size),
130
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
131
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
132
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
133
+ }
134
+
135
+ [data-component~="ui-editor-insert-table-grid"]:dir(rtl) .grid {
136
+ --_ui-scroll-fade-direction: to left;
108
137
  }
109
138
 
110
139
  .cell {
@@ -122,6 +151,11 @@ useComponentHost(controllerModule.default, {
122
151
  border-color: var(--ui-accent-solid, var(--ui-accent));
123
152
  }
124
153
 
154
+ .cell:focus-visible {
155
+ outline: 2px solid var(--ui-focus-ring);
156
+ outline-offset: -2px;
157
+ }
158
+
125
159
  .header {
126
160
  display: block;
127
161
  margin-bottom: var(--ui-space-2);
@@ -129,19 +163,22 @@ useComponentHost(controllerModule.default, {
129
163
  cursor: pointer;
130
164
  }
131
165
 
132
- [data-component~="ui-editor-insert-table-grid"] .insert {
133
- width: 100%;
134
- padding: var(--ui-space-2) var(--ui-space-3);
135
- border: 1px solid var(--ui-border);
136
- border-radius: var(--ui-radius-sm);
137
- background: var(--ui-accent-solid, var(--ui-accent));
138
- color: var(--ui-accent-contrast);
139
- font-size: var(--ui-font-size-sm);
140
- cursor: pointer;
166
+ @media (pointer: coarse) {
167
+ .grid {
168
+ grid-template-columns: repeat(var(--_cols, 8), 44px);
169
+ grid-template-rows: repeat(var(--_rows, 8), 44px);
170
+ }
171
+
172
+ .cell {
173
+ width: 44px;
174
+ height: 44px;
175
+ }
141
176
  }
142
177
 
143
- [data-component~="ui-editor-insert-table-grid"] .insert:hover {
144
- filter: brightness(1.05);
178
+ @media (forced-colors: active) {
179
+ .cell:focus-visible {
180
+ outline-color: Highlight;
181
+ }
145
182
  }
146
183
 
147
184
  [data-component~="ui-editor-insert-table-grid"][hidden] {