@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,267 +1,387 @@
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-editable/ui-editable.js";
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-editable/ui-editable.js'
5
13
 
6
- defineOptions({ inheritAttrs: false });
14
+ defineOptions({ inheritAttrs: false })
7
15
 
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
- };
14
-
15
- const props = withDefaults(defineProps<{
16
- actions?: boolean | null;
17
- disabled?: boolean | null;
18
- edit?: boolean | null;
19
- hint?: string | null;
20
- label?: string | null;
21
- value?: string | null;
22
- }>(), {
23
- actions: false,
24
- disabled: false,
25
- edit: false,
26
- hint: "",
27
- label: "Edit value",
28
- value: "",
29
- });
16
+ const props = withDefaults(
17
+ defineProps<{
18
+ actions?: boolean
19
+ disabled?: boolean
20
+ edit?: boolean
21
+ hint?: string
22
+ label?: string
23
+ value?: string
24
+ }>(),
25
+ {
26
+ actions: false,
27
+ disabled: false,
28
+ edit: false,
29
+ hint: '',
30
+ label: 'Edit value',
31
+ value: '',
32
+ },
33
+ )
30
34
  const emit = defineEmits<{
31
- "input": [detail: { readonly value: string; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
32
- "change": [detail: { readonly value: string; readonly previousValue: string; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
33
- "edit-change": [detail: { readonly edit: boolean; readonly reason: "activate" | "commit" | "cancel" | "light-dismiss" | "escape" | "programmatic"; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
34
- }>();
35
- const root = ref<HTMLElement | null>(null);
36
- const refs: Record<string, Element | undefined> = {};
37
- const state_internalEdit = ref<any>(false);
38
- const state_internalValue = ref<any>("");
39
- const state_draft = ref<any>("");
35
+ 'update:edit': [value: boolean]
36
+ 'update:value': [value: string]
37
+ input: [
38
+ detail: { readonly value: string; readonly trigger: 'keyboard' | 'pointer' | 'programmatic' },
39
+ ]
40
+ change: [
41
+ detail: {
42
+ readonly value: string
43
+ readonly previousValue: string
44
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
45
+ },
46
+ ]
47
+ 'edit-change': [
48
+ detail: {
49
+ readonly edit: boolean
50
+ readonly reason:
51
+ | 'activate'
52
+ | 'commit'
53
+ | 'cancel'
54
+ | 'light-dismiss'
55
+ | 'escape'
56
+ | 'programmatic'
57
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
58
+ },
59
+ ]
60
+ }>()
61
+
62
+ const root = ref<HTMLElement | null>(null)
63
+ const previewElement = useTemplateRef<HTMLElement>('preview')
64
+ const inputElement = useTemplateRef<HTMLElement>('input')
65
+ const internalEdit = ref(false)
66
+ const internalValue = ref('')
67
+ const draft = ref('')
68
+
69
+ /** The values the styles' :host-state() rules test. */
70
+ const hostState = computed(() =>
71
+ [
72
+ internalEdit.value && 'internalEdit',
73
+ props.disabled && 'disabled',
74
+ ].filter(Boolean).join(' ')
75
+ )
40
76
 
41
77
  /** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
42
- const dispatch = (name: string, detail?: unknown): boolean => {
43
- const declared = {"input":{"bubbles":true,"composed":true,"cancelable":false},"change":{"bubbles":true,"composed":true,"cancelable":false},"edit-change":{"bubbles":true,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
78
+ function dispatch(name: string, detail?: unknown): boolean {
79
+ const declared: Record<string, EventInit | undefined> = {
80
+ input: { bubbles: true, composed: true, cancelable: false },
81
+ change: { bubbles: true, composed: true, cancelable: false },
82
+ 'edit-change': { bubbles: true, composed: true, cancelable: false },
83
+ }
44
84
  const checks: Record<string, (detail: unknown) => boolean> = {
45
- "input": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["value"] === "string" && ((detail as Record<string, unknown>)["trigger"] === "keyboard" || (detail as Record<string, unknown>)["trigger"] === "pointer" || (detail as Record<string, unknown>)["trigger"] === "programmatic") && Object.keys(detail as object).every((key) => ["value","trigger"].includes(key))),
46
- "change": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["value"] === "string" && typeof (detail as Record<string, unknown>)["previousValue"] === "string" && ((detail as Record<string, unknown>)["trigger"] === "keyboard" || (detail as Record<string, unknown>)["trigger"] === "pointer" || (detail as Record<string, unknown>)["trigger"] === "programmatic") && Object.keys(detail as object).every((key) => ["value","previousValue","trigger"].includes(key))),
47
- "edit-change": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["edit"] === "boolean" && ((detail as Record<string, unknown>)["reason"] === "activate" || (detail as Record<string, unknown>)["reason"] === "commit" || (detail as Record<string, unknown>)["reason"] === "cancel" || (detail as Record<string, unknown>)["reason"] === "light-dismiss" || (detail as Record<string, unknown>)["reason"] === "escape" || (detail as Record<string, unknown>)["reason"] === "programmatic") && ((detail as Record<string, unknown>)["trigger"] === "keyboard" || (detail as Record<string, unknown>)["trigger"] === "pointer" || (detail as Record<string, unknown>)["trigger"] === "programmatic") && Object.keys(detail as object).every((key) => ["edit","reason","trigger"].includes(key))),
48
- };
85
+ input: (detail) =>
86
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
87
+ && typeof (detail as Record<string, unknown>)['value'] === 'string'
88
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
89
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
90
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
91
+ && Object.keys(detail as object).every((key) => ['value', 'trigger'].includes(key)),
92
+ change: (detail) =>
93
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
94
+ && typeof (detail as Record<string, unknown>)['value'] === 'string'
95
+ && typeof (detail as Record<string, unknown>)['previousValue'] === 'string'
96
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
97
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
98
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
99
+ && Object.keys(detail as object).every((key) =>
100
+ ['value', 'previousValue', 'trigger'].includes(key)
101
+ ),
102
+ 'edit-change': (detail) =>
103
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
104
+ && typeof (detail as Record<string, unknown>)['edit'] === 'boolean'
105
+ && ((detail as Record<string, unknown>)['reason'] === 'activate'
106
+ || (detail as Record<string, unknown>)['reason'] === 'commit'
107
+ || (detail as Record<string, unknown>)['reason'] === 'cancel'
108
+ || (detail as Record<string, unknown>)['reason'] === 'light-dismiss'
109
+ || (detail as Record<string, unknown>)['reason'] === 'escape'
110
+ || (detail as Record<string, unknown>)['reason'] === 'programmatic')
111
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
112
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
113
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
114
+ && Object.keys(detail as object).every((key) => ['edit', 'reason', 'trigger'].includes(key)),
115
+ }
49
116
  if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
50
- throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
117
+ throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`)
51
118
  }
52
- (emit as (name: string, detail: unknown) => void)(name, detail);
53
- return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
54
- };
55
-
56
- /** The resolved values the styles' :host-state() rules test. */
57
- const hostState = computed(() => (["internalEdit","disabled"] as const).flatMap((name) => {
58
- const value = read(name);
59
- const tokens: string[] = hn.t(value) ? [name] : [];
60
- if (typeof value === "string" || typeof value === "number") tokens.push(`${name}=${encodeURIComponent(String(value))}`);
61
- return tokens;
62
- }).join(" "));
119
+ const emitEvent = emit as (name: string, detail: unknown) => void
120
+ emitEvent(name, detail)
121
+ if (detail !== null && typeof detail === 'object' && 'edit' in detail) {
122
+ emitEvent('update:edit', (detail as Record<string, unknown>)['edit'])
123
+ }
124
+ if (detail !== null && typeof detail === 'object' && 'value' in detail) {
125
+ emitEvent('update:value', (detail as Record<string, unknown>)['value'])
126
+ }
127
+ return root.value?.dispatchEvent(
128
+ new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail }),
129
+ ) ?? true
130
+ }
63
131
 
64
132
  function read(name: string): unknown {
65
- if (name === "internalEdit") return state_internalEdit.value;
66
- if (name === "internalValue") return state_internalValue.value;
67
- if (name === "draft") return state_draft.value;
68
- return (props as Record<string, unknown>)[name];
133
+ if (name === 'internalEdit') return internalEdit.value
134
+ if (name === 'internalValue') return internalValue.value
135
+ if (name === 'draft') return draft.value
136
+ return (props as Record<string, unknown>)[name]
69
137
  }
70
138
 
71
139
  function write(name: string, value: unknown): boolean {
72
- if (name === "internalEdit") { state_internalEdit.value = value; return true; }
73
- if (name === "internalValue") { state_internalValue.value = value; return true; }
74
- if (name === "draft") { state_draft.value = value; return true; }
75
- throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
140
+ if (name === 'internalEdit') {
141
+ internalEdit.value = value as never
142
+ return true
143
+ }
144
+ if (name === 'internalValue') {
145
+ internalValue.value = value as never
146
+ return true
147
+ }
148
+ if (name === 'draft') {
149
+ draft.value = value as never
150
+ return true
151
+ }
152
+ throw new TypeError(`Only declared state is writable; \`${name}\` is not.`)
76
153
  }
77
154
 
78
- const stops: Array<() => void> = [];
155
+ const stops: Array<() => void> = []
79
156
  const host = {
80
- get element(): Element { return root.value as Element; },
157
+ get element(): Element {
158
+ return root.value as Element
159
+ },
81
160
  state: new Proxy({} as Record<string, unknown>, {
82
- get: (_target, name) => typeof name === "string" ? read(name) : undefined,
83
- set: (_target, name, value) => typeof name === "string" && write(name, value),
161
+ get: (_target, name) => typeof name === 'string' ? read(name) : undefined,
162
+ set: (_target, name, value) => typeof name === 'string' && write(name, value),
84
163
  }),
85
- refs: refs as Readonly<Record<string, Element>>,
164
+ refs: {
165
+ get preview(): Element {
166
+ return previewElement.value as Element
167
+ },
168
+ get input(): Element {
169
+ return inputElement.value as Element
170
+ },
171
+ } as Readonly<Record<string, Element>>,
86
172
  elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
87
173
  get: (_target, name) => {
88
- if (typeof name !== "string" || root.value === null) return undefined;
89
- const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
90
- return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
174
+ if (typeof name !== 'string' || root.value === null) return undefined
175
+ const form = root.value instanceof HTMLFormElement
176
+ ? root.value
177
+ : root.value.querySelector('form')
178
+ return form?.elements.namedItem(name)
179
+ ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined
91
180
  },
92
181
  }),
93
182
  signal<T>(initialValue: T) {
94
- const value = shallowRef(initialValue);
183
+ const value = shallowRef(initialValue)
95
184
  return {
96
185
  get: (): T => value.value,
97
- set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
98
- update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
99
- };
186
+ set: (next: T): void => {
187
+ if (!Object.is(value.value, next)) value.value = next
188
+ },
189
+ update: (next: (current: T) => T): void => {
190
+ const updated = next(value.value)
191
+ if (!Object.is(value.value, updated)) value.value = updated
192
+ },
193
+ }
100
194
  },
101
195
  computed<T>(compute: () => T) {
102
- const value = computed(compute);
103
- return { get: (): T => value.value };
196
+ const value = computed(compute)
197
+ return { get: (): T => value.value }
104
198
  },
105
199
  effect(run: () => void | (() => void)): () => void {
106
200
  const stop = watchEffect((onCleanup) => {
107
- const cleanup = run();
108
- if (typeof cleanup === "function") onCleanup(cleanup);
109
- }, { flush: "post" });
110
- stops.push(stop);
111
- return stop;
201
+ const cleanup = run()
202
+ if (typeof cleanup === 'function') onCleanup(cleanup)
203
+ }, { flush: 'post' })
204
+ stops.push(stop)
205
+ return stop
112
206
  },
113
207
  on(event: string, listener: EventListener): () => void {
114
- const element = root.value;
115
- element?.addEventListener(event, listener);
116
- const off = (): void => element?.removeEventListener(event, listener);
117
- stops.push(off);
118
- return off;
208
+ const element = root.value
209
+ element?.addEventListener(event, listener)
210
+ const off = (): void => element?.removeEventListener(event, listener)
211
+ stops.push(off)
212
+ return off
119
213
  },
120
214
  dispatch,
121
- };
215
+ }
122
216
 
123
- let cleanup: void | (() => void);
124
- let ready: Promise<void> | undefined;
217
+ let cleanup: void | (() => void)
218
+ let ready: Promise<void> | undefined
125
219
  onMounted(() => {
126
- ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
127
- });
220
+ ready = Promise.resolve(controllerModule.default(host as never)).then((result) => {
221
+ cleanup = result
222
+ })
223
+ })
128
224
  onBeforeUnmount(() => {
129
- for (const stop of stops.splice(0)) stop();
130
- if (typeof cleanup === "function") cleanup();
131
- });
225
+ for (const stop of stops.splice(0)) stop()
226
+ if (typeof cleanup === 'function') cleanup()
227
+ })
132
228
  </script>
133
229
 
134
230
  <template>
135
- <div data-component="ui-editable" v-bind="$attrs" :data-ui-editable-state="hostState || undefined" ref="root"><div class="field"><button class="preview" type="button" :disabled="hn.attr(props.disabled)" :ref="(element) => { refs['preview'] = element as Element }"><span class="text">{{ hn.text(state_internalValue) }}</span><template v-if="hn.t(props.hint)"><span class="hint" aria-hidden="true">{{ hn.text(props.hint) }}</span></template></button><input class="input" type="text" :value.prop="(state_draft) as any" :aria-label="hn.enumerated(props.label)" :disabled="hn.attr((hn.t(props.disabled) || hn.t(!hn.t(state_internalEdit))))" :ref="(element) => { refs['input'] = element as Element }"></div><template v-if="hn.t(props.actions)"><div class="actions"><button class="save" type="button">Save</button><button class="cancel" type="button">Cancel</button></div></template></div>
231
+ <div
232
+ data-component="ui-editable"
233
+ v-bind="$attrs"
234
+ :data-ui-editable-state="hostState || undefined"
235
+ ref="root"
236
+ >
237
+ <div class="field">
238
+ <button class="preview" type="button" :disabled="disabled" ref="preview">
239
+ <span class="text">{{ internalValue }}</span>
240
+ <span v-if="hint" class="hint" aria-hidden="true">{{ hint }}</span>
241
+ </button>
242
+ <input
243
+ class="input"
244
+ type="text"
245
+ :value.prop="draft"
246
+ :aria-label="label"
247
+ :disabled="disabled || !internalEdit"
248
+ ref="input"
249
+ >
250
+ </div>
251
+ <div v-if="actions" class="actions">
252
+ <button class="save" type="button">Save</button>
253
+ <button class="cancel" type="button">Cancel</button>
254
+ </div>
255
+ </div>
136
256
  </template>
137
257
 
138
258
  <style scoped>
139
259
  [data-component~="ui-editable"] {
140
- display: flex;
141
- flex-wrap: wrap;
142
- align-items: center;
143
- gap: var(--ui-space-2);
144
- min-inline-size: 0;
145
- color: var(--ui-text-primary);
146
- }
260
+ display: flex;
261
+ flex-wrap: wrap;
262
+ align-items: center;
263
+ gap: var(--ui-space-2);
264
+ min-inline-size: 0;
265
+ color: var(--ui-text-primary);
266
+ }
147
267
 
148
- /* The value and the input share one grid cell with identical box metrics, so switching between
149
- * display and edit never changes the control's size or moves the text. */
150
- .field {
151
- display: inline-grid;
152
- min-inline-size: 8rem;
153
- max-inline-size: 100%;
154
- }
268
+ /* The value and the input share one grid cell with identical box metrics, so switching between
269
+ * display and edit never changes the control's size or moves the text. */
270
+ .field {
271
+ display: inline-grid;
272
+ min-inline-size: 8rem;
273
+ max-inline-size: 100%;
274
+ }
155
275
 
156
- .preview,
157
- .input {
158
- grid-area: 1 / 1;
159
- box-sizing: border-box;
160
- min-block-size: var(--ui-control-size-sm, 2rem);
161
- margin: 0;
162
- padding: var(--ui-space-1) var(--ui-space-2);
163
- border: 1px solid transparent;
164
- border-radius: var(--ui-radius-2);
165
- font: inherit;
166
- line-height: var(--ui-line-height-md);
167
- color: inherit;
168
- transition:
169
- background-color var(--ui-motion-fast) var(--ui-motion-ease),
170
- border-color var(--ui-motion-fast) var(--ui-motion-ease),
171
- box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
172
- }
276
+ .preview,
277
+ .input {
278
+ grid-area: 1 / 1;
279
+ box-sizing: border-box;
280
+ min-block-size: var(--ui-control-size-sm, 2rem);
281
+ margin: 0;
282
+ padding: var(--ui-space-1) var(--ui-space-2);
283
+ border: 1px solid transparent;
284
+ border-radius: var(--ui-radius-2);
285
+ font: inherit;
286
+ line-height: var(--ui-line-height-md);
287
+ color: inherit;
288
+ transition:
289
+ background-color var(--ui-motion-fast) var(--ui-motion-ease),
290
+ border-color var(--ui-motion-fast) var(--ui-motion-ease),
291
+ box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
292
+ }
173
293
 
174
- .preview {
175
- display: inline-flex;
176
- gap: var(--ui-space-2);
177
- align-items: center;
178
- background: transparent;
179
- text-align: start;
180
- cursor: pointer;
181
- }
294
+ .preview {
295
+ display: inline-flex;
296
+ gap: var(--ui-space-2);
297
+ align-items: center;
298
+ background: transparent;
299
+ text-align: start;
300
+ cursor: pointer;
301
+ }
182
302
 
183
- .preview:hover:not(:disabled) {
184
- background: var(--ui-surface-muted);
185
- }
303
+ .preview:hover:not(:disabled) {
304
+ background: var(--ui-surface-muted);
305
+ }
186
306
 
187
- .preview:focus-visible {
188
- outline: none;
189
- box-shadow: var(--ui-focus-halo);
190
- }
307
+ .preview:focus-visible {
308
+ outline: none;
309
+ box-shadow: var(--ui-focus-halo);
310
+ }
191
311
 
192
- .hint {
193
- color: var(--ui-text-secondary);
194
- font-size: var(--ui-font-size-sm);
195
- }
312
+ .hint {
313
+ color: var(--ui-text-secondary);
314
+ font-size: var(--ui-font-size-sm);
315
+ }
196
316
 
197
- /* Contained so it takes the value's width instead of its own default input width. */
198
- .input {
199
- contain: inline-size;
200
- inline-size: 100%;
201
- min-inline-size: 0;
202
- visibility: hidden;
203
- background: var(--ui-control-surface, var(--ui-surface-elevated));
204
- }
317
+ /* Contained so it takes the value's width instead of its own default input width. */
318
+ .input {
319
+ contain: inline-size;
320
+ inline-size: 100%;
321
+ min-inline-size: 0;
322
+ visibility: hidden;
323
+ background: var(--ui-control-surface, var(--ui-surface-elevated));
324
+ }
205
325
 
206
- .input:focus {
207
- outline: none;
208
- border-color: var(--ui-control-focus, var(--ui-accent-solid));
209
- box-shadow:
210
- var(--ui-control-inset),
211
- var(--ui-control-focus-halo-shadow);
212
- }
326
+ .input:focus {
327
+ outline: none;
328
+ border-color: var(--ui-control-focus, var(--ui-accent-solid));
329
+ box-shadow:
330
+ var(--ui-control-inset),
331
+ var(--ui-control-focus-halo-shadow);
332
+ }
213
333
 
214
- .input::selection {
215
- background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
216
- }
334
+ .input::selection {
335
+ background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
336
+ }
217
337
 
218
- [data-component~="ui-editable"][data-ui-editable-state~="internalEdit"] .preview {
219
- visibility: hidden;
220
- }
221
- [data-component~="ui-editable"][data-ui-editable-state~="internalEdit"] .input {
222
- visibility: visible;
223
- }
338
+ [data-component~="ui-editable"][data-ui-editable-state~="internalEdit"] .preview {
339
+ visibility: hidden;
340
+ }
341
+ [data-component~="ui-editable"][data-ui-editable-state~="internalEdit"] .input {
342
+ visibility: visible;
343
+ }
224
344
 
225
- .actions {
226
- display: none;
227
- gap: var(--ui-space-1);
228
- }
229
- [data-component~="ui-editable"][data-ui-editable-state~="internalEdit"] .actions {
230
- display: inline-flex;
231
- }
345
+ .actions {
346
+ display: none;
347
+ gap: var(--ui-space-1);
348
+ }
349
+ [data-component~="ui-editable"][data-ui-editable-state~="internalEdit"] .actions {
350
+ display: inline-flex;
351
+ }
232
352
 
233
- .actions button {
234
- min-block-size: var(--ui-control-size-sm, 2rem);
235
- padding: 0 var(--ui-space-3);
236
- border: 1px solid var(--ui-border-strong);
237
- border-radius: var(--ui-radius-2);
238
- background: var(--ui-surface-elevated);
239
- background-image: var(--ui-raised-highlight, none);
240
- box-shadow: var(--ui-raised, none);
241
- color: inherit;
242
- font: inherit;
243
- font-size: var(--ui-font-size-sm);
244
- cursor: pointer;
245
- }
353
+ .actions button {
354
+ min-block-size: var(--ui-control-size-sm, 2rem);
355
+ padding: 0 var(--ui-space-3);
356
+ border: 1px solid var(--ui-border-strong);
357
+ border-radius: var(--ui-radius-2);
358
+ background: var(--ui-surface-elevated);
359
+ background-image: var(--ui-raised-highlight, none);
360
+ box-shadow: var(--ui-raised, none);
361
+ color: inherit;
362
+ font: inherit;
363
+ font-size: var(--ui-font-size-sm);
364
+ cursor: pointer;
365
+ }
246
366
 
247
- .actions .save {
248
- border-color: var(--ui-accent-solid);
249
- background: var(--ui-accent-solid);
250
- color: var(--ui-text-on-accent);
251
- }
367
+ .actions .save {
368
+ border-color: var(--ui-accent-solid);
369
+ background: var(--ui-accent-solid);
370
+ color: var(--ui-text-on-accent);
371
+ }
252
372
 
253
- .actions button:focus-visible {
254
- outline: none;
255
- box-shadow: var(--ui-focus-halo);
256
- }
373
+ .actions button:focus-visible {
374
+ outline: none;
375
+ box-shadow: var(--ui-focus-halo);
376
+ }
257
377
 
258
- [data-component~="ui-editable"][data-ui-editable-state~="disabled"] .preview {
259
- color: var(--ui-text-muted);
260
- cursor: not-allowed;
261
- }
378
+ [data-component~="ui-editable"][data-ui-editable-state~="disabled"] .preview {
379
+ color: var(--ui-text-muted);
380
+ cursor: not-allowed;
381
+ }
262
382
 
263
- /* A component that sets its display still honours the hidden attribute on its root. */
264
- [data-component~="ui-editable"][hidden] {
265
- display: none;
266
- }
383
+ /* A component that sets its display still honours the hidden attribute on its root. */
384
+ [data-component~="ui-editable"][hidden] {
385
+ display: none;
386
+ }
267
387
  </style>
@@ -1,8 +1,8 @@
1
1
  type __VLS_Props = {
2
- headerRow?: boolean | null;
3
- maxCols?: number | null;
4
- maxRows?: number | null;
5
- open?: boolean | null;
2
+ headerRow?: boolean;
3
+ maxCols?: number;
4
+ maxRows?: number;
5
+ open?: boolean;
6
6
  };
7
7
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
8
8
  insert: (detail: {
@@ -17,10 +17,10 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
17
17
  readonly withHeaderRow: boolean;
18
18
  }) => any) | undefined;
19
19
  }>, {
20
- open: boolean | null;
21
- headerRow: boolean | null;
22
- maxCols: number | null;
23
- maxRows: number | null;
20
+ open: boolean;
21
+ headerRow: boolean;
22
+ maxCols: number;
23
+ maxRows: number;
24
24
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
25
  declare const _default: typeof __VLS_export;
26
26
  export default _default;