@threadlabs/looma 0.5.0 → 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 (313) hide show
  1. package/README.md +1 -1
  2. package/components/shared/input-modality.d.ts +8 -0
  3. package/components/shared/input-modality.js +2 -0
  4. package/components/ui-button/ui-button.html +42 -1
  5. package/components/ui-combobox/ui-combobox.html +12 -4
  6. package/components/ui-dialog/ui-dialog.html +13 -0
  7. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +1 -1
  8. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +1 -1
  9. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +6 -2
  10. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +20 -4
  11. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +8 -4
  12. package/components/ui-form-field/ui-form-field.html +18 -7
  13. package/components/ui-icon/ui-icon.html +5 -1
  14. package/components/ui-icon-button/ui-icon-button.html +44 -1
  15. package/components/ui-popover/ui-popover.js +10 -2
  16. package/components/ui-search-shell/ui-search-shell.html +7 -0
  17. package/components/ui-search-shell/ui-search-shell.js +9 -0
  18. package/components/ui-tabs/ui-tabs.html +1 -1
  19. package/components/ui-toast-region/ui-toast-region.html +1 -1
  20. package/components/ui-tree-item/ui-tree-item.html +6 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +2 -2
  23. package/package.json +2 -2
  24. package/styles/ui-affordance-scope.css +1 -1
  25. package/styles/ui-avatar-group.css +1 -1
  26. package/styles/ui-avatar.css +1 -1
  27. package/styles/ui-badge.css +1 -1
  28. package/styles/ui-button.css +42 -2
  29. package/styles/ui-callout.css +1 -1
  30. package/styles/ui-checkbox.css +1 -1
  31. package/styles/ui-cluster.css +1 -1
  32. package/styles/ui-combobox.css +1 -1
  33. package/styles/ui-container.css +1 -1
  34. package/styles/ui-context-menu.css +1 -1
  35. package/styles/ui-dialog.css +18 -1
  36. package/styles/ui-disclosure.css +1 -1
  37. package/styles/ui-editable.css +1 -1
  38. package/styles/ui-editor-insert-table-grid.css +1 -1
  39. package/styles/ui-editor-mention-menu.css +1 -1
  40. package/styles/ui-editor-slash-menu.css +1 -1
  41. package/styles/ui-editor-table-context-menu.css +1 -1
  42. package/styles/ui-editor-table-overlay.css +1 -1
  43. package/styles/ui-editor-table-toolbar.css +1 -1
  44. package/styles/ui-editor-toolbar.css +1 -1
  45. package/styles/ui-floating-action-button.css +1 -1
  46. package/styles/ui-form-field.css +24 -10
  47. package/styles/ui-grid.css +1 -1
  48. package/styles/ui-icon-button.css +52 -2
  49. package/styles/ui-icon.css +1 -1
  50. package/styles/ui-input.css +1 -1
  51. package/styles/ui-menu-item.css +1 -1
  52. package/styles/ui-menu.css +1 -1
  53. package/styles/ui-popover.css +1 -1
  54. package/styles/ui-radio-group.css +1 -1
  55. package/styles/ui-radio.css +1 -1
  56. package/styles/ui-reel.css +1 -1
  57. package/styles/ui-search-result-row.css +1 -1
  58. package/styles/ui-search-shell.css +11 -2
  59. package/styles/ui-select.css +1 -1
  60. package/styles/ui-separator.css +1 -1
  61. package/styles/ui-sidebar.css +1 -1
  62. package/styles/ui-stack.css +1 -1
  63. package/styles/ui-switch.css +1 -1
  64. package/styles/ui-switcher.css +1 -1
  65. package/styles/ui-tabs.css +1 -1
  66. package/styles/ui-textarea.css +1 -1
  67. package/styles/ui-toast-region.css +1 -1
  68. package/styles/ui-tooltip.css +1 -1
  69. package/styles/ui-top-bar.css +1 -1
  70. package/styles/ui-tree-item.css +10 -2
  71. package/styles/ui-tree.css +1 -1
  72. package/vanilla/UiAffordanceScope.d.ts +1 -1
  73. package/vanilla/UiAffordanceScope.js +2 -2
  74. package/vanilla/UiAvatar.d.ts +1 -1
  75. package/vanilla/UiAvatar.js +2 -2
  76. package/vanilla/UiAvatarGroup.d.ts +1 -1
  77. package/vanilla/UiAvatarGroup.js +2 -2
  78. package/vanilla/UiBadge.d.ts +1 -1
  79. package/vanilla/UiBadge.js +2 -2
  80. package/vanilla/UiButton.d.ts +3 -1
  81. package/vanilla/UiButton.js +3 -3
  82. package/vanilla/UiCallout.d.ts +1 -1
  83. package/vanilla/UiCallout.js +2 -2
  84. package/vanilla/UiCheckbox.d.ts +1 -1
  85. package/vanilla/UiCheckbox.js +2 -2
  86. package/vanilla/UiCluster.d.ts +1 -1
  87. package/vanilla/UiCluster.js +2 -2
  88. package/vanilla/UiCombobox.d.ts +1 -1
  89. package/vanilla/UiCombobox.js +3 -3
  90. package/vanilla/UiContainer.d.ts +1 -1
  91. package/vanilla/UiContainer.js +2 -2
  92. package/vanilla/UiContextMenu.d.ts +1 -1
  93. package/vanilla/UiContextMenu.js +2 -2
  94. package/vanilla/UiDialog.d.ts +1 -1
  95. package/vanilla/UiDialog.js +2 -2
  96. package/vanilla/UiDisclosure.d.ts +1 -1
  97. package/vanilla/UiDisclosure.js +2 -2
  98. package/vanilla/UiEditable.d.ts +1 -1
  99. package/vanilla/UiEditable.js +2 -2
  100. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  101. package/vanilla/UiEditorInsertTableGrid.js +3 -3
  102. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  103. package/vanilla/UiEditorMentionMenu.js +3 -3
  104. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  105. package/vanilla/UiEditorSlashMenu.js +2 -2
  106. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  107. package/vanilla/UiEditorTableContextMenu.js +3 -3
  108. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  109. package/vanilla/UiEditorTableOverlay.js +3 -3
  110. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  111. package/vanilla/UiEditorTableToolbar.js +3 -3
  112. package/vanilla/UiEditorToolbar.d.ts +1 -1
  113. package/vanilla/UiEditorToolbar.js +2 -2
  114. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  115. package/vanilla/UiFloatingActionButton.js +2 -2
  116. package/vanilla/UiFormField.d.ts +1 -1
  117. package/vanilla/UiFormField.js +15 -6
  118. package/vanilla/UiGrid.d.ts +1 -1
  119. package/vanilla/UiGrid.js +2 -2
  120. package/vanilla/UiIcon.d.ts +1 -1
  121. package/vanilla/UiIcon.js +3 -3
  122. package/vanilla/UiIconButton.d.ts +1 -1
  123. package/vanilla/UiIconButton.js +2 -2
  124. package/vanilla/UiInput.d.ts +1 -1
  125. package/vanilla/UiInput.js +2 -2
  126. package/vanilla/UiMenu.d.ts +1 -1
  127. package/vanilla/UiMenu.js +2 -2
  128. package/vanilla/UiMenuItem.d.ts +1 -1
  129. package/vanilla/UiMenuItem.js +2 -2
  130. package/vanilla/UiPopover.d.ts +1 -1
  131. package/vanilla/UiPopover.js +2 -2
  132. package/vanilla/UiRadio.d.ts +1 -1
  133. package/vanilla/UiRadio.js +2 -2
  134. package/vanilla/UiRadioGroup.d.ts +1 -1
  135. package/vanilla/UiRadioGroup.js +2 -2
  136. package/vanilla/UiReel.d.ts +1 -1
  137. package/vanilla/UiReel.js +2 -2
  138. package/vanilla/UiSearchResultRow.d.ts +1 -1
  139. package/vanilla/UiSearchResultRow.js +2 -2
  140. package/vanilla/UiSearchShell.d.ts +1 -1
  141. package/vanilla/UiSearchShell.js +2 -2
  142. package/vanilla/UiSelect.d.ts +1 -1
  143. package/vanilla/UiSelect.js +2 -2
  144. package/vanilla/UiSeparator.d.ts +1 -1
  145. package/vanilla/UiSeparator.js +2 -2
  146. package/vanilla/UiSidebar.d.ts +1 -1
  147. package/vanilla/UiSidebar.js +2 -2
  148. package/vanilla/UiStack.d.ts +1 -1
  149. package/vanilla/UiStack.js +2 -2
  150. package/vanilla/UiSwitch.d.ts +1 -1
  151. package/vanilla/UiSwitch.js +2 -2
  152. package/vanilla/UiSwitcher.d.ts +1 -1
  153. package/vanilla/UiSwitcher.js +2 -2
  154. package/vanilla/UiTabs.d.ts +1 -1
  155. package/vanilla/UiTabs.js +3 -3
  156. package/vanilla/UiTextarea.d.ts +1 -1
  157. package/vanilla/UiTextarea.js +2 -2
  158. package/vanilla/UiToastRegion.d.ts +1 -1
  159. package/vanilla/UiToastRegion.js +3 -3
  160. package/vanilla/UiTooltip.d.ts +1 -1
  161. package/vanilla/UiTooltip.js +2 -2
  162. package/vanilla/UiTopBar.d.ts +1 -1
  163. package/vanilla/UiTopBar.js +1 -1
  164. package/vanilla/UiTree.d.ts +1 -1
  165. package/vanilla/UiTree.js +2 -2
  166. package/vanilla/UiTreeItem.d.ts +1 -1
  167. package/vanilla/UiTreeItem.js +2 -2
  168. package/vue/UiAffordanceScope.d.ts +2 -2
  169. package/vue/UiAffordanceScope.vue +92 -73
  170. package/vue/UiAvatar.d.ts +7 -7
  171. package/vue/UiAvatar.vue +145 -105
  172. package/vue/UiAvatarGroup.d.ts +4 -4
  173. package/vue/UiAvatarGroup.vue +134 -118
  174. package/vue/UiBadge.d.ts +4 -4
  175. package/vue/UiBadge.vue +113 -114
  176. package/vue/UiButton.d.ts +10 -6
  177. package/vue/UiButton.vue +289 -220
  178. package/vue/UiCallout.d.ts +2 -2
  179. package/vue/UiCallout.vue +154 -87
  180. package/vue/UiCheckbox.d.ts +14 -10
  181. package/vue/UiCheckbox.vue +228 -162
  182. package/vue/UiCluster.d.ts +2 -2
  183. package/vue/UiCluster.vue +53 -60
  184. package/vue/UiCombobox.d.ts +36 -32
  185. package/vue/UiCombobox.vue +1005 -416
  186. package/vue/UiContainer.d.ts +2 -2
  187. package/vue/UiContainer.vue +48 -51
  188. package/vue/UiContextMenu.d.ts +6 -4
  189. package/vue/UiContextMenu.vue +205 -116
  190. package/vue/UiDialog.d.ts +11 -9
  191. package/vue/UiDialog.vue +287 -212
  192. package/vue/UiDisclosure.d.ts +8 -6
  193. package/vue/UiDisclosure.vue +248 -159
  194. package/vue/UiEditable.d.ts +16 -12
  195. package/vue/UiEditable.vue +325 -205
  196. package/vue/UiEditorInsertTableGrid.d.ts +8 -8
  197. package/vue/UiEditorInsertTableGrid.vue +216 -157
  198. package/vue/UiEditorMentionMenu.d.ts +9 -9
  199. package/vue/UiEditorMentionMenu.vue +265 -222
  200. package/vue/UiEditorSlashMenu.d.ts +7 -7
  201. package/vue/UiEditorSlashMenu.vue +286 -240
  202. package/vue/UiEditorTableContextMenu.d.ts +5 -5
  203. package/vue/UiEditorTableContextMenu.vue +306 -193
  204. package/vue/UiEditorTableOverlay.d.ts +2 -2
  205. package/vue/UiEditorTableOverlay.vue +609 -369
  206. package/vue/UiEditorTableToolbar.d.ts +7 -7
  207. package/vue/UiEditorTableToolbar.vue +443 -268
  208. package/vue/UiEditorToolbar.d.ts +2 -2
  209. package/vue/UiEditorToolbar.vue +134 -121
  210. package/vue/UiFloatingActionButton.d.ts +6 -6
  211. package/vue/UiFloatingActionButton.vue +100 -99
  212. package/vue/UiFormField.d.ts +6 -6
  213. package/vue/UiFormField.vue +112 -80
  214. package/vue/UiGrid.d.ts +2 -2
  215. package/vue/UiGrid.vue +51 -57
  216. package/vue/UiIcon.d.ts +2 -2
  217. package/vue/UiIcon.vue +118 -89
  218. package/vue/UiIconButton.d.ts +11 -11
  219. package/vue/UiIconButton.vue +285 -206
  220. package/vue/UiInput.d.ts +9 -9
  221. package/vue/UiInput.vue +153 -127
  222. package/vue/UiMenu.d.ts +8 -6
  223. package/vue/UiMenu.vue +217 -143
  224. package/vue/UiMenuItem.d.ts +4 -4
  225. package/vue/UiMenuItem.vue +52 -46
  226. package/vue/UiPopover.d.ts +8 -6
  227. package/vue/UiPopover.vue +197 -137
  228. package/vue/UiRadio.d.ts +14 -10
  229. package/vue/UiRadio.vue +183 -117
  230. package/vue/UiRadioGroup.d.ts +14 -12
  231. package/vue/UiRadioGroup.vue +172 -111
  232. package/vue/UiReel.d.ts +3 -3
  233. package/vue/UiReel.vue +77 -77
  234. package/vue/UiSearchResultRow.d.ts +4 -4
  235. package/vue/UiSearchResultRow.vue +124 -115
  236. package/vue/UiSearchShell.d.ts +10 -8
  237. package/vue/UiSearchShell.vue +245 -176
  238. package/vue/UiSelect.d.ts +9 -9
  239. package/vue/UiSelect.vue +162 -134
  240. package/vue/UiSeparator.d.ts +2 -2
  241. package/vue/UiSeparator.vue +22 -27
  242. package/vue/UiSidebar.d.ts +20 -18
  243. package/vue/UiSidebar.vue +312 -224
  244. package/vue/UiStack.d.ts +3 -3
  245. package/vue/UiStack.vue +64 -70
  246. package/vue/UiSwitch.d.ts +12 -8
  247. package/vue/UiSwitch.vue +218 -150
  248. package/vue/UiSwitcher.d.ts +3 -3
  249. package/vue/UiSwitcher.vue +73 -75
  250. package/vue/UiTabs.d.ts +10 -8
  251. package/vue/UiTabs.vue +251 -210
  252. package/vue/UiTextarea.d.ts +11 -11
  253. package/vue/UiTextarea.vue +155 -128
  254. package/vue/UiToastRegion.d.ts +10 -8
  255. package/vue/UiToastRegion.vue +261 -198
  256. package/vue/UiTooltip.d.ts +14 -12
  257. package/vue/UiTooltip.vue +241 -177
  258. package/vue/UiTopBar.vue +51 -42
  259. package/vue/UiTree.d.ts +8 -6
  260. package/vue/UiTree.vue +157 -70
  261. package/vue/UiTreeItem.d.ts +24 -22
  262. package/vue/UiTreeItem.vue +456 -339
  263. package/vue/chunks/UiAffordanceScope.js +9 -16
  264. package/vue/chunks/UiAvatar.js +23 -29
  265. package/vue/chunks/UiAvatarGroup.js +16 -39
  266. package/vue/chunks/UiBadge.js +3 -12
  267. package/vue/chunks/UiButton.js +15 -18
  268. package/vue/chunks/UiCallout.js +8 -17
  269. package/vue/chunks/UiCheckbox.js +37 -40
  270. package/vue/chunks/UiCluster.js +3 -12
  271. package/vue/chunks/UiCombobox.js +224 -266
  272. package/vue/chunks/UiContainer.js +3 -12
  273. package/vue/chunks/UiContextMenu.js +39 -34
  274. package/vue/chunks/UiDialog.js +36 -39
  275. package/vue/chunks/UiDisclosure.js +43 -48
  276. package/vue/chunks/UiEditable.js +55 -57
  277. package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
  278. package/vue/chunks/UiEditorMentionMenu.js +40 -81
  279. package/vue/chunks/UiEditorSlashMenu.js +28 -52
  280. package/vue/chunks/UiEditorTableContextMenu.js +32 -56
  281. package/vue/chunks/UiEditorTableOverlay.js +58 -82
  282. package/vue/chunks/UiEditorTableToolbar.js +61 -85
  283. package/vue/chunks/UiEditorToolbar.js +4 -13
  284. package/vue/chunks/UiFloatingActionButton.js +7 -21
  285. package/vue/chunks/UiFormField.js +15 -12
  286. package/vue/chunks/UiGrid.js +3 -12
  287. package/vue/chunks/UiIcon.js +20 -43
  288. package/vue/chunks/UiIconButton.js +16 -28
  289. package/vue/chunks/UiInput.js +20 -25
  290. package/vue/chunks/UiMenu.js +29 -33
  291. package/vue/chunks/UiMenuItem.js +4 -10
  292. package/vue/chunks/UiPopover.js +28 -29
  293. package/vue/chunks/UiRadio.js +36 -39
  294. package/vue/chunks/UiRadioGroup.js +30 -34
  295. package/vue/chunks/UiReel.js +6 -15
  296. package/vue/chunks/UiSearchResultRow.js +6 -19
  297. package/vue/chunks/UiSearchShell.js +25 -28
  298. package/vue/chunks/UiSelect.js +20 -23
  299. package/vue/chunks/UiSeparator.js +2 -8
  300. package/vue/chunks/UiSidebar.js +39 -44
  301. package/vue/chunks/UiStack.js +6 -15
  302. package/vue/chunks/UiSwitch.js +35 -38
  303. package/vue/chunks/UiSwitcher.js +6 -15
  304. package/vue/chunks/UiTabs.js +47 -85
  305. package/vue/chunks/UiTextarea.js +21 -26
  306. package/vue/chunks/UiToastRegion.js +38 -72
  307. package/vue/chunks/UiTooltip.js +34 -35
  308. package/vue/chunks/UiTopBar.js +1 -1
  309. package/vue/chunks/UiTree.js +20 -15
  310. package/vue/chunks/UiTreeItem.js +85 -102
  311. package/vue/components.css +3994 -3764
  312. package/vue/index.d.ts +1 -0
  313. package/vue/index.js +2 -1
@@ -1,210 +1,269 @@
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 * as controllerModule from "../components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.js";
5
-
6
- defineOptions({ inheritAttrs: false });
7
-
8
- const hn = {
9
- 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),
10
- text: (v: unknown): string => v === undefined || v === null ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? "" : String(v),
11
- 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),
12
- enumerated: (v: unknown): any => typeof v === "boolean" ? String(v) : hn.attr(v),
13
- shape: (items: unknown, where: ((item: any) => unknown) | undefined, sort: readonly string[], limit: unknown): any[] => {
14
- let list = Array.isArray(items) ? items.slice() : [];
15
- if (where !== undefined) list = list.filter((item) => hn.t(where(item)));
16
- if (sort.length > 0) {
17
- const field = (item: unknown, path: string): unknown => item !== null && typeof item === "object" && !Array.isArray(item)
18
- ? path.split(".").reduce<unknown>((value, key) => (value as Record<string, unknown> | undefined)?.[key], item)
19
- : item;
20
- const compare = (a: unknown, b: unknown): number => typeof a === "number" && typeof b === "number" ? a - b : hn.text(a).localeCompare(hn.text(b));
21
- list.sort((a, b) => {
22
- for (const key of sort) {
23
- const descending = key.startsWith("-");
24
- const order = compare(field(a, descending ? key.slice(1) : key), field(b, descending ? key.slice(1) : key));
25
- if (order !== 0) return descending ? -order : order;
26
- }
27
- return 0;
28
- });
29
- }
30
- return typeof limit === "number" ? list.slice(0, Math.max(0, Math.trunc(limit))) : list;
3
+ import {
4
+ computed,
5
+ onBeforeUnmount,
6
+ onMounted,
7
+ ref,
8
+ shallowRef,
9
+ useTemplateRef,
10
+ watchEffect,
11
+ } from 'vue'
12
+ import * as controllerModule from '../components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.js'
13
+
14
+ defineOptions({ inheritAttrs: false })
15
+
16
+ const props = withDefaults(
17
+ defineProps<{
18
+ headerRow?: boolean
19
+ maxCols?: number
20
+ maxRows?: number
21
+ open?: boolean
22
+ }>(),
23
+ {
24
+ headerRow: false,
25
+ maxCols: 8,
26
+ maxRows: 8,
27
+ open: false,
31
28
  },
32
- };
33
-
34
- const props = withDefaults(defineProps<{
35
- headerRow?: boolean | null;
36
- maxCols?: number | null;
37
- maxRows?: number | null;
38
- open?: boolean | null;
39
- }>(), {
40
- headerRow: false,
41
- maxCols: 8,
42
- maxRows: 8,
43
- open: false,
44
- });
29
+ )
45
30
  const emit = defineEmits<{
46
- "insert": [detail: { readonly rows: number; readonly cols: number; readonly withHeaderRow: boolean }];
47
- }>();
48
- const root = ref<HTMLElement | null>(null);
49
- const refs: Record<string, Element | undefined> = {};
50
- const state_cells = ref<any>([]);
51
- const state_rows = ref<any>(8);
52
- const state_cols = ref<any>(8);
53
- const state_hint = ref<any>("");
54
- const state_withHeaderRow = ref<any>(false);
31
+ insert: [
32
+ detail: { readonly rows: number; readonly cols: number; readonly withHeaderRow: boolean },
33
+ ]
34
+ }>()
35
+
36
+ const root = ref<HTMLElement | null>(null)
37
+ const headerElement = useTemplateRef<HTMLElement>('header')
38
+ const insertElement = useTemplateRef<HTMLElement>('insert')
39
+ const cells = ref<{ key: string; row: number; col: number; label: string; selected: boolean }[]>([])
40
+ const rows = ref(8)
41
+ const cols = ref(8)
42
+ const hint = ref('')
43
+ const withHeaderRow = ref(false)
55
44
 
56
45
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
57
- const dispatch = (name: string, detail?: unknown): boolean => {
58
- const declared = {"insert":{"bubbles":true,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
46
+ function dispatch(name: string, detail?: unknown): boolean {
47
+ const declared: Record<string, EventInit | undefined> = {
48
+ insert: { bubbles: true, composed: true, cancelable: false },
49
+ }
59
50
  const checks: Record<string, (detail: unknown) => boolean> = {
60
- "insert": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && Number.isInteger((detail as Record<string, unknown>)["rows"]) && Number.isInteger((detail as Record<string, unknown>)["cols"]) && typeof (detail as Record<string, unknown>)["withHeaderRow"] === "boolean" && Object.keys(detail as object).every((key) => ["rows","cols","withHeaderRow"].includes(key))),
61
- };
51
+ insert: (detail) =>
52
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
53
+ && Number.isInteger((detail as Record<string, unknown>)['rows'])
54
+ && Number.isInteger((detail as Record<string, unknown>)['cols'])
55
+ && typeof (detail as Record<string, unknown>)['withHeaderRow'] === 'boolean'
56
+ && Object.keys(detail as object).every((key) =>
57
+ ['rows', 'cols', 'withHeaderRow'].includes(key)
58
+ ),
59
+ }
62
60
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
63
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
61
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
64
62
  }
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
- };
63
+ const emitEvent = emit as (name: string, detail: unknown) => void
64
+ emitEvent(name, detail)
65
+ return root.value?.dispatchEvent(
66
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
67
+ ) ?? true
68
+ }
68
69
 
69
70
  function read(name: string): unknown {
70
- if (name === "cells") return state_cells.value;
71
- if (name === "rows") return state_rows.value;
72
- if (name === "cols") return state_cols.value;
73
- if (name === "hint") return state_hint.value;
74
- if (name === "withHeaderRow") return state_withHeaderRow.value;
75
- return (props as Record<string, unknown>)[name];
71
+ if (name === 'cells') return cells.value
72
+ if (name === 'rows') return rows.value
73
+ if (name === 'cols') return cols.value
74
+ if (name === 'hint') return hint.value
75
+ if (name === 'withHeaderRow') return withHeaderRow.value
76
+ return (props as Record<string, unknown>)[name]
76
77
  }
77
78
 
78
79
  function write(name: string, value: unknown): boolean {
79
- if (name === "cells") { state_cells.value = value; return true; }
80
- if (name === "rows") { state_rows.value = value; return true; }
81
- if (name === "cols") { state_cols.value = value; return true; }
82
- if (name === "hint") { state_hint.value = value; return true; }
83
- if (name === "withHeaderRow") { state_withHeaderRow.value = value; return true; }
84
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
80
+ if (name === 'cells') {
81
+ cells.value = value as never
82
+ return true
83
+ }
84
+ if (name === 'rows') {
85
+ rows.value = value as never
86
+ return true
87
+ }
88
+ if (name === 'cols') {
89
+ cols.value = value as never
90
+ return true
91
+ }
92
+ if (name === 'hint') {
93
+ hint.value = value as never
94
+ return true
95
+ }
96
+ if (name === 'withHeaderRow') {
97
+ withHeaderRow.value = value as never
98
+ return true
99
+ }
100
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
85
101
  }
86
102
 
87
- const stops: Array<() => void> = [];
103
+ const stops: Array<() => void> = []
88
104
  const host = {
89
- get element(): Element { return root.value as Element; },
105
+ get element(): Element {
106
+ return root.value as Element
107
+ },
90
108
  state: new Proxy({} as Record<string, unknown>, {
91
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
92
- set: (_target, name, value) => typeof name === "string" && write(name, value),
109
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
110
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
93
111
  }),
94
- refs: refs as Readonly<Record<string, Element>>,
112
+ refs: {
113
+ get header(): Element {
114
+ return headerElement.value as Element
115
+ },
116
+ get insert(): Element {
117
+ return insertElement.value as Element
118
+ },
119
+ } as Readonly<Record<string, Element>>,
95
120
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
96
121
  get: (_target, name) => {
97
- if (typeof name !== "string" || root.value === null) return undefined;
98
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
99
- return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
122
+ if (typeof name !== 'string' || root.value === null) return undefined
123
+ const form = root.value instanceof HTMLFormElement
124
+ ? root.value
125
+ : root.value.querySelector('form')
126
+ return form?.elements.namedItem(name)
127
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
100
128
  },
101
129
  }),
102
130
  signal<T>(initialValue: T) {
103
- const value = shallowRef(initialValue);
131
+ const value = shallowRef(initialValue)
104
132
  return {
105
133
  get: (): T => value.value,
106
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
107
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
108
- };
134
+ set: (next: T): void => {
135
+ if (!Object.is(value.value, next)) value.value = next
136
+ },
137
+ update: (next: (current: T) => T): void => {
138
+ const updated = next(value.value)
139
+ if (!Object.is(value.value, updated)) value.value = updated
140
+ },
141
+ }
109
142
  },
110
143
  computed<T>(compute: () => T) {
111
- const value = computed(compute);
112
- return { get: (): T => value.value };
144
+ const value = computed(compute)
145
+ return { get: (): T => value.value }
113
146
  },
114
147
  effect(run: () => void | (() => void)): () => void {
115
148
  const stop = watchEffect((onCleanup) => {
116
- const cleanup = run();
117
- if (typeof cleanup === "function") onCleanup(cleanup);
118
- }, { flush: "post" });
119
- stops.push(stop);
120
- return stop;
149
+ const cleanup = run()
150
+ if (typeof cleanup === 'function') onCleanup(cleanup)
151
+ }, { flush: 'post' })
152
+ stops.push(stop)
153
+ return stop
121
154
  },
122
155
  on(event: string, listener: EventListener): () => void {
123
- const element = root.value;
124
- element?.addEventListener(event, listener);
125
- const off = (): void => element?.removeEventListener(event, listener);
126
- stops.push(off);
127
- return off;
156
+ const element = root.value
157
+ element?.addEventListener(event, listener)
158
+ const off = (): void => element?.removeEventListener(event, listener)
159
+ stops.push(off)
160
+ return off
128
161
  },
129
162
  dispatch,
130
- };
163
+ }
131
164
 
132
- let cleanup: void | (() => void);
133
- let ready: Promise<void> | undefined;
165
+ let cleanup: void | (() => void)
166
+ let ready: Promise<void> | undefined
134
167
  onMounted(() => {
135
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
136
- });
168
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
169
+ cleanup = result
170
+ })
171
+ })
137
172
  onBeforeUnmount(() => {
138
- for (const stop of stops.splice(0)) stop();
139
- if (typeof cleanup === "function") cleanup();
140
- });
173
+ for (const stop of stops.splice(0)) stop()
174
+ if (typeof cleanup === 'function') cleanup()
175
+ })
141
176
  </script>
142
177
 
143
178
  <template>
144
- <div data-component="ui-editor-insert-table-grid" v-bind="$attrs" :hidden="hn.attr(!hn.t(props.open))" ref="root"><p class="hint">{{ hn.text(state_hint) }}</p><div class="grid" role="group" aria-label="Table dimensions" :style="{ '--ui-editor-table-grid-rows': hn.text(state_rows), '--ui-editor-table-grid-cols': hn.text(state_cols) }"><template v-for="(cell, index) in hn.shape(state_cells, undefined, [], undefined)" :key="(cell)?.key"><button type="button" class="cell" :data-row="hn.attr((cell)?.row)" :data-col="hn.attr((cell)?.col)" :aria-label="hn.enumerated((cell)?.label)" :aria-pressed="hn.enumerated((cell)?.selected)" :class="{ 'selected': hn.t((cell)?.selected) }"></button></template></div><label class="header"><input type="checkbox" :checked.prop="(state_withHeaderRow) as any" :ref="(element) => { refs['header'] = element as Element }"> Header row</label><button type="button" class="insert" :ref="(element) => { refs['insert'] = element as Element }">Insert table</button></div>
179
+ <div data-component="ui-editor-insert-table-grid" v-bind="$attrs" :hidden="!open" ref="root">
180
+ <p class="hint">{{ hint }}</p>
181
+ <div
182
+ class="grid"
183
+ role="group"
184
+ aria-label="Table dimensions"
185
+ :style="{ '--ui-editor-table-grid-rows': rows, '--ui-editor-table-grid-cols': cols }"
186
+ >
187
+ <button
188
+ v-for="cell in cells"
189
+ :key="cell.key"
190
+ type="button"
191
+ class="cell"
192
+ :data-row="cell.row"
193
+ :data-col="cell.col"
194
+ :aria-label="cell.label"
195
+ :aria-pressed="cell.selected"
196
+ :class="{ selected: cell.selected }"
197
+ >
198
+ </button>
199
+ </div>
200
+ <label class="header"><input type="checkbox" :checked.prop="withHeaderRow" ref="header"> Header
201
+ row</label>
202
+ <button type="button" class="insert" ref="insert">Insert table</button>
203
+ </div>
145
204
  </template>
146
205
 
147
206
  <style scoped>
148
207
  [data-component~="ui-editor-insert-table-grid"] {
149
- padding: var(--ui-space-3, 12px);
150
- background: var(--ui-surface, #fff);
151
- border: 1px solid var(--ui-border, #e5e7eb);
152
- border-radius: var(--ui-radius-md, 6px);
153
- box-shadow: var(--ui-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
154
- }
208
+ padding: var(--ui-space-3, 12px);
209
+ background: var(--ui-surface, #fff);
210
+ border: 1px solid var(--ui-border, #e5e7eb);
211
+ border-radius: var(--ui-radius-md, 6px);
212
+ box-shadow: var(--ui-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
213
+ }
155
214
 
156
- .hint {
157
- margin: 0 0 var(--ui-space-2, 8px);
158
- font-size: var(--ui-text-sm, 0.875rem);
159
- color: var(--ui-text-muted, #6b7280);
160
- }
215
+ .hint {
216
+ margin: 0 0 var(--ui-space-2, 8px);
217
+ font-size: var(--ui-text-sm, 0.875rem);
218
+ color: var(--ui-text-muted, #6b7280);
219
+ }
161
220
 
162
- .grid {
163
- display: grid;
164
- grid-template-columns: repeat(var(--ui-editor-table-grid-cols, 8), 1.25rem);
165
- grid-template-rows: repeat(var(--ui-editor-table-grid-rows, 8), 1.25rem);
166
- gap: 2px;
167
- margin-bottom: var(--ui-space-2, 8px);
168
- }
221
+ .grid {
222
+ display: grid;
223
+ grid-template-columns: repeat(var(--ui-editor-table-grid-cols, 8), 1.25rem);
224
+ grid-template-rows: repeat(var(--ui-editor-table-grid-rows, 8), 1.25rem);
225
+ gap: 2px;
226
+ margin-bottom: var(--ui-space-2, 8px);
227
+ }
169
228
 
170
- .cell {
171
- width: 1.25rem;
172
- height: 1.25rem;
173
- padding: 0;
174
- border: 1px solid var(--ui-border, #e5e7eb);
175
- border-radius: 2px;
176
- background: var(--ui-surface, #fff);
177
- cursor: pointer;
178
- }
229
+ .cell {
230
+ width: 1.25rem;
231
+ height: 1.25rem;
232
+ padding: 0;
233
+ border: 1px solid var(--ui-border, #e5e7eb);
234
+ border-radius: 2px;
235
+ background: var(--ui-surface, #fff);
236
+ cursor: pointer;
237
+ }
179
238
 
180
- .cell.selected {
181
- background: var(--ui-accent-solid, var(--ui-accent, #0066cc));
182
- border-color: var(--ui-accent-solid, var(--ui-accent, #0066cc));
183
- }
239
+ .cell.selected {
240
+ background: var(--ui-accent-solid, var(--ui-accent, #0066cc));
241
+ border-color: var(--ui-accent-solid, var(--ui-accent, #0066cc));
242
+ }
184
243
 
185
- .header {
186
- display: block;
187
- margin-bottom: var(--ui-space-2, 8px);
188
- font-size: var(--ui-text-sm, 0.875rem);
189
- cursor: pointer;
190
- }
244
+ .header {
245
+ display: block;
246
+ margin-bottom: var(--ui-space-2, 8px);
247
+ font-size: var(--ui-text-sm, 0.875rem);
248
+ cursor: pointer;
249
+ }
191
250
 
192
- [data-component~="ui-editor-insert-table-grid"] .insert {
193
- width: 100%;
194
- padding: var(--ui-space-2, 8px) var(--ui-space-3, 12px);
195
- border: 1px solid var(--ui-border, #e5e7eb);
196
- border-radius: var(--ui-radius-sm, 4px);
197
- background: var(--ui-accent-solid, var(--ui-accent, #0066cc));
198
- color: var(--ui-accent-contrast, #fff);
199
- font-size: var(--ui-text-sm, 0.875rem);
200
- cursor: pointer;
201
- }
251
+ [data-component~="ui-editor-insert-table-grid"] .insert {
252
+ width: 100%;
253
+ padding: var(--ui-space-2, 8px) var(--ui-space-3, 12px);
254
+ border: 1px solid var(--ui-border, #e5e7eb);
255
+ border-radius: var(--ui-radius-sm, 4px);
256
+ background: var(--ui-accent-solid, var(--ui-accent, #0066cc));
257
+ color: var(--ui-accent-contrast, #fff);
258
+ font-size: var(--ui-text-sm, 0.875rem);
259
+ cursor: pointer;
260
+ }
202
261
 
203
- [data-component~="ui-editor-insert-table-grid"] .insert:hover {
204
- filter: brightness(1.05);
205
- }
262
+ [data-component~="ui-editor-insert-table-grid"] .insert:hover {
263
+ filter: brightness(1.05);
264
+ }
206
265
 
207
- [data-component~="ui-editor-insert-table-grid"][hidden] {
208
- display: none;
209
- }
266
+ [data-component~="ui-editor-insert-table-grid"][hidden] {
267
+ display: none;
268
+ }
210
269
  </style>
@@ -14,11 +14,11 @@ type __VLS_Props = {
14
14
  readonly label: string;
15
15
  readonly detail?: string;
16
16
  readonly initials?: string;
17
- })[] | null;
18
- loading?: boolean | null;
19
- open?: boolean | null;
20
- query?: string | null;
21
- selectedIndex?: number | null;
17
+ })[];
18
+ loading?: boolean;
19
+ open?: boolean;
20
+ query?: string;
21
+ selectedIndex?: number;
22
22
  };
23
23
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
24
24
  select: (detail: {
@@ -35,10 +35,10 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
35
35
  readonly index: number;
36
36
  }) => any) | undefined;
37
37
  }>, {
38
- open: boolean | null;
39
- query: string | null;
40
- loading: boolean | null;
41
- selectedIndex: number | null;
38
+ open: boolean;
39
+ query: string;
40
+ loading: boolean;
41
+ selectedIndex: number;
42
42
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
43
43
  declare const _default: typeof __VLS_export;
44
44
  export default _default;