@cosmicdrift/kumiko-document-designer 0.377.0 → 0.379.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 (78) hide show
  1. package/dist/feature.d.ts +6 -2
  2. package/dist/feature.js +10 -10
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.js +1 -1
  5. package/dist/list-definition.js +14 -2
  6. package/dist/web/cells.js +3 -4
  7. package/dist/web/client-plugin.js +3 -4
  8. package/dist/{constants.d.ts → web/constants.d.ts} +1 -0
  9. package/dist/{constants.js → web/constants.js} +2 -1
  10. package/dist/web/default-translations.d.ts +2 -0
  11. package/dist/web/default-translations.js +218 -0
  12. package/dist/web/editor-header.js +1 -2
  13. package/dist/web/editor-locale.js +1 -2
  14. package/dist/web/editor-shell.js +8 -4
  15. package/dist/web/errors.js +0 -1
  16. package/dist/web/field-issue-text.js +0 -1
  17. package/dist/web/file-name.js +0 -1
  18. package/dist/web/i18n.d.ts +6 -2
  19. package/dist/web/i18n.js +873 -219
  20. package/dist/web/index.d.ts +1 -1
  21. package/dist/web/index.js +1 -2
  22. package/dist/web/layout-editor-body.js +6 -6
  23. package/dist/web/layout-editor.js +1 -2
  24. package/dist/web/layout-html.js +0 -1
  25. package/dist/web/layout-meta.js +0 -1
  26. package/dist/web/layout-rails.js +3 -3
  27. package/dist/web/layout-users.js +1 -2
  28. package/dist/web/mail-dialogs.js +0 -1
  29. package/dist/web/mail-draft.js +4 -3
  30. package/dist/web/mail-edit-center.js +0 -1
  31. package/dist/web/mail-editor-body.js +7 -4
  32. package/dist/web/mail-editor.js +1 -2
  33. package/dist/web/mail-footer.d.ts +1 -1
  34. package/dist/web/mail-footer.js +2 -2
  35. package/dist/web/mail-left-rail.d.ts +2 -1
  36. package/dist/web/mail-left-rail.js +2 -3
  37. package/dist/web/mail-missing-locale.js +0 -1
  38. package/dist/web/mail-origin-bar.js +0 -1
  39. package/dist/web/mail-pdf-link-modal.js +5 -2
  40. package/dist/web/mail-preview-side.d.ts +2 -0
  41. package/dist/web/mail-preview-side.js +3 -2
  42. package/dist/web/mail-preview.js +1 -2
  43. package/dist/web/mail-right-rail.js +1 -2
  44. package/dist/web/mail-types.d.ts +4 -0
  45. package/dist/web/mail-upload-modal.js +0 -1
  46. package/dist/web/mail-versions.js +0 -1
  47. package/dist/web/origin-bar.js +2 -3
  48. package/dist/web/overrides-drawer.js +0 -1
  49. package/dist/web/overview-row.d.ts +4 -1
  50. package/dist/web/overview-row.js +3 -1
  51. package/dist/web/page-canvas.d.ts +1 -0
  52. package/dist/web/page-canvas.js +1 -2
  53. package/dist/web/pdf-left-rail.d.ts +2 -1
  54. package/dist/web/pdf-left-rail.js +2 -3
  55. package/dist/web/pdf-meta.js +0 -1
  56. package/dist/web/pdf-template-editor.js +40 -7
  57. package/dist/web/preview-record-picker.js +0 -1
  58. package/dist/web/rail.js +8 -4
  59. package/dist/web/settings-panel.js +0 -1
  60. package/dist/web/template-rows.js +0 -1
  61. package/dist/web/types.d.ts +1 -1
  62. package/dist/web/use-files-capability.d.ts +1 -0
  63. package/dist/web/use-files-capability.js +7 -0
  64. package/dist/web/use-mail-persistence.js +0 -1
  65. package/dist/web/use-overview-rows.js +0 -1
  66. package/dist/web/use-own-address.js +1 -2
  67. package/dist/web/use-settled-value.js +0 -1
  68. package/dist/web/use-test-mail.d.ts +6 -0
  69. package/dist/web/use-test-mail.js +8 -4
  70. package/dist/web/used-by-label.d.ts +1 -0
  71. package/dist/web/used-by-label.js +10 -5
  72. package/package.json +11 -9
  73. package/src/changes.json +43 -0
  74. package/src/web/styles.css +12 -0
  75. package/dist/i18n.d.ts +0 -6
  76. package/dist/i18n.js +0 -836
  77. package/dist/web/pdf-preview.d.ts +0 -4
  78. package/dist/web/pdf-preview.js +0 -112
@@ -1,4 +0,0 @@
1
- import { type ReactNode } from "react";
2
- export declare function PdfPreview({ pdfBase64 }: {
3
- readonly pdfBase64: string;
4
- }): ReactNode;
@@ -1,112 +0,0 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // @runtime client
3
- /// <reference path="./pdfjs-worker.d.ts" />
4
- import { useTranslation } from "@cosmicdrift/kumiko-renderer";
5
- import { Suspense, use, useCallback, useMemo } from "react";
6
- // pdf.js runs in the main thread ("fake worker"): the worker module is bundled
7
- // with the app and handed over through globalThis.pdfjsWorker, so no worker or
8
- // CDN URL is ever fetched (self-hosting and CSP stay intact).
9
- const RENDER_SCALE = 96 / 72;
10
- let cachedKey = null;
11
- let cachedLoad = null;
12
- function decodeBase64(base64) {
13
- const binary = atob(base64);
14
- const bytes = new Uint8Array(binary.length);
15
- for (let index = 0; index < binary.length; index++)
16
- bytes[index] = binary.charCodeAt(index);
17
- return bytes;
18
- }
19
- async function loadDocument(pdfBase64) {
20
- try {
21
- const [pdfjs, worker] = await Promise.all([
22
- import("pdfjs-dist"),
23
- import("pdfjs-dist/build/pdf.worker.min.mjs"),
24
- ]);
25
- Object.assign(globalThis, { pdfjsWorker: worker });
26
- const loadingTask = pdfjs.getDocument({ data: decodeBase64(pdfBase64) });
27
- return { ok: true, document: await loadingTask.promise, loadingTask };
28
- }
29
- catch {
30
- return { ok: false };
31
- }
32
- }
33
- // The promise must be stable across renders for use(); only the latest PDF is kept.
34
- function documentFor(pdfBase64) {
35
- if (cachedKey !== pdfBase64 || cachedLoad === null) {
36
- const previous = cachedLoad;
37
- cachedKey = pdfBase64;
38
- cachedLoad = loadDocument(pdfBase64);
39
- void previous?.then((loaded) => {
40
- if (loaded.ok)
41
- void loaded.loadingTask.destroy();
42
- });
43
- }
44
- return cachedLoad;
45
- }
46
- function PageView({ document, pageNumber, }) {
47
- const t = useTranslation();
48
- const page = use(pageFor(document, pageNumber));
49
- // Stable identity: the mount callbacks below depend on it, and a new viewport per render re-mounts canvas and text layer.
50
- const viewport = useMemo(() => page.getViewport({ scale: RENDER_SCALE }), [page]);
51
- const mountCanvas = useCallback((canvas) => {
52
- if (canvas === null)
53
- return;
54
- const task = page.render({ canvas, viewport });
55
- task.promise.catch(() => undefined);
56
- return () => task.cancel();
57
- }, [page, viewport]);
58
- const mountTextLayer = useCallback((container) => {
59
- if (container === null)
60
- return;
61
- container.style.setProperty("--total-scale-factor", String(RENDER_SCALE));
62
- container.style.setProperty("--scale-factor", String(RENDER_SCALE));
63
- let layer = null;
64
- let cancelled = false;
65
- void import("pdfjs-dist").then(({ TextLayer }) => {
66
- // skip: cleanup ran before pdfjs finished loading
67
- if (cancelled)
68
- return undefined;
69
- // TextLayer.cancel() keeps rendered spans; a re-mount must not append a second layer.
70
- container.replaceChildren();
71
- const textLayer = new TextLayer({
72
- textContentSource: page.streamTextContent(),
73
- container,
74
- viewport,
75
- });
76
- layer = textLayer;
77
- return textLayer.render().catch(() => undefined);
78
- });
79
- return () => {
80
- cancelled = true;
81
- layer?.cancel();
82
- };
83
- }, [page, viewport]);
84
- return (_jsxs("figure", { className: "m-0 flex flex-col items-center gap-2", "data-testid": `pdf-page-${pageNumber}`, children: [_jsxs("div", { className: "relative w-fit bg-card shadow-md", children: [_jsx("canvas", { ref: mountCanvas, width: viewport.width, height: viewport.height }), _jsx("div", { ref: mountTextLayer, className: "absolute inset-0 overflow-hidden leading-none [&_span]:absolute [&_span]:origin-top-left [&_span]:cursor-text [&_span]:whitespace-pre [&_span]:text-transparent [&_span::selection]:bg-primary/30" })] }), _jsx("figcaption", { className: "text-xs text-muted-foreground", children: t("documentDesigner.preview.pageOf", { page: pageNumber, pages: document.numPages }) })] }));
85
- }
86
- const pageCache = new WeakMap();
87
- function pageFor(document, pageNumber) {
88
- let pages = pageCache.get(document);
89
- if (pages === undefined) {
90
- pages = new Map();
91
- pageCache.set(document, pages);
92
- }
93
- let page = pages.get(pageNumber);
94
- if (page === undefined) {
95
- page = document.getPage(pageNumber);
96
- pages.set(pageNumber, page);
97
- }
98
- return page;
99
- }
100
- function Pages({ pdfBase64 }) {
101
- const t = useTranslation();
102
- const loaded = use(documentFor(pdfBase64));
103
- if (!loaded.ok) {
104
- return _jsx("p", { className: "text-sm text-status-bad", children: t("documentDesigner.preview.renderFailed") });
105
- }
106
- const pageNumbers = Array.from({ length: loaded.document.numPages }, (_, index) => index + 1);
107
- return (_jsx(_Fragment, { children: pageNumbers.map((pageNumber) => (_jsx(Suspense, { fallback: null, children: _jsx(PageView, { document: loaded.document, pageNumber: pageNumber }) }, pageNumber))) }));
108
- }
109
- export function PdfPreview({ pdfBase64 }) {
110
- const t = useTranslation();
111
- return (_jsx("div", { className: "flex flex-col items-center gap-6 overflow-auto bg-muted p-6", "data-testid": "document-designer-pdf-preview", children: _jsx(Suspense, { fallback: _jsx("p", { className: "text-sm text-muted-foreground", children: t("documentDesigner.preview.loading") }), children: _jsx(Pages, { pdfBase64: pdfBase64 }) }) }));
112
- }