@inkbar/vue 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +70 -4
  2. package/dist/components/InkDownloadButton.js +7 -0
  3. package/dist/components/InkDownloadButton.js.map +1 -0
  4. package/dist/components/InkDownloadButton.vue.d.ts +21 -0
  5. package/dist/components/InkDownloadButton.vue.d.ts.map +1 -0
  6. package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js +42 -0
  7. package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  8. package/dist/components/InkFindBar.js.map +1 -1
  9. package/dist/components/InkFindBar.vue.d.ts.map +1 -1
  10. package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js +48 -48
  11. package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/InkHighlightMenu.js.map +1 -1
  13. package/dist/components/InkHighlightMenu.vue.d.ts.map +1 -1
  14. package/dist/components/InkHighlightMenu.vue_vue_type_script_setup_true_lang.js +67 -65
  15. package/dist/components/InkHighlightMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/InkPanel.js +7 -0
  17. package/dist/components/InkPanel.js.map +1 -0
  18. package/dist/components/InkPanel.vue.d.ts +21 -0
  19. package/dist/components/InkPanel.vue.d.ts.map +1 -0
  20. package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js +48 -0
  21. package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  22. package/dist/components/InkPrintButton.js +7 -0
  23. package/dist/components/InkPrintButton.js.map +1 -0
  24. package/dist/components/InkPrintButton.vue.d.ts +19 -0
  25. package/dist/components/InkPrintButton.vue.d.ts.map +1 -0
  26. package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js +39 -0
  27. package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  28. package/dist/components/InkRecordList.js +7 -0
  29. package/dist/components/InkRecordList.js.map +1 -0
  30. package/dist/components/InkRecordList.vue.d.ts +35 -0
  31. package/dist/components/InkRecordList.vue.d.ts.map +1 -0
  32. package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js +41 -0
  33. package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  34. package/dist/components/InkRoot.js.map +1 -1
  35. package/dist/components/InkRoot.vue.d.ts +48 -4
  36. package/dist/components/InkRoot.vue.d.ts.map +1 -1
  37. package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js +177 -164
  38. package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/InkSearchResults.js +7 -0
  40. package/dist/components/InkSearchResults.js.map +1 -0
  41. package/dist/components/InkSearchResults.vue.d.ts +9 -0
  42. package/dist/components/InkSearchResults.vue.d.ts.map +1 -0
  43. package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js +52 -0
  44. package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js.map +1 -0
  45. package/dist/components/InkShapeMenu.js.map +1 -1
  46. package/dist/components/InkShapeMenu.vue.d.ts.map +1 -1
  47. package/dist/components/InkShapeMenu.vue_vue_type_script_setup_true_lang.js +58 -56
  48. package/dist/components/InkShapeMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  49. package/dist/components/InkSidebar.js +7 -0
  50. package/dist/components/InkSidebar.js.map +1 -0
  51. package/dist/components/InkSidebar.vue.d.ts +34 -0
  52. package/dist/components/InkSidebar.vue.d.ts.map +1 -0
  53. package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js +95 -0
  54. package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  55. package/dist/components/InkSignatureDialog.js.map +1 -1
  56. package/dist/components/InkSignatureDialog.vue.d.ts +3 -2
  57. package/dist/components/InkSignatureDialog.vue.d.ts.map +1 -1
  58. package/dist/components/InkSignatureDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/components/InkSignatureMenu.js.map +1 -1
  60. package/dist/components/InkSignatureMenu.vue.d.ts.map +1 -1
  61. package/dist/components/InkSignatureMenu.vue_vue_type_script_setup_true_lang.js +77 -75
  62. package/dist/components/InkSignatureMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/InkThumbnail.js +7 -0
  64. package/dist/components/InkThumbnail.js.map +1 -0
  65. package/dist/components/InkThumbnail.vue.d.ts +18 -0
  66. package/dist/components/InkThumbnail.vue.d.ts.map +1 -0
  67. package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js +49 -0
  68. package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js.map +1 -0
  69. package/dist/components/InkThumbnails.js +7 -0
  70. package/dist/components/InkThumbnails.js.map +1 -0
  71. package/dist/components/InkThumbnails.vue.d.ts +27 -0
  72. package/dist/components/InkThumbnails.vue.d.ts.map +1 -0
  73. package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js +107 -0
  74. package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js.map +1 -0
  75. package/dist/components/InkToolButton.js.map +1 -1
  76. package/dist/components/InkToolButton.vue.d.ts.map +1 -1
  77. package/dist/components/InkToolButton.vue_vue_type_script_setup_true_lang.js +39 -36
  78. package/dist/components/InkToolButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  79. package/dist/components/InkToolbarButton.js +7 -0
  80. package/dist/components/InkToolbarButton.js.map +1 -0
  81. package/dist/components/InkToolbarButton.vue.d.ts +22 -0
  82. package/dist/components/InkToolbarButton.vue.d.ts.map +1 -0
  83. package/dist/components/InkToolbarButton.vue_vue_type_script_setup_true_lang.js +32 -0
  84. package/dist/components/InkToolbarButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  85. package/dist/components/InkViewport.js.map +1 -1
  86. package/dist/components/InkViewport.vue.d.ts.map +1 -1
  87. package/dist/components/InkViewport.vue_vue_type_script_setup_true_lang.js +37 -36
  88. package/dist/components/InkViewport.vue_vue_type_script_setup_true_lang.js.map +1 -1
  89. package/dist/components/InkZoomSelect.js.map +1 -1
  90. package/dist/components/InkZoomSelect.vue.d.ts.map +1 -1
  91. package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  92. package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  93. package/dist/components/RecordCards.js +7 -0
  94. package/dist/components/RecordCards.js.map +1 -0
  95. package/dist/components/RecordCards.vue.d.ts +25 -0
  96. package/dist/components/RecordCards.vue.d.ts.map +1 -0
  97. package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js +120 -0
  98. package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js.map +1 -0
  99. package/dist/components/SidebarTrigger.js +7 -0
  100. package/dist/components/SidebarTrigger.js.map +1 -0
  101. package/dist/components/SidebarTrigger.vue.d.ts +9 -0
  102. package/dist/components/SidebarTrigger.vue.d.ts.map +1 -0
  103. package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js +33 -0
  104. package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
  105. package/dist/components/SignatureForm.js.map +1 -1
  106. package/dist/components/SignatureForm.vue.d.ts.map +1 -1
  107. package/dist/components/SignatureForm.vue_vue_type_script_setup_true_lang.js +56 -55
  108. package/dist/components/SignatureForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/sidebar-context.d.ts +21 -0
  110. package/dist/components/sidebar-context.d.ts.map +1 -0
  111. package/dist/components/sidebar-context.js +7 -0
  112. package/dist/components/sidebar-context.js.map +1 -0
  113. package/dist/composables/useAnnotations.d.ts +91 -0
  114. package/dist/composables/useAnnotations.d.ts.map +1 -1
  115. package/dist/composables/useRecordSelection.d.ts +12 -0
  116. package/dist/composables/useRecordSelection.d.ts.map +1 -0
  117. package/dist/composables/useRecordSelection.js +15 -0
  118. package/dist/composables/useRecordSelection.js.map +1 -0
  119. package/dist/composables/useRecords.d.ts +14 -0
  120. package/dist/composables/useRecords.d.ts.map +1 -0
  121. package/dist/composables/useRecords.js +16 -0
  122. package/dist/composables/useRecords.js.map +1 -0
  123. package/dist/composables/useRegisteredTool.d.ts +21 -0
  124. package/dist/composables/useRegisteredTool.d.ts.map +1 -0
  125. package/dist/composables/useRegisteredTool.js +25 -0
  126. package/dist/composables/useRegisteredTool.js.map +1 -0
  127. package/dist/composables/useSearch.d.ts.map +1 -1
  128. package/dist/composables/useSearch.js +1 -0
  129. package/dist/composables/useSearch.js.map +1 -1
  130. package/dist/composables/useToolOptions.d.ts +8 -0
  131. package/dist/composables/useToolOptions.d.ts.map +1 -1
  132. package/dist/composables/useToolOptions.js +10 -5
  133. package/dist/composables/useToolOptions.js.map +1 -1
  134. package/dist/context.d.ts +5 -0
  135. package/dist/context.d.ts.map +1 -1
  136. package/dist/context.js.map +1 -1
  137. package/dist/index.d.ts +12 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +40 -29
  140. package/dist/to-readable.d.ts +7 -0
  141. package/dist/to-readable.d.ts.map +1 -0
  142. package/dist/to-readable.js +11 -0
  143. package/dist/to-readable.js.map +1 -0
  144. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"InkZoomSelect.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkZoomSelect.vue"],"names":[],"mappings":"AA8bA,QAAA,MAAM,YAAY,+QAChB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"InkZoomSelect.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkZoomSelect.vue"],"names":[],"mappings":"AA+bA,QAAA,MAAM,YAAY,+QAChB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -40,7 +40,7 @@ var k = "custom:", A = /*@__PURE__*/ c({
40
40
  "onUpdate:modelValue": I
41
41
  }, {
42
42
  default: m(() => [s(p(w), l({
43
- class: "ink-zoom-select ink-select-trigger",
43
+ class: "ink-select ink-select-trigger ink-zoom-select",
44
44
  "data-ink-zoom-select": ""
45
45
  }, R), {
46
46
  default: m(() => [s(p(T), { class: "ink-select-value" }), s(p(_), { class: "ink-select-icon" }, {
@@ -1 +1 @@
1
- {"version":3,"file":"InkZoomSelect.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_withCtx","_createVNode","_mergeProps","InkIcon","_createElementBlock","_Fragment","_renderList","_createTextVNode","_toDisplayString","InkIcon_default","CUSTOM","InkZoomSelect_vue_vue_type_script_setup_true_lang_default","useZoom","level","ZOOM_LEVELS","l","z","custom","computed","zoom","value","onChange","v","next","FITS","triggerAttrs","percent","levels","list","c","scale","a","b","openBlock","createBlock","unref","SelectRoot","withCtx","createVNode","SelectTrigger","mergeProps","SelectValue","SelectIcon","ChevronDown","SelectPortal","SelectContent","SelectViewport","createElementBlock","Fragment","renderList","SelectItem","o","SelectItemText","createTextVNode","toDisplayString","SelectItemIndicator","Check","SelectSeparator"],"sources":["../../src/components/InkZoomSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ZOOM_LEVELS } from '@inkbar/core/dom'\nimport { Check, ChevronDown } from '@inkbar/icons'\nimport {\n SelectContent,\n SelectIcon,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectPortal,\n SelectRoot,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n SelectViewport,\n} from 'reka-ui'\nimport { computed } from 'vue'\n\nimport { useZoom } from '../composables/useZoom'\n\nimport InkIcon from './InkIcon.vue'\n\nimport type { ZoomValue } from '@inkbar/core/dom'\n\nconst CUSTOM = 'custom:'\n\nconst { zoom, scale, setZoom } = useZoom()\n\nconst level = (z: number) => ZOOM_LEVELS.find((l) => Math.abs(l - z) < 0.001)\n/** A numeric zoom that is not one of the levels (zoom in and out multiply). */\nconst custom = computed(() =>\n typeof zoom.value === 'number' && level(zoom.value) === undefined ? zoom.value : null\n)\nconst value = computed(() => {\n const z = zoom.value\n if (typeof z !== 'number') return z\n return custom.value === null ? String(level(z)) : `${CUSTOM}${z}`\n})\n\nfunction onChange(v: unknown): void {\n if (typeof v !== 'string' || v === value.value) return\n const next: ZoomValue =\n v === 'fit-width' || v === 'fit-page' ? v : Number(v.replace(CUSTOM, ''))\n setZoom(next)\n}\n\nconst FITS = [\n { value: 'fit-width', label: 'Fit width' },\n { value: 'fit-page', label: 'Fit page' },\n]\n// Reka's typed props stop at its own; ARIA goes through a bound object.\nconst triggerAttrs = { 'aria-label': 'Zoom' }\nconst percent = (z: number) => `${Math.round(z * 100)}%`\n/** The levels, with a custom zoom in its place among them. */\nconst levels = computed(() => {\n const list = ZOOM_LEVELS.map((l) => ({ z: l, value: String(l), label: percent(l) }))\n const c = custom.value\n if (c !== null) list.push({ z: c, value: `${CUSTOM}${c}`, label: percent(scale.value) })\n return list.sort((a, b) => a.z - b.z)\n})\n</script>\n\n<template>\n <SelectRoot :model-value=\"value\" @update:model-value=\"onChange\">\n <SelectTrigger\n class=\"ink-zoom-select ink-select-trigger\"\n data-ink-zoom-select\n v-bind=\"triggerAttrs\"\n >\n <SelectValue class=\"ink-select-value\" />\n <SelectIcon class=\"ink-select-icon\">\n <InkIcon :icon=\"ChevronDown\" :size=\"16\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectContent\n class=\"ink-select-content\"\n data-ink-select-content\n position=\"popper\"\n side=\"top\"\n :side-offset=\"4\"\n >\n <SelectViewport>\n <SelectItem\n v-for=\"o in FITS\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n <SelectSeparator class=\"ink-select-separator\" />\n <SelectItem\n v-for=\"o in levels\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n </SelectViewport>\n </SelectContent>\n </SelectPortal>\n </SelectRoot>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"InkZoomSelect.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_withCtx","_createVNode","_mergeProps","InkIcon","_createElementBlock","_Fragment","_renderList","_createTextVNode","_toDisplayString","InkIcon_default","CUSTOM","InkZoomSelect_vue_vue_type_script_setup_true_lang_default","useZoom","level","ZOOM_LEVELS","l","z","custom","computed","zoom","value","onChange","v","next","FITS","triggerAttrs","percent","levels","list","c","scale","a","b","openBlock","createBlock","unref","SelectRoot","withCtx","createVNode","SelectTrigger","mergeProps","SelectValue","SelectIcon","ChevronDown","SelectPortal","SelectContent","SelectViewport","createElementBlock","Fragment","renderList","SelectItem","o","SelectItemText","createTextVNode","toDisplayString","SelectItemIndicator","Check","SelectSeparator"],"sources":["../../src/components/InkZoomSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ZOOM_LEVELS } from '@inkbar/core/dom'\nimport { Check, ChevronDown } from '@inkbar/icons'\nimport {\n SelectContent,\n SelectIcon,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectPortal,\n SelectRoot,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n SelectViewport,\n} from 'reka-ui'\nimport { computed } from 'vue'\n\nimport { useZoom } from '../composables/useZoom'\n\nimport InkIcon from './InkIcon.vue'\n\nimport type { ZoomValue } from '@inkbar/core/dom'\n\nconst CUSTOM = 'custom:'\n\nconst { zoom, scale, setZoom } = useZoom()\n\nconst level = (z: number) => ZOOM_LEVELS.find((l) => Math.abs(l - z) < 0.001)\n/** A numeric zoom that is not one of the levels (zoom in and out multiply). */\nconst custom = computed(() =>\n typeof zoom.value === 'number' && level(zoom.value) === undefined ? zoom.value : null\n)\nconst value = computed(() => {\n const z = zoom.value\n if (typeof z !== 'number') return z\n return custom.value === null ? String(level(z)) : `${CUSTOM}${z}`\n})\n\nfunction onChange(v: unknown): void {\n if (typeof v !== 'string' || v === value.value) return\n const next: ZoomValue =\n v === 'fit-width' || v === 'fit-page' ? v : Number(v.replace(CUSTOM, ''))\n setZoom(next)\n}\n\nconst FITS = [\n { value: 'fit-width', label: 'Fit width' },\n { value: 'fit-page', label: 'Fit page' },\n]\n// Reka's typed props stop at its own; ARIA goes through a bound object.\nconst triggerAttrs = { 'aria-label': 'Zoom' }\nconst percent = (z: number) => `${Math.round(z * 100)}%`\n/** The levels, with a custom zoom in its place among them. */\nconst levels = computed(() => {\n const list = ZOOM_LEVELS.map((l) => ({ z: l, value: String(l), label: percent(l) }))\n const c = custom.value\n if (c !== null) list.push({ z: c, value: `${CUSTOM}${c}`, label: percent(scale.value) })\n return list.sort((a, b) => a.z - b.z)\n})\n</script>\n\n<template>\n <SelectRoot :model-value=\"value\" @update:model-value=\"onChange\">\n <SelectTrigger\n class=\"ink-select ink-select-trigger ink-zoom-select\"\n data-ink-zoom-select\n v-bind=\"triggerAttrs\"\n >\n <SelectValue class=\"ink-select-value\" />\n <SelectIcon class=\"ink-select-icon\">\n <InkIcon :icon=\"ChevronDown\" :size=\"16\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectContent\n class=\"ink-select-content\"\n data-ink-select-content\n position=\"popper\"\n side=\"top\"\n :side-offset=\"4\"\n >\n <SelectViewport>\n <SelectItem\n v-for=\"o in FITS\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n <SelectSeparator class=\"ink-select-separator\" />\n <SelectItem\n v-for=\"o in levels\"\n :key=\"o.value\"\n :value=\"o.value\"\n class=\"ink-select-item\"\n data-ink-select-item\n >\n <SelectItemText>{{ o.label }}</SelectItemText>\n <SelectItemIndicator class=\"ink-select-indicator\">\n <InkIcon :icon=\"Check\" :size=\"16\" />\n </SelectItemIndicator>\n </SelectItem>\n </SelectViewport>\n </SelectContent>\n </SelectPortal>\n </SelectRoot>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import e from "./RecordCards.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/RecordCards.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=RecordCards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordCards.js","names":["_sfc_main","RecordCards_vue_vue_type_script_setup_true_lang_default","RecordCards_default"],"sources":["../../src/components/RecordCards.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A record list's markup on core's record list controller, shared by `InkRecordList` and\n * `InkSearchResults`: `createRecordList`'s `div.ink-records` holding `ul.ink-record-list` with\n * one `li.ink-record` card per row, the empty text and a polite live region. The controller\n * holds the rows, the count and the announcement, and handles the clicks, keys, Tab stop,\n * focus and scrolling. Empty, with no empty text, until there is a source.\n */\nimport {\n createRecordListController,\n type RecordListController,\n type RecordListRow,\n type RecordListSource,\n} from '@inkbar/core/dom'\nimport { computed, nextTick, shallowRef, useTemplateRef, watch } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n source: RecordListSource | null\n /** Whether the empty text shows when there are no rows. */\n emptyShown?: boolean\n }>(),\n { emptyShown: true }\n)\n\nconst emit = defineEmits<{ 'update:count': [count: number] }>()\n\ndefineSlots<{ empty?(): unknown }>()\n\nconst root = useTemplateRef<HTMLElement>('root')\nconst controller = shallowRef<RecordListController | null>(null)\nconst rows = shallowRef<readonly RecordListRow[]>([])\nconst announcement = shallowRef('')\nconst empty = computed(\n () => controller.value !== null && rows.value.length === 0 && props.emptyShown\n)\n\nlet reported: number | null = null\nfunction report(count: number): void {\n if (count === reported) return\n reported = count\n emit('update:count', count)\n}\n\n/**\n * When the rows change under a focused action whose button goes (its card lost that action),\n * focus the same place in the card once it re-renders, else the row. A row that goes is the\n * controller's to re-home.\n */\nfunction keepActionFocus(): void {\n const el = root.value\n const active = el?.ownerDocument.activeElement\n if (!el || !(active instanceof HTMLButtonElement) || !el.contains(active)) return\n const row = active.closest<HTMLElement>('[data-ink-record]')\n if (!row) return\n const id = row.dataset.inkRecord\n const buttons = (r: HTMLElement) => [\n ...r.querySelectorAll<HTMLElement>('.ink-card-actions > button'),\n ]\n const index = buttons(row).indexOf(active)\n void nextTick(() => {\n if (active.isConnected) return\n const now = [...el.querySelectorAll<HTMLElement>('[data-ink-record]')].find(\n (r) => r.dataset.inkRecord === id\n )\n if (now) (buttons(now)[index] ?? now).focus({ preventScroll: true })\n })\n}\n\nwatch(\n [() => props.source, root],\n ([source, el], _, onCleanup) => {\n if (!source || !el) {\n controller.value = null\n rows.value = []\n announcement.value = ''\n return\n }\n const c = createRecordListController(source)\n controller.value = c\n rows.value = c.rows.get()\n announcement.value = c.announcement.get()\n report(c.count.get())\n const stops = [\n c.rows.subscribe((next) => {\n keepActionFocus()\n rows.value = next\n }),\n c.count.subscribe(report),\n c.announcement.subscribe((text) => {\n announcement.value = text\n }),\n ]\n const detach = c.attach(el)\n onCleanup(() => {\n for (const stop of stops) stop()\n detach()\n c.destroy()\n })\n },\n { flush: 'post', immediate: true }\n)\n</script>\n\n<template>\n <div ref=\"root\" class=\"ink-records\" data-ink-records tabindex=\"-1\">\n <ul class=\"ink-record-list\" role=\"list\" :hidden=\"rows.length === 0\">\n <!-- The controller sets each row's tabindex. -->\n <li\n v-for=\"{ item, card, selected } in rows\"\n :key=\"item.id\"\n class=\"ink-record\"\n :data-ink-record=\"item.id\"\n :aria-current=\"selected ? 'true' : undefined\"\n :data-selected=\"selected ? '' : undefined\"\n >\n <div :class=\"['ink-card', card?.className]\">\n <template v-if=\"card\">\n <p class=\"ink-card-title\">{{ card.title }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.meta !== undefined\" class=\"ink-card-meta\"><span v-if=\"card.swatch !== undefined\" class=\"ink-card-swatch\" :style=\"{ background: card.swatch }\" />{{ card.meta }}</p>\n <p v-if=\"card.body !== undefined\" class=\"ink-card-body\">{{ card.body }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.excerpt !== undefined\" class=\"ink-card-excerpt\">{{ card.excerpt.before }}<mark>{{ card.excerpt.match }}</mark>{{ card.excerpt.after }}</p>\n <div class=\"ink-card-actions\">\n <button\n v-for=\"label in Object.keys(card.actions)\"\n :key=\"label\"\n type=\"button\"\n @click=\"controller?.act(item.id, label)\"\n v-text=\"label\"\n />\n </div>\n </template>\n </div>\n </li>\n </ul>\n <p class=\"ink-record-list-empty\" :hidden=\"!empty\">\n <slot name=\"empty\">Nothing here yet.</slot>\n </p>\n <div\n class=\"ink-visually-hidden\"\n aria-live=\"polite\"\n data-ink-record-status\n v-text=\"announcement\"\n />\n </div>\n</template>\n"],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { RecordListSource } from '@inkbar/core/dom';
2
+ type __VLS_Props = {
3
+ source: RecordListSource | null;
4
+ /** Whether the empty text shows when there are no rows. */
5
+ emptyShown?: boolean;
6
+ };
7
+ type __VLS_Slots = {
8
+ empty?(): unknown;
9
+ };
10
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
11
+ "update:count": (count: number) => any;
12
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
13
+ "onUpdate:count"?: (count: number) => any;
14
+ }>, {
15
+ emptyShown: boolean;
16
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
17
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
18
+ declare const _default: typeof __VLS_export;
19
+ export default _default;
20
+ type __VLS_WithSlots<T, S> = T & {
21
+ new (): {
22
+ $slots: S;
23
+ };
24
+ };
25
+ //# sourceMappingURL=RecordCards.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordCards.vue.d.ts","sourceRoot":"","sources":["../../src/components/RecordCards.vue"],"names":[],"mappings":"AA6JA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;AAIzB,KAAK,WAAW,GAAG;IACf,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC/B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAC;AASJ,KAAK,WAAW,GAAG;IAAE,KAAK,CAAC,IAAI,OAAO,CAAA;CAAE,CAAC;AAgNzC,QAAA,MAAM,UAAU;;;;;;6EAId,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { Fragment as e, computed as t, createCommentVNode as n, createElementBlock as r, createElementVNode as i, createTextVNode as a, defineComponent as o, nextTick as s, normalizeClass as c, normalizeStyle as l, openBlock as u, renderList as d, renderSlot as f, shallowRef as p, toDisplayString as m, useTemplateRef as h, watch as g } from "vue";
2
+ import { createRecordListController as _ } from "@inkbar/core/dom";
3
+ //#region src/components/RecordCards.vue?vue&type=script&setup=true&lang.ts
4
+ var v = ["hidden"], y = [
5
+ "data-ink-record",
6
+ "aria-current",
7
+ "data-selected"
8
+ ], b = { class: "ink-card-title" }, x = {
9
+ key: 0,
10
+ class: "ink-card-meta"
11
+ }, S = {
12
+ key: 1,
13
+ class: "ink-card-body"
14
+ }, C = {
15
+ key: 2,
16
+ class: "ink-card-excerpt"
17
+ }, w = { class: "ink-card-actions" }, T = ["onClick", "textContent"], E = ["hidden"], D = ["textContent"], O = /*@__PURE__*/ o({
18
+ __name: "RecordCards",
19
+ props: {
20
+ source: {},
21
+ emptyShown: {
22
+ type: Boolean,
23
+ default: !0
24
+ }
25
+ },
26
+ emits: ["update:count"],
27
+ setup(o, { emit: O }) {
28
+ let k = o, A = O, j = h("root"), M = p(null), N = p([]), P = p(""), F = t(() => M.value !== null && N.value.length === 0 && k.emptyShown), I = null;
29
+ function L(e) {
30
+ e !== I && (I = e, A("update:count", e));
31
+ }
32
+ function R() {
33
+ let e = j.value, t = e?.ownerDocument.activeElement;
34
+ if (!e || !(t instanceof HTMLButtonElement) || !e.contains(t)) return;
35
+ let n = t.closest("[data-ink-record]");
36
+ if (!n) return;
37
+ let r = n.dataset.inkRecord, i = (e) => [...e.querySelectorAll(".ink-card-actions > button")], a = i(n).indexOf(t);
38
+ s(() => {
39
+ if (t.isConnected) return;
40
+ let n = [...e.querySelectorAll("[data-ink-record]")].find((e) => e.dataset.inkRecord === r);
41
+ n && (i(n)[a] ?? n).focus({ preventScroll: !0 });
42
+ });
43
+ }
44
+ return g([() => k.source, j], ([e, t], n, r) => {
45
+ if (!e || !t) {
46
+ M.value = null, N.value = [], P.value = "";
47
+ return;
48
+ }
49
+ let i = _(e);
50
+ M.value = i, N.value = i.rows.get(), P.value = i.announcement.get(), L(i.count.get());
51
+ let a = [
52
+ i.rows.subscribe((e) => {
53
+ R(), N.value = e;
54
+ }),
55
+ i.count.subscribe(L),
56
+ i.announcement.subscribe((e) => {
57
+ P.value = e;
58
+ })
59
+ ], o = i.attach(t);
60
+ r(() => {
61
+ for (let e of a) e();
62
+ o(), i.destroy();
63
+ });
64
+ }, {
65
+ flush: "post",
66
+ immediate: !0
67
+ }), (t, o) => (u(), r("div", {
68
+ ref_key: "root",
69
+ ref: j,
70
+ class: "ink-records",
71
+ "data-ink-records": "",
72
+ tabindex: "-1"
73
+ }, [
74
+ i("ul", {
75
+ class: "ink-record-list",
76
+ role: "list",
77
+ hidden: N.value.length === 0
78
+ }, [(u(!0), r(e, null, d(N.value, ({ item: t, card: o, selected: s }) => (u(), r("li", {
79
+ key: t.id,
80
+ class: "ink-record",
81
+ "data-ink-record": t.id,
82
+ "aria-current": s ? "true" : void 0,
83
+ "data-selected": s ? "" : void 0
84
+ }, [i("div", { class: c(["ink-card", o?.className]) }, [o ? (u(), r(e, { key: 0 }, [
85
+ i("p", b, m(o.title), 1),
86
+ o.meta === void 0 ? n("", !0) : (u(), r("p", x, [o.swatch === void 0 ? n("", !0) : (u(), r("span", {
87
+ key: 0,
88
+ class: "ink-card-swatch",
89
+ style: l({ background: o.swatch })
90
+ }, null, 4)), a(m(o.meta), 1)])),
91
+ o.body === void 0 ? n("", !0) : (u(), r("p", S, m(o.body), 1)),
92
+ o.excerpt === void 0 ? n("", !0) : (u(), r("p", C, [
93
+ a(m(o.excerpt.before), 1),
94
+ i("mark", null, m(o.excerpt.match), 1),
95
+ a(m(o.excerpt.after), 1)
96
+ ])),
97
+ i("div", w, [(u(!0), r(e, null, d(Object.keys(o.actions), (e) => (u(), r("button", {
98
+ key: e,
99
+ type: "button",
100
+ onClick: (n) => M.value?.act(t.id, e),
101
+ textContent: m(e)
102
+ }, null, 8, T))), 128))])
103
+ ], 64)) : n("", !0)], 2)], 8, y))), 128))], 8, v),
104
+ i("p", {
105
+ class: "ink-record-list-empty",
106
+ hidden: !F.value
107
+ }, [f(t.$slots, "empty", {}, () => [o[0] ||= a("Nothing here yet.", -1)])], 8, E),
108
+ i("div", {
109
+ class: "ink-visually-hidden",
110
+ "aria-live": "polite",
111
+ "data-ink-record-status": "",
112
+ textContent: m(P.value)
113
+ }, null, 8, D)
114
+ ], 512));
115
+ }
116
+ });
117
+ //#endregion
118
+ export { O as default };
119
+
120
+ //# sourceMappingURL=RecordCards.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordCards.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_Fragment","_renderList","_normalizeClass","_toDisplayString","_normalizeStyle","_createCommentVNode","_createTextVNode","_renderSlot","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","RecordCards_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","root","useTemplateRef","controller","shallowRef","rows","announcement","empty","computed","reported","report","count","keepActionFocus","el","active","row","id","buttons","r","index","now","watch","source","c","createRecordListController","stops","next","text","detach","stop","openBlock","createElementBlock","createElementVNode","Fragment","renderList","item","selected","normalizeClass","card","toDisplayString","createCommentVNode","normalizeStyle","createTextVNode","label","renderSlot","_ctx","_cache"],"sources":["../../src/components/RecordCards.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A record list's markup on core's record list controller, shared by `InkRecordList` and\n * `InkSearchResults`: `createRecordList`'s `div.ink-records` holding `ul.ink-record-list` with\n * one `li.ink-record` card per row, the empty text and a polite live region. The controller\n * holds the rows, the count and the announcement, and handles the clicks, keys, Tab stop,\n * focus and scrolling. Empty, with no empty text, until there is a source.\n */\nimport {\n createRecordListController,\n type RecordListController,\n type RecordListRow,\n type RecordListSource,\n} from '@inkbar/core/dom'\nimport { computed, nextTick, shallowRef, useTemplateRef, watch } from 'vue'\n\nconst props = withDefaults(\n defineProps<{\n source: RecordListSource | null\n /** Whether the empty text shows when there are no rows. */\n emptyShown?: boolean\n }>(),\n { emptyShown: true }\n)\n\nconst emit = defineEmits<{ 'update:count': [count: number] }>()\n\ndefineSlots<{ empty?(): unknown }>()\n\nconst root = useTemplateRef<HTMLElement>('root')\nconst controller = shallowRef<RecordListController | null>(null)\nconst rows = shallowRef<readonly RecordListRow[]>([])\nconst announcement = shallowRef('')\nconst empty = computed(\n () => controller.value !== null && rows.value.length === 0 && props.emptyShown\n)\n\nlet reported: number | null = null\nfunction report(count: number): void {\n if (count === reported) return\n reported = count\n emit('update:count', count)\n}\n\n/**\n * When the rows change under a focused action whose button goes (its card lost that action),\n * focus the same place in the card once it re-renders, else the row. A row that goes is the\n * controller's to re-home.\n */\nfunction keepActionFocus(): void {\n const el = root.value\n const active = el?.ownerDocument.activeElement\n if (!el || !(active instanceof HTMLButtonElement) || !el.contains(active)) return\n const row = active.closest<HTMLElement>('[data-ink-record]')\n if (!row) return\n const id = row.dataset.inkRecord\n const buttons = (r: HTMLElement) => [\n ...r.querySelectorAll<HTMLElement>('.ink-card-actions > button'),\n ]\n const index = buttons(row).indexOf(active)\n void nextTick(() => {\n if (active.isConnected) return\n const now = [...el.querySelectorAll<HTMLElement>('[data-ink-record]')].find(\n (r) => r.dataset.inkRecord === id\n )\n if (now) (buttons(now)[index] ?? now).focus({ preventScroll: true })\n })\n}\n\nwatch(\n [() => props.source, root],\n ([source, el], _, onCleanup) => {\n if (!source || !el) {\n controller.value = null\n rows.value = []\n announcement.value = ''\n return\n }\n const c = createRecordListController(source)\n controller.value = c\n rows.value = c.rows.get()\n announcement.value = c.announcement.get()\n report(c.count.get())\n const stops = [\n c.rows.subscribe((next) => {\n keepActionFocus()\n rows.value = next\n }),\n c.count.subscribe(report),\n c.announcement.subscribe((text) => {\n announcement.value = text\n }),\n ]\n const detach = c.attach(el)\n onCleanup(() => {\n for (const stop of stops) stop()\n detach()\n c.destroy()\n })\n },\n { flush: 'post', immediate: true }\n)\n</script>\n\n<template>\n <div ref=\"root\" class=\"ink-records\" data-ink-records tabindex=\"-1\">\n <ul class=\"ink-record-list\" role=\"list\" :hidden=\"rows.length === 0\">\n <!-- The controller sets each row's tabindex. -->\n <li\n v-for=\"{ item, card, selected } in rows\"\n :key=\"item.id\"\n class=\"ink-record\"\n :data-ink-record=\"item.id\"\n :aria-current=\"selected ? 'true' : undefined\"\n :data-selected=\"selected ? '' : undefined\"\n >\n <div :class=\"['ink-card', card?.className]\">\n <template v-if=\"card\">\n <p class=\"ink-card-title\">{{ card.title }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.meta !== undefined\" class=\"ink-card-meta\"><span v-if=\"card.swatch !== undefined\" class=\"ink-card-swatch\" :style=\"{ background: card.swatch }\" />{{ card.meta }}</p>\n <p v-if=\"card.body !== undefined\" class=\"ink-card-body\">{{ card.body }}</p>\n <!-- prettier-ignore -->\n <p v-if=\"card.excerpt !== undefined\" class=\"ink-card-excerpt\">{{ card.excerpt.before }}<mark>{{ card.excerpt.match }}</mark>{{ card.excerpt.after }}</p>\n <div class=\"ink-card-actions\">\n <button\n v-for=\"label in Object.keys(card.actions)\"\n :key=\"label\"\n type=\"button\"\n @click=\"controller?.act(item.id, label)\"\n v-text=\"label\"\n />\n </div>\n </template>\n </div>\n </li>\n </ul>\n <p class=\"ink-record-list-empty\" :hidden=\"!empty\">\n <slot name=\"empty\">Nothing here yet.</slot>\n </p>\n <div\n class=\"ink-visually-hidden\"\n aria-live=\"polite\"\n data-ink-record-status\n v-text=\"announcement\"\n />\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import e from "./SidebarTrigger.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/SidebarTrigger.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=SidebarTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarTrigger.js","names":["_sfc_main","SidebarTrigger_vue_vue_type_script_setup_true_lang_default","SidebarTrigger_default"],"sources":["../../src/components/SidebarTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A sidebar trigger's content: `createSidebar`'s markup, so the theme styles both alike. The\n * rail shows the icon alone (the trigger's `title` carries the label); tabs and stack headers\n * show the label too. The badge is hidden from assistive technology: the trigger's name has it.\n */\nimport { sidebarBadge, type SidebarPanelInfo } from '@inkbar/core/dom'\nimport { computed } from 'vue'\n\nimport InkIcon from './InkIcon.vue'\n\nconst props = defineProps<{ panel: SidebarPanelInfo; rail: boolean }>()\nconst badge = computed(() => sidebarBadge(props.panel.badge))\n</script>\n\n<template>\n <InkIcon v-if=\"panel.icon\" :icon=\"panel.icon\" />\n <span v-if=\"!panel.icon || !rail\" class=\"ink-sidebar-label\">{{ panel.label }}</span>\n <span class=\"ink-sidebar-badge\" aria-hidden=\"true\" :hidden=\"badge === null\">{{\n badge\n }}</span>\n</template>\n"],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { SidebarPanelInfo } from '@inkbar/core/dom';
2
+ type __VLS_Props = {
3
+ panel: SidebarPanelInfo;
4
+ rail: boolean;
5
+ };
6
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ //# sourceMappingURL=SidebarTrigger.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarTrigger.vue.d.ts","sourceRoot":"","sources":["../../src/components/SidebarTrigger.vue"],"names":[],"mappings":"AA6BA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAMtE,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAgD9D,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -0,0 +1,33 @@
1
+ import e from "./InkIcon.js";
2
+ import { Fragment as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, openBlock as c, toDisplayString as l } from "vue";
3
+ import { sidebarBadge as u } from "@inkbar/core/dom";
4
+ //#region src/components/SidebarTrigger.vue?vue&type=script&setup=true&lang.ts
5
+ var d = {
6
+ key: 1,
7
+ class: "ink-sidebar-label"
8
+ }, f = ["hidden"], p = /*@__PURE__*/ s({
9
+ __name: "SidebarTrigger",
10
+ props: {
11
+ panel: {},
12
+ rail: { type: Boolean }
13
+ },
14
+ setup(s) {
15
+ let p = s, m = n(() => u(p.panel.badge));
16
+ return (n, u) => (c(), a(t, null, [
17
+ s.panel.icon ? (c(), r(e, {
18
+ key: 0,
19
+ icon: s.panel.icon
20
+ }, null, 8, ["icon"])) : i("", !0),
21
+ !s.panel.icon || !s.rail ? (c(), a("span", d, l(s.panel.label), 1)) : i("", !0),
22
+ o("span", {
23
+ class: "ink-sidebar-badge",
24
+ "aria-hidden": "true",
25
+ hidden: m.value === null
26
+ }, l(m.value), 9, f)
27
+ ], 64));
28
+ }
29
+ });
30
+ //#endregion
31
+ export { p as default };
32
+
33
+ //# sourceMappingURL=SidebarTrigger.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarTrigger.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createBlock","InkIcon","_createCommentVNode","_toDisplayString","_createElementVNode","InkIcon_default","_hoisted_1","_hoisted_2","SidebarTrigger_vue_vue_type_script_setup_true_lang_default","props","__props","badge","computed","sidebarBadge","openBlock","createElementBlock","Fragment","createBlock","createCommentVNode","toDisplayString","createElementVNode"],"sources":["../../src/components/SidebarTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * A sidebar trigger's content: `createSidebar`'s markup, so the theme styles both alike. The\n * rail shows the icon alone (the trigger's `title` carries the label); tabs and stack headers\n * show the label too. The badge is hidden from assistive technology: the trigger's name has it.\n */\nimport { sidebarBadge, type SidebarPanelInfo } from '@inkbar/core/dom'\nimport { computed } from 'vue'\n\nimport InkIcon from './InkIcon.vue'\n\nconst props = defineProps<{ panel: SidebarPanelInfo; rail: boolean }>()\nconst badge = computed(() => sidebarBadge(props.panel.badge))\n</script>\n\n<template>\n <InkIcon v-if=\"panel.icon\" :icon=\"panel.icon\" />\n <span v-if=\"!panel.icon || !rail\" class=\"ink-sidebar-label\">{{ panel.label }}</span>\n <span class=\"ink-sidebar-badge\" aria-hidden=\"true\" :hidden=\"badge === null\">{{\n badge\n }}</span>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAWA,IAAMY,IAAQC,GACRC,IAAQC,QAAeC,EAAaJ,EAAM,MAAM,KAAK,CAAC;;GAI3CC,EAAA,MAAM,QAArBb,EAAA,GAAAG,EAAgDC,GAAA;;IAApB,MAAMS,EAAA,MAAM;;GAC3B,CAAAA,EAAA,MAAM,QAAI,CAAKA,EAAA,QAA5Bb,EAAA,GAAAC,EAAoF,QAApFQ,GAAoFH,EAArBO,EAAA,MAAM,KAAK,GAAA,CAAA,KAAAQ,EAAA,IAAA,EAAA;GAC1Ed,EAES,QAAA;IAFH,OAAM;IAAoB,eAAY;IAAQ,QAAQO,EAAA,UAAK;GAC/D,GAAAR,EAAAQ,EAAA,KAAK,GAAA,GAAAJ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureForm.js","names":["_sfc_main","SignatureForm_vue_vue_type_script_setup_true_lang_default","SignatureForm_default"],"sources":["../../src/components/SignatureForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * The body of `InkSignatureDialog`, mounted while it is open: one draft per opening. Draw,\n * Type and Image tabs, then Cancel and Save.\n */\nimport {\n createSignatureDraft,\n fontFamilyValue,\n handleRadioKeys,\n handleTabKeys,\n SIGNATURE_LABELS,\n SIGNATURE_TABS,\n type SignatureDraftState,\n type SignatureTab,\n} from '@inkbar/core/dom'\nimport { DialogClose } from 'reka-ui'\nimport { computed, onBeforeUnmount, onMounted, useId, useTemplateRef } from 'vue'\n\nimport { useTool } from '../composables/useTool'\nimport { useToolOptions } from '../composables/useToolOptions'\nimport { useInkContext } from '../context'\nimport { useReadable } from '../use-readable'\n\nimport type { SignatureOptions, SignatureTemplate } from '@inkbar/core'\n\nconst props = withDefaults(\n defineProps<{ fonts?: readonly string[] | undefined; select?: boolean }>(),\n { fonts: undefined, select: true }\n)\nconst emit = defineEmits<{ saved: [template: SignatureTemplate]; close: [] }>()\n\nconst ctx = useInkContext('InkSignatureDialog')\nconst { setTool } = useTool()\nconst { setOptions } = useToolOptions<SignatureOptions>('signature')\nconst draft = createSignatureDraft({ fonts: props.fonts ?? ctx.signatureFonts.value })\nconst IDLE: SignatureDraftState = draft.state.get()\nconst s = useReadable(draft.state, IDLE)\nconst uid = useId()\nconst padHost = useTemplateRef<HTMLDivElement>('pad')\n\nlet detach: (() => void) | undefined\nonMounted(() => {\n if (padHost.value) detach = draft.attachPad(padHost.value)\n})\nonBeforeUnmount(() => {\n detach?.()\n draft.destroy()\n})\n\nfunction save(): void {\n draft.save(ctx.signatures.value).then(\n (t) => {\n if (!t) return\n if (props.select) {\n setOptions({ templateId: t.id })\n setTool('signature')\n }\n emit('saved', t)\n emit('close')\n },\n () => {\n // The host's store refused it: the dialog stays open to try again.\n }\n )\n}\n\nconst tabId = (tab: SignatureTab) => `${uid}-tab-${tab}`\nconst panelId = (tab: SignatureTab) => `${uid}-panel-${tab}`\nconst shown = computed(() => s.value.name.trim() || SIGNATURE_LABELS.namePlaceholder)\nconst onTabKeydown = (e: KeyboardEvent) =>\n handleTabKeys(e, e.currentTarget as HTMLElement)\nconst onRadioKeydown = (e: KeyboardEvent) =>\n handleRadioKeys(e, e.currentTarget as HTMLElement)\nconst onName = (e: Event) => draft.setName((e.target as HTMLInputElement).value)\nconst onFile = (e: Event) =>\n void draft.chooseFile((e.target as HTMLInputElement).files?.[0])\n</script>\n\n<template>\n <div\n role=\"tablist\"\n :aria-label=\"SIGNATURE_LABELS.tabs\"\n class=\"ink-tabs\"\n @keydown=\"onTabKeydown\"\n >\n <button\n v-for=\"tab in SIGNATURE_TABS\"\n :id=\"tabId(tab)\"\n :key=\"tab\"\n type=\"button\"\n role=\"tab\"\n :aria-controls=\"panelId(tab)\"\n :aria-selected=\"s.tab === tab\"\n :tabindex=\"s.tab === tab ? 0 : -1\"\n class=\"ink-tab\"\n :data-key=\"tab\"\n :data-state=\"s.tab === tab ? 'active' : 'inactive'\"\n @click=\"draft.setTab(tab)\"\n >\n {{ SIGNATURE_LABELS[tab] }}\n </button>\n </div>\n <div\n :id=\"panelId('draw')\"\n role=\"tabpanel\"\n :aria-labelledby=\"tabId('draw')\"\n class=\"ink-tab-panel\"\n data-key=\"draw\"\n :hidden=\"s.tab !== 'draw'\"\n >\n <div\n ref=\"pad\"\n class=\"ink-signature-pad-host\"\n data-ink-signature-pad-host\n role=\"img\"\n :aria-label=\"SIGNATURE_LABELS.pad\"\n />\n <div class=\"ink-dialog-row\">\n <button\n type=\"button\"\n class=\"ink-button\"\n data-ink-signature-clear\n :disabled=\"s.padEmpty\"\n @click=\"draft.clearPad()\"\n >\n {{ SIGNATURE_LABELS.clear }}\n </button>\n </div>\n </div>\n <div\n :id=\"panelId('type')\"\n role=\"tabpanel\"\n :aria-labelledby=\"tabId('type')\"\n class=\"ink-tab-panel\"\n data-key=\"type\"\n :hidden=\"s.tab !== 'type'\"\n >\n <label class=\"ink-field\">\n <span>{{ SIGNATURE_LABELS.name }}</span>\n <input\n type=\"text\"\n class=\"ink-input\"\n data-ink-signature-name\n autocomplete=\"name\"\n :placeholder=\"SIGNATURE_LABELS.namePlaceholder\"\n :value=\"s.name\"\n @input=\"onName\"\n />\n </label>\n <div\n role=\"radiogroup\"\n :aria-label=\"SIGNATURE_LABELS.fonts\"\n class=\"ink-signature-fonts\"\n @keydown=\"onRadioKeydown\"\n >\n <button\n v-for=\"font in draft.fonts\"\n :key=\"font\"\n type=\"button\"\n role=\"radio\"\n :aria-checked=\"s.font === font\"\n :aria-label=\"font\"\n :tabindex=\"s.font === font ? 0 : -1\"\n class=\"ink-signature-font\"\n :data-key=\"font\"\n :data-state=\"s.font === font ? 'checked' : 'unchecked'\"\n @click=\"draft.setFont(font)\"\n >\n <!-- The font is the option itself, so it is set here, not left to the theme. -->\n <span\n class=\"ink-signature-font-sample\"\n :style=\"{ fontFamily: fontFamilyValue(font) }\"\n >\n {{ shown }}\n </span>\n </button>\n </div>\n </div>\n <div\n :id=\"panelId('image')\"\n role=\"tabpanel\"\n :aria-labelledby=\"tabId('image')\"\n class=\"ink-tab-panel\"\n data-key=\"image\"\n :hidden=\"s.tab !== 'image'\"\n >\n <label class=\"ink-field\">\n <span>{{ SIGNATURE_LABELS.file }}</span>\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n class=\"ink-input\"\n data-ink-signature-file\n @change=\"onFile\"\n />\n </label>\n <img\n v-if=\"s.image?.kind === 'image'\"\n class=\"ink-signature-image\"\n :src=\"s.image.imagedata\"\n alt=\"\"\n />\n <p v-if=\"s.imageError\" class=\"ink-field-error\" role=\"alert\">{{ s.imageError }}</p>\n </div>\n <p\n v-if=\"s.saveError\"\n class=\"ink-field-error\"\n role=\"alert\"\n data-ink-signature-save-error\n >\n {{ s.saveError }}\n </p>\n <div class=\"ink-dialog-actions\">\n <DialogClose as-child>\n <button type=\"button\" class=\"ink-button\" data-ink-signature-cancel>\n {{ SIGNATURE_LABELS.cancel }}\n </button>\n </DialogClose>\n <button\n type=\"button\"\n class=\"ink-button\"\n data-variant=\"primary\"\n data-ink-signature-save\n :disabled=\"!s.canSave\"\n @click=\"save\"\n >\n {{ SIGNATURE_LABELS.save }}\n </button>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"SignatureForm.js","names":["_sfc_main","SignatureForm_vue_vue_type_script_setup_true_lang_default","SignatureForm_default"],"sources":["../../src/components/SignatureForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * The body of `InkSignatureDialog`, mounted while it is open: one draft per opening. Draw,\n * Type and Image tabs, then Cancel and Save.\n */\nimport {\n createSignatureDraft,\n fontFamilyValue,\n handleRadioKeys,\n handleTabKeys,\n SIGNATURE_LABELS,\n SIGNATURE_TABS,\n type SignatureDraftState,\n type SignatureTab,\n} from '@inkbar/core/dom'\nimport { DialogClose } from 'reka-ui'\nimport { computed, onBeforeUnmount, onMounted, useId, useTemplateRef } from 'vue'\n\nimport { useHasTool } from '../composables/useRegisteredTool'\nimport { useTool } from '../composables/useTool'\nimport { useToolOptionsWhile } from '../composables/useToolOptions'\nimport { useInkContext } from '../context'\nimport { useReadable } from '../use-readable'\n\nimport type { SignatureOptions, SignatureTemplate } from '@inkbar/core'\n\nconst props = withDefaults(\n defineProps<{ fonts?: readonly string[] | undefined; select?: boolean }>(),\n { fonts: undefined, select: true }\n)\nconst emit = defineEmits<{ saved: [template: SignatureTemplate]; close: [] }>()\n\nconst ctx = useInkContext('InkSignatureDialog')\nconst { setTool } = useTool()\n// Without the signature tool, Save only stores the template, as signing a form field needs.\nconst hasSignatureTool = useHasTool(ctx, 'signature')\nconst { setOptions } = useToolOptionsWhile<SignatureOptions>(\n 'signature',\n hasSignatureTool\n)\nconst draft = createSignatureDraft({ fonts: props.fonts ?? ctx.signatureFonts.value })\nconst IDLE: SignatureDraftState = draft.state.get()\nconst s = useReadable(draft.state, IDLE)\nconst uid = useId()\nconst padHost = useTemplateRef<HTMLDivElement>('pad')\n\nlet detach: (() => void) | undefined\nonMounted(() => {\n if (padHost.value) detach = draft.attachPad(padHost.value)\n})\nonBeforeUnmount(() => {\n detach?.()\n draft.destroy()\n})\n\nfunction save(): void {\n draft.save(ctx.signatures.value).then(\n (t) => {\n if (!t) return\n if (props.select && hasSignatureTool.value) {\n setOptions({ templateId: t.id })\n setTool('signature')\n }\n emit('saved', t)\n emit('close')\n },\n () => {\n // The host's store refused it: the dialog stays open to try again.\n }\n )\n}\n\nconst tabId = (tab: SignatureTab) => `${uid}-tab-${tab}`\nconst panelId = (tab: SignatureTab) => `${uid}-panel-${tab}`\nconst shown = computed(() => s.value.name.trim() || SIGNATURE_LABELS.namePlaceholder)\nconst onTabKeydown = (e: KeyboardEvent) =>\n handleTabKeys(e, e.currentTarget as HTMLElement)\nconst onRadioKeydown = (e: KeyboardEvent) =>\n handleRadioKeys(e, e.currentTarget as HTMLElement)\nconst onName = (e: Event) => draft.setName((e.target as HTMLInputElement).value)\nconst onFile = (e: Event) =>\n void draft.chooseFile((e.target as HTMLInputElement).files?.[0])\n</script>\n\n<template>\n <div\n role=\"tablist\"\n :aria-label=\"SIGNATURE_LABELS.tabs\"\n class=\"ink-tabs\"\n @keydown=\"onTabKeydown\"\n >\n <button\n v-for=\"tab in SIGNATURE_TABS\"\n :id=\"tabId(tab)\"\n :key=\"tab\"\n type=\"button\"\n role=\"tab\"\n :aria-controls=\"panelId(tab)\"\n :aria-selected=\"s.tab === tab\"\n :tabindex=\"s.tab === tab ? 0 : -1\"\n class=\"ink-tab\"\n :data-key=\"tab\"\n :data-state=\"s.tab === tab ? 'active' : 'inactive'\"\n @click=\"draft.setTab(tab)\"\n >\n {{ SIGNATURE_LABELS[tab] }}\n </button>\n </div>\n <div\n :id=\"panelId('draw')\"\n role=\"tabpanel\"\n :aria-labelledby=\"tabId('draw')\"\n class=\"ink-tab-panel\"\n data-key=\"draw\"\n :hidden=\"s.tab !== 'draw'\"\n >\n <div\n ref=\"pad\"\n class=\"ink-signature-pad-host\"\n data-ink-signature-pad-host\n role=\"img\"\n :aria-label=\"SIGNATURE_LABELS.pad\"\n />\n <div class=\"ink-dialog-row\">\n <button\n type=\"button\"\n class=\"ink-button\"\n data-ink-signature-clear\n :disabled=\"s.padEmpty\"\n @click=\"draft.clearPad()\"\n >\n {{ SIGNATURE_LABELS.clear }}\n </button>\n </div>\n </div>\n <div\n :id=\"panelId('type')\"\n role=\"tabpanel\"\n :aria-labelledby=\"tabId('type')\"\n class=\"ink-tab-panel\"\n data-key=\"type\"\n :hidden=\"s.tab !== 'type'\"\n >\n <label class=\"ink-field\">\n <span>{{ SIGNATURE_LABELS.name }}</span>\n <input\n type=\"text\"\n class=\"ink-input\"\n data-ink-signature-name\n autocomplete=\"name\"\n :placeholder=\"SIGNATURE_LABELS.namePlaceholder\"\n :value=\"s.name\"\n @input=\"onName\"\n />\n </label>\n <div\n role=\"radiogroup\"\n :aria-label=\"SIGNATURE_LABELS.fonts\"\n class=\"ink-signature-fonts\"\n @keydown=\"onRadioKeydown\"\n >\n <button\n v-for=\"font in draft.fonts\"\n :key=\"font\"\n type=\"button\"\n role=\"radio\"\n :aria-checked=\"s.font === font\"\n :aria-label=\"font\"\n :tabindex=\"s.font === font ? 0 : -1\"\n class=\"ink-signature-font\"\n :data-key=\"font\"\n :data-state=\"s.font === font ? 'checked' : 'unchecked'\"\n @click=\"draft.setFont(font)\"\n >\n <!-- The font is the option itself, so it is set here, not left to the theme. -->\n <span\n class=\"ink-signature-font-sample\"\n :style=\"{ fontFamily: fontFamilyValue(font) }\"\n >\n {{ shown }}\n </span>\n </button>\n </div>\n </div>\n <div\n :id=\"panelId('image')\"\n role=\"tabpanel\"\n :aria-labelledby=\"tabId('image')\"\n class=\"ink-tab-panel\"\n data-key=\"image\"\n :hidden=\"s.tab !== 'image'\"\n >\n <label class=\"ink-field\">\n <span>{{ SIGNATURE_LABELS.file }}</span>\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n class=\"ink-input\"\n data-ink-signature-file\n @change=\"onFile\"\n />\n </label>\n <img\n v-if=\"s.image?.kind === 'image'\"\n class=\"ink-signature-image\"\n :src=\"s.image.imagedata\"\n alt=\"\"\n />\n <p v-if=\"s.imageError\" class=\"ink-field-error\" role=\"alert\">{{ s.imageError }}</p>\n </div>\n <p\n v-if=\"s.saveError\"\n class=\"ink-field-error\"\n role=\"alert\"\n data-ink-signature-save-error\n >\n {{ s.saveError }}\n </p>\n <div class=\"ink-dialog-actions\">\n <DialogClose as-child>\n <button type=\"button\" class=\"ink-button\" data-ink-signature-cancel>\n {{ SIGNATURE_LABELS.cancel }}\n </button>\n </DialogClose>\n <button\n type=\"button\"\n class=\"ink-button\"\n data-variant=\"primary\"\n data-ink-signature-save\n :disabled=\"!s.canSave\"\n @click=\"save\"\n >\n {{ SIGNATURE_LABELS.save }}\n </button>\n </div>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"SignatureForm.vue.d.ts","sourceRoot":"","sources":["../../src/components/SignatureForm.vue"],"names":[],"mappings":"AA8PA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGvE,KAAK,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA6R/E,QAAA,MAAM,YAAY;;;;;;;;;6EAIhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"SignatureForm.vue.d.ts","sourceRoot":"","sources":["../../src/components/SignatureForm.vue"],"names":[],"mappings":"AAqQA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGvE,KAAK,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAkS/E,QAAA,MAAM,YAAY;;;;;;;;;6EAIhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1,9 +1,10 @@
1
1
  import { useInkContext as e } from "../context.js";
2
- import { useReadable as t } from "../use-readable.js";
2
+ import { useHasTool as t } from "../composables/useRegisteredTool.js";
3
+ import { useReadable as ee } from "../use-readable.js";
3
4
  import { useTool as n } from "../composables/useTool.js";
4
- import { useToolOptions as ee } from "../composables/useToolOptions.js";
5
- import { Fragment as r, computed as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createVNode as te, defineComponent as c, normalizeStyle as ne, onBeforeUnmount as l, onMounted as re, openBlock as u, renderList as d, toDisplayString as f, unref as p, useId as m, useTemplateRef as h, withCtx as g } from "vue";
6
- import { SIGNATURE_LABELS as _, SIGNATURE_TABS as ie, createSignatureDraft as ae, fontFamilyValue as v, handleRadioKeys as y, handleTabKeys as b } from "@inkbar/core/dom";
5
+ import { useToolOptionsWhile as r } from "../composables/useToolOptions.js";
6
+ import { Fragment as i, computed as te, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createVNode as c, defineComponent as l, normalizeStyle as u, onBeforeUnmount as ne, onMounted as re, openBlock as d, renderList as f, toDisplayString as p, unref as m, useId as h, useTemplateRef as g, withCtx as ie } from "vue";
7
+ import { SIGNATURE_LABELS as _, SIGNATURE_TABS as ae, createSignatureDraft as oe, fontFamilyValue as v, handleRadioKeys as y, handleTabKeys as b } from "@inkbar/core/dom";
7
8
  import { DialogClose as x } from "reka-ui";
8
9
  //#region src/components/SignatureForm.vue?vue&type=script&setup=true&lang.ts
9
10
  var S = ["aria-label"], C = [
@@ -42,11 +43,11 @@ var S = ["aria-label"], C = [
42
43
  class: "ink-field-error",
43
44
  role: "alert",
44
45
  "data-ink-signature-save-error": ""
45
- }, oe = { class: "ink-dialog-actions" }, R = {
46
+ }, se = { class: "ink-dialog-actions" }, R = {
46
47
  type: "button",
47
48
  class: "ink-button",
48
49
  "data-ink-signature-cancel": ""
49
- }, z = ["disabled"], B = /*@__PURE__*/ c({
50
+ }, z = ["disabled"], B = /*@__PURE__*/ l({
50
51
  __name: "SignatureForm",
51
52
  props: {
52
53
  fonts: { default: void 0 },
@@ -56,128 +57,128 @@ var S = ["aria-label"], C = [
56
57
  }
57
58
  },
58
59
  emits: ["saved", "close"],
59
- setup(c, { emit: B }) {
60
- let V = c, H = B, U = e("InkSignatureDialog"), { setTool: W } = n(), { setOptions: G } = ee("signature"), K = ae({ fonts: V.fonts ?? U.signatureFonts.value }), q = K.state.get(), J = t(K.state, q), Y = m(), X = h("pad"), Z;
60
+ setup(l, { emit: B }) {
61
+ let V = l, H = B, U = e("InkSignatureDialog"), { setTool: W } = n(), G = t(U, "signature"), { setOptions: K } = r("signature", G), q = oe({ fonts: V.fonts ?? U.signatureFonts.value }), ce = q.state.get(), J = ee(q.state, ce), Y = h(), X = g("pad"), Z;
61
62
  re(() => {
62
- X.value && (Z = K.attachPad(X.value));
63
- }), l(() => {
64
- Z?.(), K.destroy();
63
+ X.value && (Z = q.attachPad(X.value));
64
+ }), ne(() => {
65
+ Z?.(), q.destroy();
65
66
  });
66
- function se() {
67
- K.save(U.signatures.value).then((e) => {
68
- e && (V.select && (G({ templateId: e.id }), W("signature")), H("saved", e), H("close"));
67
+ function le() {
68
+ q.save(U.signatures.value).then((e) => {
69
+ e && (V.select && G.value && (K({ templateId: e.id }), W("signature")), H("saved", e), H("close"));
69
70
  }, () => {});
70
71
  }
71
- let Q = (e) => `${Y}-tab-${e}`, $ = (e) => `${Y}-panel-${e}`, ce = i(() => J.value.name.trim() || _.namePlaceholder), le = (e) => b(e, e.currentTarget), ue = (e) => y(e, e.currentTarget), de = (e) => K.setName(e.target.value), fe = (e) => void K.chooseFile(e.target.files?.[0]);
72
- return (e, t) => (u(), o(r, null, [
72
+ let Q = (e) => `${Y}-tab-${e}`, $ = (e) => `${Y}-panel-${e}`, ue = te(() => J.value.name.trim() || _.namePlaceholder), de = (e) => b(e, e.currentTarget), fe = (e) => y(e, e.currentTarget), pe = (e) => q.setName(e.target.value), me = (e) => void q.chooseFile(e.target.files?.[0]);
73
+ return (e, t) => (d(), o(i, null, [
73
74
  s("div", {
74
75
  role: "tablist",
75
- "aria-label": p(_).tabs,
76
+ "aria-label": m(_).tabs,
76
77
  class: "ink-tabs",
77
- onKeydown: le
78
- }, [(u(!0), o(r, null, d(p(ie), (e) => (u(), o("button", {
78
+ onKeydown: de
79
+ }, [(d(!0), o(i, null, f(m(ae), (e) => (d(), o("button", {
79
80
  id: Q(e),
80
81
  key: e,
81
82
  type: "button",
82
83
  role: "tab",
83
84
  "aria-controls": $(e),
84
- "aria-selected": p(J).tab === e,
85
- tabindex: p(J).tab === e ? 0 : -1,
85
+ "aria-selected": m(J).tab === e,
86
+ tabindex: m(J).tab === e ? 0 : -1,
86
87
  class: "ink-tab",
87
88
  "data-key": e,
88
- "data-state": p(J).tab === e ? "active" : "inactive",
89
- onClick: (t) => p(K).setTab(e)
90
- }, f(p(_)[e]), 9, C))), 128))], 40, S),
89
+ "data-state": m(J).tab === e ? "active" : "inactive",
90
+ onClick: (t) => m(q).setTab(e)
91
+ }, p(m(_)[e]), 9, C))), 128))], 40, S),
91
92
  s("div", {
92
93
  id: $("draw"),
93
94
  role: "tabpanel",
94
95
  "aria-labelledby": Q("draw"),
95
96
  class: "ink-tab-panel",
96
97
  "data-key": "draw",
97
- hidden: p(J).tab !== "draw"
98
+ hidden: m(J).tab !== "draw"
98
99
  }, [s("div", {
99
100
  ref: "pad",
100
101
  class: "ink-signature-pad-host",
101
102
  "data-ink-signature-pad-host": "",
102
103
  role: "img",
103
- "aria-label": p(_).pad
104
+ "aria-label": m(_).pad
104
105
  }, null, 8, T), s("div", E, [s("button", {
105
106
  type: "button",
106
107
  class: "ink-button",
107
108
  "data-ink-signature-clear": "",
108
- disabled: p(J).padEmpty,
109
- onClick: t[0] ||= (e) => p(K).clearPad()
110
- }, f(p(_).clear), 9, D)])], 8, w),
109
+ disabled: m(J).padEmpty,
110
+ onClick: t[0] ||= (e) => m(q).clearPad()
111
+ }, p(m(_).clear), 9, D)])], 8, w),
111
112
  s("div", {
112
113
  id: $("type"),
113
114
  role: "tabpanel",
114
115
  "aria-labelledby": Q("type"),
115
116
  class: "ink-tab-panel",
116
117
  "data-key": "type",
117
- hidden: p(J).tab !== "type"
118
- }, [s("label", k, [s("span", null, f(p(_).name), 1), s("input", {
118
+ hidden: m(J).tab !== "type"
119
+ }, [s("label", k, [s("span", null, p(m(_).name), 1), s("input", {
119
120
  type: "text",
120
121
  class: "ink-input",
121
122
  "data-ink-signature-name": "",
122
123
  autocomplete: "name",
123
- placeholder: p(_).namePlaceholder,
124
- value: p(J).name,
125
- onInput: de
124
+ placeholder: m(_).namePlaceholder,
125
+ value: m(J).name,
126
+ onInput: pe
126
127
  }, null, 40, A)]), s("div", {
127
128
  role: "radiogroup",
128
- "aria-label": p(_).fonts,
129
+ "aria-label": m(_).fonts,
129
130
  class: "ink-signature-fonts",
130
- onKeydown: ue
131
- }, [(u(!0), o(r, null, d(p(K).fonts, (e) => (u(), o("button", {
131
+ onKeydown: fe
132
+ }, [(d(!0), o(i, null, f(m(q).fonts, (e) => (d(), o("button", {
132
133
  key: e,
133
134
  type: "button",
134
135
  role: "radio",
135
- "aria-checked": p(J).font === e,
136
+ "aria-checked": m(J).font === e,
136
137
  "aria-label": e,
137
- tabindex: p(J).font === e ? 0 : -1,
138
+ tabindex: m(J).font === e ? 0 : -1,
138
139
  class: "ink-signature-font",
139
140
  "data-key": e,
140
- "data-state": p(J).font === e ? "checked" : "unchecked",
141
- onClick: (t) => p(K).setFont(e)
141
+ "data-state": m(J).font === e ? "checked" : "unchecked",
142
+ onClick: (t) => m(q).setFont(e)
142
143
  }, [s("span", {
143
144
  class: "ink-signature-font-sample",
144
- style: ne({ fontFamily: p(v)(e) })
145
- }, f(ce.value), 5)], 8, M))), 128))], 40, j)], 8, O),
145
+ style: u({ fontFamily: m(v)(e) })
146
+ }, p(ue.value), 5)], 8, M))), 128))], 40, j)], 8, O),
146
147
  s("div", {
147
148
  id: $("image"),
148
149
  role: "tabpanel",
149
150
  "aria-labelledby": Q("image"),
150
151
  class: "ink-tab-panel",
151
152
  "data-key": "image",
152
- hidden: p(J).tab !== "image"
153
+ hidden: m(J).tab !== "image"
153
154
  }, [
154
- s("label", P, [s("span", null, f(p(_).file), 1), s("input", {
155
+ s("label", P, [s("span", null, p(m(_).file), 1), s("input", {
155
156
  type: "file",
156
157
  accept: "image/png,image/jpeg",
157
158
  class: "ink-input",
158
159
  "data-ink-signature-file": "",
159
- onChange: fe
160
+ onChange: me
160
161
  }, null, 32)]),
161
- p(J).image?.kind === "image" ? (u(), o("img", {
162
+ m(J).image?.kind === "image" ? (d(), o("img", {
162
163
  key: 0,
163
164
  class: "ink-signature-image",
164
- src: p(J).image.imagedata,
165
+ src: m(J).image.imagedata,
165
166
  alt: ""
166
167
  }, null, 8, F)) : a("", !0),
167
- p(J).imageError ? (u(), o("p", I, f(p(J).imageError), 1)) : a("", !0)
168
+ m(J).imageError ? (d(), o("p", I, p(m(J).imageError), 1)) : a("", !0)
168
169
  ], 8, N),
169
- p(J).saveError ? (u(), o("p", L, f(p(J).saveError), 1)) : a("", !0),
170
- s("div", oe, [te(p(x), { "as-child": "" }, {
171
- default: g(() => [s("button", R, f(p(_).cancel), 1)]),
170
+ m(J).saveError ? (d(), o("p", L, p(m(J).saveError), 1)) : a("", !0),
171
+ s("div", se, [c(m(x), { "as-child": "" }, {
172
+ default: ie(() => [s("button", R, p(m(_).cancel), 1)]),
172
173
  _: 1
173
174
  }), s("button", {
174
175
  type: "button",
175
176
  class: "ink-button",
176
177
  "data-variant": "primary",
177
178
  "data-ink-signature-save": "",
178
- disabled: !p(J).canSave,
179
- onClick: se
180
- }, f(p(_).save), 9, z)])
179
+ disabled: !m(J).canSave,
180
+ onClick: le
181
+ }, p(m(_).save), 9, z)])
181
182
  ], 64));
182
183
  }
183
184
  });