@inkbar/vue 0.9.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 +63 -2
- 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/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 +39 -0
- package/dist/components/InkRoot.vue.d.ts.map +1 -1
- package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js +45 -45
- 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/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/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/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/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/useSearch.d.ts.map +1 -1
- package/dist/composables/useSearch.js +1 -0
- package/dist/composables/useSearch.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -30
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InkPrintButton.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkPrintButton.vue"],"names":[],"mappings":"AA2DA,KAAK,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAiEzC,QAAA,IAAI,OAAO,IAAW,CAAC;AACvB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAG/C,QAAA,MAAM,UAAU;;6EAGd,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,39 @@
|
|
|
1
|
+
import { useInkContext as e } from "../context.js";
|
|
2
|
+
import t from "./InkIcon.js";
|
|
3
|
+
import { computed as n, createBlock as r, createVNode as i, defineComponent as a, mergeProps as o, openBlock as s, renderSlot as c, unref as l, withCtx as u } from "vue";
|
|
4
|
+
import { printDocument as d } from "@inkbar/core/dom";
|
|
5
|
+
import { ToolbarButton as f } from "reka-ui";
|
|
6
|
+
import { Printer as p } from "@inkbar/icons";
|
|
7
|
+
//#region src/components/InkPrintButton.vue?vue&type=script&setup=true&lang.ts
|
|
8
|
+
var m = /*@__PURE__*/ a({
|
|
9
|
+
__name: "InkPrintButton",
|
|
10
|
+
props: { asChild: {
|
|
11
|
+
type: Boolean,
|
|
12
|
+
default: !1
|
|
13
|
+
} },
|
|
14
|
+
setup(a) {
|
|
15
|
+
let m = e("InkPrintButton"), h = n(() => m.document.value !== null && m.status.value.state === "ready");
|
|
16
|
+
function g() {
|
|
17
|
+
let e = m.document.value;
|
|
18
|
+
e && d(e).catch(() => void 0);
|
|
19
|
+
}
|
|
20
|
+
let _ = {
|
|
21
|
+
"aria-label": "Print",
|
|
22
|
+
title: "Print",
|
|
23
|
+
onClick: g
|
|
24
|
+
};
|
|
25
|
+
return (e, n) => (s(), r(l(f), o({
|
|
26
|
+
"as-child": a.asChild,
|
|
27
|
+
disabled: !h.value,
|
|
28
|
+
class: "ink-print",
|
|
29
|
+
"data-ink-print": ""
|
|
30
|
+
}, _), {
|
|
31
|
+
default: u(() => [c(e.$slots, "default", {}, () => [i(t, { icon: l(p) }, null, 8, ["icon"])])]),
|
|
32
|
+
_: 3
|
|
33
|
+
}, 16, ["as-child", "disabled"]));
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
//#endregion
|
|
37
|
+
export { m as default };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=InkPrintButton.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InkPrintButton.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_mergeProps","_withCtx","_renderSlot","_createVNode","InkIcon","InkIcon_default","InkPrintButton_vue_vue_type_script_setup_true_lang_default","ctx","useInkContext","ready","computed","run","doc","printDocument","attrs","openBlock","createBlock","unref","ToolbarButton","mergeProps","__props","withCtx","renderSlot","_ctx","createVNode","Printer"],"sources":["../../src/components/InkPrintButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/*\n * Prints the open document's file with the browser's own PDF viewer (on iOS, in a new\n * tab). Disabled until the document is ready. Today that is the file as it was\n * opened, without this session's annotations.\n */\nimport { printDocument } from '@inkbar/core/dom'\nimport { Printer } from '@inkbar/icons'\nimport { ToolbarButton } from 'reka-ui'\nimport { computed } from 'vue'\n\nimport { useInkContext } from '../context'\n\nimport InkIcon from './InkIcon.vue'\n\nwithDefaults(defineProps<{ asChild?: boolean }>(), {\n asChild: false,\n})\nconst ctx = useInkContext('InkPrintButton')\nconst ready = computed(\n () => ctx.document.value !== null && ctx.status.value.state === 'ready'\n)\n\nfunction run(): void {\n const doc = ctx.document.value\n if (doc) void printDocument(doc).catch(() => undefined)\n}\n// Reka's typed props stop at its own; ARIA and listeners go through a bound object.\nconst attrs = { 'aria-label': 'Print', title: 'Print', onClick: run }\n</script>\n\n<template>\n <ToolbarButton\n :as-child=\"asChild\"\n :disabled=\"!ready\"\n class=\"ink-print\"\n data-ink-print\n v-bind=\"attrs\"\n >\n <slot><InkIcon :icon=\"Printer\" /></slot>\n </ToolbarButton>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAkBA,IAAMU,IAAMC,EAAc,gBAAgB,GACpCC,IAAQC,QACNH,EAAI,SAAS,UAAU,QAAQA,EAAI,OAAO,MAAM,UAAU,OAClE;EAEA,SAASI,IAAY;GACnB,IAAMC,IAAML,EAAI,SAAS;GACzB,AAAIK,KAAKC,EAAmBD,CAAG,CAAC,CAAC,YAAY,KAAA,CAAS;EACxD;EAEA,IAAME,IAAQ;GAAE,cAAc;GAAS,OAAO;GAAS,SAASH;EAAI;oBAIlEd,EAAA,GAAAC,EAQgBC,EAAAmB,CAAA,GARhBlB,EAQgB;GAPb,YAAUoB,EAAA;GACV,UAAQ,CAAGX,EAAA;GACZ,OAAM;GACN,kBAAA;EACQ,GAAAK,CAAK,GAAA;GAEb,SAAAb,QAAwC,CAAxCC,EAAwCqB,EAAA,QAAA,WAAA,CAAA,SAAA,CAAlCpB,EAA2BC,GAAA,EAAjB,MAAML,EAAA0B,CAAA,EAAO,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InkRecordList.js","names":["_sfc_main","InkRecordList_vue_vue_type_script_setup_true_lang_default","InkRecordList_default"],"sources":["../../src/components/InkRecordList.vue"],"sourcesContent":["<script\n setup\n lang=\"ts\"\n generic=\"T extends RecordBase & { page: number } = RecordBase & { page: number }\"\n>\n/*\n * The records a plugin keeps under `records` (`<plugin>.<name>`) as a list of cards, the same\n * cards their marks open, with the same actions: `createRecordList` on core's record list\n * controller. The list, the marks and `useRecordSelection` share one selection. `card`, `where`\n * and `sort` replace the marks' card, filter and reading order; changing one rebuilds the list,\n * so pass functions defined once rather than inline. `update:count` gives the number listed\n * whenever it changes; the `empty` slot replaces \"Nothing here yet.\". It fills its parent's\n * height. Inside `InkRoot`; it renders empty on the server.\n *\n * In place of `records`, `source` takes a host's own `RecordListSource` and lists it with the\n * same controller and cards; `card`, `where` and `sort` do not apply to it. Give one of the two:\n * with both, `source` wins and a development build warns.\n */\nimport {\n recordsSource,\n type CardSpec,\n type RecordListSource,\n type RecordsSourceOptions,\n} from '@inkbar/core/dom'\nimport { computed, watch } from 'vue'\n\nimport { injectInkContext } from '../context'\nimport { toReadable } from '../to-readable'\n\nimport RecordCards from './RecordCards.vue'\n\nimport type { RecordBase } from '@inkbar/core'\n\nconst props = defineProps<{\n records?: string | undefined\n source?: RecordListSource | undefined\n card?: ((record: T) => CardSpec) | undefined\n where?: ((record: T) => boolean) | undefined\n sort?: ((a: T, b: T) => number) | undefined\n}>()\n\ndefineEmits<{ 'update:count': [count: number] }>()\n\ndefineSlots<{ empty?(): unknown }>()\n\nconst ctx = injectInkContext()\nconst viewport = toReadable(() => ctx.viewport.value)\n\nif (import.meta.env.DEV)\n watch(\n () => props.records !== undefined && props.source !== undefined,\n (both) => {\n if (both)\n console.warn(\n '[inkbar] InkRecordList takes `records` or `source`, not both: it lists `source`.'\n )\n },\n { immediate: true }\n )\n\nconst source = computed((): RecordListSource | null => {\n if (props.source) return props.source\n const pluginHost = ctx.pluginHost.value\n if (!pluginHost || props.records === undefined) return null\n const opts: RecordsSourceOptions<T> = {}\n if (props.card) opts.card = props.card\n if (props.where) opts.where = props.where\n if (props.sort) opts.sort = props.sort\n return recordsSource<T>({ pluginHost, viewport }, props.records, opts)\n})\n</script>\n\n<template>\n <RecordCards :source=\"source\" @update:count=\"$emit('update:count', $event)\">\n <template v-if=\"$slots.empty\" #empty><slot name=\"empty\" /></template>\n </RecordCards>\n</template>\n"],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CardSpec, RecordListSource } from '@inkbar/core/dom';
|
|
2
|
+
import { RecordBase } from '@inkbar/core';
|
|
3
|
+
declare const __VLS_export: <T extends RecordBase & {
|
|
4
|
+
page: number;
|
|
5
|
+
} = RecordBase & {
|
|
6
|
+
page: number;
|
|
7
|
+
}>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
8
|
+
props: import('vue').PublicProps & __VLS_PrettifyLocal<{
|
|
9
|
+
records?: string | undefined;
|
|
10
|
+
source?: RecordListSource | undefined;
|
|
11
|
+
card?: ((record: T) => CardSpec) | undefined;
|
|
12
|
+
where?: ((record: T) => boolean) | undefined;
|
|
13
|
+
sort?: ((a: T, b: T) => number) | undefined;
|
|
14
|
+
} & {
|
|
15
|
+
"onUpdate:count"?: (count: number) => any;
|
|
16
|
+
}> & (typeof globalThis extends {
|
|
17
|
+
__VLS_PROPS_FALLBACK: infer P;
|
|
18
|
+
} ? P : {});
|
|
19
|
+
expose: (exposed: {}) => void;
|
|
20
|
+
attrs: any;
|
|
21
|
+
slots: {
|
|
22
|
+
empty?(): unknown;
|
|
23
|
+
};
|
|
24
|
+
emit: (evt: "update:count", count: number) => void;
|
|
25
|
+
}>) => import('vue').VNode & {
|
|
26
|
+
__ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
|
|
27
|
+
};
|
|
28
|
+
declare const _default: typeof __VLS_export;
|
|
29
|
+
export default _default;
|
|
30
|
+
type __VLS_PrettifyLocal<T> = (T extends any ? {
|
|
31
|
+
[K in keyof T]: T[K];
|
|
32
|
+
} : {
|
|
33
|
+
[K in keyof T as K]: T[K];
|
|
34
|
+
}) & {};
|
|
35
|
+
//# sourceMappingURL=InkRecordList.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InkRecordList.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkRecordList.vue"],"names":[],"mappings":"AA4FA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EAEtB,MAAM,kBAAkB,CAAA;AAQzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,QAAA,MAAM,YAAY,GAAK,CAAC,SAAS,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAC7F,aAAa,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAC9D,YAAY,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,EAC3G,gBAAgB,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAClE;WAkGO,OAAO,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;kBAhG5C,MAAM,GAAG,SAAS;iBACnB,gBAAgB,GAAG,SAAS;eAC9B,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,QAAQ,CAAC,GAAG,SAAS;gBACpC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,SAAS;eACrC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,SAAS;;;KA4F8C,CAAC,GAAG,CAAC,OAAO,UAAU,SAAS;QAAE,oBAAoB,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAC5J,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI;WACtB,GAAG;;kBAvFoB,OAAO;;;EA2FlC,KACQ,OAAO,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAAI,CAAC;wBACpE,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { injectInkContext as e } from "../context.js";
|
|
2
|
+
import { toReadable as t } from "../to-readable.js";
|
|
3
|
+
import n from "./RecordCards.js";
|
|
4
|
+
import { computed as r, createBlock as i, createSlots as a, defineComponent as o, openBlock as s, renderSlot as c, withCtx as l } from "vue";
|
|
5
|
+
import { recordsSource as u } from "@inkbar/core/dom";
|
|
6
|
+
//#region src/components/InkRecordList.vue?vue&type=script&setup=true&lang.ts
|
|
7
|
+
var d = /*@__PURE__*/ o({
|
|
8
|
+
__name: "InkRecordList",
|
|
9
|
+
props: {
|
|
10
|
+
records: {},
|
|
11
|
+
source: {},
|
|
12
|
+
card: { type: Function },
|
|
13
|
+
where: { type: Function },
|
|
14
|
+
sort: { type: Function }
|
|
15
|
+
},
|
|
16
|
+
emits: ["update:count"],
|
|
17
|
+
setup(o) {
|
|
18
|
+
let d = o, f = e(), p = t(() => f.viewport.value), m = r(() => {
|
|
19
|
+
if (d.source) return d.source;
|
|
20
|
+
let e = f.pluginHost.value;
|
|
21
|
+
if (!e || d.records === void 0) return null;
|
|
22
|
+
let t = {};
|
|
23
|
+
return d.card && (t.card = d.card), d.where && (t.where = d.where), d.sort && (t.sort = d.sort), u({
|
|
24
|
+
pluginHost: e,
|
|
25
|
+
viewport: p
|
|
26
|
+
}, d.records, t);
|
|
27
|
+
});
|
|
28
|
+
return (e, t) => (s(), i(n, {
|
|
29
|
+
source: m.value,
|
|
30
|
+
"onUpdate:count": t[0] ||= (t) => e.$emit("update:count", t)
|
|
31
|
+
}, a({ _: 2 }, [e.$slots.empty ? {
|
|
32
|
+
name: "empty",
|
|
33
|
+
fn: l(() => [c(e.$slots, "empty")]),
|
|
34
|
+
key: "0"
|
|
35
|
+
} : void 0]), 1032, ["source"]));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
//#endregion
|
|
39
|
+
export { d as default };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=InkRecordList.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InkRecordList.vue_vue_type_script_setup_true_lang.js","names":["$emit","$slots","_openBlock","_createBlock","RecordCards","_createSlots","_withCtx","_renderSlot","RecordCards_default","InkRecordList_vue_vue_type_script_setup_true_lang_default","props","__props","ctx","injectInkContext","viewport","toReadable","source","computed","pluginHost","opts","recordsSource","openBlock","createBlock","_cache","_ctx","$event","createSlots","withCtx","renderSlot"],"sources":["../../src/components/InkRecordList.vue"],"sourcesContent":["<script\n setup\n lang=\"ts\"\n generic=\"T extends RecordBase & { page: number } = RecordBase & { page: number }\"\n>\n/*\n * The records a plugin keeps under `records` (`<plugin>.<name>`) as a list of cards, the same\n * cards their marks open, with the same actions: `createRecordList` on core's record list\n * controller. The list, the marks and `useRecordSelection` share one selection. `card`, `where`\n * and `sort` replace the marks' card, filter and reading order; changing one rebuilds the list,\n * so pass functions defined once rather than inline. `update:count` gives the number listed\n * whenever it changes; the `empty` slot replaces \"Nothing here yet.\". It fills its parent's\n * height. Inside `InkRoot`; it renders empty on the server.\n *\n * In place of `records`, `source` takes a host's own `RecordListSource` and lists it with the\n * same controller and cards; `card`, `where` and `sort` do not apply to it. Give one of the two:\n * with both, `source` wins and a development build warns.\n */\nimport {\n recordsSource,\n type CardSpec,\n type RecordListSource,\n type RecordsSourceOptions,\n} from '@inkbar/core/dom'\nimport { computed, watch } from 'vue'\n\nimport { injectInkContext } from '../context'\nimport { toReadable } from '../to-readable'\n\nimport RecordCards from './RecordCards.vue'\n\nimport type { RecordBase } from '@inkbar/core'\n\nconst props = defineProps<{\n records?: string | undefined\n source?: RecordListSource | undefined\n card?: ((record: T) => CardSpec) | undefined\n where?: ((record: T) => boolean) | undefined\n sort?: ((a: T, b: T) => number) | undefined\n}>()\n\ndefineEmits<{ 'update:count': [count: number] }>()\n\ndefineSlots<{ empty?(): unknown }>()\n\nconst ctx = injectInkContext()\nconst viewport = toReadable(() => ctx.viewport.value)\n\nif (import.meta.env.DEV)\n watch(\n () => props.records !== undefined && props.source !== undefined,\n (both) => {\n if (both)\n console.warn(\n '[inkbar] InkRecordList takes `records` or `source`, not both: it lists `source`.'\n )\n },\n { immediate: true }\n )\n\nconst source = computed((): RecordListSource | null => {\n if (props.source) return props.source\n const pluginHost = ctx.pluginHost.value\n if (!pluginHost || props.records === undefined) return null\n const opts: RecordsSourceOptions<T> = {}\n if (props.card) opts.card = props.card\n if (props.where) opts.where = props.where\n if (props.sort) opts.sort = props.sort\n return recordsSource<T>({ pluginHost, viewport }, props.records, opts)\n})\n</script>\n\n<template>\n <RecordCards :source=\"source\" @update:count=\"$emit('update:count', $event)\">\n <template v-if=\"$slots.empty\" #empty><slot name=\"empty\" /></template>\n </RecordCards>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;EAiCA,IAAMU,IAAQC,GAYRC,IAAMC,EAAiB,GACvBC,IAAWC,QAAiBH,EAAI,SAAS,KAAK,GAc9CI,IAASC,QAAwC;GACrD,IAAIP,EAAM,QAAQ,OAAOA,EAAM;GAC/B,IAAMQ,IAAaN,EAAI,WAAW;GAClC,IAAI,CAACM,KAAcR,EAAM,YAAY,KAAA,GAAW,OAAO;GACvD,IAAMS,IAAgC,CAAC;GAIvC,OAHIT,EAAM,SAAM,EAAK,OAAOA,EAAM,OAC9BA,EAAM,UAAO,EAAK,QAAQA,EAAM,QAChCA,EAAM,SAAM,EAAK,OAAOA,EAAM,OAC3BU,EAAiB;IAAE;IAAY;GAAS,GAAGV,EAAM,SAASS,CAAI;EACvE,CAAC;oBAICjB,EAAA,GAAAC,EAEcC,GAAA;GAFA,QAAQY,EAAA;GAAS,kBAAY,AAAAO,EAAA,QAAA,MAAEvB,EAAAA,MAAK,gBAAiByB,CAAM;EACvDxB,GAAAA,EAAAA,EAAAA,GAAAA,EAAAA,GAAAA,CAAAA,EAAAA,OAAO,QAAA;GAAQ,MAAA;GAAM,IAAAK,QAAqB,CAArBC,EAAqBiB,EAAA,QAAA,OAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InkRoot.js","names":["_sfc_main","InkRoot_vue_vue_type_script_setup_true_lang_default","InkRoot_default"],"sources":["../../src/components/InkRoot.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n createMemorySignatureStore,\n createSignatureLibrary,\n InkError,\n openDocument,\n readonly,\n writable,\n} from '@inkbar/core'\nimport {\n attachHistoryKeys,\n createPluginHost,\n createSearchController,\n createToolOptions,\n handleFindKey,\n pageSelectionText,\n viewerSearchOf,\n cssVariableDefaults,\n FONT_FAMILIES,\n keepHistoryFocus,\n SIGNATURE_FONTS,\n trackToolStyle,\n unknownTool,\n} from '@inkbar/core/dom'\nimport { Primitive } from 'reka-ui'\nimport {\n computed,\n onBeforeUnmount,\n onUnmounted,\n onMounted,\n onUpdated,\n ref,\n shallowRef,\n useTemplateRef,\n watch,\n} from 'vue'\n\nimport { registeredToolIds } from '../composables/useRegisteredTool'\nimport { provideInkContext, type InkHistory, type InkStatus } from '../context'\nimport { createRefHistory } from '../ref-history'\nimport { useReadable } from '../use-readable'\n\nimport type {\n Annotation,\n AnnotationChange,\n AnnotationDefaults,\n DocumentSource,\n FieldsChange,\n FieldValues,\n FormAction,\n InkDocument,\n PdfAssets,\n SignatureStore,\n} from '@inkbar/core'\nimport type {\n DecorateAnnotation,\n InkPlugin,\n PluginHost,\n SearchController,\n Tool,\n ToolController,\n ToolId,\n ToolStyle,\n Viewport,\n ZoomValue,\n} from '@inkbar/core/dom'\n\nconst props = withDefaults(\n defineProps<{\n src: DocumentSource | null\n assets: PdfAssets\n password?: string | undefined\n /** Colour defaults. Without it, the theme's CSS variables on the root element apply. */\n defaults?: AnnotationDefaults | undefined\n /**\n * Pass (with v-model) to put annotations under the host's control. The mode is fixed when a\n * document opens: passing or dropping this prop later takes effect on the next open.\n */\n annotations?: Annotation[] | undefined\n /**\n * Pass (with `v-model:fields`) to put the form's field values under the host's control. A\n * commit shows at once and is reported after; the host's push wins. The mode is fixed when\n * a document opens, as for `annotations`.\n */\n fields?: FieldValues | undefined\n /** Tints fillable form fields. Default true. A change applies to the open document in place. */\n formHighlight?: boolean | undefined\n tool?: ToolId | undefined\n /**\n * The creation tools, such as `allTools()` or a pick of the tool factories. `select-text`\n * and `select` are always present; a tool with either id replaces it. They are read when a\n * document opens: a tool added later is usable from the next open, one removed stops at\n * once. When the active tool goes, the viewer switches to `select-text` and emits\n * `update:tool`. A controlled `tool` naming a missing tool is reported back as\n * `select-text` and is not applied again when the tool appears later. Each mounted control\n * for a missing tool logs its own `UnknownTool`.\n */\n tools?: Tool[] | undefined\n /**\n * Plugins, set up once when the root is created; a later change to this prop is not\n * applied. Their tools join `tools`, their decoration and page layers apply to every\n * document, and their commands are placed with `InkCommand` or `useCommand`.\n */\n plugins?: InkPlugin[] | undefined\n /**\n * Adds `data-*` attributes, classes and a screen-reader description to each annotation's\n * element (see `DecorateAnnotation`). Decorations re-apply whenever the annotations change\n * and when this prop changes, without rebuilding the viewer. Pass a new function when its\n * output would change for any other reason.\n */\n decorateAnnotation?: DecorateAnnotation | undefined\n /**\n * The font families text boxes offer, replacing the PDF standard families\n * (`FONT_FAMILIES`). Fonts beyond those are the PDF writer's to embed.\n */\n fonts?: string[] | undefined\n /**\n * Where saved signatures live. Default: memory, gone on reload.\n * `createLocalSignatureStore` keeps them in the browser; a host can keep them anywhere.\n * A new store takes effect at once, for the menus and the `signature` tool alike.\n */\n signatures?: SignatureStore | undefined\n /** The handwriting fonts a typed signature offers; the host loads them. */\n signatureFonts?: string[] | undefined\n page?: number | undefined\n zoom?: ZoomValue | undefined\n /** Undo history. Defaults to on for uncontrolled, off for controlled. */\n history?: boolean | undefined\n asChild?: boolean\n }>(),\n {\n password: undefined,\n defaults: undefined,\n annotations: undefined,\n fields: undefined,\n formHighlight: undefined,\n tool: undefined,\n tools: undefined,\n plugins: undefined,\n decorateAnnotation: undefined,\n fonts: undefined,\n signatures: undefined,\n signatureFonts: undefined,\n page: undefined,\n zoom: undefined,\n history: undefined,\n asChild: false,\n }\n)\n\nconst emit = defineEmits<{\n 'update:annotations': [next: Annotation[]]\n change: [change: AnnotationChange]\n /** Committed field values, in full, with what changed them. */\n 'update:fields': [next: FieldValues, change: FieldsChange]\n /** The form asked to submit, open a link, send mail, print or prompt. Inkbar does none. */\n 'form-action': [action: FormAction]\n 'update:tool': [tool: ToolId]\n 'update:page': [page: number]\n 'update:zoom': [zoom: ZoomValue]\n ready: [doc: InkDocument]\n /**\n * Opening failed, or later a form script failed or a signature field refused its signing.\n * An error from while the document opened comes after `ready`.\n */\n error: [error: InkError]\n activate: [id: string]\n}>()\n\ntype TestHookElement = HTMLElement & { __inkDocument?: InkDocument | undefined }\n\n// A template ref on Primitive is a component instance; the context needs its element.\nconst primitive = useTemplateRef<{ $el: unknown }>('primitive')\nconst rootEl = shallowRef<HTMLElement | null>(null)\nfunction syncRootEl(): void {\n const el = primitive.value?.$el\n rootEl.value = el instanceof HTMLElement ? el : null\n}\n\nconst document = shallowRef<InkDocument | null>(null)\n/** Overrides the document's status while opening, and when opening itself failed. */\nconst override = shallowRef<InkStatus | null>(null)\nconst idle: InkStatus = { state: 'idle' }\nconst documentStatus = useReadable<InkStatus>(() => document.value?.status ?? null, idle)\nconst status = computed<InkStatus>(() => override.value ?? documentStatus.value)\nconst annotationList = useReadable<readonly Annotation[]>(\n () => document.value?.annotations.list ?? null,\n []\n)\nconst selection = useReadable<readonly string[]>(\n () => document.value?.annotations.selection ?? null,\n []\n)\nconst viewport = shallowRef<Viewport | null>(null)\nconst toolController = shallowRef<ToolController | null>(null)\nconst internalTool = ref<ToolId>(props.tool ?? 'select-text')\nconst activated = ref<string | null>(null)\n\nconst controlled = computed(() => props.annotations !== undefined)\nconst fieldsControlled = computed(() => props.fields !== undefined)\n\nfunction setActivated(id: string | null): void {\n activated.value = id\n if (id) emit('activate', id)\n}\n\nconst noop = () => {}\n\n/** Signed URLs change; the key does not. Bytes and Blobs are their own identity. */\nfunction identity(src: DocumentSource | null): unknown {\n if (src === null) return null\n if (typeof src === 'string') return src\n if ('key' in src) return src.key\n return src\n}\n\nfunction setTestHook(doc: InkDocument | undefined): void {\n if (import.meta.env.DEV && rootEl.value)\n (rootEl.value as TestHookElement).__inkDocument = doc\n}\n\nlet generation = 0\nlet stopFormErrors: () => void = noop\nfunction release(): void {\n stopFormErrors()\n stopFormErrors = noop\n // Cleared first, so the plugins close their stores while the document is still alive.\n const doc = document.value\n document.value = null\n doc?.destroy()\n setTestHook(undefined)\n}\n\nasync function open(): Promise<void> {\n const gen = ++generation\n const src = props.src\n release()\n refHistory.clear()\n if (src === null) {\n override.value = null\n return\n }\n override.value = { state: 'loading' }\n syncRootEl()\n let doc: InkDocument\n try {\n doc = await openDocument(src, {\n assets: props.assets,\n password: props.password,\n defaults:\n props.defaults ?? (rootEl.value ? cssVariableDefaults(rootEl.value) : undefined),\n // Controlled hosts get the ref history below; core's own stack stays off.\n history: controlled.value ? false : (props.history ?? true),\n annotations: controlled.value\n ? {\n mode: 'controlled',\n initial: props.annotations ?? [],\n onChange: (next, change) => {\n emit('update:annotations', next)\n emit('change', change)\n },\n }\n : { mode: 'uncontrolled' },\n fields: fieldsControlled.value\n ? {\n mode: 'controlled',\n initial: props.fields ?? {},\n onChange: (next, change) => emit('update:fields', next, change),\n }\n : { mode: 'uncontrolled' },\n })\n } catch (cause) {\n if (gen !== generation) return\n const error =\n cause instanceof InkError\n ? cause\n : new InkError(\n 'InvalidPdf',\n cause instanceof Error ? cause.message : String(cause),\n {},\n cause\n )\n override.value = { state: 'error', error }\n emit('error', error)\n return\n }\n if (gen !== generation) {\n doc.destroy()\n return\n }\n // The prop may have changed while the file loaded, when there was no store to apply it to.\n if (doc.annotations.mode === 'controlled' && props.annotations !== undefined)\n doc.annotations.setControlledValue(props.annotations)\n // The same for the fields; a document whose fields opened uncontrolled ignores the push.\n if (props.fields !== undefined) doc.form.setControlledValue(props.fields)\n // A form script that fails leaves the form fillable; the failure goes to `error`. Subscribed\n // before anyone hears of the document, so the form replays the errors from while it opened\n // here, not to a listener added in `ready`; they are held until `ready` has gone out.\n let held: InkError[] | undefined = []\n stopFormErrors = doc.form.on('error', (e) => {\n if (held) held.push(e)\n else emit('error', e)\n })\n document.value = doc\n override.value = null\n setTestHook(doc)\n const s = doc.status.get()\n if (s.state === 'ready') emit('ready', doc)\n else if (s.state === 'error') emit('error', s.error)\n const early = held\n held = undefined\n if (gen === generation) for (const e of early) emit('error', e)\n}\n\nconst refHistory = createRefHistory({\n source: () => props.annotations,\n apply: (list) => document.value?.annotations.replaceAll(list, 'history'),\n enabled: computed(() => controlled.value && props.history === true),\n store: () =>\n document.value?.annotations.mode === 'controlled' ? document.value.annotations : null,\n})\nconst coreCanUndo = useReadable(() => document.value?.history.canUndo ?? null, false)\nconst coreCanRedo = useReadable(() => document.value?.history.canRedo ?? null, false)\nconst inkHistory: InkHistory = {\n canUndo: computed(() =>\n controlled.value ? refHistory.canUndo.value : coreCanUndo.value\n ),\n canRedo: computed(() =>\n controlled.value ? refHistory.canRedo.value : coreCanRedo.value\n ),\n undo: () => (controlled.value ? refHistory.undo() : document.value?.history.undo()),\n redo: () => (controlled.value ? refHistory.redo() : document.value?.history.redo()),\n clear: () => (controlled.value ? refHistory.clear() : document.value?.history.clear()),\n batch: (fn) => {\n if (controlled.value) refHistory.batch(fn)\n else if (document.value) document.value.history.batch(fn)\n else fn()\n },\n track: (store) =>\n controlled.value\n ? refHistory.track(store)\n : (document.value?.history.track(store) ?? noop),\n react: (fn) =>\n controlled.value ? refHistory.react(fn) : (document.value?.history.react(fn) ?? noop),\n}\n\n// The undo and redo keys anywhere in the root do what InkUndo and InkRedo do. When either\n// button undoes or redoes the last step and disables itself, focus goes back to the document.\n// The find key listens here too.\nwatch(\n rootEl,\n (el, _prev, onCleanup) => {\n if (!el) return\n const stopKeys = attachHistoryKeys(el, () => ({\n canUndo: inkHistory.canUndo.value,\n canRedo: inkHistory.canRedo.value,\n undo: inkHistory.undo,\n redo: inkHistory.redo,\n }))\n const stopFocus = keepHistoryFocus(el, () =>\n el.querySelector<HTMLElement>('[data-ink-scroll]')\n )\n // Not a template listener: Vue leaves those on the element when it unmounts.\n el.addEventListener('keydown', onKeydown)\n onCleanup(() => {\n stopKeys()\n stopFocus()\n el.removeEventListener('keydown', onKeydown)\n })\n },\n { immediate: true }\n)\n\n/*\n * One plugin host for the root's life, built once mounted so that no `setup` runs on the\n * server, where nothing would clean it up. Until then `pluginHost` is null, and InkCommand\n * renders its command disabled. The host follows `hostDocument`, which is set after `document`\n * (a sync watch): when the host reads `inkHistory` for a new document, it is that document's\n * history.\n */\nconst hostDocument = writable<InkDocument | null>(null)\nwatch(document, (doc) => hostDocument.set(doc), { flush: 'sync' })\nconst viewportEl = shallowRef<HTMLElement | null>(null)\nconst hostRoot = writable<HTMLElement | null>(null)\nwatch(viewportEl, (el) => hostRoot.set(el), { flush: 'sync' })\nconst hostActivated = writable<string | null>(null)\nwatch(activated, (id) => hostActivated.set(id), { flush: 'sync' })\nconst pluginHost = shallowRef<PluginHost | null>(null)\n/** One search controller for the root's life, built with the plugin host that shares it. */\nconst search = shallowRef<SearchController | null>(null)\nfunction setUpPlugins(): void {\n const controller = createSearchController({\n document: readonly(hostDocument),\n viewport: () => viewport.value,\n })\n search.value = controller\n pluginHost.value = createPluginHost({\n plugins: props.plugins ?? [],\n document: readonly(hostDocument),\n history: () => inkHistory,\n activated: readonly(hostActivated),\n // As in `createViewer`: an id not in the open document is ignored.\n setActivated: (id) => {\n if (id === null || document.value?.annotations.get(id)) setActivated(id)\n },\n root: readonly(hostRoot),\n decorate: () => props.decorateAnnotation,\n viewport: () => viewport.value,\n search: viewerSearchOf(controller),\n })\n}\n\n/** Ctrl/Cmd+F while focus is in the root and a find bar is mounted; else the browser's. */\nfunction onKeydown(e: KeyboardEvent): void {\n const controller = search.value\n const root = e.currentTarget\n if (controller && root instanceof HTMLElement)\n handleFindKey(e, controller, () => pageSelectionText(root))\n}\n\n/** The document's tool style; it batches through `inkHistory`, whichever mode is on. */\nconst toolStyle = shallowRef<ToolStyle | null>(null)\nlet setStyleTool: ((id: ToolId) => void) | undefined\nwatch(\n document,\n (doc) => {\n if (!doc) {\n toolStyle.value = null\n setStyleTool = undefined\n return\n }\n const tracker = trackToolStyle({\n store: doc.annotations,\n history: { batch: (fn) => inkHistory.batch(fn) },\n // The plugins' tools too, so a plugin tool's style group applies (the host is set by now:\n // it is built on mount, before the first document opens).\n tools: [...(props.tools ?? []), ...(pluginHost.value?.tools ?? [])],\n tool: internalTool.value,\n })\n setStyleTool = (id) => tracker.setTool(id)\n toolStyle.value = tracker.toolStyle\n },\n // Sync: the style is in place before InkViewport's watcher mounts the engine with it.\n { immediate: true, flush: 'sync' }\n)\nwatch(internalTool, (id) => setStyleTool?.(id))\n\n// Plugins and the document on the client only: on the server InkRoot renders its empty slot.\n// The plugins first, so the first document opens with their stores and reactions.\nonMounted(() => {\n syncRootEl()\n // A plugin whose setup throws still leaves the document to open; the error then goes to\n // Vue's error handling (`onErrorCaptured`, `app.config.errorHandler`).\n try {\n setUpPlugins()\n } finally {\n mounted.value = true\n void open()\n }\n})\nonUpdated(syncRootEl)\n\n// Separate sources, so a new `{ url, key }` object with the same key compares equal.\nwatch([() => identity(props.src), () => props.password], () => void open())\n\nwatch(\n () => props.annotations,\n (next) => {\n if (next && document.value?.annotations.mode === 'controlled')\n document.value.annotations.setControlledValue(next)\n }\n)\n\nwatch(\n () => props.fields,\n (next) => {\n if (next) document.value?.form.setControlledValue(next)\n }\n)\n\n/*\n * The tools are known once the plugins are set up on mount. A tool id nobody registered is\n * logged as `UnknownTool`; as the active tool, from a `tool` prop or because it left `tools`,\n * it falls back to `select-text`, reported through `update:tool`. A controlled `tool` that\n * stays on the missing id is not applied again.\n */\nconst mounted = ref(false)\n/** The ids of the tools the current viewer was built with; InkViewport sets them. */\nconst openedToolIds = shallowRef<readonly ToolId[] | null>(null)\nconst toolIds = computed(() =>\n registeredToolIds(props.tools, pluginHost.value, openedToolIds.value)\n)\nconst isRegistered = (id: ToolId): boolean => !mounted.value || toolIds.value.includes(id)\nconst logUnknownTool = (id: ToolId): void => console.error(unknownTool(id, toolIds.value))\n\nfunction fallBack(id: ToolId): void {\n logUnknownTool(id)\n internalTool.value = 'select-text'\n emit('update:tool', 'select-text')\n}\n\nwatch(\n () => props.tool,\n (t) => {\n if (!t) return\n if (isRegistered(t)) internalTool.value = t\n else fallBack(t)\n }\n)\nwatch([mounted, toolIds], () => {\n if (!isRegistered(internalTool.value)) fallBack(internalTool.value)\n})\n\nfunction setTool(id: ToolId): void {\n // As the tool controller does: a missing tool is logged and nothing changes.\n if (!isRegistered(id)) {\n logUnknownTool(id)\n return\n }\n // Picking the active tool again starts it afresh, as after a one-shot tool's use.\n const tc = toolController.value\n if (internalTool.value === id && tc?.active.get() === id) tc.set(id)\n internalTool.value = id\n emit('update:tool', id)\n}\n\nonBeforeUnmount(() => {\n generation++\n release()\n})\n\n// After the children: InkViewport's engine, and the plugin layers with it, are gone by now, as\n// in `createViewer`, so no layer `destroy` runs after the plugins' cleanups.\nonUnmounted(() => {\n pluginHost.value?.destroy()\n pluginHost.value = null\n search.value?.destroy()\n search.value = null\n})\n\nconst signatures = computed(() =>\n createSignatureLibrary(props.signatures ?? createMemorySignatureStore())\n)\nwatch(signatures, (lib) => void lib.refresh(), { immediate: true })\n/** Tool options last as long as the root; the tool style is per document. */\nconst toolOptions = createToolOptions()\n\nprovideInkContext({\n assets: computed(() => props.assets),\n document,\n status,\n annotations: annotationList,\n selection,\n viewport,\n tools: toolController,\n tool: internalTool,\n setTool,\n hostTools: computed(() => props.tools),\n openedToolIds,\n decorateAnnotation: computed(() => props.decorateAnnotation),\n fonts: computed(() => props.fonts ?? FONT_FAMILIES),\n toolOptions,\n signatures,\n signatureFonts: computed(() => props.signatureFonts ?? SIGNATURE_FONTS),\n toolStyle,\n zoomModel: computed(() => props.zoom),\n pageModel: computed(() => props.page),\n reportZoom: (z) => emit('update:zoom', z),\n reportPage: (p) => emit('update:page', p),\n activated,\n setActivated,\n pluginHost,\n search,\n viewportEl,\n history: inkHistory,\n rootEl,\n formHighlight: computed(() => props.formHighlight),\n reportFormAction: (a) => emit('form-action', a),\n reportError: (e) => emit('error', e),\n})\n\n// `history` is what `useHistory()` returns inside the root, for hosts that hold a template ref:\n// a controlled host calls `history.clear()` after loading its saved list.\ndefineExpose({ document, status, rootEl, history: inkHistory })\n</script>\n\n<template>\n <Primitive\n ref=\"primitive\"\n :as-child=\"props.asChild\"\n as=\"div\"\n data-ink-root\n :data-state=\"status.state\"\n >\n <slot :status=\"status\" :document=\"document\" />\n </Primitive>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"InkRoot.js","names":["_sfc_main","InkRoot_vue_vue_type_script_setup_true_lang_default","InkRoot_default"],"sources":["../../src/components/InkRoot.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n createMemorySignatureStore,\n createSignatureLibrary,\n InkError,\n openDocument,\n readonly,\n writable,\n} from '@inkbar/core'\nimport {\n attachFileKeys,\n attachHistoryKeys,\n createPluginHost,\n createSearchController,\n createToolOptions,\n handleFindKey,\n pageSelectionText,\n viewerSearchOf,\n cssVariableDefaults,\n FONT_FAMILIES,\n keepHistoryFocus,\n SIGNATURE_FONTS,\n trackToolStyle,\n unknownTool,\n} from '@inkbar/core/dom'\nimport { Primitive } from 'reka-ui'\nimport {\n computed,\n onBeforeUnmount,\n onUnmounted,\n onMounted,\n onUpdated,\n ref,\n shallowRef,\n useTemplateRef,\n watch,\n} from 'vue'\n\nimport { registeredToolIds } from '../composables/useRegisteredTool'\nimport { provideInkContext, type InkHistory, type InkStatus } from '../context'\nimport { createRefHistory } from '../ref-history'\nimport { useReadable } from '../use-readable'\n\nimport type {\n Annotation,\n AnnotationChange,\n AnnotationDefaults,\n DocumentSource,\n FieldsChange,\n FieldValues,\n FormAction,\n InkDocument,\n PdfAssets,\n SignatureStore,\n} from '@inkbar/core'\nimport type {\n DecorateAnnotation,\n InkPlugin,\n PluginHost,\n SearchController,\n Tool,\n ToolController,\n ToolId,\n ToolStyle,\n Viewport,\n ZoomValue,\n} from '@inkbar/core/dom'\n\nconst props = withDefaults(\n defineProps<{\n src: DocumentSource | null\n assets: PdfAssets\n password?: string | undefined\n /** Colour defaults. Without it, the theme's CSS variables on the root element apply. */\n defaults?: AnnotationDefaults | undefined\n /**\n * Pass (with v-model) to put annotations under the host's control. The mode is fixed when a\n * document opens: passing or dropping this prop later takes effect on the next open.\n */\n annotations?: Annotation[] | undefined\n /**\n * Pass (with `v-model:fields`) to put the form's field values under the host's control. A\n * commit shows at once and is reported after; the host's push wins. The mode is fixed when\n * a document opens, as for `annotations`.\n */\n fields?: FieldValues | undefined\n /** Tints fillable form fields. Default true. A change applies to the open document in place. */\n formHighlight?: boolean | undefined\n tool?: ToolId | undefined\n /**\n * The creation tools, such as `allTools()` or a pick of the tool factories. `select-text`\n * and `select` are always present; a tool with either id replaces it. They are read when a\n * document opens: a tool added later is usable from the next open, one removed stops at\n * once. When the active tool goes, the viewer switches to `select-text` and emits\n * `update:tool`. A controlled `tool` naming a missing tool is reported back as\n * `select-text` and is not applied again when the tool appears later. Each mounted control\n * for a missing tool logs its own `UnknownTool`.\n */\n tools?: Tool[] | undefined\n /**\n * Plugins, set up once when the root is created; a later change to this prop is not\n * applied. Their tools join `tools`, their decoration and page layers apply to every\n * document, and their commands are placed with `InkCommand` or `useCommand`.\n */\n plugins?: InkPlugin[] | undefined\n /**\n * Adds `data-*` attributes, classes and a screen-reader description to each annotation's\n * element (see `DecorateAnnotation`). Decorations re-apply whenever the annotations change\n * and when this prop changes, without rebuilding the viewer. Pass a new function when its\n * output would change for any other reason.\n */\n decorateAnnotation?: DecorateAnnotation | undefined\n /**\n * The font families text boxes offer, replacing the PDF standard families\n * (`FONT_FAMILIES`). Fonts beyond those are the PDF writer's to embed.\n */\n fonts?: string[] | undefined\n /**\n * Where saved signatures live. Default: memory, gone on reload.\n * `createLocalSignatureStore` keeps them in the browser; a host can keep them anywhere.\n * A new store takes effect at once, for the menus and the `signature` tool alike.\n */\n signatures?: SignatureStore | undefined\n /** The handwriting fonts a typed signature offers; the host loads them. */\n signatureFonts?: string[] | undefined\n page?: number | undefined\n zoom?: ZoomValue | undefined\n /** Undo history. Defaults to on for uncontrolled, off for controlled. */\n history?: boolean | undefined\n asChild?: boolean\n }>(),\n {\n password: undefined,\n defaults: undefined,\n annotations: undefined,\n fields: undefined,\n formHighlight: undefined,\n tool: undefined,\n tools: undefined,\n plugins: undefined,\n decorateAnnotation: undefined,\n fonts: undefined,\n signatures: undefined,\n signatureFonts: undefined,\n page: undefined,\n zoom: undefined,\n history: undefined,\n asChild: false,\n }\n)\n\nconst emit = defineEmits<{\n 'update:annotations': [next: Annotation[]]\n change: [change: AnnotationChange]\n /** Committed field values, in full, with what changed them. */\n 'update:fields': [next: FieldValues, change: FieldsChange]\n /** The form asked to submit, open a link, send mail, print or prompt. Inkbar does none. */\n 'form-action': [action: FormAction]\n 'update:tool': [tool: ToolId]\n 'update:page': [page: number]\n 'update:zoom': [zoom: ZoomValue]\n ready: [doc: InkDocument]\n /**\n * Opening failed, or later a form script failed or a signature field refused its signing.\n * An error from while the document opened comes after `ready`.\n */\n error: [error: InkError]\n activate: [id: string]\n}>()\n\ntype TestHookElement = HTMLElement & { __inkDocument?: InkDocument | undefined }\n\n// A template ref on Primitive is a component instance; the context needs its element.\nconst primitive = useTemplateRef<{ $el: unknown }>('primitive')\nconst rootEl = shallowRef<HTMLElement | null>(null)\nfunction syncRootEl(): void {\n const el = primitive.value?.$el\n rootEl.value = el instanceof HTMLElement ? el : null\n}\n\nconst document = shallowRef<InkDocument | null>(null)\n/** Overrides the document's status while opening, and when opening itself failed. */\nconst override = shallowRef<InkStatus | null>(null)\nconst idle: InkStatus = { state: 'idle' }\nconst documentStatus = useReadable<InkStatus>(() => document.value?.status ?? null, idle)\nconst status = computed<InkStatus>(() => override.value ?? documentStatus.value)\nconst annotationList = useReadable<readonly Annotation[]>(\n () => document.value?.annotations.list ?? null,\n []\n)\nconst selection = useReadable<readonly string[]>(\n () => document.value?.annotations.selection ?? null,\n []\n)\nconst viewport = shallowRef<Viewport | null>(null)\nconst toolController = shallowRef<ToolController | null>(null)\nconst internalTool = ref<ToolId>(props.tool ?? 'select-text')\nconst activated = ref<string | null>(null)\n\nconst controlled = computed(() => props.annotations !== undefined)\nconst fieldsControlled = computed(() => props.fields !== undefined)\n\nfunction setActivated(id: string | null): void {\n activated.value = id\n if (id) emit('activate', id)\n}\n\nconst noop = () => {}\n\n/** Signed URLs change; the key does not. Bytes and Blobs are their own identity. */\nfunction identity(src: DocumentSource | null): unknown {\n if (src === null) return null\n if (typeof src === 'string') return src\n if ('key' in src) return src.key\n return src\n}\n\nfunction setTestHook(doc: InkDocument | undefined): void {\n if (import.meta.env.DEV && rootEl.value)\n (rootEl.value as TestHookElement).__inkDocument = doc\n}\n\nlet generation = 0\nlet stopFormErrors: () => void = noop\nfunction release(): void {\n stopFormErrors()\n stopFormErrors = noop\n // Cleared first, so the plugins close their stores while the document is still alive.\n const doc = document.value\n document.value = null\n doc?.destroy()\n setTestHook(undefined)\n}\n\nasync function open(): Promise<void> {\n const gen = ++generation\n const src = props.src\n release()\n refHistory.clear()\n if (src === null) {\n override.value = null\n return\n }\n override.value = { state: 'loading' }\n syncRootEl()\n let doc: InkDocument\n try {\n doc = await openDocument(src, {\n assets: props.assets,\n password: props.password,\n defaults:\n props.defaults ?? (rootEl.value ? cssVariableDefaults(rootEl.value) : undefined),\n // Controlled hosts get the ref history below; core's own stack stays off.\n history: controlled.value ? false : (props.history ?? true),\n annotations: controlled.value\n ? {\n mode: 'controlled',\n initial: props.annotations ?? [],\n onChange: (next, change) => {\n emit('update:annotations', next)\n emit('change', change)\n },\n }\n : { mode: 'uncontrolled' },\n fields: fieldsControlled.value\n ? {\n mode: 'controlled',\n initial: props.fields ?? {},\n onChange: (next, change) => emit('update:fields', next, change),\n }\n : { mode: 'uncontrolled' },\n })\n } catch (cause) {\n if (gen !== generation) return\n const error =\n cause instanceof InkError\n ? cause\n : new InkError(\n 'InvalidPdf',\n cause instanceof Error ? cause.message : String(cause),\n {},\n cause\n )\n override.value = { state: 'error', error }\n emit('error', error)\n return\n }\n if (gen !== generation) {\n doc.destroy()\n return\n }\n // The prop may have changed while the file loaded, when there was no store to apply it to.\n if (doc.annotations.mode === 'controlled' && props.annotations !== undefined)\n doc.annotations.setControlledValue(props.annotations)\n // The same for the fields; a document whose fields opened uncontrolled ignores the push.\n if (props.fields !== undefined) doc.form.setControlledValue(props.fields)\n // A form script that fails leaves the form fillable; the failure goes to `error`. Subscribed\n // before anyone hears of the document, so the form replays the errors from while it opened\n // here, not to a listener added in `ready`; they are held until `ready` has gone out.\n let held: InkError[] | undefined = []\n stopFormErrors = doc.form.on('error', (e) => {\n if (held) held.push(e)\n else emit('error', e)\n })\n document.value = doc\n override.value = null\n setTestHook(doc)\n const s = doc.status.get()\n if (s.state === 'ready') emit('ready', doc)\n else if (s.state === 'error') emit('error', s.error)\n const early = held\n held = undefined\n if (gen === generation) for (const e of early) emit('error', e)\n}\n\nconst refHistory = createRefHistory({\n source: () => props.annotations,\n apply: (list) => document.value?.annotations.replaceAll(list, 'history'),\n enabled: computed(() => controlled.value && props.history === true),\n store: () =>\n document.value?.annotations.mode === 'controlled' ? document.value.annotations : null,\n})\nconst coreCanUndo = useReadable(() => document.value?.history.canUndo ?? null, false)\nconst coreCanRedo = useReadable(() => document.value?.history.canRedo ?? null, false)\nconst inkHistory: InkHistory = {\n canUndo: computed(() =>\n controlled.value ? refHistory.canUndo.value : coreCanUndo.value\n ),\n canRedo: computed(() =>\n controlled.value ? refHistory.canRedo.value : coreCanRedo.value\n ),\n undo: () => (controlled.value ? refHistory.undo() : document.value?.history.undo()),\n redo: () => (controlled.value ? refHistory.redo() : document.value?.history.redo()),\n clear: () => (controlled.value ? refHistory.clear() : document.value?.history.clear()),\n batch: (fn) => {\n if (controlled.value) refHistory.batch(fn)\n else if (document.value) document.value.history.batch(fn)\n else fn()\n },\n track: (store) =>\n controlled.value\n ? refHistory.track(store)\n : (document.value?.history.track(store) ?? noop),\n react: (fn) =>\n controlled.value ? refHistory.react(fn) : (document.value?.history.react(fn) ?? noop),\n}\n\n// The undo and redo keys anywhere in the root do what InkUndo and InkRedo do. When either\n// button undoes or redoes the last step and disables itself, focus goes back to the document.\n// The find key listens here too.\nwatch(\n rootEl,\n (el, _prev, onCleanup) => {\n if (!el) return\n const stopKeys = attachHistoryKeys(el, () => ({\n canUndo: inkHistory.canUndo.value,\n canRedo: inkHistory.canRedo.value,\n undo: inkHistory.undo,\n redo: inkHistory.redo,\n }))\n const stopFocus = keepHistoryFocus(el, () =>\n el.querySelector<HTMLElement>('[data-ink-scroll]')\n )\n // Ctrl or Cmd+P prints and +S downloads, as InkPrintButton and InkDownloadButton do.\n const stopFileKeys = attachFileKeys(el, () => document.value)\n // Not a template listener: Vue leaves those on the element when it unmounts.\n el.addEventListener('keydown', onKeydown)\n onCleanup(() => {\n stopKeys()\n stopFocus()\n stopFileKeys()\n el.removeEventListener('keydown', onKeydown)\n })\n },\n { immediate: true }\n)\n\n/*\n * One plugin host for the root's life, built once mounted so that no `setup` runs on the\n * server, where nothing would clean it up. Until then `pluginHost` is null, and InkCommand\n * renders its command disabled. The host follows `hostDocument`, which is set after `document`\n * (a sync watch): when the host reads `inkHistory` for a new document, it is that document's\n * history.\n */\nconst hostDocument = writable<InkDocument | null>(null)\nwatch(document, (doc) => hostDocument.set(doc), { flush: 'sync' })\nconst viewportEl = shallowRef<HTMLElement | null>(null)\nconst hostRoot = writable<HTMLElement | null>(null)\nwatch(viewportEl, (el) => hostRoot.set(el), { flush: 'sync' })\nconst hostActivated = writable<string | null>(null)\nwatch(activated, (id) => hostActivated.set(id), { flush: 'sync' })\nconst pluginHost = shallowRef<PluginHost | null>(null)\n/** One search controller for the root's life, built with the plugin host that shares it. */\nconst search = shallowRef<SearchController | null>(null)\nfunction setUpPlugins(): void {\n const controller = createSearchController({\n document: readonly(hostDocument),\n viewport: () => viewport.value,\n })\n search.value = controller\n pluginHost.value = createPluginHost({\n plugins: props.plugins ?? [],\n document: readonly(hostDocument),\n history: () => inkHistory,\n activated: readonly(hostActivated),\n // As in `createViewer`: an id not in the open document is ignored.\n setActivated: (id) => {\n if (id === null || document.value?.annotations.get(id)) setActivated(id)\n },\n root: readonly(hostRoot),\n decorate: () => props.decorateAnnotation,\n viewport: () => viewport.value,\n search: viewerSearchOf(controller),\n })\n}\n\n/** Ctrl/Cmd+F while focus is in the root and a find bar is mounted; else the browser's. */\nfunction onKeydown(e: KeyboardEvent): void {\n const controller = search.value\n const root = e.currentTarget\n if (controller && root instanceof HTMLElement)\n handleFindKey(e, controller, () => pageSelectionText(root))\n}\n\n/** The document's tool style; it batches through `inkHistory`, whichever mode is on. */\nconst toolStyle = shallowRef<ToolStyle | null>(null)\nlet setStyleTool: ((id: ToolId) => void) | undefined\nwatch(\n document,\n (doc) => {\n if (!doc) {\n toolStyle.value = null\n setStyleTool = undefined\n return\n }\n const tracker = trackToolStyle({\n store: doc.annotations,\n history: { batch: (fn) => inkHistory.batch(fn) },\n // The plugins' tools too, so a plugin tool's style group applies (the host is set by now:\n // it is built on mount, before the first document opens).\n tools: [...(props.tools ?? []), ...(pluginHost.value?.tools ?? [])],\n tool: internalTool.value,\n })\n setStyleTool = (id) => tracker.setTool(id)\n toolStyle.value = tracker.toolStyle\n },\n // Sync: the style is in place before InkViewport's watcher mounts the engine with it.\n { immediate: true, flush: 'sync' }\n)\nwatch(internalTool, (id) => setStyleTool?.(id))\n\n// Plugins and the document on the client only: on the server InkRoot renders its empty slot.\n// The plugins first, so the first document opens with their stores and reactions.\nonMounted(() => {\n syncRootEl()\n // A plugin whose setup throws still leaves the document to open; the error then goes to\n // Vue's error handling (`onErrorCaptured`, `app.config.errorHandler`).\n try {\n setUpPlugins()\n } finally {\n mounted.value = true\n void open()\n }\n})\nonUpdated(syncRootEl)\n\n// Separate sources, so a new `{ url, key }` object with the same key compares equal.\nwatch([() => identity(props.src), () => props.password], () => void open())\n\nwatch(\n () => props.annotations,\n (next) => {\n if (next && document.value?.annotations.mode === 'controlled')\n document.value.annotations.setControlledValue(next)\n }\n)\n\nwatch(\n () => props.fields,\n (next) => {\n if (next) document.value?.form.setControlledValue(next)\n }\n)\n\n/*\n * The tools are known once the plugins are set up on mount. A tool id nobody registered is\n * logged as `UnknownTool`; as the active tool, from a `tool` prop or because it left `tools`,\n * it falls back to `select-text`, reported through `update:tool`. A controlled `tool` that\n * stays on the missing id is not applied again.\n */\nconst mounted = ref(false)\n/** The ids of the tools the current viewer was built with; InkViewport sets them. */\nconst openedToolIds = shallowRef<readonly ToolId[] | null>(null)\nconst toolIds = computed(() =>\n registeredToolIds(props.tools, pluginHost.value, openedToolIds.value)\n)\nconst isRegistered = (id: ToolId): boolean => !mounted.value || toolIds.value.includes(id)\nconst logUnknownTool = (id: ToolId): void => console.error(unknownTool(id, toolIds.value))\n\nfunction fallBack(id: ToolId): void {\n logUnknownTool(id)\n internalTool.value = 'select-text'\n emit('update:tool', 'select-text')\n}\n\nwatch(\n () => props.tool,\n (t) => {\n if (!t) return\n if (isRegistered(t)) internalTool.value = t\n else fallBack(t)\n }\n)\nwatch([mounted, toolIds], () => {\n if (!isRegistered(internalTool.value)) fallBack(internalTool.value)\n})\n\nfunction setTool(id: ToolId): void {\n // As the tool controller does: a missing tool is logged and nothing changes.\n if (!isRegistered(id)) {\n logUnknownTool(id)\n return\n }\n // Picking the active tool again starts it afresh, as after a one-shot tool's use.\n const tc = toolController.value\n if (internalTool.value === id && tc?.active.get() === id) tc.set(id)\n internalTool.value = id\n emit('update:tool', id)\n}\n\nonBeforeUnmount(() => {\n generation++\n release()\n})\n\n// After the children: InkViewport's engine, and the plugin layers with it, are gone by now, as\n// in `createViewer`, so no layer `destroy` runs after the plugins' cleanups.\nonUnmounted(() => {\n pluginHost.value?.destroy()\n pluginHost.value = null\n search.value?.destroy()\n search.value = null\n})\n\nconst signatures = computed(() =>\n createSignatureLibrary(props.signatures ?? createMemorySignatureStore())\n)\nwatch(signatures, (lib) => void lib.refresh(), { immediate: true })\n/** Tool options last as long as the root; the tool style is per document. */\nconst toolOptions = createToolOptions()\n\nprovideInkContext({\n assets: computed(() => props.assets),\n document,\n status,\n annotations: annotationList,\n selection,\n viewport,\n tools: toolController,\n tool: internalTool,\n setTool,\n hostTools: computed(() => props.tools),\n openedToolIds,\n decorateAnnotation: computed(() => props.decorateAnnotation),\n fonts: computed(() => props.fonts ?? FONT_FAMILIES),\n toolOptions,\n signatures,\n signatureFonts: computed(() => props.signatureFonts ?? SIGNATURE_FONTS),\n toolStyle,\n zoomModel: computed(() => props.zoom),\n pageModel: computed(() => props.page),\n reportZoom: (z) => emit('update:zoom', z),\n reportPage: (p) => emit('update:page', p),\n activated,\n setActivated,\n pluginHost,\n search,\n viewportEl,\n history: inkHistory,\n rootEl,\n formHighlight: computed(() => props.formHighlight),\n reportFormAction: (a) => emit('form-action', a),\n reportError: (e) => emit('error', e),\n})\n\n// `history` is what `useHistory()` returns inside the root, for hosts that hold a template ref:\n// a controlled host calls `history.clear()` after loading its saved list.\ndefineExpose({ document, status, rootEl, history: inkHistory })\n</script>\n\n<template>\n <Primitive\n ref=\"primitive\"\n :as-child=\"props.asChild\"\n as=\"div\"\n data-ink-root\n :data-state=\"status.state\"\n >\n <slot :status=\"status\" :document=\"document\" />\n </Primitive>\n</template>\n"],"mappings":""}
|
|
@@ -111,6 +111,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
111
111
|
id: string;
|
|
112
112
|
page: number;
|
|
113
113
|
locked?: boolean | undefined;
|
|
114
|
+
hasAppearance?: boolean | undefined;
|
|
114
115
|
author?: string | undefined;
|
|
115
116
|
contents?: string | undefined;
|
|
116
117
|
inReplyTo?: string | undefined;
|
|
@@ -134,6 +135,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
134
135
|
page: number;
|
|
135
136
|
type: "text";
|
|
136
137
|
locked?: boolean | undefined;
|
|
138
|
+
hasAppearance?: boolean | undefined;
|
|
137
139
|
author?: string | undefined;
|
|
138
140
|
contents?: string | undefined;
|
|
139
141
|
inReplyTo?: string | undefined;
|
|
@@ -182,6 +184,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
182
184
|
fontSize?: undefined;
|
|
183
185
|
align?: undefined;
|
|
184
186
|
locked?: boolean | undefined;
|
|
187
|
+
hasAppearance?: boolean | undefined;
|
|
185
188
|
dashes?: number[] | undefined;
|
|
186
189
|
cornerRadius?: number | undefined;
|
|
187
190
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -207,6 +210,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
207
210
|
page: number;
|
|
208
211
|
type: "square";
|
|
209
212
|
locked?: boolean | undefined;
|
|
213
|
+
hasAppearance?: boolean | undefined;
|
|
210
214
|
dashes?: number[] | undefined;
|
|
211
215
|
interiorColor?: string | undefined;
|
|
212
216
|
cornerRadius?: number | undefined;
|
|
@@ -234,6 +238,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
234
238
|
type: "circle";
|
|
235
239
|
cornerRadius?: undefined;
|
|
236
240
|
locked?: boolean | undefined;
|
|
241
|
+
hasAppearance?: boolean | undefined;
|
|
237
242
|
dashes?: number[] | undefined;
|
|
238
243
|
interiorColor?: string | undefined;
|
|
239
244
|
author?: string | undefined;
|
|
@@ -267,6 +272,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
267
272
|
page: number;
|
|
268
273
|
type: "line";
|
|
269
274
|
locked?: boolean | undefined;
|
|
275
|
+
hasAppearance?: boolean | undefined;
|
|
270
276
|
dashes?: number[] | undefined;
|
|
271
277
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
272
278
|
tail?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -297,6 +303,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
297
303
|
page: number;
|
|
298
304
|
type: "polyline";
|
|
299
305
|
locked?: boolean | undefined;
|
|
306
|
+
hasAppearance?: boolean | undefined;
|
|
300
307
|
dashes?: number[] | undefined;
|
|
301
308
|
interiorColor?: string | undefined;
|
|
302
309
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -330,6 +337,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
330
337
|
head?: undefined;
|
|
331
338
|
tail?: undefined;
|
|
332
339
|
locked?: boolean | undefined;
|
|
340
|
+
hasAppearance?: boolean | undefined;
|
|
333
341
|
dashes?: number[] | undefined;
|
|
334
342
|
interiorColor?: string | undefined;
|
|
335
343
|
author?: string | undefined;
|
|
@@ -360,6 +368,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
360
368
|
type: "ink";
|
|
361
369
|
pressure?: number[][] | undefined;
|
|
362
370
|
locked?: boolean | undefined;
|
|
371
|
+
hasAppearance?: boolean | undefined;
|
|
363
372
|
dashes?: number[] | undefined;
|
|
364
373
|
author?: string | undefined;
|
|
365
374
|
contents?: string | undefined;
|
|
@@ -384,6 +393,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
384
393
|
page: number;
|
|
385
394
|
type: "stamp";
|
|
386
395
|
locked?: boolean | undefined;
|
|
396
|
+
hasAppearance?: boolean | undefined;
|
|
387
397
|
rotation?: 0 | 90 | 180 | 270 | undefined;
|
|
388
398
|
author?: string | undefined;
|
|
389
399
|
contents?: string | undefined;
|
|
@@ -409,6 +419,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
409
419
|
page: number;
|
|
410
420
|
type: "loupe";
|
|
411
421
|
locked?: boolean | undefined;
|
|
422
|
+
hasAppearance?: boolean | undefined;
|
|
412
423
|
author?: string | undefined;
|
|
413
424
|
contents?: string | undefined;
|
|
414
425
|
inReplyTo?: string | undefined;
|
|
@@ -433,6 +444,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
433
444
|
page: number;
|
|
434
445
|
type: "mask";
|
|
435
446
|
locked?: boolean | undefined;
|
|
447
|
+
hasAppearance?: boolean | undefined;
|
|
436
448
|
author?: string | undefined;
|
|
437
449
|
contents?: string | undefined;
|
|
438
450
|
inReplyTo?: string | undefined;
|
|
@@ -474,6 +486,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
474
486
|
};
|
|
475
487
|
}[] | undefined;
|
|
476
488
|
locked?: boolean | undefined;
|
|
489
|
+
hasAppearance?: boolean | undefined;
|
|
477
490
|
overlayText?: string | undefined;
|
|
478
491
|
author?: string | undefined;
|
|
479
492
|
contents?: string | undefined;
|
|
@@ -526,6 +539,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
526
539
|
id: string;
|
|
527
540
|
page: number;
|
|
528
541
|
locked?: boolean | undefined;
|
|
542
|
+
hasAppearance?: boolean | undefined;
|
|
529
543
|
author?: string | undefined;
|
|
530
544
|
contents?: string | undefined;
|
|
531
545
|
inReplyTo?: string | undefined;
|
|
@@ -549,6 +563,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
549
563
|
page: number;
|
|
550
564
|
type: "text";
|
|
551
565
|
locked?: boolean | undefined;
|
|
566
|
+
hasAppearance?: boolean | undefined;
|
|
552
567
|
author?: string | undefined;
|
|
553
568
|
contents?: string | undefined;
|
|
554
569
|
inReplyTo?: string | undefined;
|
|
@@ -597,6 +612,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
597
612
|
fontSize?: undefined;
|
|
598
613
|
align?: undefined;
|
|
599
614
|
locked?: boolean | undefined;
|
|
615
|
+
hasAppearance?: boolean | undefined;
|
|
600
616
|
dashes?: number[] | undefined;
|
|
601
617
|
cornerRadius?: number | undefined;
|
|
602
618
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -622,6 +638,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
622
638
|
page: number;
|
|
623
639
|
type: "square";
|
|
624
640
|
locked?: boolean | undefined;
|
|
641
|
+
hasAppearance?: boolean | undefined;
|
|
625
642
|
dashes?: number[] | undefined;
|
|
626
643
|
interiorColor?: string | undefined;
|
|
627
644
|
cornerRadius?: number | undefined;
|
|
@@ -649,6 +666,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
649
666
|
type: "circle";
|
|
650
667
|
cornerRadius?: undefined;
|
|
651
668
|
locked?: boolean | undefined;
|
|
669
|
+
hasAppearance?: boolean | undefined;
|
|
652
670
|
dashes?: number[] | undefined;
|
|
653
671
|
interiorColor?: string | undefined;
|
|
654
672
|
author?: string | undefined;
|
|
@@ -682,6 +700,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
682
700
|
page: number;
|
|
683
701
|
type: "line";
|
|
684
702
|
locked?: boolean | undefined;
|
|
703
|
+
hasAppearance?: boolean | undefined;
|
|
685
704
|
dashes?: number[] | undefined;
|
|
686
705
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
687
706
|
tail?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -712,6 +731,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
712
731
|
page: number;
|
|
713
732
|
type: "polyline";
|
|
714
733
|
locked?: boolean | undefined;
|
|
734
|
+
hasAppearance?: boolean | undefined;
|
|
715
735
|
dashes?: number[] | undefined;
|
|
716
736
|
interiorColor?: string | undefined;
|
|
717
737
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -745,6 +765,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
745
765
|
head?: undefined;
|
|
746
766
|
tail?: undefined;
|
|
747
767
|
locked?: boolean | undefined;
|
|
768
|
+
hasAppearance?: boolean | undefined;
|
|
748
769
|
dashes?: number[] | undefined;
|
|
749
770
|
interiorColor?: string | undefined;
|
|
750
771
|
author?: string | undefined;
|
|
@@ -775,6 +796,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
775
796
|
type: "ink";
|
|
776
797
|
pressure?: number[][] | undefined;
|
|
777
798
|
locked?: boolean | undefined;
|
|
799
|
+
hasAppearance?: boolean | undefined;
|
|
778
800
|
dashes?: number[] | undefined;
|
|
779
801
|
author?: string | undefined;
|
|
780
802
|
contents?: string | undefined;
|
|
@@ -799,6 +821,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
799
821
|
page: number;
|
|
800
822
|
type: "stamp";
|
|
801
823
|
locked?: boolean | undefined;
|
|
824
|
+
hasAppearance?: boolean | undefined;
|
|
802
825
|
rotation?: 0 | 90 | 180 | 270 | undefined;
|
|
803
826
|
author?: string | undefined;
|
|
804
827
|
contents?: string | undefined;
|
|
@@ -824,6 +847,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
824
847
|
page: number;
|
|
825
848
|
type: "loupe";
|
|
826
849
|
locked?: boolean | undefined;
|
|
850
|
+
hasAppearance?: boolean | undefined;
|
|
827
851
|
author?: string | undefined;
|
|
828
852
|
contents?: string | undefined;
|
|
829
853
|
inReplyTo?: string | undefined;
|
|
@@ -848,6 +872,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
848
872
|
page: number;
|
|
849
873
|
type: "mask";
|
|
850
874
|
locked?: boolean | undefined;
|
|
875
|
+
hasAppearance?: boolean | undefined;
|
|
851
876
|
author?: string | undefined;
|
|
852
877
|
contents?: string | undefined;
|
|
853
878
|
inReplyTo?: string | undefined;
|
|
@@ -889,6 +914,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
889
914
|
};
|
|
890
915
|
}[] | undefined;
|
|
891
916
|
locked?: boolean | undefined;
|
|
917
|
+
hasAppearance?: boolean | undefined;
|
|
892
918
|
overlayText?: string | undefined;
|
|
893
919
|
author?: string | undefined;
|
|
894
920
|
contents?: string | undefined;
|
|
@@ -943,6 +969,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
943
969
|
id: string;
|
|
944
970
|
page: number;
|
|
945
971
|
locked?: boolean | undefined;
|
|
972
|
+
hasAppearance?: boolean | undefined;
|
|
946
973
|
author?: string | undefined;
|
|
947
974
|
contents?: string | undefined;
|
|
948
975
|
inReplyTo?: string | undefined;
|
|
@@ -966,6 +993,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
966
993
|
page: number;
|
|
967
994
|
type: "text";
|
|
968
995
|
locked?: boolean | undefined;
|
|
996
|
+
hasAppearance?: boolean | undefined;
|
|
969
997
|
author?: string | undefined;
|
|
970
998
|
contents?: string | undefined;
|
|
971
999
|
inReplyTo?: string | undefined;
|
|
@@ -1014,6 +1042,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1014
1042
|
fontSize?: undefined;
|
|
1015
1043
|
align?: undefined;
|
|
1016
1044
|
locked?: boolean | undefined;
|
|
1045
|
+
hasAppearance?: boolean | undefined;
|
|
1017
1046
|
dashes?: number[] | undefined;
|
|
1018
1047
|
cornerRadius?: number | undefined;
|
|
1019
1048
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -1039,6 +1068,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1039
1068
|
page: number;
|
|
1040
1069
|
type: "square";
|
|
1041
1070
|
locked?: boolean | undefined;
|
|
1071
|
+
hasAppearance?: boolean | undefined;
|
|
1042
1072
|
dashes?: number[] | undefined;
|
|
1043
1073
|
interiorColor?: string | undefined;
|
|
1044
1074
|
cornerRadius?: number | undefined;
|
|
@@ -1066,6 +1096,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1066
1096
|
type: "circle";
|
|
1067
1097
|
cornerRadius?: undefined;
|
|
1068
1098
|
locked?: boolean | undefined;
|
|
1099
|
+
hasAppearance?: boolean | undefined;
|
|
1069
1100
|
dashes?: number[] | undefined;
|
|
1070
1101
|
interiorColor?: string | undefined;
|
|
1071
1102
|
author?: string | undefined;
|
|
@@ -1099,6 +1130,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1099
1130
|
page: number;
|
|
1100
1131
|
type: "line";
|
|
1101
1132
|
locked?: boolean | undefined;
|
|
1133
|
+
hasAppearance?: boolean | undefined;
|
|
1102
1134
|
dashes?: number[] | undefined;
|
|
1103
1135
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
1104
1136
|
tail?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -1129,6 +1161,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1129
1161
|
page: number;
|
|
1130
1162
|
type: "polyline";
|
|
1131
1163
|
locked?: boolean | undefined;
|
|
1164
|
+
hasAppearance?: boolean | undefined;
|
|
1132
1165
|
dashes?: number[] | undefined;
|
|
1133
1166
|
interiorColor?: string | undefined;
|
|
1134
1167
|
head?: (string & {}) | "None" | "Square" | "Circle" | "Diamond" | "OpenArrow" | "ClosedArrow" | "Butt" | "ROpenArrow" | "RClosedArrow" | "Slash" | undefined;
|
|
@@ -1162,6 +1195,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1162
1195
|
head?: undefined;
|
|
1163
1196
|
tail?: undefined;
|
|
1164
1197
|
locked?: boolean | undefined;
|
|
1198
|
+
hasAppearance?: boolean | undefined;
|
|
1165
1199
|
dashes?: number[] | undefined;
|
|
1166
1200
|
interiorColor?: string | undefined;
|
|
1167
1201
|
author?: string | undefined;
|
|
@@ -1192,6 +1226,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1192
1226
|
type: "ink";
|
|
1193
1227
|
pressure?: number[][] | undefined;
|
|
1194
1228
|
locked?: boolean | undefined;
|
|
1229
|
+
hasAppearance?: boolean | undefined;
|
|
1195
1230
|
dashes?: number[] | undefined;
|
|
1196
1231
|
author?: string | undefined;
|
|
1197
1232
|
contents?: string | undefined;
|
|
@@ -1216,6 +1251,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1216
1251
|
page: number;
|
|
1217
1252
|
type: "stamp";
|
|
1218
1253
|
locked?: boolean | undefined;
|
|
1254
|
+
hasAppearance?: boolean | undefined;
|
|
1219
1255
|
rotation?: 0 | 90 | 180 | 270 | undefined;
|
|
1220
1256
|
author?: string | undefined;
|
|
1221
1257
|
contents?: string | undefined;
|
|
@@ -1241,6 +1277,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1241
1277
|
page: number;
|
|
1242
1278
|
type: "loupe";
|
|
1243
1279
|
locked?: boolean | undefined;
|
|
1280
|
+
hasAppearance?: boolean | undefined;
|
|
1244
1281
|
author?: string | undefined;
|
|
1245
1282
|
contents?: string | undefined;
|
|
1246
1283
|
inReplyTo?: string | undefined;
|
|
@@ -1265,6 +1302,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1265
1302
|
page: number;
|
|
1266
1303
|
type: "mask";
|
|
1267
1304
|
locked?: boolean | undefined;
|
|
1305
|
+
hasAppearance?: boolean | undefined;
|
|
1268
1306
|
author?: string | undefined;
|
|
1269
1307
|
contents?: string | undefined;
|
|
1270
1308
|
inReplyTo?: string | undefined;
|
|
@@ -1306,6 +1344,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
1306
1344
|
};
|
|
1307
1345
|
}[] | undefined;
|
|
1308
1346
|
locked?: boolean | undefined;
|
|
1347
|
+
hasAppearance?: boolean | undefined;
|
|
1309
1348
|
overlayText?: string | undefined;
|
|
1310
1349
|
author?: string | undefined;
|
|
1311
1350
|
contents?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InkRoot.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkRoot.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InkRoot.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkRoot.vue"],"names":[],"mappings":"AA2lBA,OAAO,EAGL,QAAQ,EAIT,MAAM,cAAc,CAAA;AA+BrB,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAI/E,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACf,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EACV,kBAAkB,EAClB,SAAS,EAGT,IAAI,EAEJ,MAAM,EAGN,SAAS,EACV,MAAM,kBAAkB,CAAA;AAGzB,KAAK,WAAW,GAAG;IACf,GAAG,EAAE,cAAc,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,SAAS,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACzC;;;OAGG;IACH,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,SAAS,CAAA;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;IAChC,gGAAgG;IAChG,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,SAAS,CAAA;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAA;IACjC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACnD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAC5B;;;;OAIG;IACH,UAAU,CAAC,EAAE,cAAc,GAAG,SAAS,CAAA;IACvC,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IACrC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;IAC5B,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;AAygBJ,QAAA,IAAI,OAAO;;;CAAW,CAAC;AACvB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAG/C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6EAKd,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"}
|