@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.
Files changed (99) hide show
  1. package/README.md +63 -2
  2. package/dist/components/InkDownloadButton.js +7 -0
  3. package/dist/components/InkDownloadButton.js.map +1 -0
  4. package/dist/components/InkDownloadButton.vue.d.ts +21 -0
  5. package/dist/components/InkDownloadButton.vue.d.ts.map +1 -0
  6. package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js +42 -0
  7. package/dist/components/InkDownloadButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  8. package/dist/components/InkFindBar.js.map +1 -1
  9. package/dist/components/InkFindBar.vue.d.ts.map +1 -1
  10. package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js +48 -48
  11. package/dist/components/InkFindBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/InkPanel.js +7 -0
  13. package/dist/components/InkPanel.js.map +1 -0
  14. package/dist/components/InkPanel.vue.d.ts +21 -0
  15. package/dist/components/InkPanel.vue.d.ts.map +1 -0
  16. package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js +48 -0
  17. package/dist/components/InkPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  18. package/dist/components/InkPrintButton.js +7 -0
  19. package/dist/components/InkPrintButton.js.map +1 -0
  20. package/dist/components/InkPrintButton.vue.d.ts +19 -0
  21. package/dist/components/InkPrintButton.vue.d.ts.map +1 -0
  22. package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js +39 -0
  23. package/dist/components/InkPrintButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  24. package/dist/components/InkRecordList.js +7 -0
  25. package/dist/components/InkRecordList.js.map +1 -0
  26. package/dist/components/InkRecordList.vue.d.ts +35 -0
  27. package/dist/components/InkRecordList.vue.d.ts.map +1 -0
  28. package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js +41 -0
  29. package/dist/components/InkRecordList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  30. package/dist/components/InkRoot.js.map +1 -1
  31. package/dist/components/InkRoot.vue.d.ts +39 -0
  32. package/dist/components/InkRoot.vue.d.ts.map +1 -1
  33. package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js +45 -45
  34. package/dist/components/InkRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/InkSearchResults.js +7 -0
  36. package/dist/components/InkSearchResults.js.map +1 -0
  37. package/dist/components/InkSearchResults.vue.d.ts +9 -0
  38. package/dist/components/InkSearchResults.vue.d.ts.map +1 -0
  39. package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js +52 -0
  40. package/dist/components/InkSearchResults.vue_vue_type_script_setup_true_lang.js.map +1 -0
  41. package/dist/components/InkSidebar.js +7 -0
  42. package/dist/components/InkSidebar.js.map +1 -0
  43. package/dist/components/InkSidebar.vue.d.ts +34 -0
  44. package/dist/components/InkSidebar.vue.d.ts.map +1 -0
  45. package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js +95 -0
  46. package/dist/components/InkSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  47. package/dist/components/InkThumbnail.js +7 -0
  48. package/dist/components/InkThumbnail.js.map +1 -0
  49. package/dist/components/InkThumbnail.vue.d.ts +18 -0
  50. package/dist/components/InkThumbnail.vue.d.ts.map +1 -0
  51. package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js +49 -0
  52. package/dist/components/InkThumbnail.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/components/InkThumbnails.js +7 -0
  54. package/dist/components/InkThumbnails.js.map +1 -0
  55. package/dist/components/InkThumbnails.vue.d.ts +27 -0
  56. package/dist/components/InkThumbnails.vue.d.ts.map +1 -0
  57. package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js +107 -0
  58. package/dist/components/InkThumbnails.vue_vue_type_script_setup_true_lang.js.map +1 -0
  59. package/dist/components/InkZoomSelect.js.map +1 -1
  60. package/dist/components/InkZoomSelect.vue.d.ts.map +1 -1
  61. package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  62. package/dist/components/InkZoomSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/RecordCards.js +7 -0
  64. package/dist/components/RecordCards.js.map +1 -0
  65. package/dist/components/RecordCards.vue.d.ts +25 -0
  66. package/dist/components/RecordCards.vue.d.ts.map +1 -0
  67. package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js +120 -0
  68. package/dist/components/RecordCards.vue_vue_type_script_setup_true_lang.js.map +1 -0
  69. package/dist/components/SidebarTrigger.js +7 -0
  70. package/dist/components/SidebarTrigger.js.map +1 -0
  71. package/dist/components/SidebarTrigger.vue.d.ts +9 -0
  72. package/dist/components/SidebarTrigger.vue.d.ts.map +1 -0
  73. package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js +33 -0
  74. package/dist/components/SidebarTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
  75. package/dist/components/sidebar-context.d.ts +21 -0
  76. package/dist/components/sidebar-context.d.ts.map +1 -0
  77. package/dist/components/sidebar-context.js +7 -0
  78. package/dist/components/sidebar-context.js.map +1 -0
  79. package/dist/composables/useAnnotations.d.ts +91 -0
  80. package/dist/composables/useAnnotations.d.ts.map +1 -1
  81. package/dist/composables/useRecordSelection.d.ts +12 -0
  82. package/dist/composables/useRecordSelection.d.ts.map +1 -0
  83. package/dist/composables/useRecordSelection.js +15 -0
  84. package/dist/composables/useRecordSelection.js.map +1 -0
  85. package/dist/composables/useRecords.d.ts +14 -0
  86. package/dist/composables/useRecords.d.ts.map +1 -0
  87. package/dist/composables/useRecords.js +16 -0
  88. package/dist/composables/useRecords.js.map +1 -0
  89. package/dist/composables/useSearch.d.ts.map +1 -1
  90. package/dist/composables/useSearch.js +1 -0
  91. package/dist/composables/useSearch.js.map +1 -1
  92. package/dist/index.d.ts +11 -0
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +40 -30
  95. package/dist/to-readable.d.ts +7 -0
  96. package/dist/to-readable.d.ts.map +1 -0
  97. package/dist/to-readable.js +11 -0
  98. package/dist/to-readable.js.map +1 -0
  99. 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,7 @@
1
+ import e from "./InkRecordList.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/InkRecordList.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=InkRecordList.js.map
@@ -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":"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"}
1
+ {"version":3,"file":"InkRoot.vue.d.ts","sourceRoot":"","sources":["../../src/components/InkRoot.vue"],"names":[],"mappings":"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"}