@pstdio/workbench 0.1.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.
@@ -0,0 +1,171 @@
1
+ import { jsx as c } from "react/jsx-runtime";
2
+ import { c as X } from "react/compiler-runtime";
3
+ import { Center as N, Text as D, Image as P, Spinner as J, Box as G, Flex as Q } from "@chakra-ui/react";
4
+ import { CodeEditor as Z } from "@pstdio/ui/diff";
5
+ import { MarkdownEditor as ee } from "@pstdio/ui/rich-text";
6
+ import { useState as M, useRef as A, useEffect as V, useLayoutEffect as te } from "react";
7
+ const re = /* @__PURE__ */ new Set(["png", "jpg", "jpeg", "gif", "webp", "svg", "avif", "bmp", "ico"]), z = {
8
+ ts: "typescript",
9
+ tsx: "typescript",
10
+ js: "javascript",
11
+ jsx: "javascript",
12
+ mjs: "javascript",
13
+ cjs: "javascript",
14
+ json: "json",
15
+ jsonc: "json",
16
+ py: "python",
17
+ rb: "ruby",
18
+ rs: "rust",
19
+ go: "go",
20
+ java: "java",
21
+ kt: "kotlin",
22
+ c: "c",
23
+ h: "c",
24
+ cpp: "cpp",
25
+ cc: "cpp",
26
+ hpp: "cpp",
27
+ cs: "csharp",
28
+ php: "php",
29
+ swift: "swift",
30
+ sh: "shell",
31
+ bash: "shell",
32
+ zsh: "shell",
33
+ sql: "sql",
34
+ css: "css",
35
+ scss: "scss",
36
+ less: "less",
37
+ html: "html",
38
+ xml: "xml",
39
+ yml: "yaml",
40
+ yaml: "yaml",
41
+ toml: "ini",
42
+ ini: "ini",
43
+ dockerfile: "dockerfile",
44
+ graphql: "graphql",
45
+ gql: "graphql"
46
+ }, B = (l) => {
47
+ if (!l) return "";
48
+ const e = l.lastIndexOf(".");
49
+ return e < 0 || e === l.length - 1 ? "" : l.slice(e + 1).toLowerCase();
50
+ }, ne = (l, e) => e?.startsWith("image/") ? !0 : re.has(B(l)), le = (l, e) => ne(l, e) ? "image" : B(l) in z ? "code" : "markdown", ie = (l) => z[B(l)] ?? "plaintext", oe = (l) => {
51
+ const {
52
+ fileRendererId: e,
53
+ resourceUri: f
54
+ } = l;
55
+ return `${e}:${f ?? ""}`;
56
+ }, se = (l, e) => l?.loadKey === e, ce = 600, ae = (l) => l instanceof Error ? l.message : "Failed to load file.", ge = (l) => {
57
+ const e = X(50), {
58
+ workbench: f,
59
+ contribution: s
60
+ } = l, o = l.placement?.resource, R = o?.uri;
61
+ let b;
62
+ e[0] !== s.id || e[1] !== R ? (b = oe({
63
+ fileRendererId: s.id,
64
+ resourceUri: R
65
+ }), e[0] = s.id, e[1] = R, e[2] = b) : b = e[2];
66
+ const a = b, [y, W] = M(null), [E, I] = M(null), K = A(null);
67
+ let w;
68
+ e[3] !== s || e[4] !== a || e[5] !== o || e[6] !== f.renderers ? (w = () => {
69
+ let t = !1, r = 0;
70
+ I(null), W(null);
71
+ const i = () => {
72
+ Promise.resolve(s.load(o)).then((v) => {
73
+ t || (r = r + 1, I(null), W({
74
+ ...v,
75
+ revision: r,
76
+ loadKey: a
77
+ }));
78
+ }).catch((v) => {
79
+ t || I({
80
+ loadKey: a,
81
+ message: ae(v)
82
+ });
83
+ });
84
+ };
85
+ i();
86
+ const g = f.renderers.onDidRefreshFileRenderer((v) => {
87
+ v.fileRendererId === s.id && i();
88
+ });
89
+ return () => {
90
+ t = !0, g.dispose();
91
+ };
92
+ }, e[3] = s, e[4] = a, e[5] = o, e[6] = f.renderers, e[7] = w) : w = e[7];
93
+ let j;
94
+ e[8] !== s || e[9] !== a || e[10] !== o || e[11] !== f ? (j = [s, f, o, a], e[8] = s, e[9] = a, e[10] = o, e[11] = f, e[12] = j) : j = e[12], V(w, j);
95
+ const u = s.save, m = A(null), h = A(null);
96
+ let x, S;
97
+ e[13] !== o || e[14] !== u ? (x = () => {
98
+ if (!u)
99
+ return;
100
+ const t = () => {
101
+ if (h.current && (clearTimeout(h.current), h.current = null), m.current === null)
102
+ return;
103
+ const i = m.current;
104
+ m.current = null, u(o, i);
105
+ }, r = () => {
106
+ document.visibilityState === "hidden" && t();
107
+ };
108
+ return window.addEventListener("beforeunload", t), document.addEventListener("visibilitychange", r), () => {
109
+ window.removeEventListener("beforeunload", t), document.removeEventListener("visibilitychange", r), t();
110
+ };
111
+ }, S = [u, o], e[13] = o, e[14] = u, e[15] = x, e[16] = S) : (x = e[15], S = e[16]), V(x, S);
112
+ let L;
113
+ e[17] !== o || e[18] !== u ? (L = (t) => {
114
+ u && (m.current = t, h.current && clearTimeout(h.current), h.current = setTimeout(() => {
115
+ if (h.current = null, m.current === null)
116
+ return;
117
+ const r = m.current;
118
+ m.current = null, u(o, r);
119
+ }, ce));
120
+ }, e[17] = o, e[18] = u, e[19] = L) : L = e[19];
121
+ const Y = L;
122
+ let C;
123
+ e[20] !== a || e[21] !== y ? (C = se(y, a) ? y : null, e[20] = a, e[21] = y, e[22] = C) : C = e[22];
124
+ const n = C, T = n ? `${n.loadKey}:${n.revision}` : "";
125
+ let _, k;
126
+ if (e[23] !== T ? (_ = () => {
127
+ if (!T)
128
+ return;
129
+ const t = K.current;
130
+ t && requestAnimationFrame(() => {
131
+ let r = t.parentElement;
132
+ for (; r; ) {
133
+ const i = getComputedStyle(r).overflowY;
134
+ ["auto", "scroll", "overlay"].includes(i) && r.scrollHeight > r.clientHeight && (r.scrollTop = 0), r = r.parentElement;
135
+ }
136
+ });
137
+ }, k = [T], e[23] = T, e[24] = _, e[25] = k) : (_ = e[24], k = e[25]), te(_, k), E?.loadKey === a) {
138
+ let t;
139
+ return e[26] !== E.message ? (t = /* @__PURE__ */ c(N, { h: "full", minH: "0", bg: "bg", p: "md", children: /* @__PURE__ */ c(D, { color: "fg.muted", children: E.message }) }), e[26] = E.message, e[27] = t) : t = e[27], t;
140
+ }
141
+ if (!n) {
142
+ let t;
143
+ return e[28] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t = /* @__PURE__ */ c(N, { h: "full", minH: "0", bg: "bg", children: /* @__PURE__ */ c(J, { size: "sm" }) }), e[28] = t) : t = e[28], t;
144
+ }
145
+ let F;
146
+ e[29] !== n.fileName || e[30] !== n.mimeType ? (F = le(n.fileName, n.mimeType), e[29] = n.fileName, e[30] = n.mimeType, e[31] = F) : F = e[31];
147
+ const U = F, d = !!u && U !== "image", p = `${s.id}:${n.revision}`;
148
+ if (U === "image") {
149
+ if (!n.dataUrl) {
150
+ let i;
151
+ return e[32] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (i = /* @__PURE__ */ c(N, { h: "full", minH: "0", bg: "bg", p: "md", children: /* @__PURE__ */ c(D, { color: "fg.muted", children: "This image preview is unavailable." }) }), e[32] = i) : i = e[32], i;
152
+ }
153
+ const t = n.fileName ?? s.title;
154
+ let r;
155
+ return e[33] !== n.dataUrl || e[34] !== t ? (r = /* @__PURE__ */ c(N, { ref: K, h: "full", minH: "0", bg: "bg", p: "md", overflow: "auto", children: /* @__PURE__ */ c(P, { src: n.dataUrl, alt: t, maxW: "100%", maxH: "100%", objectFit: "contain" }) }), e[33] = n.dataUrl, e[34] = t, e[35] = r) : r = e[35], r;
156
+ }
157
+ if (U === "code") {
158
+ let t;
159
+ e[36] !== n.fileName ? (t = ie(n.fileName), e[36] = n.fileName, e[37] = t) : t = e[37];
160
+ const r = n.content ?? "", i = d ? Y : void 0;
161
+ let g;
162
+ return e[38] !== p || e[39] !== d || e[40] !== t || e[41] !== r || e[42] !== i ? (g = /* @__PURE__ */ c(G, { h: "full", minH: "0", bg: "bg", children: /* @__PURE__ */ c(Z, { language: t, defaultCode: r, isEditable: d, showLineNumbers: !0, onChange: i }, p) }), e[38] = p, e[39] = d, e[40] = t, e[41] = r, e[42] = i, e[43] = g) : g = e[43], g;
163
+ }
164
+ const q = n.content ?? "", $ = d ? n.placeholder ?? "Write…" : void 0, O = d ? Y : void 0;
165
+ let H;
166
+ return e[44] !== p || e[45] !== d || e[46] !== q || e[47] !== $ || e[48] !== O ? (H = /* @__PURE__ */ c(Q, { ref: K, direction: "column", h: "full", minH: "0", overflow: "hidden", bg: "bg", children: /* @__PURE__ */ c(G, { flex: "1", minH: "0", overflowY: "auto", children: /* @__PURE__ */ c(ee, { defaultState: q, isEditable: d, placeholder: $, onChange: O }, p) }) }), e[44] = p, e[45] = d, e[46] = q, e[47] = $, e[48] = O, e[49] = H) : H = e[49], H;
167
+ };
168
+ export {
169
+ ge as WorkbenchFileRendererView
170
+ };
171
+ //# sourceMappingURL=file-renderer-view-DrrhYnb_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-renderer-view-DrrhYnb_.js","sources":["../src/react/renderers/file/file-kind.ts","../src/react/renderers/file/file-renderer-load-key.ts","../src/react/renderers/file/file-renderer-view.tsx"],"sourcesContent":["// Generic file-type dispatch for the file renderer. Markdown is the default so\n// `.md` / `.txt` / extension-less files open in the prose editor; recognised code\n// extensions open in Monaco; images render read-only. This is deliberately\n// domain-agnostic — it knows about file types, not about tickets.\n\nexport type FileKind = \"markdown\" | \"code\" | \"image\";\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"bmp\", \"ico\"]);\n\n// Extension → Monaco language id. Markdown/plain text intentionally absent so\n// they fall through to the prose editor.\nconst CODE_LANGUAGE_BY_EXTENSION: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n kt: \"kotlin\",\n c: \"c\",\n h: \"c\",\n cpp: \"cpp\",\n cc: \"cpp\",\n hpp: \"cpp\",\n cs: \"csharp\",\n php: \"php\",\n swift: \"swift\",\n sh: \"shell\",\n bash: \"shell\",\n zsh: \"shell\",\n sql: \"sql\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n html: \"html\",\n xml: \"xml\",\n yml: \"yaml\",\n yaml: \"yaml\",\n toml: \"ini\",\n ini: \"ini\",\n dockerfile: \"dockerfile\",\n graphql: \"graphql\",\n gql: \"graphql\",\n};\n\nconst extensionOf = (fileName: string | undefined) => {\n if (!fileName) return \"\";\n const dot = fileName.lastIndexOf(\".\");\n if (dot < 0 || dot === fileName.length - 1) return \"\";\n return fileName.slice(dot + 1).toLowerCase();\n};\n\nconst isImage = (fileName: string | undefined, mimeType: string | undefined) => {\n if (mimeType?.startsWith(\"image/\")) return true;\n return IMAGE_EXTENSIONS.has(extensionOf(fileName));\n};\n\nexport const pickFileKind = (fileName: string | undefined, mimeType: string | undefined): FileKind => {\n if (isImage(fileName, mimeType)) return \"image\";\n if (extensionOf(fileName) in CODE_LANGUAGE_BY_EXTENSION) return \"code\";\n return \"markdown\";\n};\n\n// Monaco language for a code file; falls back to plaintext for unknown extensions.\nexport const codeLanguageFor = (fileName: string | undefined) =>\n CODE_LANGUAGE_BY_EXTENSION[extensionOf(fileName)] ?? \"plaintext\";\n","interface FileRendererLoadKeyInput {\n fileRendererId: string;\n resourceUri: string | undefined;\n}\n\nexport const createFileRendererLoadKey = (input: FileRendererLoadKeyInput) => {\n const { fileRendererId, resourceUri } = input;\n return `${fileRendererId}:${resourceUri ?? \"\"}`;\n};\n\nexport const isCurrentLoadedFile = (loaded: { loadKey: string } | null, loadKey: string) => loaded?.loadKey === loadKey;\n","import { Box, Center, Flex, Image, Spinner, Text } from \"@chakra-ui/react\";\nimport { CodeEditor } from \"@pstdio/ui/diff\";\nimport { MarkdownEditor } from \"@pstdio/ui/rich-text\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type {\n FileRendererContent,\n RegisteredFileRendererContribution,\n WorkbenchCore,\n WorkbenchWidgetPlacement,\n} from \"../../../core\";\nimport { codeLanguageFor, pickFileKind } from \"./file-kind\";\nimport { createFileRendererLoadKey, isCurrentLoadedFile } from \"./file-renderer-load-key\";\n\ninterface WorkbenchFileRendererViewProps {\n workbench: WorkbenchCore;\n contribution: RegisteredFileRendererContribution;\n // The bound resource (e.g. the open ticket / ticket-file) the load/save\n // commands operate on.\n placement?: WorkbenchWidgetPlacement;\n}\n\ninterface LoadedFile extends FileRendererContent {\n // Bumped on every (re)load so the uncontrolled editors remount with fresh\n // content on a refresh, but never mid-edit (load only runs on mount/refresh).\n revision: number;\n loadKey: string;\n}\n\nconst SAVE_DEBOUNCE_MS = 600;\n\nconst describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to load file.\");\n\nexport const WorkbenchFileRendererView = (props: WorkbenchFileRendererViewProps) => {\n const { workbench, contribution } = props;\n const resource = props.placement?.resource;\n const loadKey = createFileRendererLoadKey({ fileRendererId: contribution.id, resourceUri: resource?.uri });\n const [loaded, setLoaded] = useState<LoadedFile | null>(null);\n const [error, setError] = useState<{ loadKey: string; message: string } | null>(null);\n const rendererRef = useRef<HTMLDivElement>(null);\n\n // Re-binding a singleton widget to another resource changes `resource` and reloads.\n useEffect(() => {\n let cancelled = false;\n let revision = 0;\n setError(null);\n setLoaded(null);\n const load = () => {\n Promise.resolve(contribution.load(resource))\n .then((next) => {\n if (cancelled) return;\n revision += 1;\n setError(null);\n setLoaded({ ...next, revision, loadKey });\n })\n .catch((loadError) => {\n if (cancelled) return;\n setError({ loadKey, message: describeError(loadError) });\n });\n };\n load();\n const refreshSubscription = workbench.renderers.onDidRefreshFileRenderer((event) => {\n if (event.fileRendererId === contribution.id) load();\n });\n return () => {\n cancelled = true;\n refreshSubscription.dispose();\n };\n }, [contribution, workbench, resource, loadKey]);\n\n // Debounced autosave shared by the markdown + code editors. Flushed on unmount\n // and when the tab is hidden so the last keystrokes are never dropped.\n const save = contribution.save;\n const pending = useRef<string | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (!save) return;\n const flush = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n if (pending.current === null) return;\n const value = pending.current;\n pending.current = null;\n void save(resource, value);\n };\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") flush();\n };\n window.addEventListener(\"beforeunload\", flush);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.removeEventListener(\"beforeunload\", flush);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n flush();\n };\n }, [save, resource]);\n\n const handleChange = (value: string) => {\n if (!save) return;\n pending.current = value;\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n timer.current = null;\n if (pending.current === null) return;\n const next = pending.current;\n pending.current = null;\n void save(resource, next);\n }, SAVE_DEBOUNCE_MS);\n };\n\n const currentLoaded = isCurrentLoadedFile(loaded, loadKey) ? loaded : null;\n const scrollResetKey = currentLoaded ? `${currentLoaded.loadKey}:${currentLoaded.revision}` : \"\";\n\n useLayoutEffect(() => {\n if (!scrollResetKey) return;\n const node = rendererRef.current;\n if (!node) return;\n\n requestAnimationFrame(() => {\n let current = node.parentElement;\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if ([\"auto\", \"scroll\", \"overlay\"].includes(overflowY) && current.scrollHeight > current.clientHeight) {\n current.scrollTop = 0;\n }\n current = current.parentElement;\n }\n });\n }, [scrollResetKey]);\n\n if (error?.loadKey === loadKey) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\">\n <Text color=\"fg.muted\">{error.message}</Text>\n </Center>\n );\n }\n\n if (!currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\">\n <Spinner size=\"sm\" />\n </Center>\n );\n }\n\n const kind = pickFileKind(currentLoaded.fileName, currentLoaded.mimeType);\n const isEditable = Boolean(save) && kind !== \"image\";\n const editorKey = `${contribution.id}:${currentLoaded.revision}`;\n\n if (kind === \"image\") {\n if (!currentLoaded.dataUrl) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\">\n <Text color=\"fg.muted\">This image preview is unavailable.</Text>\n </Center>\n );\n }\n return (\n <Center ref={rendererRef} h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\" overflow=\"auto\">\n <Image\n src={currentLoaded.dataUrl}\n alt={currentLoaded.fileName ?? contribution.title}\n maxW=\"100%\"\n maxH=\"100%\"\n objectFit=\"contain\"\n />\n </Center>\n );\n }\n\n if (kind === \"code\") {\n return (\n <Box h=\"full\" minH=\"0\" bg=\"bg\">\n <CodeEditor\n key={editorKey}\n language={codeLanguageFor(currentLoaded.fileName)}\n defaultCode={currentLoaded.content ?? \"\"}\n isEditable={isEditable}\n showLineNumbers\n onChange={isEditable ? handleChange : undefined}\n />\n </Box>\n );\n }\n\n return (\n <Flex ref={rendererRef} direction=\"column\" h=\"full\" minH=\"0\" overflow=\"hidden\" bg=\"bg\">\n <Box flex=\"1\" minH=\"0\" overflowY=\"auto\">\n <MarkdownEditor\n key={editorKey}\n defaultState={currentLoaded.content ?? \"\"}\n isEditable={isEditable}\n placeholder={isEditable ? (currentLoaded.placeholder ?? \"Write…\") : undefined}\n onChange={isEditable ? handleChange : undefined}\n />\n </Box>\n </Flex>\n );\n};\n"],"names":["IMAGE_EXTENSIONS","Set","CODE_LANGUAGE_BY_EXTENSION","ts","tsx","js","jsx","mjs","cjs","json","jsonc","py","rb","rs","go","java","kt","c","h","cpp","cc","hpp","cs","php","swift","sh","bash","zsh","sql","css","scss","less","html","xml","yml","yaml","toml","ini","dockerfile","graphql","gql","extensionOf","fileName","dot","lastIndexOf","length","slice","toLowerCase","isImage","mimeType","startsWith","has","pickFileKind","codeLanguageFor","createFileRendererLoadKey","input","fileRendererId","resourceUri","isCurrentLoadedFile","loaded","loadKey","SAVE_DEBOUNCE_MS","describeError","error","Error","message","WorkbenchFileRendererView","props","$","_c","workbench","contribution","resource","placement","t0","uri","t1","id","setLoaded","useState","setError","rendererRef","useRef","t2","renderers","cancelled","revision","load","Promise","resolve","then","next","catch","loadError","refreshSubscription","onDidRefreshFileRenderer","event","dispose","t3","useEffect","save","pending","timer","t4","t5","flush","current","clearTimeout","value","onVisibility","document","visibilityState","window","addEventListener","removeEventListener","t6","value_0","setTimeout","next_0","handleChange","t7","currentLoaded","scrollResetKey","t8","t9","node","requestAnimationFrame","parentElement","overflowY","getComputedStyle","includes","scrollHeight","clientHeight","scrollTop","useLayoutEffect","t10","Center","Text","Symbol","for","Spinner","kind","isEditable","Boolean","editorKey","dataUrl","t11","title","t12","Image","content","t13","undefined","t14","Box","CodeEditor","placeholder","Flex","MarkdownEditor"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { jsx as f } from "react/jsx-runtime";
2
+ import { c as u } from "react/compiler-runtime";
3
+ import { Icon as m } from "@chakra-ui/react";
4
+ import * as d from "lucide-react";
5
+ const p = (n) => n.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((e) => `${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(""), I = (n) => {
6
+ const e = p(n), t = [n, e, `${e}Icon`];
7
+ for (const c of t) {
8
+ const o = d[c];
9
+ if (o && (typeof o == "function" || typeof o == "object"))
10
+ return o;
11
+ }
12
+ }, z = (n) => {
13
+ const e = u(10);
14
+ let t, c, o;
15
+ e[0] !== n ? ({
16
+ name: t,
17
+ size: o,
18
+ ...c
19
+ } = n, e[0] = n, e[1] = t, e[2] = c, e[3] = o) : (t = e[1], c = e[2], o = e[3]);
20
+ const l = o === void 0 ? 14 : o;
21
+ if (!t)
22
+ return null;
23
+ let s;
24
+ e[4] !== t ? (s = I(t), e[4] = t, e[5] = s) : s = e[5];
25
+ const i = s;
26
+ if (!i)
27
+ return null;
28
+ const a = typeof l == "number" ? `${l}px` : l;
29
+ let r;
30
+ return e[6] !== i || e[7] !== c || e[8] !== a ? (r = /* @__PURE__ */ f(m, { as: i, boxSize: a, "aria-hidden": "true", ...c }), e[6] = i, e[7] = c, e[8] = a, e[9] = r) : r = e[9], r;
31
+ };
32
+ export {
33
+ z as W
34
+ };
35
+ //# sourceMappingURL=icon-B9XolQG8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-B9XolQG8.js","sources":["../src/react/shared/icon.tsx"],"sourcesContent":["import { Icon, type IconProps } from \"@chakra-ui/react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport * as lucideIcons from \"lucide-react\";\n\ninterface WorkbenchIconProps extends Omit<IconProps, \"as\" | \"size\"> {\n name?: string;\n size?: number | string;\n}\n\nconst toPascalCase = (value: string) =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\"\");\n\nconst resolveLucideIcon = (name: string) => {\n const pascalName = toPascalCase(name);\n const candidates = [name, pascalName, `${pascalName}Icon`];\n\n for (const candidate of candidates) {\n const IconComponent = (lucideIcons as Record<string, unknown>)[candidate];\n if (IconComponent && (typeof IconComponent === \"function\" || typeof IconComponent === \"object\")) {\n return IconComponent as LucideIcon;\n }\n }\n\n return undefined;\n};\n\nexport const WorkbenchIcon = (props: WorkbenchIconProps) => {\n const { name, size = 14, ...rest } = props;\n if (!name) return null;\n\n const LucideIcon = resolveLucideIcon(name);\n if (!LucideIcon) return null;\n\n return <Icon as={LucideIcon} boxSize={typeof size === \"number\" ? `${size}px` : size} aria-hidden=\"true\" {...rest} />;\n};\n"],"names":["toPascalCase","value","split","filter","Boolean","map","part","charAt","toUpperCase","slice","join","resolveLucideIcon","name","pascalName","candidates","candidate","IconComponent","lucideIcons","WorkbenchIcon","props","$","_c","rest","t0","size","undefined","t1","LucideIcon","t2","t3","Icon"],"mappings":";;;;AASA,MAAMA,IAAeA,CAACC,MACpBA,EACGC,MAAM,eAAe,EACrBC,OAAOC,OAAO,EACdC,IAAKC,CAAAA,MAAS,GAAGA,EAAKC,OAAO,CAAC,EAAEC,YAAAA,CAAa,GAAGF,EAAKG,MAAM,CAAC,CAAC,EAAE,EAC/DC,KAAK,EAAE,GAENC,IAAoBA,CAACC,MAAiB;AAC1C,QAAMC,IAAab,EAAaY,CAAI,GAC9BE,IAAa,CAACF,GAAMC,GAAY,GAAGA,CAAU,MAAM;AAEzD,aAAWE,KAAaD,GAAY;AAClC,UAAME,IAAiBC,EAAwCF,CAAS;AACxE,QAAIC,MAAkB,OAAOA,KAAkB,cAAc,OAAOA,KAAkB;AACpF,aAAOA;AAAAA,EAEX;AAGF,GAEaE,IAAgBC,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAA,MAAAT,GAAAU,GAAAC;AAAA,EAAAH,SAAAD,KAC3B;AAAA,IAAAP,MAAAA;AAAAA,IAAAY,MAAAD;AAAAA,IAAA,GAAAD;AAAAA,EAAAA,IAAqCH,GAAMC,OAAAD,GAAAC,OAAAR,GAAAQ,OAAAE,GAAAF,OAAAG,MAAAX,IAAAQ,EAAA,CAAA,GAAAE,IAAAF,EAAA,CAAA,GAAAG,IAAAH,EAAA,CAAA;AAA7B,QAAAI,IAAAD,MAAAE,SAAA,KAAAF;AACd,MAAI,CAACX;AAAI,WAAS;AAAK,MAAAc;AAAA,EAAAN,SAAAR,KAEJc,IAAAf,EAAkBC,CAAI,GAACQ,OAAAR,GAAAQ,OAAAM,KAAAA,IAAAN,EAAA,CAAA;AAA1C,QAAAO,IAAmBD;AACnB,MAAI,CAACC;AAAU,WAAS;AAEc,QAAAC,IAAA,OAAOJ,KAAS,WAAhB,GAA8BA,CAAI,OAAlCA;AAA6C,MAAAK;AAAA,SAAAT,EAAA,CAAA,MAAAO,KAAAP,SAAAE,KAAAF,EAAA,CAAA,MAAAQ,KAA5EC,sBAACC,KAASH,IAAAA,GAAqB,SAAAC,GAA2D,eAAA,QAAM,GAAKN,EAAAA,CAAI,GAAIF,OAAAO,GAAAP,OAAAE,GAAAF,OAAAQ,GAAAR,OAAAS,KAAAA,IAAAT,EAAA,CAAA,GAA7GS;AAA6G;"}