@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.
- package/README.md +70 -4
- package/dist/components/InkDownloadButton.js +7 -0
- package/dist/components/InkDownloadButton.js.map +1 -0
- package/dist/components/InkDownloadButton.vue.d.ts +21 -0
- package/dist/components/InkDownloadButton.vue.d.ts.map +1 -0
- package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkFindBar.js.map +1 -1
- package/dist/components/InkFindBar.vue.d.ts.map +1 -1
- package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js +48 -48
- package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkHighlightMenu.js.map +1 -1
- package/dist/components/InkHighlightMenu.vue.d.ts.map +1 -1
- package/dist/components/InkHighlightMenu.vue_vue_type_script_setup_true_lang.js +67 -65
- package/dist/components/InkHighlightMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkPanel.js +7 -0
- package/dist/components/InkPanel.js.map +1 -0
- package/dist/components/InkPanel.vue.d.ts +21 -0
- package/dist/components/InkPanel.vue.d.ts.map +1 -0
- package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js +48 -0
- package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkPrintButton.js +7 -0
- package/dist/components/InkPrintButton.js.map +1 -0
- package/dist/components/InkPrintButton.vue.d.ts +19 -0
- package/dist/components/InkPrintButton.vue.d.ts.map +1 -0
- package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js +39 -0
- package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkRecordList.js +7 -0
- package/dist/components/InkRecordList.js.map +1 -0
- package/dist/components/InkRecordList.vue.d.ts +35 -0
- package/dist/components/InkRecordList.vue.d.ts.map +1 -0
- package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js +41 -0
- package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkRoot.js.map +1 -1
- package/dist/components/InkRoot.vue.d.ts +48 -4
- package/dist/components/InkRoot.vue.d.ts.map +1 -1
- package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js +177 -164
- package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkSearchResults.js +7 -0
- package/dist/components/InkSearchResults.js.map +1 -0
- package/dist/components/InkSearchResults.vue.d.ts +9 -0
- package/dist/components/InkSearchResults.vue.d.ts.map +1 -0
- package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js +52 -0
- package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkShapeMenu.js.map +1 -1
- package/dist/components/InkShapeMenu.vue.d.ts.map +1 -1
- package/dist/components/InkShapeMenu.vue_vue_type_script_setup_true_lang.js +58 -56
- package/dist/components/InkShapeMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkSidebar.js +7 -0
- package/dist/components/InkSidebar.js.map +1 -0
- package/dist/components/InkSidebar.vue.d.ts +34 -0
- package/dist/components/InkSidebar.vue.d.ts.map +1 -0
- package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js +95 -0
- package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkSignatureDialog.js.map +1 -1
- package/dist/components/InkSignatureDialog.vue.d.ts +3 -2
- package/dist/components/InkSignatureDialog.vue.d.ts.map +1 -1
- package/dist/components/InkSignatureDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkSignatureMenu.js.map +1 -1
- package/dist/components/InkSignatureMenu.vue.d.ts.map +1 -1
- package/dist/components/InkSignatureMenu.vue_vue_type_script_setup_true_lang.js +77 -75
- package/dist/components/InkSignatureMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkThumbnail.js +7 -0
- package/dist/components/InkThumbnail.js.map +1 -0
- package/dist/components/InkThumbnail.vue.d.ts +18 -0
- package/dist/components/InkThumbnail.vue.d.ts.map +1 -0
- package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js +49 -0
- package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkThumbnails.js +7 -0
- package/dist/components/InkThumbnails.js.map +1 -0
- package/dist/components/InkThumbnails.vue.d.ts +27 -0
- package/dist/components/InkThumbnails.vue.d.ts.map +1 -0
- package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js +107 -0
- package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkToolButton.js.map +1 -1
- package/dist/components/InkToolButton.vue.d.ts.map +1 -1
- package/dist/components/InkToolButton.vue_vue_type_script_setup_true_lang.js +39 -36
- package/dist/components/InkToolButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkToolbarButton.js +7 -0
- package/dist/components/InkToolbarButton.js.map +1 -0
- package/dist/components/InkToolbarButton.vue.d.ts +22 -0
- package/dist/components/InkToolbarButton.vue.d.ts.map +1 -0
- package/dist/components/InkToolbarButton.vue_vue_type_script_setup_true_lang.js +32 -0
- package/dist/components/InkToolbarButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InkViewport.js.map +1 -1
- package/dist/components/InkViewport.vue.d.ts.map +1 -1
- package/dist/components/InkViewport.vue_vue_type_script_setup_true_lang.js +37 -36
- package/dist/components/InkViewport.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/InkZoomSelect.js.map +1 -1
- package/dist/components/InkZoomSelect.vue.d.ts.map +1 -1
- package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/RecordCards.js +7 -0
- package/dist/components/RecordCards.js.map +1 -0
- package/dist/components/RecordCards.vue.d.ts +25 -0
- package/dist/components/RecordCards.vue.d.ts.map +1 -0
- package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js +120 -0
- package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/SidebarTrigger.js +7 -0
- package/dist/components/SidebarTrigger.js.map +1 -0
- package/dist/components/SidebarTrigger.vue.d.ts +9 -0
- package/dist/components/SidebarTrigger.vue.d.ts.map +1 -0
- package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js +33 -0
- package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/SignatureForm.js.map +1 -1
- package/dist/components/SignatureForm.vue.d.ts.map +1 -1
- package/dist/components/SignatureForm.vue_vue_type_script_setup_true_lang.js +56 -55
- package/dist/components/SignatureForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/sidebar-context.d.ts +21 -0
- package/dist/components/sidebar-context.d.ts.map +1 -0
- package/dist/components/sidebar-context.js +7 -0
- package/dist/components/sidebar-context.js.map +1 -0
- package/dist/composables/useAnnotations.d.ts +91 -0
- package/dist/composables/useAnnotations.d.ts.map +1 -1
- package/dist/composables/useRecordSelection.d.ts +12 -0
- package/dist/composables/useRecordSelection.d.ts.map +1 -0
- package/dist/composables/useRecordSelection.js +15 -0
- package/dist/composables/useRecordSelection.js.map +1 -0
- package/dist/composables/useRecords.d.ts +14 -0
- package/dist/composables/useRecords.d.ts.map +1 -0
- package/dist/composables/useRecords.js +16 -0
- package/dist/composables/useRecords.js.map +1 -0
- package/dist/composables/useRegisteredTool.d.ts +21 -0
- package/dist/composables/useRegisteredTool.d.ts.map +1 -0
- package/dist/composables/useRegisteredTool.js +25 -0
- package/dist/composables/useRegisteredTool.js.map +1 -0
- package/dist/composables/useSearch.d.ts.map +1 -1
- package/dist/composables/useSearch.js +1 -0
- package/dist/composables/useSearch.js.map +1 -1
- package/dist/composables/useToolOptions.d.ts +8 -0
- package/dist/composables/useToolOptions.d.ts.map +1 -1
- package/dist/composables/useToolOptions.js +10 -5
- package/dist/composables/useToolOptions.js.map +1 -1
- package/dist/context.d.ts +5 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -29
- package/dist/to-readable.d.ts +7 -0
- package/dist/to-readable.d.ts.map +1 -0
- package/dist/to-readable.js +11 -0
- package/dist/to-readable.js.map +1 -0
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InkZoomSelect.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkZoomSelect.vue"],"names":[],"mappings":"
|
|
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-
|
|
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-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 {
|
|
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":"
|
|
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 {
|
|
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 {
|
|
5
|
-
import { Fragment as
|
|
6
|
-
import { SIGNATURE_LABELS as _, SIGNATURE_TABS as
|
|
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
|
-
},
|
|
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__*/
|
|
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(
|
|
60
|
-
let V =
|
|
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 =
|
|
63
|
-
}),
|
|
64
|
-
Z?.(),
|
|
63
|
+
X.value && (Z = q.attachPad(X.value));
|
|
64
|
+
}), ne(() => {
|
|
65
|
+
Z?.(), q.destroy();
|
|
65
66
|
});
|
|
66
|
-
function
|
|
67
|
-
|
|
68
|
-
e && (V.select &&
|
|
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}`,
|
|
72
|
-
return (e, t) => (
|
|
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":
|
|
76
|
+
"aria-label": m(_).tabs,
|
|
76
77
|
class: "ink-tabs",
|
|
77
|
-
onKeydown:
|
|
78
|
-
}, [(
|
|
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":
|
|
85
|
-
tabindex:
|
|
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":
|
|
89
|
-
onClick: (t) =>
|
|
90
|
-
},
|
|
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:
|
|
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":
|
|
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:
|
|
109
|
-
onClick: t[0] ||= (e) =>
|
|
110
|
-
},
|
|
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:
|
|
118
|
-
}, [s("label", k, [s("span", null,
|
|
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:
|
|
124
|
-
value:
|
|
125
|
-
onInput:
|
|
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":
|
|
129
|
+
"aria-label": m(_).fonts,
|
|
129
130
|
class: "ink-signature-fonts",
|
|
130
|
-
onKeydown:
|
|
131
|
-
}, [(
|
|
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":
|
|
136
|
+
"aria-checked": m(J).font === e,
|
|
136
137
|
"aria-label": e,
|
|
137
|
-
tabindex:
|
|
138
|
+
tabindex: m(J).font === e ? 0 : -1,
|
|
138
139
|
class: "ink-signature-font",
|
|
139
140
|
"data-key": e,
|
|
140
|
-
"data-state":
|
|
141
|
-
onClick: (t) =>
|
|
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:
|
|
145
|
-
},
|
|
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:
|
|
153
|
+
hidden: m(J).tab !== "image"
|
|
153
154
|
}, [
|
|
154
|
-
s("label", P, [s("span", null,
|
|
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:
|
|
160
|
+
onChange: me
|
|
160
161
|
}, null, 32)]),
|
|
161
|
-
|
|
162
|
+
m(J).image?.kind === "image" ? (d(), o("img", {
|
|
162
163
|
key: 0,
|
|
163
164
|
class: "ink-signature-image",
|
|
164
|
-
src:
|
|
165
|
+
src: m(J).image.imagedata,
|
|
165
166
|
alt: ""
|
|
166
167
|
}, null, 8, F)) : a("", !0),
|
|
167
|
-
|
|
168
|
+
m(J).imageError ? (d(), o("p", I, p(m(J).imageError), 1)) : a("", !0)
|
|
168
169
|
], 8, N),
|
|
169
|
-
|
|
170
|
-
s("div",
|
|
171
|
-
default:
|
|
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: !
|
|
179
|
-
onClick:
|
|
180
|
-
},
|
|
179
|
+
disabled: !m(J).canSave,
|
|
180
|
+
onClick: le
|
|
181
|
+
}, p(m(_).save), 9, z)])
|
|
181
182
|
], 64));
|
|
182
183
|
}
|
|
183
184
|
});
|