@jotx-labs/editor 2.4.138 → 2.4.141
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/dist/components/Brand/JotxLogo.d.ts +9 -0
- package/dist/components/Brand/JotxLogo.d.ts.map +1 -0
- package/dist/components/Brand/JotxLogo.js +11 -0
- package/dist/components/Brand/JotxLogo.js.map +1 -0
- package/dist/components/DocumentHeader/DocumentHeader.d.ts +21 -0
- package/dist/components/DocumentHeader/DocumentHeader.d.ts.map +1 -0
- package/dist/components/DocumentHeader/DocumentHeader.js +83 -0
- package/dist/components/DocumentHeader/DocumentHeader.js.map +1 -0
- package/dist/components/DocumentHeader/ExportMenu.d.ts +11 -0
- package/dist/components/DocumentHeader/ExportMenu.d.ts.map +1 -0
- package/dist/components/DocumentHeader/ExportMenu.js +244 -0
- package/dist/components/DocumentHeader/ExportMenu.js.map +1 -0
- package/dist/components/DocumentHeader/ViewOptions.d.ts +6 -0
- package/dist/components/DocumentHeader/ViewOptions.d.ts.map +1 -0
- package/dist/components/DocumentHeader/ViewOptions.js +73 -0
- package/dist/components/DocumentHeader/ViewOptions.js.map +1 -0
- package/dist/components/GraphView/GraphView.d.ts +33 -0
- package/dist/components/GraphView/GraphView.d.ts.map +1 -0
- package/dist/components/GraphView/GraphView.js +234 -0
- package/dist/components/GraphView/GraphView.js.map +1 -0
- package/dist/extensions/ButtonNode 2.js +59 -0
- package/dist/extensions/ButtonNode.d 2.ts +7 -0
- package/dist/extensions/ButtonNode.d.ts 2.map +1 -0
- package/dist/extensions/ButtonNode.js 2.map +1 -0
- package/dist/extensions/CardNode 2.js +64 -0
- package/dist/extensions/CardNode.d 2.ts +7 -0
- package/dist/extensions/CardNode.d.ts 2.map +1 -0
- package/dist/extensions/CardNode.js 2.map +1 -0
- package/dist/extensions/GridCardNode.d 2.ts +7 -0
- package/dist/extensions/GridCardNode.d.ts 2.map +1 -0
- package/dist/extensions/GridCardNode.js 2.map +1 -0
- package/dist/extensions/ImageNode.d.ts 2.map +1 -0
- package/dist/extensions/LinkNode.js 2.map +1 -0
- package/dist/extensions/SearchExtension.d 2.ts +40 -0
- package/dist/extensions/SearchExtension.d.ts 2.map +1 -0
- package/dist/extensions/SearchExtension.js 2.map +1 -0
- package/dist/extensions/SectionNode 2.js +58 -0
- package/dist/extensions/SectionNode.d 2.ts +11 -0
- package/dist/extensions/SectionNode.d.ts 2.map +1 -0
- package/dist/extensions/SectionNode.js 2.map +1 -0
- package/dist/extensions/ToggleNode 2.js +58 -0
- package/dist/extensions/ToggleNode.d 2.ts +11 -0
- package/dist/extensions/ToggleNode.d.ts 2.map +1 -0
- package/dist/extensions/ToggleNode.js 2.map +1 -0
- package/dist/index 2.js +128 -0
- package/dist/index.d 2.ts +59 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts 2.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js 2.map +1 -0
- package/dist/index.js.map +1 -1
- package/dist/styles/DocumentHeader.css +294 -0
- package/dist/styles/GraphView.css +220 -0
- package/package.json +5 -4
- package/src/styles/DocumentHeader.css +294 -0
- package/src/styles/GraphView.css +220 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface JotxLogoProps {
|
|
2
|
+
size?: number;
|
|
3
|
+
className?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Monochrome jotx logo (theme-invertable): uses currentColor.
|
|
7
|
+
*/
|
|
8
|
+
export declare function JotxLogo({ size, className }: JotxLogoProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=JotxLogo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JotxLogo.d.ts","sourceRoot":"","sources":["../../../src/components/Brand/JotxLogo.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAS,EAAE,SAAS,EAAE,EAAE,aAAa,2CAqC/D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JotxLogo = JotxLogo;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* Monochrome jotx logo (theme-invertable): uses currentColor.
|
|
7
|
+
*/
|
|
8
|
+
function JotxLogo({ size = 28, className }) {
|
|
9
|
+
return ((0, jsx_runtime_1.jsxs)("svg", { className: className, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 256 256", width: size, height: size, role: "img", "aria-label": "jotx", fill: "none", children: [(0, jsx_runtime_1.jsx)("rect", { x: "36", y: "36", width: "184", height: "184", rx: "44", stroke: "currentColor", strokeWidth: "18" }), (0, jsx_runtime_1.jsx)("text", { x: "128", y: "140", textAnchor: "middle", dominantBaseline: "middle", fill: "currentColor", fontSize: "124", fontWeight: "700", fontStyle: "italic", fontFamily: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace`, transform: "translate(128 140) skewX(-10) translate(-128 -140)", children: "j" })] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=JotxLogo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JotxLogo.js","sourceRoot":"","sources":["../../../src/components/Brand/JotxLogo.tsx"],"names":[],"mappings":";;AAUA,4BAqCC;;AAxCD;;GAEG;AACH,SAAgB,QAAQ,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAiB;IAC9D,OAAO,CACL,iCACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,aAAa,EACrB,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,IAAI,EAAC,KAAK,gBACC,MAAM,EACjB,IAAI,EAAC,MAAM,aAEX,iCACE,CAAC,EAAC,IAAI,EACN,CAAC,EAAC,IAAI,EACN,KAAK,EAAC,KAAK,EACX,MAAM,EAAC,KAAK,EACZ,EAAE,EAAC,IAAI,EACP,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,IAAI,GAChB,EACF,iCACE,CAAC,EAAC,KAAK,EACP,CAAC,EAAC,KAAK,EACP,UAAU,EAAC,QAAQ,EACnB,gBAAgB,EAAC,QAAQ,EACzB,IAAI,EAAC,cAAc,EACnB,QAAQ,EAAC,KAAK,EACd,UAAU,EAAC,KAAK,EAChB,SAAS,EAAC,QAAQ,EAClB,UAAU,EAAE,oGAAoG,EAChH,SAAS,EAAC,oDAAoD,kBAGzD,IACH,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document Header - Always visible, even for empty files
|
|
3
|
+
* Supports custom logo, title editing, export, share, print
|
|
4
|
+
*/
|
|
5
|
+
import '../../styles/DocumentHeader.css';
|
|
6
|
+
export interface DocumentHeaderProps {
|
|
7
|
+
documentId: string;
|
|
8
|
+
documentUri?: string;
|
|
9
|
+
documentType: 'page' | 'meeting' | 'tasklist';
|
|
10
|
+
contentType?: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
icon?: string;
|
|
13
|
+
logoUrl?: string;
|
|
14
|
+
onTitleChange?: (title: string) => void;
|
|
15
|
+
onIconChange?: (icon: string) => void;
|
|
16
|
+
onContentTypeChange?: (type: string) => void;
|
|
17
|
+
onOpenGraph?: () => void;
|
|
18
|
+
onCopyHelpFiles?: () => void;
|
|
19
|
+
}
|
|
20
|
+
export declare function DocumentHeader({ documentId, documentUri, documentType, contentType, title, onTitleChange, onContentTypeChange, onOpenGraph, onCopyHelpFiles }: DocumentHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=DocumentHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentHeader.d.ts","sourceRoot":"","sources":["../../../src/components/DocumentHeader/DocumentHeader.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,iCAAiC,CAAA;AAExC,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;CAC7B;AAiBD,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,eAAe,EAChB,EAAE,mBAAmB,2CAsJrB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DocumentHeader = DocumentHeader;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* Document Header - Always visible, even for empty files
|
|
7
|
+
* Supports custom logo, title editing, export, share, print
|
|
8
|
+
*/
|
|
9
|
+
const react_1 = require("react");
|
|
10
|
+
const lucide_react_1 = require("lucide-react");
|
|
11
|
+
const JotxLogo_1 = require("../Brand/JotxLogo");
|
|
12
|
+
const ViewOptions_1 = require("./ViewOptions");
|
|
13
|
+
const ExportMenu_1 = require("./ExportMenu");
|
|
14
|
+
require("../../styles/DocumentHeader.css");
|
|
15
|
+
const CREATIVE_TYPES = [
|
|
16
|
+
{ value: 'page', label: 'Page', icon: lucide_react_1.FileText, group: 'General' },
|
|
17
|
+
{ value: 'article', label: 'Article', icon: lucide_react_1.FileText, group: 'General' },
|
|
18
|
+
{ value: 'documentation', label: 'Documentation', icon: lucide_react_1.Book, group: 'General' },
|
|
19
|
+
{ value: 'report', label: 'Report', icon: lucide_react_1.FileSpreadsheet, group: 'General' },
|
|
20
|
+
{ value: 'spec', label: 'Specification', icon: lucide_react_1.FileCode, group: 'Planning' },
|
|
21
|
+
{ value: 'dashboard', label: 'Dashboard', icon: lucide_react_1.LayoutDashboard, group: 'Planning' },
|
|
22
|
+
{ value: 'roadmap', label: 'Roadmap', icon: lucide_react_1.Flag, group: 'Planning' },
|
|
23
|
+
{ value: 'brainstorm', label: 'Brainstorm', icon: lucide_react_1.Lightbulb, group: 'Creative' },
|
|
24
|
+
{ value: 'journal', label: 'Journal', icon: lucide_react_1.PenTool, group: 'Creative' },
|
|
25
|
+
{ value: 'meeting', label: 'Meeting', icon: lucide_react_1.Users, group: 'Functional' },
|
|
26
|
+
{ value: 'tasklist', label: 'Task List', icon: lucide_react_1.CheckSquare, group: 'Functional' },
|
|
27
|
+
{ value: 'process', label: 'Process', icon: lucide_react_1.GitBranch, group: 'Process' },
|
|
28
|
+
];
|
|
29
|
+
function DocumentHeader({ documentId, documentUri, documentType, contentType, title = 'Untitled', onTitleChange, onContentTypeChange, onOpenGraph, onCopyHelpFiles }) {
|
|
30
|
+
const [isEditingTitle, setIsEditingTitle] = (0, react_1.useState)(false);
|
|
31
|
+
const [editedTitle, setEditedTitle] = (0, react_1.useState)(title);
|
|
32
|
+
const [isTypeMenuOpen, setIsTypeMenuOpen] = (0, react_1.useState)(false);
|
|
33
|
+
const titleInputRef = (0, react_1.useRef)(null);
|
|
34
|
+
const menuRef = (0, react_1.useRef)(null);
|
|
35
|
+
(0, react_1.useEffect)(() => {
|
|
36
|
+
setEditedTitle(title);
|
|
37
|
+
}, [title]);
|
|
38
|
+
(0, react_1.useEffect)(() => {
|
|
39
|
+
if (isEditingTitle && titleInputRef.current) {
|
|
40
|
+
titleInputRef.current.focus();
|
|
41
|
+
titleInputRef.current.select();
|
|
42
|
+
}
|
|
43
|
+
}, [isEditingTitle]);
|
|
44
|
+
// Click outside to close menu
|
|
45
|
+
(0, react_1.useEffect)(() => {
|
|
46
|
+
const handleClickOutside = (event) => {
|
|
47
|
+
if (menuRef.current && !menuRef.current.contains(event.target)) {
|
|
48
|
+
setIsTypeMenuOpen(false);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
52
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
53
|
+
}, []);
|
|
54
|
+
const handleTitleBlur = () => {
|
|
55
|
+
setIsEditingTitle(false);
|
|
56
|
+
if (editedTitle.trim() && editedTitle !== title) {
|
|
57
|
+
onTitleChange?.(editedTitle.trim());
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
setEditedTitle(title);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const handleTitleKeyDown = (e) => {
|
|
64
|
+
if (e.key === 'Enter') {
|
|
65
|
+
handleTitleBlur();
|
|
66
|
+
}
|
|
67
|
+
else if (e.key === 'Escape') {
|
|
68
|
+
setEditedTitle(title);
|
|
69
|
+
setIsEditingTitle(false);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
// Resolve current active type information
|
|
73
|
+
// If contentType (metadata) is set, use it. Otherwise fallback to documentType.
|
|
74
|
+
const currentTypeValue = contentType || documentType;
|
|
75
|
+
const currentTypeDef = CREATIVE_TYPES.find(t => t.value === currentTypeValue) ||
|
|
76
|
+
CREATIVE_TYPES.find(t => t.value === 'page');
|
|
77
|
+
const Icon = currentTypeDef.icon;
|
|
78
|
+
return ((0, jsx_runtime_1.jsxs)("header", { className: "jotx-header", children: [(0, jsx_runtime_1.jsxs)("div", { className: "jotx-header-left", children: [(0, jsx_runtime_1.jsx)("div", { className: "jotx-header-logo", children: (0, jsx_runtime_1.jsx)(JotxLogo_1.JotxLogo, { className: "jotx-header-logo-svg", size: 28 }) }), (0, jsx_runtime_1.jsxs)("div", { className: "jotx-header-type-container", ref: menuRef, children: [(0, jsx_runtime_1.jsxs)("button", { className: "jotx-header-type-button", onClick: () => setIsTypeMenuOpen(!isTypeMenuOpen), title: "Change Document Type", children: [(0, jsx_runtime_1.jsx)(Icon, { size: 16, className: "jotx-header-type-icon" }), (0, jsx_runtime_1.jsx)("span", { className: "jotx-header-type-label", children: currentTypeDef.label }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 12, className: "jotx-header-type-chevron" })] }), isTypeMenuOpen && ((0, jsx_runtime_1.jsxs)("div", { className: "jotx-header-type-menu", children: [(0, jsx_runtime_1.jsx)("div", { className: "jotx-type-menu-header", children: "Change Type" }), (0, jsx_runtime_1.jsx)("div", { className: "jotx-type-menu-list", children: CREATIVE_TYPES.map((type) => ((0, jsx_runtime_1.jsxs)("button", { className: `jotx-type-menu-item ${currentTypeValue === type.value ? 'active' : ''}`, onClick: () => {
|
|
79
|
+
onContentTypeChange?.(type.value);
|
|
80
|
+
setIsTypeMenuOpen(false);
|
|
81
|
+
}, children: [(0, jsx_runtime_1.jsx)(type.icon, { size: 16 }), (0, jsx_runtime_1.jsx)("span", { children: type.label })] }, type.value))) })] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "jotx-header-title-container", children: isEditingTitle ? ((0, jsx_runtime_1.jsx)("input", { ref: titleInputRef, type: "text", className: "jotx-header-title-input", value: editedTitle, onChange: (e) => setEditedTitle(e.target.value), onBlur: handleTitleBlur, onKeyDown: handleTitleKeyDown, placeholder: "Untitled" })) : ((0, jsx_runtime_1.jsx)("h1", { className: "jotx-header-title", onClick: () => setIsEditingTitle(true), title: "Click to edit title", children: title })) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "jotx-header-right", children: [(0, jsx_runtime_1.jsx)(ExportMenu_1.ExportMenu, { documentId: documentId, documentTitle: title }), onOpenGraph && ((0, jsx_runtime_1.jsx)("button", { className: "jotx-header-graph-btn", onClick: onOpenGraph, title: "Open Knowledge Graph", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Network, { size: 18 }) })), onCopyHelpFiles && ((0, jsx_runtime_1.jsx)("button", { className: "jotx-header-help-btn", onClick: onCopyHelpFiles, title: "Copy Help Files to Workspace", children: (0, jsx_runtime_1.jsx)(lucide_react_1.HelpCircle, { size: 18 }) })), (0, jsx_runtime_1.jsx)(ViewOptions_1.ViewOptions, {})] })] }));
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=DocumentHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentHeader.js","sourceRoot":"","sources":["../../../src/components/DocumentHeader/DocumentHeader.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export Menu - Web Browser Version
|
|
3
|
+
* Download as Markdown, PDF (via browser-native APIs)
|
|
4
|
+
*/
|
|
5
|
+
import './ExportMenu.css';
|
|
6
|
+
export interface ExportMenuProps {
|
|
7
|
+
documentId: string;
|
|
8
|
+
documentTitle?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function ExportMenu({ documentId, documentTitle }: ExportMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=ExportMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportMenu.d.ts","sourceRoot":"","sources":["../../../src/components/DocumentHeader/ExportMenu.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,kBAAkB,CAAA;AAEzB,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,aAA0B,EAAE,EAAE,eAAe,2CAgNrF"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ExportMenu = ExportMenu;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
/**
|
|
39
|
+
* Export Menu - Web Browser Version
|
|
40
|
+
* Download as Markdown, PDF (via browser-native APIs)
|
|
41
|
+
*/
|
|
42
|
+
const react_1 = require("react");
|
|
43
|
+
const lucide_react_1 = require("lucide-react");
|
|
44
|
+
require("./ExportMenu.css");
|
|
45
|
+
function ExportMenu({ documentId, documentTitle = 'Untitled' }) {
|
|
46
|
+
const [isOpen, setIsOpen] = (0, react_1.useState)(false);
|
|
47
|
+
const [isExporting, setIsExporting] = (0, react_1.useState)(false);
|
|
48
|
+
const menuRef = (0, react_1.useRef)(null);
|
|
49
|
+
(0, react_1.useEffect)(() => {
|
|
50
|
+
const handleClickOutside = (e) => {
|
|
51
|
+
if (menuRef.current && !menuRef.current.contains(e.target)) {
|
|
52
|
+
setIsOpen(false);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
if (isOpen) {
|
|
56
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
57
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
58
|
+
}
|
|
59
|
+
}, [isOpen]);
|
|
60
|
+
/**
|
|
61
|
+
* Download a file via browser-native API
|
|
62
|
+
*/
|
|
63
|
+
const downloadFile = (content, filename, mimeType) => {
|
|
64
|
+
const blob = typeof content === 'string' ? new Blob([content], { type: mimeType }) : content;
|
|
65
|
+
const url = URL.createObjectURL(blob);
|
|
66
|
+
const a = document.createElement('a');
|
|
67
|
+
a.href = url;
|
|
68
|
+
a.download = filename;
|
|
69
|
+
document.body.appendChild(a);
|
|
70
|
+
a.click();
|
|
71
|
+
document.body.removeChild(a);
|
|
72
|
+
URL.revokeObjectURL(url);
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Export to Markdown
|
|
76
|
+
*/
|
|
77
|
+
const exportMarkdown = async () => {
|
|
78
|
+
try {
|
|
79
|
+
setIsExporting(true);
|
|
80
|
+
setIsOpen(false);
|
|
81
|
+
const prosemirror = document.querySelector('.ProseMirror');
|
|
82
|
+
if (!prosemirror) {
|
|
83
|
+
throw new Error('Editor not found');
|
|
84
|
+
}
|
|
85
|
+
// Simple HTML to Markdown conversion
|
|
86
|
+
const html = prosemirror.innerHTML;
|
|
87
|
+
const markdown = htmlToMarkdown(html);
|
|
88
|
+
const filename = `${documentTitle.replace(/[^a-z0-9]/gi, '_')}.md`;
|
|
89
|
+
downloadFile(markdown, filename, 'text/markdown');
|
|
90
|
+
console.log('✅ Markdown exported:', filename);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error('Markdown export failed:', error);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
setIsExporting(false);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Export to PDF using jsPDF + html2canvas
|
|
101
|
+
*/
|
|
102
|
+
const exportPDF = async () => {
|
|
103
|
+
try {
|
|
104
|
+
setIsExporting(true);
|
|
105
|
+
setIsOpen(false);
|
|
106
|
+
// Dynamically import jsPDF and html2canvas
|
|
107
|
+
const { default: jsPDF } = await Promise.resolve().then(() => __importStar(require('jspdf')));
|
|
108
|
+
const html2canvas = (await Promise.resolve().then(() => __importStar(require('html2canvas')))).default;
|
|
109
|
+
// Find the ProseMirror element
|
|
110
|
+
const element = document.querySelector('.ProseMirror');
|
|
111
|
+
if (!element) {
|
|
112
|
+
throw new Error('Editor not found');
|
|
113
|
+
}
|
|
114
|
+
console.log('🔄 Generating PDF using jsPDF...');
|
|
115
|
+
// Clone content for PDF capture without affecting the real DOM
|
|
116
|
+
const offscreenContainer = document.createElement('div');
|
|
117
|
+
offscreenContainer.style.cssText = `
|
|
118
|
+
position: absolute;
|
|
119
|
+
left: -9999px;
|
|
120
|
+
top: 0;
|
|
121
|
+
width: 800px;
|
|
122
|
+
height: auto;
|
|
123
|
+
overflow: visible;
|
|
124
|
+
background: white;
|
|
125
|
+
padding: 40px;
|
|
126
|
+
`;
|
|
127
|
+
const clone = element.cloneNode(true);
|
|
128
|
+
clone.style.cssText = `
|
|
129
|
+
height: auto !important;
|
|
130
|
+
max-height: none !important;
|
|
131
|
+
overflow: visible !important;
|
|
132
|
+
min-height: 0 !important;
|
|
133
|
+
`;
|
|
134
|
+
offscreenContainer.appendChild(clone);
|
|
135
|
+
document.body.appendChild(offscreenContainer);
|
|
136
|
+
// Wait for reflow
|
|
137
|
+
await new Promise(r => setTimeout(r, 200));
|
|
138
|
+
const fullHeight = clone.scrollHeight || clone.offsetHeight;
|
|
139
|
+
// Create canvas from the clone
|
|
140
|
+
const canvas = await html2canvas(clone, {
|
|
141
|
+
scale: 2,
|
|
142
|
+
useCORS: true,
|
|
143
|
+
logging: false,
|
|
144
|
+
backgroundColor: '#ffffff',
|
|
145
|
+
height: fullHeight,
|
|
146
|
+
windowHeight: fullHeight + 100,
|
|
147
|
+
scrollY: 0,
|
|
148
|
+
scrollX: 0
|
|
149
|
+
});
|
|
150
|
+
// Remove offscreen container
|
|
151
|
+
document.body.removeChild(offscreenContainer);
|
|
152
|
+
// Create PDF
|
|
153
|
+
const imgData = canvas.toDataURL('image/png');
|
|
154
|
+
const pdf = new jsPDF({
|
|
155
|
+
orientation: 'portrait',
|
|
156
|
+
unit: 'mm',
|
|
157
|
+
format: 'a4'
|
|
158
|
+
});
|
|
159
|
+
const pdfWidth = pdf.internal.pageSize.getWidth();
|
|
160
|
+
const pdfHeight = pdf.internal.pageSize.getHeight();
|
|
161
|
+
const imgWidth = pdfWidth - 20; // 10mm margin on each side
|
|
162
|
+
const imgHeight = (canvas.height * imgWidth) / canvas.width;
|
|
163
|
+
const xOffset = 10; // 10mm left margin
|
|
164
|
+
let heightLeft = imgHeight;
|
|
165
|
+
let position = 10; // Start with 10mm top margin
|
|
166
|
+
// Add first page
|
|
167
|
+
pdf.addImage(imgData, 'PNG', xOffset, position, imgWidth, imgHeight);
|
|
168
|
+
heightLeft -= (pdfHeight - 20);
|
|
169
|
+
// Add additional pages if needed
|
|
170
|
+
while (heightLeft > 0) {
|
|
171
|
+
pdf.addPage();
|
|
172
|
+
position = -(imgHeight - heightLeft) + 10;
|
|
173
|
+
pdf.addImage(imgData, 'PNG', xOffset, position, imgWidth, imgHeight);
|
|
174
|
+
heightLeft -= (pdfHeight - 20);
|
|
175
|
+
}
|
|
176
|
+
// Download PDF
|
|
177
|
+
const pdfBlob = pdf.output('blob');
|
|
178
|
+
const filename = `${documentTitle.replace(/[^a-z0-9]/gi, '_')}.pdf`;
|
|
179
|
+
downloadFile(pdfBlob, filename, 'application/pdf');
|
|
180
|
+
console.log('✅ PDF exported:', filename);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
console.error('PDF export failed:', error);
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
setIsExporting(false);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "jotx-export-menu", ref: menuRef, children: [(0, jsx_runtime_1.jsx)("button", { className: "jotx-header-button", onClick: () => setIsOpen(!isOpen), title: "Download document", disabled: isExporting, children: isExporting ? ((0, jsx_runtime_1.jsx)("span", { style: { fontSize: '12px' }, children: "Exporting..." })) : ((0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 16 })) }), isOpen && !isExporting && ((0, jsx_runtime_1.jsxs)("div", { className: "jotx-export-dropdown", children: [(0, jsx_runtime_1.jsx)("div", { className: "jotx-export-header", children: "Download as" }), (0, jsx_runtime_1.jsxs)("button", { className: "jotx-export-item", onClick: exportPDF, title: "Export to PDF", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.FileDown, { size: 16 }), (0, jsx_runtime_1.jsx)("span", { children: "PDF Document" }), (0, jsx_runtime_1.jsx)("span", { className: "jotx-export-badge", children: ".pdf" })] }), (0, jsx_runtime_1.jsxs)("button", { className: "jotx-export-item", onClick: exportMarkdown, title: "Export to Markdown", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.FileText, { size: 16 }), (0, jsx_runtime_1.jsx)("span", { children: "Markdown" }), (0, jsx_runtime_1.jsx)("span", { className: "jotx-export-badge", children: ".md" })] })] }))] }));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Simple HTML to Markdown converter
|
|
193
|
+
*/
|
|
194
|
+
function htmlToMarkdown(html) {
|
|
195
|
+
let md = html;
|
|
196
|
+
// Headers
|
|
197
|
+
md = md.replace(/<h1[^>]*>(.*?)<\/h1>/gi, '# $1\n\n');
|
|
198
|
+
md = md.replace(/<h2[^>]*>(.*?)<\/h2>/gi, '## $1\n\n');
|
|
199
|
+
md = md.replace(/<h3[^>]*>(.*?)<\/h3>/gi, '### $1\n\n');
|
|
200
|
+
md = md.replace(/<h4[^>]*>(.*?)<\/h4>/gi, '#### $1\n\n');
|
|
201
|
+
md = md.replace(/<h5[^>]*>(.*?)<\/h5>/gi, '##### $1\n\n');
|
|
202
|
+
md = md.replace(/<h6[^>]*>(.*?)<\/h6>/gi, '###### $1\n\n');
|
|
203
|
+
// Bold and italic
|
|
204
|
+
md = md.replace(/<strong[^>]*>(.*?)<\/strong>/gi, '**$1**');
|
|
205
|
+
md = md.replace(/<b[^>]*>(.*?)<\/b>/gi, '**$1**');
|
|
206
|
+
md = md.replace(/<em[^>]*>(.*?)<\/em>/gi, '*$1*');
|
|
207
|
+
md = md.replace(/<i[^>]*>(.*?)<\/i>/gi, '*$1*');
|
|
208
|
+
// Code
|
|
209
|
+
md = md.replace(/<code[^>]*>(.*?)<\/code>/gi, '`$1`');
|
|
210
|
+
md = md.replace(/<pre[^>]*><code[^>]*>(.*?)<\/code><\/pre>/gis, '```\n$1\n```\n\n');
|
|
211
|
+
// Links
|
|
212
|
+
md = md.replace(/<a[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/gi, '[$2]($1)');
|
|
213
|
+
// Images
|
|
214
|
+
md = md.replace(/<img[^>]*src="([^"]*)"[^>]*alt="([^"]*)"[^>]*>/gi, '');
|
|
215
|
+
md = md.replace(/<img[^>]*src="([^"]*)"[^>]*>/gi, '');
|
|
216
|
+
// Lists
|
|
217
|
+
md = md.replace(/<ul[^>]*>/gi, '\n');
|
|
218
|
+
md = md.replace(/<\/ul>/gi, '\n');
|
|
219
|
+
md = md.replace(/<ol[^>]*>/gi, '\n');
|
|
220
|
+
md = md.replace(/<\/ol>/gi, '\n');
|
|
221
|
+
md = md.replace(/<li[^>]*>(.*?)<\/li>/gi, '- $1\n');
|
|
222
|
+
// Paragraphs
|
|
223
|
+
md = md.replace(/<p[^>]*>(.*?)<\/p>/gis, '$1\n\n');
|
|
224
|
+
// Line breaks
|
|
225
|
+
md = md.replace(/<br\s*\/?>/gi, '\n');
|
|
226
|
+
// Horizontal rules
|
|
227
|
+
md = md.replace(/<hr[^>]*>/gi, '\n---\n\n');
|
|
228
|
+
// Blockquotes
|
|
229
|
+
md = md.replace(/<blockquote[^>]*>(.*?)<\/blockquote>/gis, '> $1\n\n');
|
|
230
|
+
// Remove remaining HTML tags
|
|
231
|
+
md = md.replace(/<[^>]+>/g, '');
|
|
232
|
+
// Decode HTML entities
|
|
233
|
+
md = md.replace(/ /g, ' ');
|
|
234
|
+
md = md.replace(/&/g, '&');
|
|
235
|
+
md = md.replace(/</g, '<');
|
|
236
|
+
md = md.replace(/>/g, '>');
|
|
237
|
+
md = md.replace(/"/g, '"');
|
|
238
|
+
md = md.replace(/'/g, "'");
|
|
239
|
+
// Clean up extra whitespace
|
|
240
|
+
md = md.replace(/\n{3,}/g, '\n\n');
|
|
241
|
+
md = md.trim();
|
|
242
|
+
return md;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=ExportMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportMenu.js","sourceRoot":"","sources":["../../../src/components/DocumentHeader/ExportMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewOptions.d.ts","sourceRoot":"","sources":["../../../src/components/DocumentHeader/ViewOptions.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,mBAAmB,CAAA;AAK1B,wBAAgB,WAAW,4CAyH1B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ViewOptions = ViewOptions;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* View Options - Font size, width, etc.
|
|
7
|
+
*/
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const lucide_react_1 = require("lucide-react");
|
|
10
|
+
require("./ViewOptions.css");
|
|
11
|
+
const LS_FONT_SIZE = 'jotx_view_fontSize';
|
|
12
|
+
const LS_MAX_WIDTH = 'jotx_view_maxWidth';
|
|
13
|
+
function ViewOptions() {
|
|
14
|
+
const [isOpen, setIsOpen] = (0, react_1.useState)(false);
|
|
15
|
+
const [fontSize, setFontSize] = (0, react_1.useState)(() => {
|
|
16
|
+
const raw = localStorage.getItem(LS_FONT_SIZE);
|
|
17
|
+
const n = raw ? Number(raw) : 16;
|
|
18
|
+
return Number.isFinite(n) ? n : 16;
|
|
19
|
+
});
|
|
20
|
+
const [maxWidth, setMaxWidth] = (0, react_1.useState)(() => {
|
|
21
|
+
const raw = localStorage.getItem(LS_MAX_WIDTH);
|
|
22
|
+
const n = raw ? Number(raw) : 900;
|
|
23
|
+
return Number.isFinite(n) ? n : 900;
|
|
24
|
+
});
|
|
25
|
+
const menuRef = (0, react_1.useRef)(null);
|
|
26
|
+
(0, react_1.useEffect)(() => {
|
|
27
|
+
const handleClickOutside = (event) => {
|
|
28
|
+
if (menuRef.current && !menuRef.current.contains(event.target)) {
|
|
29
|
+
setIsOpen(false);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
if (isOpen) {
|
|
33
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
34
|
+
}
|
|
35
|
+
return () => {
|
|
36
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
37
|
+
};
|
|
38
|
+
}, [isOpen]);
|
|
39
|
+
(0, react_1.useEffect)(() => {
|
|
40
|
+
// web-theme.css defines these vars with `!important` to force dark mode.
|
|
41
|
+
// So we must set them with important priority too, otherwise slider changes have no effect.
|
|
42
|
+
document.documentElement.style.setProperty('--jotx-editor-fontSize', `${fontSize}px`, 'important');
|
|
43
|
+
localStorage.setItem(LS_FONT_SIZE, String(fontSize));
|
|
44
|
+
// Bulletproof fallback: apply directly to editor DOM (covers any CSS override/caching issues).
|
|
45
|
+
const size = `${fontSize}px`;
|
|
46
|
+
document.querySelectorAll('.jotx-editor-content, .ProseMirror').forEach((el) => {
|
|
47
|
+
el.style.setProperty('font-size', size, 'important');
|
|
48
|
+
});
|
|
49
|
+
}, [fontSize]);
|
|
50
|
+
(0, react_1.useEffect)(() => {
|
|
51
|
+
document.documentElement.style.setProperty('--jotx-editor-maxWidth', `${maxWidth}px`, 'important');
|
|
52
|
+
localStorage.setItem(LS_MAX_WIDTH, String(maxWidth));
|
|
53
|
+
// Bulletproof fallback: apply directly to layout containers.
|
|
54
|
+
// We set BOTH width and max-width so flexbox "stretch" cannot hide the effect.
|
|
55
|
+
const w = `${maxWidth}px`;
|
|
56
|
+
const wMin = `min(100%, ${w})`;
|
|
57
|
+
document.querySelectorAll('.jotx-editor-wrapper, .jotx-editor-container, .jotx-header-content').forEach((el) => {
|
|
58
|
+
el.style.setProperty('width', wMin, 'important');
|
|
59
|
+
el.style.setProperty('max-width', w, 'important');
|
|
60
|
+
el.style.setProperty('margin-left', 'auto', 'important');
|
|
61
|
+
el.style.setProperty('margin-right', 'auto', 'important');
|
|
62
|
+
// Prevent a flex parent from stretching this item in a way that masks width changes.
|
|
63
|
+
el.style.setProperty('flex', '0 1 auto', 'important');
|
|
64
|
+
});
|
|
65
|
+
}, [maxWidth]);
|
|
66
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "jotx-view-options", ref: menuRef, children: [(0, jsx_runtime_1.jsx)("button", { className: "jotx-header-button", onClick: () => setIsOpen(!isOpen), title: "View Options", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Settings, { size: 16 }) }), isOpen && ((0, jsx_runtime_1.jsxs)("div", { className: "jotx-view-dropdown", children: [(0, jsx_runtime_1.jsx)("div", { className: "jotx-view-header", children: "View Options" }), (0, jsx_runtime_1.jsxs)("div", { className: "jotx-view-section", children: [(0, jsx_runtime_1.jsxs)("label", { className: "jotx-view-label", children: ["Font Size: ", fontSize, "px"] }), (0, jsx_runtime_1.jsx)("input", { type: "range", min: "12", max: "24", value: fontSize, onChange: (e) => setFontSize(Number(e.target.value)), className: "jotx-view-slider" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "jotx-view-section", children: [(0, jsx_runtime_1.jsxs)("label", { className: "jotx-view-label", children: ["Max Width: ", maxWidth, "px"] }), (0, jsx_runtime_1.jsx)("input", { type: "range", min: "600", max: "1600", step: "50", value: maxWidth, onChange: (e) => setMaxWidth(Number(e.target.value)), className: "jotx-view-slider" })] }), (0, jsx_runtime_1.jsx)("div", { className: "jotx-view-divider" }), (0, jsx_runtime_1.jsx)("button", { className: "jotx-view-reset", onClick: () => {
|
|
67
|
+
setFontSize(16);
|
|
68
|
+
setMaxWidth(900);
|
|
69
|
+
localStorage.removeItem(LS_FONT_SIZE);
|
|
70
|
+
localStorage.removeItem(LS_MAX_WIDTH);
|
|
71
|
+
}, children: "Reset to Defaults" })] }))] }));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=ViewOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewOptions.js","sourceRoot":"","sources":["../../../src/components/DocumentHeader/ViewOptions.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphView - D3.js Force-Directed Knowledge Graph Visualization
|
|
3
|
+
* Browser-based component for web application
|
|
4
|
+
*/
|
|
5
|
+
import '../../styles/GraphView.css';
|
|
6
|
+
export interface GraphData {
|
|
7
|
+
nodes: Array<{
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
type: string;
|
|
11
|
+
nodeKind: string;
|
|
12
|
+
path: string;
|
|
13
|
+
metadata?: Record<string, any>;
|
|
14
|
+
}>;
|
|
15
|
+
edges: Array<{
|
|
16
|
+
source: string;
|
|
17
|
+
target: string;
|
|
18
|
+
type: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export interface GraphViewProps {
|
|
22
|
+
isOpen: boolean;
|
|
23
|
+
onClose: () => void;
|
|
24
|
+
focusedDocumentPath?: string;
|
|
25
|
+
graphData: GraphData;
|
|
26
|
+
stats?: {
|
|
27
|
+
documents: number;
|
|
28
|
+
blocks: number;
|
|
29
|
+
edges: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare function GraphView({ isOpen, onClose, focusedDocumentPath, graphData, stats: propStats }: GraphViewProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=GraphView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphView.d.ts","sourceRoot":"","sources":["../../../src/components/GraphView/GraphView.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,4BAA4B,CAAA;AAGnC,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,KAAK,CAAC;QACT,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KACjC,CAAC,CAAA;IACF,KAAK,EAAE,KAAK,CAAC;QACT,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;CACL;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/D;AAyCD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,2CAkR9G"}
|