@threadlabs/looma 0.5.1 → 0.6.0-rc.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 (341) hide show
  1. package/README.md +1 -1
  2. package/components/shared/overlay.js +3 -0
  3. package/components/ui-button/ui-button.html +27 -14
  4. package/components/ui-callout/ui-callout.html +1 -1
  5. package/components/ui-checkbox/ui-checkbox.html +1 -1
  6. package/components/ui-cluster/ui-cluster.html +6 -6
  7. package/components/ui-combobox/ui-combobox.html +35 -27
  8. package/components/ui-container/ui-container.html +4 -4
  9. package/components/ui-context-menu/ui-context-menu.html +2 -2
  10. package/components/ui-dialog/ui-dialog.html +21 -8
  11. package/components/ui-disclosure/ui-disclosure.html +19 -4
  12. package/components/ui-editable/ui-editable.html +6 -6
  13. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +21 -21
  14. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +26 -26
  15. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +39 -39
  16. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +26 -22
  17. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +68 -52
  18. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +42 -38
  19. package/components/ui-editor-toolbar/ui-editor-toolbar.html +9 -9
  20. package/components/ui-floating-action-button/ui-floating-action-button.html +16 -22
  21. package/components/ui-form-field/ui-form-field.html +18 -7
  22. package/components/ui-grid/ui-grid.html +6 -6
  23. package/components/ui-icon/ui-icon.html +5 -1
  24. package/components/ui-icon-button/ui-icon-button.html +68 -34
  25. package/components/ui-input/ui-input.html +2 -2
  26. package/components/ui-menu/ui-menu.html +15 -4
  27. package/components/ui-menu-item/ui-menu-item.html +5 -5
  28. package/components/ui-popover/ui-popover.html +3 -3
  29. package/components/ui-popover/ui-popover.js +10 -2
  30. package/components/ui-reel/ui-reel.html +6 -6
  31. package/components/ui-search-result-row/ui-search-result-row.html +9 -9
  32. package/components/ui-search-shell/ui-search-shell.html +10 -3
  33. package/components/ui-search-shell/ui-search-shell.js +9 -0
  34. package/components/ui-select/ui-select.html +2 -2
  35. package/components/ui-sidebar/ui-sidebar.html +11 -11
  36. package/components/ui-stack/ui-stack.html +6 -6
  37. package/components/ui-switcher/ui-switcher.html +6 -6
  38. package/components/ui-tabs/ui-tabs.html +19 -5
  39. package/components/ui-textarea/ui-textarea.html +2 -2
  40. package/components/ui-toast-region/ui-toast-region.html +3 -3
  41. package/components/ui-tooltip/ui-tooltip.html +1 -1
  42. package/components/ui-top-bar/ui-top-bar.html +5 -5
  43. package/components/ui-tree/ui-tree.html +7 -0
  44. package/components/ui-tree-item/ui-tree-item.html +20 -7
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +2 -2
  47. package/package.json +2 -2
  48. package/styles/ui-affordance-scope.css +1 -1
  49. package/styles/ui-avatar-group.css +1 -1
  50. package/styles/ui-avatar.css +1 -1
  51. package/styles/ui-badge.css +1 -1
  52. package/styles/ui-button.css +25 -15
  53. package/styles/ui-callout.css +2 -2
  54. package/styles/ui-checkbox.css +2 -2
  55. package/styles/ui-cluster.css +7 -7
  56. package/styles/ui-combobox.css +24 -24
  57. package/styles/ui-container.css +5 -5
  58. package/styles/ui-context-menu.css +3 -3
  59. package/styles/ui-dialog.css +26 -9
  60. package/styles/ui-disclosure.css +23 -7
  61. package/styles/ui-editable.css +7 -7
  62. package/styles/ui-editor-insert-table-grid.css +21 -21
  63. package/styles/ui-editor-mention-menu.css +26 -26
  64. package/styles/ui-editor-slash-menu.css +40 -40
  65. package/styles/ui-editor-table-context-menu.css +21 -21
  66. package/styles/ui-editor-table-overlay.css +49 -49
  67. package/styles/ui-editor-table-toolbar.css +35 -35
  68. package/styles/ui-editor-toolbar.css +10 -10
  69. package/styles/ui-floating-action-button.css +17 -23
  70. package/styles/ui-form-field.css +24 -10
  71. package/styles/ui-grid.css +7 -7
  72. package/styles/ui-icon-button.css +74 -35
  73. package/styles/ui-icon.css +1 -1
  74. package/styles/ui-input.css +3 -3
  75. package/styles/ui-menu-item.css +6 -6
  76. package/styles/ui-menu.css +19 -7
  77. package/styles/ui-popover.css +4 -4
  78. package/styles/ui-radio-group.css +1 -1
  79. package/styles/ui-radio.css +1 -1
  80. package/styles/ui-reel.css +7 -7
  81. package/styles/ui-search-result-row.css +10 -10
  82. package/styles/ui-search-shell.css +14 -5
  83. package/styles/ui-select.css +3 -3
  84. package/styles/ui-separator.css +1 -1
  85. package/styles/ui-sidebar.css +12 -12
  86. package/styles/ui-stack.css +7 -7
  87. package/styles/ui-switch.css +1 -1
  88. package/styles/ui-switcher.css +7 -7
  89. package/styles/ui-tabs.css +21 -7
  90. package/styles/ui-textarea.css +3 -3
  91. package/styles/ui-toast-region.css +3 -3
  92. package/styles/ui-tooltip.css +2 -2
  93. package/styles/ui-top-bar.css +6 -6
  94. package/styles/ui-tree-item.css +30 -9
  95. package/styles/ui-tree.css +8 -2
  96. package/theme-dark.css +42 -103
  97. package/theme-high-contrast.css +18 -22
  98. package/theme-light.css +15 -41
  99. package/tokens.css +149 -201
  100. package/vanilla/UiAffordanceScope.d.ts +1 -1
  101. package/vanilla/UiAffordanceScope.js +2 -2
  102. package/vanilla/UiAvatar.d.ts +1 -1
  103. package/vanilla/UiAvatar.js +2 -2
  104. package/vanilla/UiAvatarGroup.d.ts +1 -1
  105. package/vanilla/UiAvatarGroup.js +2 -2
  106. package/vanilla/UiBadge.d.ts +1 -1
  107. package/vanilla/UiBadge.js +2 -2
  108. package/vanilla/UiButton.d.ts +3 -1
  109. package/vanilla/UiButton.js +3 -3
  110. package/vanilla/UiCallout.d.ts +1 -1
  111. package/vanilla/UiCallout.js +2 -2
  112. package/vanilla/UiCheckbox.d.ts +1 -1
  113. package/vanilla/UiCheckbox.js +2 -2
  114. package/vanilla/UiCluster.d.ts +1 -1
  115. package/vanilla/UiCluster.js +2 -2
  116. package/vanilla/UiCombobox.d.ts +1 -1
  117. package/vanilla/UiCombobox.js +3 -3
  118. package/vanilla/UiContainer.d.ts +1 -1
  119. package/vanilla/UiContainer.js +2 -2
  120. package/vanilla/UiContextMenu.d.ts +1 -1
  121. package/vanilla/UiContextMenu.js +2 -2
  122. package/vanilla/UiDialog.d.ts +1 -1
  123. package/vanilla/UiDialog.js +2 -2
  124. package/vanilla/UiDisclosure.d.ts +2 -1
  125. package/vanilla/UiDisclosure.js +3 -3
  126. package/vanilla/UiEditable.d.ts +1 -1
  127. package/vanilla/UiEditable.js +2 -2
  128. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  129. package/vanilla/UiEditorInsertTableGrid.js +3 -3
  130. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  131. package/vanilla/UiEditorMentionMenu.js +3 -3
  132. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  133. package/vanilla/UiEditorSlashMenu.js +2 -2
  134. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  135. package/vanilla/UiEditorTableContextMenu.js +3 -3
  136. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  137. package/vanilla/UiEditorTableOverlay.js +3 -3
  138. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  139. package/vanilla/UiEditorTableToolbar.js +3 -3
  140. package/vanilla/UiEditorToolbar.d.ts +1 -1
  141. package/vanilla/UiEditorToolbar.js +2 -2
  142. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  143. package/vanilla/UiFloatingActionButton.js +2 -2
  144. package/vanilla/UiFormField.d.ts +1 -1
  145. package/vanilla/UiFormField.js +15 -6
  146. package/vanilla/UiGrid.d.ts +1 -1
  147. package/vanilla/UiGrid.js +2 -2
  148. package/vanilla/UiIcon.d.ts +1 -1
  149. package/vanilla/UiIcon.js +3 -3
  150. package/vanilla/UiIconButton.d.ts +1 -1
  151. package/vanilla/UiIconButton.js +2 -2
  152. package/vanilla/UiInput.d.ts +1 -1
  153. package/vanilla/UiInput.js +2 -2
  154. package/vanilla/UiMenu.d.ts +2 -1
  155. package/vanilla/UiMenu.js +3 -3
  156. package/vanilla/UiMenuItem.d.ts +1 -1
  157. package/vanilla/UiMenuItem.js +2 -2
  158. package/vanilla/UiPopover.d.ts +1 -1
  159. package/vanilla/UiPopover.js +2 -2
  160. package/vanilla/UiRadio.d.ts +1 -1
  161. package/vanilla/UiRadio.js +2 -2
  162. package/vanilla/UiRadioGroup.d.ts +1 -1
  163. package/vanilla/UiRadioGroup.js +2 -2
  164. package/vanilla/UiReel.d.ts +1 -1
  165. package/vanilla/UiReel.js +2 -2
  166. package/vanilla/UiSearchResultRow.d.ts +1 -1
  167. package/vanilla/UiSearchResultRow.js +2 -2
  168. package/vanilla/UiSearchShell.d.ts +1 -1
  169. package/vanilla/UiSearchShell.js +2 -2
  170. package/vanilla/UiSelect.d.ts +1 -1
  171. package/vanilla/UiSelect.js +2 -2
  172. package/vanilla/UiSeparator.d.ts +1 -1
  173. package/vanilla/UiSeparator.js +2 -2
  174. package/vanilla/UiSidebar.d.ts +1 -1
  175. package/vanilla/UiSidebar.js +2 -2
  176. package/vanilla/UiStack.d.ts +1 -1
  177. package/vanilla/UiStack.js +2 -2
  178. package/vanilla/UiSwitch.d.ts +1 -1
  179. package/vanilla/UiSwitch.js +2 -2
  180. package/vanilla/UiSwitcher.d.ts +1 -1
  181. package/vanilla/UiSwitcher.js +2 -2
  182. package/vanilla/UiTabs.d.ts +2 -1
  183. package/vanilla/UiTabs.js +3 -3
  184. package/vanilla/UiTextarea.d.ts +1 -1
  185. package/vanilla/UiTextarea.js +2 -2
  186. package/vanilla/UiToastRegion.d.ts +1 -1
  187. package/vanilla/UiToastRegion.js +3 -3
  188. package/vanilla/UiTooltip.d.ts +1 -1
  189. package/vanilla/UiTooltip.js +2 -2
  190. package/vanilla/UiTopBar.d.ts +1 -1
  191. package/vanilla/UiTopBar.js +1 -1
  192. package/vanilla/UiTree.d.ts +2 -1
  193. package/vanilla/UiTree.js +3 -3
  194. package/vanilla/UiTreeItem.d.ts +1 -1
  195. package/vanilla/UiTreeItem.js +2 -2
  196. package/vue/UiAffordanceScope.d.ts +2 -2
  197. package/vue/UiAffordanceScope.vue +92 -73
  198. package/vue/UiAvatar.d.ts +7 -7
  199. package/vue/UiAvatar.vue +145 -105
  200. package/vue/UiAvatarGroup.d.ts +4 -4
  201. package/vue/UiAvatarGroup.vue +134 -118
  202. package/vue/UiBadge.d.ts +4 -4
  203. package/vue/UiBadge.vue +113 -114
  204. package/vue/UiButton.d.ts +10 -6
  205. package/vue/UiButton.vue +295 -248
  206. package/vue/UiCallout.d.ts +2 -2
  207. package/vue/UiCallout.vue +154 -87
  208. package/vue/UiCheckbox.d.ts +14 -10
  209. package/vue/UiCheckbox.vue +228 -162
  210. package/vue/UiCluster.d.ts +2 -2
  211. package/vue/UiCluster.vue +53 -60
  212. package/vue/UiCombobox.d.ts +36 -32
  213. package/vue/UiCombobox.vue +1005 -416
  214. package/vue/UiContainer.d.ts +2 -2
  215. package/vue/UiContainer.vue +48 -51
  216. package/vue/UiContextMenu.d.ts +6 -4
  217. package/vue/UiContextMenu.vue +205 -116
  218. package/vue/UiDialog.d.ts +11 -9
  219. package/vue/UiDialog.vue +287 -212
  220. package/vue/UiDisclosure.d.ts +10 -6
  221. package/vue/UiDisclosure.vue +265 -159
  222. package/vue/UiEditable.d.ts +16 -12
  223. package/vue/UiEditable.vue +325 -205
  224. package/vue/UiEditorInsertTableGrid.d.ts +8 -8
  225. package/vue/UiEditorInsertTableGrid.vue +216 -157
  226. package/vue/UiEditorMentionMenu.d.ts +9 -9
  227. package/vue/UiEditorMentionMenu.vue +265 -222
  228. package/vue/UiEditorSlashMenu.d.ts +7 -7
  229. package/vue/UiEditorSlashMenu.vue +286 -240
  230. package/vue/UiEditorTableContextMenu.d.ts +5 -5
  231. package/vue/UiEditorTableContextMenu.vue +306 -193
  232. package/vue/UiEditorTableOverlay.d.ts +2 -2
  233. package/vue/UiEditorTableOverlay.vue +600 -369
  234. package/vue/UiEditorTableToolbar.d.ts +7 -7
  235. package/vue/UiEditorTableToolbar.vue +443 -268
  236. package/vue/UiEditorToolbar.d.ts +2 -2
  237. package/vue/UiEditorToolbar.vue +134 -121
  238. package/vue/UiFloatingActionButton.d.ts +6 -6
  239. package/vue/UiFloatingActionButton.vue +95 -99
  240. package/vue/UiFormField.d.ts +6 -6
  241. package/vue/UiFormField.vue +112 -80
  242. package/vue/UiGrid.d.ts +2 -2
  243. package/vue/UiGrid.vue +51 -57
  244. package/vue/UiIcon.d.ts +2 -2
  245. package/vue/UiIcon.vue +118 -89
  246. package/vue/UiIconButton.d.ts +11 -11
  247. package/vue/UiIconButton.vue +287 -217
  248. package/vue/UiInput.d.ts +9 -9
  249. package/vue/UiInput.vue +153 -127
  250. package/vue/UiMenu.d.ts +10 -6
  251. package/vue/UiMenu.vue +227 -143
  252. package/vue/UiMenuItem.d.ts +4 -4
  253. package/vue/UiMenuItem.vue +53 -46
  254. package/vue/UiPopover.d.ts +8 -6
  255. package/vue/UiPopover.vue +197 -137
  256. package/vue/UiRadio.d.ts +14 -10
  257. package/vue/UiRadio.vue +183 -117
  258. package/vue/UiRadioGroup.d.ts +14 -12
  259. package/vue/UiRadioGroup.vue +172 -111
  260. package/vue/UiReel.d.ts +3 -3
  261. package/vue/UiReel.vue +77 -77
  262. package/vue/UiSearchResultRow.d.ts +4 -4
  263. package/vue/UiSearchResultRow.vue +121 -115
  264. package/vue/UiSearchShell.d.ts +10 -8
  265. package/vue/UiSearchShell.vue +245 -176
  266. package/vue/UiSelect.d.ts +9 -9
  267. package/vue/UiSelect.vue +162 -134
  268. package/vue/UiSeparator.d.ts +2 -2
  269. package/vue/UiSeparator.vue +22 -27
  270. package/vue/UiSidebar.d.ts +20 -18
  271. package/vue/UiSidebar.vue +307 -224
  272. package/vue/UiStack.d.ts +3 -3
  273. package/vue/UiStack.vue +64 -70
  274. package/vue/UiSwitch.d.ts +12 -8
  275. package/vue/UiSwitch.vue +218 -150
  276. package/vue/UiSwitcher.d.ts +3 -3
  277. package/vue/UiSwitcher.vue +73 -75
  278. package/vue/UiTabs.d.ts +12 -8
  279. package/vue/UiTabs.vue +268 -210
  280. package/vue/UiTextarea.d.ts +11 -11
  281. package/vue/UiTextarea.vue +155 -128
  282. package/vue/UiToastRegion.d.ts +10 -8
  283. package/vue/UiToastRegion.vue +261 -198
  284. package/vue/UiTooltip.d.ts +14 -12
  285. package/vue/UiTooltip.vue +241 -177
  286. package/vue/UiTopBar.vue +51 -42
  287. package/vue/UiTree.d.ts +10 -6
  288. package/vue/UiTree.vue +180 -70
  289. package/vue/UiTreeItem.d.ts +24 -22
  290. package/vue/UiTreeItem.vue +464 -339
  291. package/vue/chunks/UiAffordanceScope.js +9 -16
  292. package/vue/chunks/UiAvatar.js +23 -29
  293. package/vue/chunks/UiAvatarGroup.js +16 -39
  294. package/vue/chunks/UiBadge.js +3 -12
  295. package/vue/chunks/UiButton.js +15 -18
  296. package/vue/chunks/UiCallout.js +8 -17
  297. package/vue/chunks/UiCheckbox.js +37 -40
  298. package/vue/chunks/UiCluster.js +3 -12
  299. package/vue/chunks/UiCombobox.js +224 -266
  300. package/vue/chunks/UiContainer.js +3 -12
  301. package/vue/chunks/UiContextMenu.js +39 -34
  302. package/vue/chunks/UiDialog.js +36 -39
  303. package/vue/chunks/UiDisclosure.js +44 -48
  304. package/vue/chunks/UiEditable.js +55 -57
  305. package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
  306. package/vue/chunks/UiEditorMentionMenu.js +40 -81
  307. package/vue/chunks/UiEditorSlashMenu.js +28 -52
  308. package/vue/chunks/UiEditorTableContextMenu.js +32 -56
  309. package/vue/chunks/UiEditorTableOverlay.js +58 -82
  310. package/vue/chunks/UiEditorTableToolbar.js +61 -85
  311. package/vue/chunks/UiEditorToolbar.js +4 -13
  312. package/vue/chunks/UiFloatingActionButton.js +7 -21
  313. package/vue/chunks/UiFormField.js +15 -12
  314. package/vue/chunks/UiGrid.js +3 -12
  315. package/vue/chunks/UiIcon.js +20 -43
  316. package/vue/chunks/UiIconButton.js +16 -28
  317. package/vue/chunks/UiInput.js +20 -25
  318. package/vue/chunks/UiMenu.js +30 -33
  319. package/vue/chunks/UiMenuItem.js +4 -10
  320. package/vue/chunks/UiPopover.js +28 -29
  321. package/vue/chunks/UiRadio.js +36 -39
  322. package/vue/chunks/UiRadioGroup.js +30 -34
  323. package/vue/chunks/UiReel.js +6 -15
  324. package/vue/chunks/UiSearchResultRow.js +6 -19
  325. package/vue/chunks/UiSearchShell.js +25 -28
  326. package/vue/chunks/UiSelect.js +20 -23
  327. package/vue/chunks/UiSeparator.js +2 -8
  328. package/vue/chunks/UiSidebar.js +39 -44
  329. package/vue/chunks/UiStack.js +6 -15
  330. package/vue/chunks/UiSwitch.js +35 -38
  331. package/vue/chunks/UiSwitcher.js +6 -15
  332. package/vue/chunks/UiTabs.js +52 -85
  333. package/vue/chunks/UiTextarea.js +21 -26
  334. package/vue/chunks/UiToastRegion.js +38 -72
  335. package/vue/chunks/UiTooltip.js +34 -35
  336. package/vue/chunks/UiTopBar.js +1 -1
  337. package/vue/chunks/UiTree.js +27 -16
  338. package/vue/chunks/UiTreeItem.js +85 -102
  339. package/vue/components.css +4027 -3800
  340. package/vue/editor/LoomaEditor.d.ts +11 -0
  341. package/vue/editor/index.js +9 -0
@@ -1,306 +1,352 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.1 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.2 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from "vue";
4
- import UiIcon from "./UiIcon.vue";
5
- import * as controllerModule from "../components/ui-editor-slash-menu/ui-editor-slash-menu.js";
3
+ import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from 'vue'
4
+ import * as controllerModule from '../components/ui-editor-slash-menu/ui-editor-slash-menu.js'
5
+ import UiIcon from './UiIcon.vue'
6
6
 
7
- defineOptions({ inheritAttrs: false });
7
+ defineOptions({ inheritAttrs: false })
8
8
 
9
- const hn = {
10
- t: (v: unknown): boolean => v === true || (typeof v === "string" ? v.length > 0 : typeof v === "number" ? v !== 0 && v === v : Array.isArray(v) ? v.length > 0 : v !== null && typeof v === "object" ? Object.keys(v).length > 0 : false),
11
- text: (v: unknown): string => v === undefined || v === null ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? "" : String(v),
12
- attr: (v: unknown): any => v === undefined || v === null || v === false ? undefined : v === true ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? undefined : String(v),
13
- enumerated: (v: unknown): any => typeof v === "boolean" ? String(v) : hn.attr(v),
14
- shape: (items: unknown, where: ((item: any) => unknown) | undefined, sort: readonly string[], limit: unknown): any[] => {
15
- let list = Array.isArray(items) ? items.slice() : [];
16
- if (where !== undefined) list = list.filter((item) => hn.t(where(item)));
17
- if (sort.length > 0) {
18
- const field = (item: unknown, path: string): unknown => item !== null && typeof item === "object" && !Array.isArray(item)
19
- ? path.split(".").reduce<unknown>((value, key) => (value as Record<string, unknown> | undefined)?.[key], item)
20
- : item;
21
- const compare = (a: unknown, b: unknown): number => typeof a === "number" && typeof b === "number" ? a - b : hn.text(a).localeCompare(hn.text(b));
22
- list.sort((a, b) => {
23
- for (const key of sort) {
24
- const descending = key.startsWith("-");
25
- const order = compare(field(a, descending ? key.slice(1) : key), field(b, descending ? key.slice(1) : key));
26
- if (order !== 0) return descending ? -order : order;
27
- }
28
- return 0;
29
- });
30
- }
31
- return typeof limit === "number" ? list.slice(0, Math.max(0, Math.trunc(limit))) : list;
9
+ const props = withDefaults(
10
+ defineProps<{
11
+ anchorRect?: {
12
+ readonly left?: number
13
+ readonly top?: number
14
+ readonly right?: number
15
+ readonly bottom?: number
16
+ readonly x?: number
17
+ readonly y?: number
18
+ readonly width?: number
19
+ readonly height?: number
20
+ } | null
21
+ items?:
22
+ readonly ({ readonly title: string; readonly description: string; readonly icon: string })[]
23
+ open?: boolean
24
+ query?: string
25
+ selectedIndex?: number
26
+ }>(),
27
+ {
28
+ open: false,
29
+ query: '',
30
+ selectedIndex: 0,
32
31
  },
33
- };
34
-
35
- const props = withDefaults(defineProps<{
36
- anchorRect?: { readonly left?: number; readonly top?: number; readonly right?: number; readonly bottom?: number; readonly x?: number; readonly y?: number; readonly width?: number; readonly height?: number } | null;
37
- items?: readonly ({ readonly title: string; readonly description: string; readonly icon: string })[] | null;
38
- open?: boolean | null;
39
- query?: string | null;
40
- selectedIndex?: number | null;
41
- }>(), {
42
- open: false,
43
- query: "",
44
- selectedIndex: 0,
45
- });
32
+ )
46
33
  const emit = defineEmits<{
47
- "highlight": [detail: { readonly index: number }];
48
- "select": [detail: { readonly index: number }];
49
- }>();
50
- const root = ref<HTMLElement | null>(null);
51
- const refs: Record<string, Element | undefined> = {};
52
- const state_visible = ref<any>(false);
53
- const state_active = ref<any>(0);
34
+ highlight: [detail: { readonly index: number }]
35
+ select: [detail: { readonly index: number }]
36
+ }>()
37
+
38
+ const root = ref<HTMLElement | null>(null)
39
+ const visible = ref(false)
40
+ const active = ref(0)
54
41
 
55
42
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
56
- const dispatch = (name: string, detail?: unknown): boolean => {
57
- const declared = {"highlight":{"bubbles":true,"composed":true,"cancelable":false},"select":{"bubbles":true,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
43
+ function dispatch(name: string, detail?: unknown): boolean {
44
+ const declared: Record<string, EventInit | undefined> = {
45
+ highlight: { bubbles: true, composed: true, cancelable: false },
46
+ select: { bubbles: true, composed: true, cancelable: false },
47
+ }
58
48
  const checks: Record<string, (detail: unknown) => boolean> = {
59
- "highlight": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && Number.isInteger((detail as Record<string, unknown>)["index"]) && Object.keys(detail as object).every((key) => ["index"].includes(key))),
60
- "select": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && Number.isInteger((detail as Record<string, unknown>)["index"]) && Object.keys(detail as object).every((key) => ["index"].includes(key))),
61
- };
49
+ highlight: (detail) =>
50
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
51
+ && Number.isInteger((detail as Record<string, unknown>)['index'])
52
+ && Object.keys(detail as object).every((key) => ['index'].includes(key)),
53
+ select: (detail) =>
54
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
55
+ && Number.isInteger((detail as Record<string, unknown>)['index'])
56
+ && Object.keys(detail as object).every((key) => ['index'].includes(key)),
57
+ }
62
58
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
63
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
59
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
64
60
  }
65
- (emit as (name: string, detail: unknown) => void)(name, detail);
66
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
67
- };
61
+ const emitEvent = emit as (name: string, detail: unknown) => void
62
+ emitEvent(name, detail)
63
+ return root.value?.dispatchEvent(
64
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
65
+ ) ?? true
66
+ }
68
67
 
69
68
  function read(name: string): unknown {
70
- if (name === "visible") return state_visible.value;
71
- if (name === "active") return state_active.value;
72
- return (props as Record<string, unknown>)[name];
69
+ if (name === 'visible') return visible.value
70
+ if (name === 'active') return active.value
71
+ return (props as Record<string, unknown>)[name]
73
72
  }
74
73
 
75
74
  function write(name: string, value: unknown): boolean {
76
- if (name === "visible") { state_visible.value = value; return true; }
77
- if (name === "active") { state_active.value = value; return true; }
78
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
75
+ if (name === 'visible') {
76
+ visible.value = value as never
77
+ return true
78
+ }
79
+ if (name === 'active') {
80
+ active.value = value as never
81
+ return true
82
+ }
83
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
79
84
  }
80
85
 
81
- const stops: Array<() => void> = [];
86
+ const stops: Array<() => void> = []
82
87
  const host = {
83
- get element(): Element { return root.value as Element; },
88
+ get element(): Element {
89
+ return root.value as Element
90
+ },
84
91
  state: new Proxy({} as Record<string, unknown>, {
85
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
86
- set: (_target, name, value) => typeof name === "string" && write(name, value),
92
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
93
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
87
94
  }),
88
- refs: refs as Readonly<Record<string, Element>>,
95
+ refs: {} as Readonly<Record<string, Element>>,
89
96
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
90
97
  get: (_target, name) => {
91
- if (typeof name !== "string" || root.value === null) return undefined;
92
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
93
- return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
98
+ if (typeof name !== 'string' || root.value === null) return undefined
99
+ const form = root.value instanceof HTMLFormElement
100
+ ? root.value
101
+ : root.value.querySelector('form')
102
+ return form?.elements.namedItem(name)
103
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
94
104
  },
95
105
  }),
96
106
  signal<T>(initialValue: T) {
97
- const value = shallowRef(initialValue);
107
+ const value = shallowRef(initialValue)
98
108
  return {
99
109
  get: (): T => value.value,
100
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
101
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
102
- };
110
+ set: (next: T): void => {
111
+ if (!Object.is(value.value, next)) value.value = next
112
+ },
113
+ update: (next: (current: T) => T): void => {
114
+ const updated = next(value.value)
115
+ if (!Object.is(value.value, updated)) value.value = updated
116
+ },
117
+ }
103
118
  },
104
119
  computed<T>(compute: () => T) {
105
- const value = computed(compute);
106
- return { get: (): T => value.value };
120
+ const value = computed(compute)
121
+ return { get: (): T => value.value }
107
122
  },
108
123
  effect(run: () => void | (() => void)): () => void {
109
124
  const stop = watchEffect((onCleanup) => {
110
- const cleanup = run();
111
- if (typeof cleanup === "function") onCleanup(cleanup);
112
- }, { flush: "post" });
113
- stops.push(stop);
114
- return stop;
125
+ const cleanup = run()
126
+ if (typeof cleanup === 'function') onCleanup(cleanup)
127
+ }, { flush: 'post' })
128
+ stops.push(stop)
129
+ return stop
115
130
  },
116
131
  on(event: string, listener: EventListener): () => void {
117
- const element = root.value;
118
- element?.addEventListener(event, listener);
119
- const off = (): void => element?.removeEventListener(event, listener);
120
- stops.push(off);
121
- return off;
132
+ const element = root.value
133
+ element?.addEventListener(event, listener)
134
+ const off = (): void => element?.removeEventListener(event, listener)
135
+ stops.push(off)
136
+ return off
122
137
  },
123
138
  dispatch,
124
- };
139
+ }
125
140
 
126
- let cleanup: void | (() => void);
127
- let ready: Promise<void> | undefined;
141
+ let cleanup: void | (() => void)
142
+ let ready: Promise<void> | undefined
128
143
  onMounted(() => {
129
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
130
- });
144
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
145
+ cleanup = result
146
+ })
147
+ })
131
148
  onBeforeUnmount(() => {
132
- for (const stop of stops.splice(0)) stop();
133
- if (typeof cleanup === "function") cleanup();
134
- });
149
+ for (const stop of stops.splice(0)) stop()
150
+ if (typeof cleanup === 'function') cleanup()
151
+ })
135
152
  </script>
136
153
 
137
154
  <template>
138
- <div data-component="ui-editor-slash-menu" role="listbox" aria-label="Insert block" v-bind="$attrs" :hidden="hn.attr(!hn.t(state_visible))" ref="root"><div class="header" aria-hidden="true"><span class="header-label">Insert</span><template v-if="hn.t(props.query)"><span class="header-query">{{ hn.text(props.query) }}</span></template></div><ul class="list" role="presentation"><template v-for="(item, index) in hn.shape(props.items, undefined, [], undefined)" :key="index"><li class="item" role="option" :aria-selected="hn.enumerated((index === state_active))" :data-index="hn.attr(index)" :class="{ 'active': hn.t((index === state_active)) }"><span class="icon" aria-hidden="true"><UiIcon :name="(item)?.icon"></UiIcon></span><span class="body"><span class="title">{{ hn.text((item)?.title) }}</span><span class="description">{{ hn.text((item)?.description) }}</span></span></li></template></ul><div class="footer" aria-hidden="true"><kbd>↑↓</kbd> navigate · <kbd>↵</kbd> insert · <kbd>Esc</kbd> close
139
- </div></div>
155
+ <div
156
+ data-component="ui-editor-slash-menu"
157
+ role="listbox"
158
+ aria-label="Insert block"
159
+ v-bind="$attrs"
160
+ :hidden="!visible"
161
+ ref="root"
162
+ >
163
+ <div class="header" aria-hidden="true">
164
+ <span class="header-label">Insert</span>
165
+ <span v-if="query" class="header-query">{{ query }}</span>
166
+ </div>
167
+ <ul class="list" role="presentation">
168
+ <li
169
+ v-for="(item, index) in items"
170
+ :key="index"
171
+ class="item"
172
+ role="option"
173
+ :aria-selected="index === active"
174
+ :data-index="index"
175
+ :class="{ active: index === active }"
176
+ >
177
+ <span class="icon" aria-hidden="true"><UiIcon :name="item.icon" /></span>
178
+ <span class="body"><span class="title">{{ item.title }}</span>
179
+ <span class="description">{{ item.description }}</span></span>
180
+ </li>
181
+ </ul>
182
+ <div class="footer" aria-hidden="true">
183
+ <kbd>↑↓</kbd> navigate · <kbd>↵</kbd> insert · <kbd>Esc</kbd> close
184
+ </div>
185
+ </div>
140
186
  </template>
141
187
 
142
188
  <style scoped>
143
189
  [data-component~="ui-editor-slash-menu"] {
144
- user-select: none;
145
- }
190
+ user-select: none;
191
+ }
146
192
 
147
- [data-component~="ui-editor-slash-menu"] {
148
- background: var(--ui-surface, #fff);
149
- border: 1px solid var(--ui-border, #e5e7eb);
150
- border-radius: var(--ui-radius-xl, 1rem);
151
- box-shadow: var(--ui-shadow-lg, 0 8px 24px rgb(0 0 0 / 0.12));
152
- overflow: hidden;
153
- display: flex;
154
- flex-direction: column;
155
- }
193
+ [data-component~="ui-editor-slash-menu"] {
194
+ background: var(--ui-surface);
195
+ border: 1px solid var(--ui-border);
196
+ border-radius: var(--ui-radius-dialog);
197
+ box-shadow: var(--ui-shadow-lg, 0 8px 24px rgb(0 0 0 / 0.12));
198
+ overflow: hidden;
199
+ display: flex;
200
+ flex-direction: column;
201
+ }
156
202
 
157
- @media (max-width: 767px) {
158
- [data-component~="ui-editor-slash-menu"] {
159
- border-radius: var(--ui-radius-xl, 1rem) var(--ui-radius-xl, 1rem) 0 0;
160
- border-bottom: none;
161
- }
162
- }
203
+ @media (max-width: 767px) {
204
+ [data-component~="ui-editor-slash-menu"] {
205
+ border-radius: var(--ui-radius-dialog) var(--ui-radius-dialog) 0 0;
206
+ border-bottom: none;
207
+ }
208
+ }
163
209
 
164
- .header {
165
- display: none;
166
- align-items: center;
167
- gap: var(--ui-space-2, 8px);
168
- padding: var(--ui-space-3, 12px) var(--ui-space-4, 16px);
169
- border-bottom: 1px solid var(--ui-border, #e5e7eb);
170
- font-size: var(--ui-font-size-xs, 0.75rem);
171
- color: var(--ui-text-muted, #6b7280);
172
- font-weight: var(--ui-font-semibold, 600);
173
- text-transform: uppercase;
174
- letter-spacing: 0.05em;
175
- }
210
+ .header {
211
+ display: none;
212
+ align-items: center;
213
+ gap: var(--ui-space-2);
214
+ padding: var(--ui-space-3) var(--ui-space-4);
215
+ border-bottom: 1px solid var(--ui-border);
216
+ font-size: var(--ui-font-size-xs);
217
+ color: var(--ui-text-muted);
218
+ font-weight: var(--ui-font-semibold);
219
+ text-transform: uppercase;
220
+ letter-spacing: 0.05em;
221
+ }
176
222
 
177
- @media (max-width: 767px) {
178
- .header {
179
- display: flex;
180
- }
181
- }
223
+ @media (max-width: 767px) {
224
+ .header {
225
+ display: flex;
226
+ }
227
+ }
182
228
 
183
- .header-query {
184
- background: var(--ui-surface-hover, #f3f4f6);
185
- border-radius: var(--ui-radius-sm, 4px);
186
- padding: 0.1em 0.4em;
187
- font-family: var(--ui-font-family-mono, ui-monospace, monospace);
188
- font-size: var(--ui-font-size-xs, 0.75rem);
189
- color: var(--ui-accent, #3b82f6);
190
- text-transform: none;
191
- letter-spacing: 0;
192
- }
229
+ .header-query {
230
+ background: var(--ui-surface-hover);
231
+ border-radius: var(--ui-radius-sm);
232
+ padding: 0.1em 0.4em;
233
+ font-family: var(--ui-font-family-mono, ui-monospace, monospace);
234
+ font-size: var(--ui-font-size-xs);
235
+ color: var(--ui-accent);
236
+ text-transform: none;
237
+ letter-spacing: 0;
238
+ }
193
239
 
194
- .list {
195
- list-style: none;
196
- margin: 0;
197
- padding: var(--ui-space-1, 4px) 0;
198
- overflow-y: auto;
199
- max-height: 280px;
200
- overscroll-behavior: contain;
201
- }
240
+ .list {
241
+ list-style: none;
242
+ margin: 0;
243
+ padding: var(--ui-space-1) 0;
244
+ overflow-y: auto;
245
+ max-height: 280px;
246
+ overscroll-behavior: contain;
247
+ }
202
248
 
203
- @media (max-width: 767px) {
204
- .list {
205
- max-height: calc(60dvh - 80px);
206
- padding: var(--ui-space-1, 4px) 0 var(--ui-space-2, 8px);
207
- }
208
- }
249
+ @media (max-width: 767px) {
250
+ .list {
251
+ max-height: calc(60dvh - 80px);
252
+ padding: var(--ui-space-1) 0 var(--ui-space-2);
253
+ }
254
+ }
209
255
 
210
- .item {
211
- display: flex;
212
- align-items: center;
213
- gap: var(--ui-space-3, 12px);
214
- padding: var(--ui-space-2, 8px) var(--ui-space-3, 12px);
215
- min-height: 44px;
216
- cursor: pointer;
217
- transition: background-color 120ms ease;
218
- }
256
+ .item {
257
+ display: flex;
258
+ align-items: center;
259
+ gap: var(--ui-space-3);
260
+ padding: var(--ui-space-2) var(--ui-space-3);
261
+ min-height: 44px;
262
+ cursor: pointer;
263
+ transition: background-color 120ms ease;
264
+ }
219
265
 
220
- .item.active {
221
- background: var(--ui-accent-subtle, rgb(59 130 246 / 0.1));
222
- }
266
+ .item.active {
267
+ background: var(--ui-accent-subtle, rgb(59 130 246 / 0.1));
268
+ }
223
269
 
224
- .icon {
225
- display: flex;
226
- align-items: center;
227
- justify-content: center;
228
- width: 32px;
229
- height: 32px;
230
- background: var(--ui-surface-hover, #f3f4f6);
231
- border: 1px solid var(--ui-border, #e5e7eb);
232
- border-radius: var(--ui-radius-md, 6px);
233
- font-size: var(--ui-font-size-sm, 0.875rem);
234
- font-weight: var(--ui-font-bold, 700);
235
- color: var(--ui-text-secondary, #4b5563);
236
- font-family: var(--ui-font-family-mono, ui-monospace, monospace);
237
- flex-shrink: 0;
238
- line-height: 1;
239
- }
270
+ .icon {
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ width: 32px;
275
+ height: 32px;
276
+ background: var(--ui-surface-hover);
277
+ border: 1px solid var(--ui-border);
278
+ border-radius: var(--ui-radius-md);
279
+ font-size: var(--ui-font-size-sm);
280
+ font-weight: var(--ui-font-bold);
281
+ color: var(--ui-text-secondary);
282
+ font-family: var(--ui-font-family-mono, ui-monospace, monospace);
283
+ flex-shrink: 0;
284
+ line-height: 1;
285
+ }
240
286
 
241
- .item.active .icon {
242
- background: var(--ui-accent, #3b82f6);
243
- border-color: var(--ui-accent, #3b82f6);
244
- color: var(--ui-accent-contrast, #fff);
245
- }
287
+ .item.active .icon {
288
+ background: var(--ui-accent);
289
+ border-color: var(--ui-accent);
290
+ color: var(--ui-accent-contrast);
291
+ }
246
292
 
247
- .icon {
248
- --ui-icon-size: 1rem;
249
- --ui-icon-stroke-width: var(--ui-editor-toolbar-icon-stroke-width, 1.75);
250
- }
293
+ .icon {
294
+ --ui-icon-size: 1rem;
295
+ --ui-icon-stroke-width: var(--ui-editor-toolbar-icon-stroke-width, 1.75);
296
+ }
251
297
 
252
- .body {
253
- display: flex;
254
- min-width: 0;
255
- flex-direction: column;
256
- gap: 1px;
257
- }
298
+ .body {
299
+ display: flex;
300
+ min-width: 0;
301
+ flex-direction: column;
302
+ gap: 1px;
303
+ }
258
304
 
259
- .title {
260
- font-size: var(--ui-font-size-sm, 0.875rem);
261
- font-weight: var(--ui-font-medium, 500);
262
- color: var(--ui-text, #111827);
263
- white-space: nowrap;
264
- overflow: hidden;
265
- text-overflow: ellipsis;
266
- }
305
+ .title {
306
+ font-size: var(--ui-font-size-sm);
307
+ font-weight: var(--ui-font-medium);
308
+ color: var(--ui-text);
309
+ white-space: nowrap;
310
+ overflow: hidden;
311
+ text-overflow: ellipsis;
312
+ }
267
313
 
268
- .description {
269
- font-size: var(--ui-font-size-xs, 0.75rem);
270
- color: var(--ui-text-muted, #6b7280);
271
- white-space: nowrap;
272
- overflow: hidden;
273
- text-overflow: ellipsis;
274
- }
314
+ .description {
315
+ font-size: var(--ui-font-size-xs);
316
+ color: var(--ui-text-muted);
317
+ white-space: nowrap;
318
+ overflow: hidden;
319
+ text-overflow: ellipsis;
320
+ }
275
321
 
276
- .footer {
277
- display: none;
278
- padding: var(--ui-space-2, 8px) var(--ui-space-3, 12px);
279
- border-top: 1px solid var(--ui-border, #e5e7eb);
280
- font-size: var(--ui-font-size-xs, 0.75rem);
281
- color: var(--ui-text-muted, #6b7280);
282
- }
322
+ .footer {
323
+ display: none;
324
+ padding: var(--ui-space-2) var(--ui-space-3);
325
+ border-top: 1px solid var(--ui-border);
326
+ font-size: var(--ui-font-size-xs);
327
+ color: var(--ui-text-muted);
328
+ }
283
329
 
284
- @media (min-width: 768px) {
285
- .footer {
286
- display: block;
287
- }
288
- }
330
+ @media (min-width: 768px) {
331
+ .footer {
332
+ display: block;
333
+ }
334
+ }
289
335
 
290
- [data-component~="ui-editor-slash-menu"] kbd {
291
- display: inline-flex;
292
- align-items: center;
293
- justify-content: center;
294
- font-family: var(--ui-font-family-mono, ui-monospace, monospace);
295
- font-size: 10px;
296
- background: var(--ui-surface-hover, #f3f4f6);
297
- border: 1px solid var(--ui-border, #e5e7eb);
298
- border-radius: 3px;
299
- padding: 0 3px;
300
- color: var(--ui-text-secondary, #4b5563);
301
- }
336
+ [data-component~="ui-editor-slash-menu"] kbd {
337
+ display: inline-flex;
338
+ align-items: center;
339
+ justify-content: center;
340
+ font-family: var(--ui-font-family-mono, ui-monospace, monospace);
341
+ font-size: 10px;
342
+ background: var(--ui-surface-hover);
343
+ border: 1px solid var(--ui-border);
344
+ border-radius: 3px;
345
+ padding: 0 3px;
346
+ color: var(--ui-text-secondary);
347
+ }
302
348
 
303
- [data-component~="ui-editor-slash-menu"][hidden] {
304
- display: none;
305
- }
349
+ [data-component~="ui-editor-slash-menu"][hidden] {
350
+ display: none;
351
+ }
306
352
  </style>
@@ -1,7 +1,7 @@
1
1
  type __VLS_Props = {
2
- actions?: readonly ("align-left" | "align-center" | "align-right" | "background-none" | "background-gray" | "background-yellow" | "background-blue" | "background-green" | "background-red" | "add-row-before" | "add-row-after" | "add-column-before" | "add-column-after" | "clear-cells" | "merge-cells" | "split-cell" | "delete-row" | "delete-column" | "delete-table")[] | null;
3
- cellBackground?: string | null;
4
- open?: boolean | null;
2
+ actions?: readonly ('align-left' | 'align-center' | 'align-right' | 'background-none' | 'background-gray' | 'background-yellow' | 'background-blue' | 'background-green' | 'background-red' | 'add-row-before' | 'add-row-after' | 'add-column-before' | 'add-column-after' | 'clear-cells' | 'merge-cells' | 'split-cell' | 'delete-row' | 'delete-column' | 'delete-table')[];
3
+ cellBackground?: string;
4
+ open?: boolean;
5
5
  };
6
6
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
7
7
  action: (detail: {
@@ -12,8 +12,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
12
12
  readonly action: "align-left" | "align-center" | "align-right" | "background-none" | "background-gray" | "background-yellow" | "background-blue" | "background-green" | "background-red" | "add-row-before" | "add-row-after" | "add-column-before" | "add-column-after" | "clear-cells" | "merge-cells" | "split-cell" | "delete-row" | "delete-column" | "delete-table";
13
13
  }) => any) | undefined;
14
14
  }>, {
15
- open: boolean | null;
16
- cellBackground: string | null;
15
+ open: boolean;
16
+ cellBackground: string;
17
17
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
18
  declare const _default: typeof __VLS_export;
19
19
  export default _default;