@threadlabs/looma 0.5.1 → 0.5.2

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 (309) hide show
  1. package/README.md +1 -1
  2. package/components/ui-button/ui-button.html +13 -0
  3. package/components/ui-combobox/ui-combobox.html +12 -4
  4. package/components/ui-dialog/ui-dialog.html +13 -0
  5. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +1 -1
  6. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +1 -1
  7. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +6 -2
  8. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +20 -4
  9. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +8 -4
  10. package/components/ui-form-field/ui-form-field.html +18 -7
  11. package/components/ui-icon/ui-icon.html +5 -1
  12. package/components/ui-icon-button/ui-icon-button.html +30 -0
  13. package/components/ui-popover/ui-popover.js +10 -2
  14. package/components/ui-search-shell/ui-search-shell.html +7 -0
  15. package/components/ui-search-shell/ui-search-shell.js +9 -0
  16. package/components/ui-tabs/ui-tabs.html +1 -1
  17. package/components/ui-toast-region/ui-toast-region.html +1 -1
  18. package/components/ui-tree-item/ui-tree-item.html +6 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +2 -2
  21. package/package.json +2 -2
  22. package/styles/ui-affordance-scope.css +1 -1
  23. package/styles/ui-avatar-group.css +1 -1
  24. package/styles/ui-avatar.css +1 -1
  25. package/styles/ui-badge.css +1 -1
  26. package/styles/ui-button.css +11 -1
  27. package/styles/ui-callout.css +1 -1
  28. package/styles/ui-checkbox.css +1 -1
  29. package/styles/ui-cluster.css +1 -1
  30. package/styles/ui-combobox.css +1 -1
  31. package/styles/ui-container.css +1 -1
  32. package/styles/ui-context-menu.css +1 -1
  33. package/styles/ui-dialog.css +18 -1
  34. package/styles/ui-disclosure.css +1 -1
  35. package/styles/ui-editable.css +1 -1
  36. package/styles/ui-editor-insert-table-grid.css +1 -1
  37. package/styles/ui-editor-mention-menu.css +1 -1
  38. package/styles/ui-editor-slash-menu.css +1 -1
  39. package/styles/ui-editor-table-context-menu.css +1 -1
  40. package/styles/ui-editor-table-overlay.css +1 -1
  41. package/styles/ui-editor-table-toolbar.css +1 -1
  42. package/styles/ui-editor-toolbar.css +1 -1
  43. package/styles/ui-floating-action-button.css +1 -1
  44. package/styles/ui-form-field.css +24 -10
  45. package/styles/ui-grid.css +1 -1
  46. package/styles/ui-icon-button.css +36 -1
  47. package/styles/ui-icon.css +1 -1
  48. package/styles/ui-input.css +1 -1
  49. package/styles/ui-menu-item.css +1 -1
  50. package/styles/ui-menu.css +1 -1
  51. package/styles/ui-popover.css +1 -1
  52. package/styles/ui-radio-group.css +1 -1
  53. package/styles/ui-radio.css +1 -1
  54. package/styles/ui-reel.css +1 -1
  55. package/styles/ui-search-result-row.css +1 -1
  56. package/styles/ui-search-shell.css +11 -2
  57. package/styles/ui-select.css +1 -1
  58. package/styles/ui-separator.css +1 -1
  59. package/styles/ui-sidebar.css +1 -1
  60. package/styles/ui-stack.css +1 -1
  61. package/styles/ui-switch.css +1 -1
  62. package/styles/ui-switcher.css +1 -1
  63. package/styles/ui-tabs.css +1 -1
  64. package/styles/ui-textarea.css +1 -1
  65. package/styles/ui-toast-region.css +1 -1
  66. package/styles/ui-tooltip.css +1 -1
  67. package/styles/ui-top-bar.css +1 -1
  68. package/styles/ui-tree-item.css +10 -2
  69. package/styles/ui-tree.css +1 -1
  70. package/vanilla/UiAffordanceScope.d.ts +1 -1
  71. package/vanilla/UiAffordanceScope.js +2 -2
  72. package/vanilla/UiAvatar.d.ts +1 -1
  73. package/vanilla/UiAvatar.js +2 -2
  74. package/vanilla/UiAvatarGroup.d.ts +1 -1
  75. package/vanilla/UiAvatarGroup.js +2 -2
  76. package/vanilla/UiBadge.d.ts +1 -1
  77. package/vanilla/UiBadge.js +2 -2
  78. package/vanilla/UiButton.d.ts +3 -1
  79. package/vanilla/UiButton.js +3 -3
  80. package/vanilla/UiCallout.d.ts +1 -1
  81. package/vanilla/UiCallout.js +2 -2
  82. package/vanilla/UiCheckbox.d.ts +1 -1
  83. package/vanilla/UiCheckbox.js +2 -2
  84. package/vanilla/UiCluster.d.ts +1 -1
  85. package/vanilla/UiCluster.js +2 -2
  86. package/vanilla/UiCombobox.d.ts +1 -1
  87. package/vanilla/UiCombobox.js +3 -3
  88. package/vanilla/UiContainer.d.ts +1 -1
  89. package/vanilla/UiContainer.js +2 -2
  90. package/vanilla/UiContextMenu.d.ts +1 -1
  91. package/vanilla/UiContextMenu.js +2 -2
  92. package/vanilla/UiDialog.d.ts +1 -1
  93. package/vanilla/UiDialog.js +2 -2
  94. package/vanilla/UiDisclosure.d.ts +1 -1
  95. package/vanilla/UiDisclosure.js +2 -2
  96. package/vanilla/UiEditable.d.ts +1 -1
  97. package/vanilla/UiEditable.js +2 -2
  98. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  99. package/vanilla/UiEditorInsertTableGrid.js +3 -3
  100. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  101. package/vanilla/UiEditorMentionMenu.js +3 -3
  102. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  103. package/vanilla/UiEditorSlashMenu.js +2 -2
  104. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  105. package/vanilla/UiEditorTableContextMenu.js +3 -3
  106. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  107. package/vanilla/UiEditorTableOverlay.js +3 -3
  108. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  109. package/vanilla/UiEditorTableToolbar.js +3 -3
  110. package/vanilla/UiEditorToolbar.d.ts +1 -1
  111. package/vanilla/UiEditorToolbar.js +2 -2
  112. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  113. package/vanilla/UiFloatingActionButton.js +2 -2
  114. package/vanilla/UiFormField.d.ts +1 -1
  115. package/vanilla/UiFormField.js +15 -6
  116. package/vanilla/UiGrid.d.ts +1 -1
  117. package/vanilla/UiGrid.js +2 -2
  118. package/vanilla/UiIcon.d.ts +1 -1
  119. package/vanilla/UiIcon.js +3 -3
  120. package/vanilla/UiIconButton.d.ts +1 -1
  121. package/vanilla/UiIconButton.js +2 -2
  122. package/vanilla/UiInput.d.ts +1 -1
  123. package/vanilla/UiInput.js +2 -2
  124. package/vanilla/UiMenu.d.ts +1 -1
  125. package/vanilla/UiMenu.js +2 -2
  126. package/vanilla/UiMenuItem.d.ts +1 -1
  127. package/vanilla/UiMenuItem.js +2 -2
  128. package/vanilla/UiPopover.d.ts +1 -1
  129. package/vanilla/UiPopover.js +2 -2
  130. package/vanilla/UiRadio.d.ts +1 -1
  131. package/vanilla/UiRadio.js +2 -2
  132. package/vanilla/UiRadioGroup.d.ts +1 -1
  133. package/vanilla/UiRadioGroup.js +2 -2
  134. package/vanilla/UiReel.d.ts +1 -1
  135. package/vanilla/UiReel.js +2 -2
  136. package/vanilla/UiSearchResultRow.d.ts +1 -1
  137. package/vanilla/UiSearchResultRow.js +2 -2
  138. package/vanilla/UiSearchShell.d.ts +1 -1
  139. package/vanilla/UiSearchShell.js +2 -2
  140. package/vanilla/UiSelect.d.ts +1 -1
  141. package/vanilla/UiSelect.js +2 -2
  142. package/vanilla/UiSeparator.d.ts +1 -1
  143. package/vanilla/UiSeparator.js +2 -2
  144. package/vanilla/UiSidebar.d.ts +1 -1
  145. package/vanilla/UiSidebar.js +2 -2
  146. package/vanilla/UiStack.d.ts +1 -1
  147. package/vanilla/UiStack.js +2 -2
  148. package/vanilla/UiSwitch.d.ts +1 -1
  149. package/vanilla/UiSwitch.js +2 -2
  150. package/vanilla/UiSwitcher.d.ts +1 -1
  151. package/vanilla/UiSwitcher.js +2 -2
  152. package/vanilla/UiTabs.d.ts +1 -1
  153. package/vanilla/UiTabs.js +3 -3
  154. package/vanilla/UiTextarea.d.ts +1 -1
  155. package/vanilla/UiTextarea.js +2 -2
  156. package/vanilla/UiToastRegion.d.ts +1 -1
  157. package/vanilla/UiToastRegion.js +3 -3
  158. package/vanilla/UiTooltip.d.ts +1 -1
  159. package/vanilla/UiTooltip.js +2 -2
  160. package/vanilla/UiTopBar.d.ts +1 -1
  161. package/vanilla/UiTopBar.js +1 -1
  162. package/vanilla/UiTree.d.ts +1 -1
  163. package/vanilla/UiTree.js +2 -2
  164. package/vanilla/UiTreeItem.d.ts +1 -1
  165. package/vanilla/UiTreeItem.js +2 -2
  166. package/vue/UiAffordanceScope.d.ts +2 -2
  167. package/vue/UiAffordanceScope.vue +92 -73
  168. package/vue/UiAvatar.d.ts +7 -7
  169. package/vue/UiAvatar.vue +145 -105
  170. package/vue/UiAvatarGroup.d.ts +4 -4
  171. package/vue/UiAvatarGroup.vue +134 -118
  172. package/vue/UiBadge.d.ts +4 -4
  173. package/vue/UiBadge.vue +113 -114
  174. package/vue/UiButton.d.ts +10 -6
  175. package/vue/UiButton.vue +289 -248
  176. package/vue/UiCallout.d.ts +2 -2
  177. package/vue/UiCallout.vue +154 -87
  178. package/vue/UiCheckbox.d.ts +14 -10
  179. package/vue/UiCheckbox.vue +228 -162
  180. package/vue/UiCluster.d.ts +2 -2
  181. package/vue/UiCluster.vue +53 -60
  182. package/vue/UiCombobox.d.ts +36 -32
  183. package/vue/UiCombobox.vue +1005 -416
  184. package/vue/UiContainer.d.ts +2 -2
  185. package/vue/UiContainer.vue +48 -51
  186. package/vue/UiContextMenu.d.ts +6 -4
  187. package/vue/UiContextMenu.vue +205 -116
  188. package/vue/UiDialog.d.ts +11 -9
  189. package/vue/UiDialog.vue +287 -212
  190. package/vue/UiDisclosure.d.ts +8 -6
  191. package/vue/UiDisclosure.vue +248 -159
  192. package/vue/UiEditable.d.ts +16 -12
  193. package/vue/UiEditable.vue +325 -205
  194. package/vue/UiEditorInsertTableGrid.d.ts +8 -8
  195. package/vue/UiEditorInsertTableGrid.vue +216 -157
  196. package/vue/UiEditorMentionMenu.d.ts +9 -9
  197. package/vue/UiEditorMentionMenu.vue +265 -222
  198. package/vue/UiEditorSlashMenu.d.ts +7 -7
  199. package/vue/UiEditorSlashMenu.vue +286 -240
  200. package/vue/UiEditorTableContextMenu.d.ts +5 -5
  201. package/vue/UiEditorTableContextMenu.vue +306 -193
  202. package/vue/UiEditorTableOverlay.d.ts +2 -2
  203. package/vue/UiEditorTableOverlay.vue +609 -369
  204. package/vue/UiEditorTableToolbar.d.ts +7 -7
  205. package/vue/UiEditorTableToolbar.vue +443 -268
  206. package/vue/UiEditorToolbar.d.ts +2 -2
  207. package/vue/UiEditorToolbar.vue +134 -121
  208. package/vue/UiFloatingActionButton.d.ts +6 -6
  209. package/vue/UiFloatingActionButton.vue +100 -99
  210. package/vue/UiFormField.d.ts +6 -6
  211. package/vue/UiFormField.vue +112 -80
  212. package/vue/UiGrid.d.ts +2 -2
  213. package/vue/UiGrid.vue +51 -57
  214. package/vue/UiIcon.d.ts +2 -2
  215. package/vue/UiIcon.vue +118 -89
  216. package/vue/UiIconButton.d.ts +11 -11
  217. package/vue/UiIconButton.vue +283 -217
  218. package/vue/UiInput.d.ts +9 -9
  219. package/vue/UiInput.vue +153 -127
  220. package/vue/UiMenu.d.ts +8 -6
  221. package/vue/UiMenu.vue +217 -143
  222. package/vue/UiMenuItem.d.ts +4 -4
  223. package/vue/UiMenuItem.vue +52 -46
  224. package/vue/UiPopover.d.ts +8 -6
  225. package/vue/UiPopover.vue +197 -137
  226. package/vue/UiRadio.d.ts +14 -10
  227. package/vue/UiRadio.vue +183 -117
  228. package/vue/UiRadioGroup.d.ts +14 -12
  229. package/vue/UiRadioGroup.vue +172 -111
  230. package/vue/UiReel.d.ts +3 -3
  231. package/vue/UiReel.vue +77 -77
  232. package/vue/UiSearchResultRow.d.ts +4 -4
  233. package/vue/UiSearchResultRow.vue +124 -115
  234. package/vue/UiSearchShell.d.ts +10 -8
  235. package/vue/UiSearchShell.vue +245 -176
  236. package/vue/UiSelect.d.ts +9 -9
  237. package/vue/UiSelect.vue +162 -134
  238. package/vue/UiSeparator.d.ts +2 -2
  239. package/vue/UiSeparator.vue +22 -27
  240. package/vue/UiSidebar.d.ts +20 -18
  241. package/vue/UiSidebar.vue +312 -224
  242. package/vue/UiStack.d.ts +3 -3
  243. package/vue/UiStack.vue +64 -70
  244. package/vue/UiSwitch.d.ts +12 -8
  245. package/vue/UiSwitch.vue +218 -150
  246. package/vue/UiSwitcher.d.ts +3 -3
  247. package/vue/UiSwitcher.vue +73 -75
  248. package/vue/UiTabs.d.ts +10 -8
  249. package/vue/UiTabs.vue +251 -210
  250. package/vue/UiTextarea.d.ts +11 -11
  251. package/vue/UiTextarea.vue +155 -128
  252. package/vue/UiToastRegion.d.ts +10 -8
  253. package/vue/UiToastRegion.vue +261 -198
  254. package/vue/UiTooltip.d.ts +14 -12
  255. package/vue/UiTooltip.vue +241 -177
  256. package/vue/UiTopBar.vue +51 -42
  257. package/vue/UiTree.d.ts +8 -6
  258. package/vue/UiTree.vue +157 -70
  259. package/vue/UiTreeItem.d.ts +24 -22
  260. package/vue/UiTreeItem.vue +456 -339
  261. package/vue/chunks/UiAffordanceScope.js +9 -16
  262. package/vue/chunks/UiAvatar.js +23 -29
  263. package/vue/chunks/UiAvatarGroup.js +16 -39
  264. package/vue/chunks/UiBadge.js +3 -12
  265. package/vue/chunks/UiButton.js +15 -18
  266. package/vue/chunks/UiCallout.js +8 -17
  267. package/vue/chunks/UiCheckbox.js +37 -40
  268. package/vue/chunks/UiCluster.js +3 -12
  269. package/vue/chunks/UiCombobox.js +224 -266
  270. package/vue/chunks/UiContainer.js +3 -12
  271. package/vue/chunks/UiContextMenu.js +39 -34
  272. package/vue/chunks/UiDialog.js +36 -39
  273. package/vue/chunks/UiDisclosure.js +43 -48
  274. package/vue/chunks/UiEditable.js +55 -57
  275. package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
  276. package/vue/chunks/UiEditorMentionMenu.js +40 -81
  277. package/vue/chunks/UiEditorSlashMenu.js +28 -52
  278. package/vue/chunks/UiEditorTableContextMenu.js +32 -56
  279. package/vue/chunks/UiEditorTableOverlay.js +58 -82
  280. package/vue/chunks/UiEditorTableToolbar.js +61 -85
  281. package/vue/chunks/UiEditorToolbar.js +4 -13
  282. package/vue/chunks/UiFloatingActionButton.js +7 -21
  283. package/vue/chunks/UiFormField.js +15 -12
  284. package/vue/chunks/UiGrid.js +3 -12
  285. package/vue/chunks/UiIcon.js +20 -43
  286. package/vue/chunks/UiIconButton.js +16 -28
  287. package/vue/chunks/UiInput.js +20 -25
  288. package/vue/chunks/UiMenu.js +29 -33
  289. package/vue/chunks/UiMenuItem.js +4 -10
  290. package/vue/chunks/UiPopover.js +28 -29
  291. package/vue/chunks/UiRadio.js +36 -39
  292. package/vue/chunks/UiRadioGroup.js +30 -34
  293. package/vue/chunks/UiReel.js +6 -15
  294. package/vue/chunks/UiSearchResultRow.js +6 -19
  295. package/vue/chunks/UiSearchShell.js +25 -28
  296. package/vue/chunks/UiSelect.js +20 -23
  297. package/vue/chunks/UiSeparator.js +2 -8
  298. package/vue/chunks/UiSidebar.js +39 -44
  299. package/vue/chunks/UiStack.js +6 -15
  300. package/vue/chunks/UiSwitch.js +35 -38
  301. package/vue/chunks/UiSwitcher.js +6 -15
  302. package/vue/chunks/UiTabs.js +47 -85
  303. package/vue/chunks/UiTextarea.js +21 -26
  304. package/vue/chunks/UiToastRegion.js +38 -72
  305. package/vue/chunks/UiTooltip.js +34 -35
  306. package/vue/chunks/UiTopBar.js +1 -1
  307. package/vue/chunks/UiTree.js +20 -15
  308. package/vue/chunks/UiTreeItem.js +85 -102
  309. package/vue/components.css +3994 -3801
@@ -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, #fff);
195
+ border: 1px solid var(--ui-border, #e5e7eb);
196
+ border-radius: var(--ui-radius-xl, 1rem);
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-xl, 1rem) var(--ui-radius-xl, 1rem) 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, 8px);
214
+ padding: var(--ui-space-3, 12px) var(--ui-space-4, 16px);
215
+ border-bottom: 1px solid var(--ui-border, #e5e7eb);
216
+ font-size: var(--ui-font-size-xs, 0.75rem);
217
+ color: var(--ui-text-muted, #6b7280);
218
+ font-weight: var(--ui-font-semibold, 600);
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, #f3f4f6);
231
+ border-radius: var(--ui-radius-sm, 4px);
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, 0.75rem);
235
+ color: var(--ui-accent, #3b82f6);
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, 4px) 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, 4px) 0 var(--ui-space-2, 8px);
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, 12px);
260
+ padding: var(--ui-space-2, 8px) var(--ui-space-3, 12px);
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, #f3f4f6);
277
+ border: 1px solid var(--ui-border, #e5e7eb);
278
+ border-radius: var(--ui-radius-md, 6px);
279
+ font-size: var(--ui-font-size-sm, 0.875rem);
280
+ font-weight: var(--ui-font-bold, 700);
281
+ color: var(--ui-text-secondary, #4b5563);
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, #3b82f6);
289
+ border-color: var(--ui-accent, #3b82f6);
290
+ color: var(--ui-accent-contrast, #fff);
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, 0.875rem);
307
+ font-weight: var(--ui-font-medium, 500);
308
+ color: var(--ui-text, #111827);
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, 0.75rem);
316
+ color: var(--ui-text-muted, #6b7280);
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, 8px) var(--ui-space-3, 12px);
325
+ border-top: 1px solid var(--ui-border, #e5e7eb);
326
+ font-size: var(--ui-font-size-xs, 0.75rem);
327
+ color: var(--ui-text-muted, #6b7280);
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, #f3f4f6);
343
+ border: 1px solid var(--ui-border, #e5e7eb);
344
+ border-radius: 3px;
345
+ padding: 0 3px;
346
+ color: var(--ui-text-secondary, #4b5563);
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;