@health-samurai/react-components 0.0.0-alpha.14 → 0.0.0-alpha.16

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/bundle.css CHANGED
@@ -591,9 +591,6 @@
591
591
  .ml-2 {
592
592
  margin-left: calc(var(--spacing) * 2);
593
593
  }
594
- .ml-4 {
595
- margin-left: calc(var(--spacing) * 4);
596
- }
597
594
  .ml-auto {
598
595
  margin-left: auto;
599
596
  }
@@ -795,9 +792,6 @@
795
792
  .h-auto {
796
793
  height: auto;
797
794
  }
798
- .h-fit {
799
- height: fit-content;
800
- }
801
795
  .h-full {
802
796
  height: 100%;
803
797
  }
@@ -1884,6 +1878,9 @@
1884
1878
  .pl-\[9px\] {
1885
1879
  padding-left: 9px;
1886
1880
  }
1881
+ .pl-\[34px\] {
1882
+ padding-left: 34px;
1883
+ }
1887
1884
  .text-center {
1888
1885
  text-align: center;
1889
1886
  }
@@ -2029,6 +2026,9 @@
2029
2026
  .text-muted-foreground {
2030
2027
  color: var(--muted-foreground);
2031
2028
  }
2029
+ .text-neutral-600 {
2030
+ color: var(--color-neutral-600);
2031
+ }
2032
2032
  .text-popover-foreground {
2033
2033
  color: var(--popover-foreground);
2034
2034
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/code-editor/index.tsx"],"names":[],"mappings":"AAgCA,OAAO,EAGN,KAAK,SAAS,EAId,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAKN,UAAU,EASV,KAAK,UAAU,EACf,MAAM,kBAAkB,CAAC;AAqnB1B,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAsCrD,KAAK,eAAe,GAAG;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC;AAExC,wBAAgB,UAAU,CAAC,EAC1B,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAgB,EAChB,EAAE,EACF,IAAa,EACb,eAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EAAE,gBAAuB,EACnC,UAAU,EAAE,gBAAuB,EACnC,WAAW,EAAE,iBAAwB,EACrC,gBAAgB,GAChB,EAAE,eAAe,2CAiMjB;AAoJD,wBAAgB,WAAW,CAAC,EAC3B,oBAAoB,EACpB,EAAE,EACF,YAAY,EACZ,YAAY,EACZ,QAAQ,GACR,EAAE;IACF,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,2CA4GA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/code-editor/index.tsx"],"names":[],"mappings":"AAgCA,OAAO,EAGN,KAAK,SAAS,EAId,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAKN,UAAU,EASV,KAAK,UAAU,EACf,MAAM,kBAAkB,CAAC;AA6nB1B,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAsCrD,KAAK,eAAe,GAAG;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC;AAExC,wBAAgB,UAAU,CAAC,EAC1B,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAgB,EAChB,EAAE,EACF,IAAa,EACb,eAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EAAE,gBAAuB,EACnC,UAAU,EAAE,gBAAuB,EACnC,WAAW,EAAE,iBAAwB,EACrC,gBAAgB,GAChB,EAAE,eAAe,2CAiMjB;AA4JD,wBAAgB,WAAW,CAAC,EAC3B,oBAAoB,EACpB,EAAE,EACF,YAAY,EACZ,YAAY,EACZ,QAAQ,GACR,EAAE;IACF,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,2CA4GA"}
@@ -10,7 +10,7 @@ import { closeSearchPanel, findNext, findPrevious, getSearchQuery, highlightSele
10
10
  import { Compartment, EditorState, RangeSet, StateEffect, StateField } from "@codemirror/state";
11
11
  import { crosshairCursor, Decoration, drawSelection, dropCursor, EditorView, GutterMarker, gutterLineClass, highlightActiveLine, highlightActiveLineGutter, highlightSpecialChars, keymap, lineNumbers, rectangularSelection } from "@codemirror/view";
12
12
  import { tags } from "@lezer/highlight";
13
- import { ChevronDown, ChevronUp, X } from "lucide-react";
13
+ import { Braces, ChevronDown, ChevronUp, Terminal, X } from "lucide-react";
14
14
  import * as React from "react";
15
15
  import { flushSync } from "react-dom";
16
16
  import { createRoot } from "react-dom/client";
@@ -125,17 +125,21 @@ const errorTooltipHandler = EditorView.domEventHandlers({
125
125
  return false;
126
126
  }
127
127
  });
128
- const baseTheme = EditorView.baseTheme({
128
+ const baseTheme = EditorView.theme({
129
129
  "&": {
130
130
  backgroundColor: "var(--color-bg-primary)",
131
131
  height: "100%",
132
132
  width: "100%",
133
- fontSize: "14px",
134
- paddingTop: "8px",
135
- paddingBottom: "8px"
133
+ fontSize: "14px"
134
+ },
135
+ "&.cm-editor": {
136
+ paddingTop: "0 !important",
137
+ paddingBottom: "0 !important"
136
138
  },
137
139
  ".cm-scroller": {
138
- overflow: "auto"
140
+ overflow: "auto",
141
+ paddingTop: "8px",
142
+ paddingBottom: "8px"
139
143
  },
140
144
  ".cm-content": {
141
145
  fontFamily: "var(--font-family-mono)",
@@ -217,12 +221,16 @@ const readOnlyTheme = EditorView.theme({
217
221
  backgroundColor: "var(--color-bg-secondary)",
218
222
  height: "100%",
219
223
  width: "100%",
220
- fontSize: "14px",
221
- paddingTop: "8px",
222
- paddingBottom: "8px"
224
+ fontSize: "14px"
225
+ },
226
+ "&.cm-editor": {
227
+ paddingTop: "0 !important",
228
+ paddingBottom: "0 !important"
223
229
  },
224
230
  ".cm-scroller": {
225
- overflow: "auto"
231
+ overflow: "auto",
232
+ paddingTop: "8px",
233
+ paddingBottom: "8px"
226
234
  },
227
235
  ".cm-content": {
228
236
  fontFamily: "var(--font-family-mono)",
@@ -925,10 +933,23 @@ const editorInputTheme = EditorView.theme({
925
933
  flexShrink: "0"
926
934
  }
927
935
  });
936
+ const KeywordIcon = ()=>/*#__PURE__*/ _jsx(Terminal, {
937
+ size: 16,
938
+ color: "#717684"
939
+ });
940
+ const OperatorIcon = ()=>/*#__PURE__*/ _jsx(Braces, {
941
+ size: 16,
942
+ color: "#717684"
943
+ });
928
944
  function getCompletionIcon(completion) {
929
945
  if (completion.type === "function") return SquareFunctionIcon;
946
+ if (completion.type === "keyword") return KeywordIcon;
947
+ if (completion.type === "operator") return OperatorIcon;
930
948
  const detail = completion.detail;
931
- if (!detail) return null;
949
+ if (!detail) {
950
+ if (completion.type === "variable") return SquareFunctionIcon;
951
+ return null;
952
+ }
932
953
  const typeName = detail.replace(/\[\]$/, "");
933
954
  if (!typeName) return null;
934
955
  const firstChar = typeName[0];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/code-editor/index.tsx"],"sourcesContent":["import {\n\tacceptCompletion,\n\tautocompletion,\n\ttype Completion,\n\tcloseBrackets,\n\tcloseBracketsKeymap,\n\tcompletionKeymap,\n} from \"@codemirror/autocomplete\";\nimport { defaultKeymap, history, historyKeymap } from \"@codemirror/commands\";\nimport { json, jsonParseLinter } from \"@codemirror/lang-json\";\nimport { SQLDialect, sql } from \"@codemirror/lang-sql\";\nimport { yaml } from \"@codemirror/lang-yaml\";\nimport {\n\tbracketMatching,\n\tfoldGutter,\n\tfoldKeymap,\n\tHighlightStyle,\n\tindentOnInput,\n\tsyntaxHighlighting,\n} from \"@codemirror/language\";\nimport { linter, lintGutter, lintKeymap } from \"@codemirror/lint\";\nimport {\n\tcloseSearchPanel,\n\tfindNext,\n\tfindPrevious,\n\tgetSearchQuery,\n\thighlightSelectionMatches,\n\tSearchQuery,\n\tsearch,\n\tsearchKeymap,\n\tsetSearchQuery,\n} from \"@codemirror/search\";\nimport {\n\tCompartment,\n\tEditorState,\n\ttype Extension,\n\tRangeSet,\n\tStateEffect,\n\tStateField,\n} from \"@codemirror/state\";\nimport {\n\tcrosshairCursor,\n\tDecoration,\n\tdrawSelection,\n\tdropCursor,\n\tEditorView,\n\tGutterMarker,\n\tgutterLineClass,\n\thighlightActiveLine,\n\thighlightActiveLineGutter,\n\thighlightSpecialChars,\n\tkeymap,\n\tlineNumbers,\n\trectangularSelection,\n\ttype ViewUpdate,\n} from \"@codemirror/view\";\nimport { tags } from \"@lezer/highlight\";\nimport { ChevronDown, ChevronUp, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { ComplexTypeIcon, SquareFunctionIcon, TypCodeIcon } from \"../../icons\";\nimport { http } from \"./http\";\n\n// --- Issue lines: gutter highlighting, line background, hover tooltip ---\n\ntype IssueLine = { line: number; message?: string };\n\nclass ErrorLineGutterMarker extends GutterMarker {\n\telementClass = \"cm-errorLineGutter\";\n}\nconst errorLineMarker = new ErrorLineGutterMarker();\nconst errorLineDecoration = Decoration.line({ class: \"cm-errorLine\" });\n\nconst setIssueLinesEffect = StateEffect.define<IssueLine[]>();\n\nlet errorTooltipEl: HTMLDivElement | null = null;\n\nfunction showErrorTooltip(anchor: Element, message: string) {\n\thideErrorTooltip();\n\n\tconst tooltip = document.createElement(\"div\");\n\ttooltip.textContent = message;\n\tObject.assign(tooltip.style, {\n\t\tposition: \"fixed\",\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t\tpadding: \"6px 10px\",\n\t\tfontSize: \"12px\",\n\t\tlineHeight: \"1.4\",\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t\tboxShadow: \"0 4px 12px rgba(0, 0, 0, 0.1)\",\n\t\tzIndex: \"1000\",\n\t\tpointerEvents: \"none\",\n\t\tmaxWidth: \"400px\",\n\t\twhiteSpace: \"pre-wrap\",\n\t});\n\tdocument.body.appendChild(tooltip);\n\terrorTooltipEl = tooltip;\n\n\tconst guttersEl = anchor.closest(\".cm-gutters\");\n\tconst guttersRect = guttersEl\n\t\t? guttersEl.getBoundingClientRect()\n\t\t: anchor.getBoundingClientRect();\n\tconst anchorRect = anchor.getBoundingClientRect();\n\ttooltip.style.left = `${guttersRect.right + 4}px`;\n\ttooltip.style.top = `${anchorRect.top}px`;\n}\n\nfunction hideErrorTooltip() {\n\terrorTooltipEl?.remove();\n\terrorTooltipEl = null;\n}\n\nconst issueLinesField = StateField.define<{\n\tgutterMarkers: RangeSet<GutterMarker>;\n\tlineDecorations: RangeSet<Decoration>;\n\tmessages: Map<number, string>;\n}>({\n\tcreate() {\n\t\treturn {\n\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\tlineDecorations: Decoration.none,\n\t\t\tmessages: new Map(),\n\t\t};\n\t},\n\tupdate(state, tr) {\n\t\tfor (const effect of tr.effects) {\n\t\t\tif (effect.is(setIssueLinesEffect)) {\n\t\t\t\tconst markers: { from: number; to: number; value: GutterMarker }[] = [];\n\t\t\t\tconst lineDecos: {\n\t\t\t\t\tfrom: number;\n\t\t\t\t\tto: number;\n\t\t\t\t\tvalue: Decoration;\n\t\t\t\t}[] = [];\n\t\t\t\tconst messages = new Map<number, string>();\n\t\t\t\tconst doc = tr.state.doc;\n\n\t\t\t\tfor (const issue of effect.value) {\n\t\t\t\t\tif (issue.line >= 1 && issue.line <= doc.lines) {\n\t\t\t\t\t\tconst line = doc.line(issue.line);\n\t\t\t\t\t\tmarkers.push(errorLineMarker.range(line.from));\n\t\t\t\t\t\tlineDecos.push(errorLineDecoration.range(line.from));\n\t\t\t\t\t\tif (issue.message) {\n\t\t\t\t\t\t\tmessages.set(issue.line, issue.message);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tgutterMarkers: RangeSet.of(markers, true),\n\t\t\t\t\tlineDecorations: Decoration.set(lineDecos, true),\n\t\t\t\t\tmessages,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t},\n\tprovide(field) {\n\t\treturn [\n\t\t\tgutterLineClass.from(field, (val) => val.gutterMarkers),\n\t\t\tEditorView.decorations.from(field, (val) => val.lineDecorations),\n\t\t];\n\t},\n});\n\nconst errorTooltipHandler = EditorView.domEventHandlers({\n\tmouseover(event, view) {\n\t\tconst target = event.target as HTMLElement;\n\t\tconst gutterEl = target.closest(\n\t\t\t\".cm-lineNumbers .cm-gutterElement\",\n\t\t) as HTMLElement | null;\n\t\tif (!gutterEl) {\n\t\t\thideErrorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tconst lineNo = Number.parseInt(gutterEl.textContent ?? \"\", 10);\n\t\tif (Number.isNaN(lineNo)) {\n\t\t\thideErrorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { messages } = view.state.field(issueLinesField);\n\t\tconst message = messages.get(lineNo);\n\t\tif (!message) {\n\t\t\thideErrorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tshowErrorTooltip(gutterEl, message);\n\t\treturn false;\n\t},\n\tmouseleave() {\n\t\thideErrorTooltip();\n\t\treturn false;\n\t},\n});\n\nconst baseTheme = EditorView.baseTheme({\n\t\"&\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\theight: \"100%\",\n\t\twidth: \"100%\",\n\t\tfontSize: \"14px\",\n\t\tpaddingTop: \"8px\",\n\t\tpaddingBottom: \"8px\",\n\t},\n\t\".cm-scroller\": {\n\t\toverflow: \"auto\",\n\t},\n\t\".cm-content\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t\tpadding: \"0\",\n\t},\n\t\"&.cm-focused\": {\n\t\toutline: \"none\",\n\t},\n\t\".cm-cursor, .cm-dropCursor\": {\n\t\tborderLeftColor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-gutter\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t},\n\t\".cm-gutters\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"none\",\n\t},\n\t\".cm-lineNumbers\": {\n\t\tpaddingLeft: \"16px\",\n\t},\n\t\".cm-activeLineGutter\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tcolor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-activeLine\": {\n\t\tbackgroundColor: \"rgba(255, 255, 255, 0)\",\n\t},\n\t\".cm-errorLineGutter\": {\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n\t\".cm-errorLine\": {\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n});\n\nconst completionTheme = EditorView.theme({\n\t\".cm-tooltip.cm-tooltip-autocomplete > ul\": {\n\t\tmaxHeight: \"400px\",\n\t},\n\t\".cm-tooltip.cm-tooltip-autocomplete > ul > li\": {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"8px\",\n\t},\n\t\".cm-completionLabel\": {\n\t\tflex: \"1\",\n\t\tminWidth: \"0\",\n\t},\n\t\".cm-completionDetail\": {\n\t\tcolor: \"var(--color-text-tertiary)\",\n\t\tfontSize: \"12px\",\n\t\tmarginLeft: \"auto\",\n\t\twhiteSpace: \"nowrap\",\n\t},\n\t\".cm-completionInfo\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t\tcolor: \"var(--color-text-secondary)\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t\tfontSize: \"12px\",\n\t\tpadding: \"8px 12px\",\n\t\tlineHeight: \"1.4\",\n\t\twhiteSpace: \"normal\",\n\t\tmaxWidth: \"300px\",\n\t},\n\t\".cm-completion-icon\": {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\twidth: \"16px\",\n\t\theight: \"16px\",\n\t\tflexShrink: \"0\",\n\t},\n});\n\nconst readOnlyTheme = EditorView.theme({\n\t\"&\": {\n\t\tbackgroundColor: \"var(--color-bg-secondary)\",\n\t\theight: \"100%\",\n\t\twidth: \"100%\",\n\t\tfontSize: \"14px\",\n\t\tpaddingTop: \"8px\",\n\t\tpaddingBottom: \"8px\",\n\t},\n\t\".cm-scroller\": {\n\t\toverflow: \"auto\",\n\t},\n\t\".cm-content\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t\tpadding: \"0\",\n\t},\n\t\"&.cm-focused\": {\n\t\toutline: \"none\",\n\t},\n\t\".cm-gutter\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t},\n\t\".cm-gutters\": {\n\t\tbackgroundColor: \"var(--color-bg-secondary)\",\n\t\tborder: \"none\",\n\t},\n\t\".cm-lineNumbers\": {\n\t\tpaddingLeft: \"16px\",\n\t},\n\t\".cm-activeLineGutter\": {\n\t\tbackgroundColor: \"var(--color-bg-secondary)\",\n\t\tcolor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-activeLine\": {\n\t\tbackgroundColor: \"rgba(255, 255, 255, 0)\",\n\t},\n\t\".cm-errorLineGutter\": {\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n\t\".cm-errorLine\": {\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n});\n\nconst iconButtonStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: \"28px\",\n\theight: \"28px\",\n\tborder: \"none\",\n\tborderRadius: \"var(--radius-sm)\",\n\tbackground: \"transparent\",\n\tcolor: \"var(--color-text-secondary)\",\n\tcursor: \"pointer\",\n\tpadding: 0,\n};\n\nfunction getMatchInfo(\n\tstate: EditorState,\n\tsearchText: string,\n): { current: number; total: number } {\n\tif (!searchText) return { current: 0, total: 0 };\n\tconst doc = state.doc.toString();\n\tconst sel = state.selection.main;\n\tconst lowerDoc = doc.toLowerCase();\n\tconst lowerSearch = searchText.toLowerCase();\n\tconst searchLen = searchText.length;\n\tlet total = 0;\n\tlet current = 0;\n\tlet pos = 0;\n\tfor (;;) {\n\t\tconst idx = lowerDoc.indexOf(lowerSearch, pos);\n\t\tif (idx === -1) break;\n\t\ttotal++;\n\t\tif (idx === sel.from && idx + searchLen === sel.to) {\n\t\t\tcurrent = total;\n\t\t}\n\t\tpos = idx + 1;\n\t}\n\treturn { current, total };\n}\n\nfunction createSearchPanel(view: EditorView) {\n\tconst dom = document.createElement(\"div\");\n\tconst root = createRoot(dom);\n\n\tconst panelRef: {\n\t\tsetSearch: ((v: string) => void) | null;\n\t\tsetMatch: ((info: { current: number; total: number }) => void) | null;\n\t\tlastSearch: string;\n\t\tlastCurrent: number;\n\t\tlastTotal: number;\n\t} = {\n\t\tsetSearch: null,\n\t\tsetMatch: null,\n\t\tlastSearch: \"\",\n\t\tlastCurrent: 0,\n\t\tlastTotal: 0,\n\t};\n\n\tfunction Panel() {\n\t\tconst [value, setValue] = React.useState(\n\t\t\t() => getSearchQuery(view.state).search,\n\t\t);\n\t\tconst [match, setMatchState] = React.useState({ current: 0, total: 0 });\n\n\t\tpanelRef.setSearch = setValue;\n\t\tpanelRef.setMatch = setMatchState;\n\n\t\tconst handleChange = (newValue: string) => {\n\t\t\tsetValue(newValue);\n\t\t\tview.dispatch({\n\t\t\t\teffects: setSearchQuery.of(new SearchQuery({ search: newValue })),\n\t\t\t});\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tgap: \"2px\",\n\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\t\t\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\t\t\t\tborderRadius: \"var(--radius-md)\",\n\t\t\t\t\tboxShadow: \"0 2px 8px rgba(0, 0, 0, 0.12)\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => handleChange(e.target.value)}\n\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (e.shiftKey) findPrevious(view);\n\t\t\t\t\t\t\telse findNext(view);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (e.key === \"Escape\") {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tcloseSearchPanel(view);\n\t\t\t\t\t\t\tview.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tplaceholder=\"Find...\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: \"28px\",\n\t\t\t\t\t\tpadding: \"0 8px\",\n\t\t\t\t\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\t\t\t\t\tborderRadius: \"var(--radius-md)\",\n\t\t\t\t\t\tfontSize: \"13px\",\n\t\t\t\t\t\tfontFamily: \"var(--font-family-sans)\",\n\t\t\t\t\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\t\t\t\t\tcolor: \"var(--color-text-primary)\",\n\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\tflex: \"0 0 200px\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tfontSize: \"12px\",\n\t\t\t\t\t\tfontFamily: \"var(--font-family-sans)\",\n\t\t\t\t\t\tcolor: \"var(--color-text-secondary)\",\n\t\t\t\t\t\twhiteSpace: \"nowrap\",\n\t\t\t\t\t\tminWidth: \"70px\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\tvisibility: value ? \"visible\" : \"hidden\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{value\n\t\t\t\t\t\t? match.total > 0\n\t\t\t\t\t\t\t? `${match.current} of ${match.total}`\n\t\t\t\t\t\t\t: \"No results\"\n\t\t\t\t\t\t: \"No results\"}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => findPrevious(view)}\n\t\t\t\t\ttitle=\"Previous match\"\n\t\t\t\t\tstyle={iconButtonStyle}\n\t\t\t\t>\n\t\t\t\t\t<ChevronUp size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => findNext(view)}\n\t\t\t\t\ttitle=\"Next match\"\n\t\t\t\t\tstyle={iconButtonStyle}\n\t\t\t\t>\n\t\t\t\t\t<ChevronDown size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tcloseSearchPanel(view);\n\t\t\t\t\t\tview.focus();\n\t\t\t\t\t}}\n\t\t\t\t\ttitle=\"Close\"\n\t\t\t\t\tstyle={iconButtonStyle}\n\t\t\t\t>\n\t\t\t\t\t<X size={14} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tflushSync(() => {\n\t\troot.render(<Panel />);\n\t});\n\n\tconst input = dom.querySelector(\"input\");\n\tif (input) input.setAttribute(\"main-field\", \"true\");\n\n\t// Compute initial match info\n\tconst q = getSearchQuery(view.state);\n\tpanelRef.lastSearch = q.search;\n\tif (q.search) {\n\t\tconst info = getMatchInfo(view.state, q.search);\n\t\tpanelRef.lastCurrent = info.current;\n\t\tpanelRef.lastTotal = info.total;\n\t\tpanelRef.setMatch?.(info);\n\t}\n\n\treturn {\n\t\tdom,\n\t\ttop: true,\n\t\tmount() {\n\t\t\tconst el = dom.querySelector(\"input\");\n\t\t\tif (el) {\n\t\t\t\tel.focus();\n\t\t\t\tel.select();\n\t\t\t}\n\t\t},\n\t\tupdate(update: ViewUpdate) {\n\t\t\tconst query = getSearchQuery(update.state);\n\n\t\t\tif (query.search !== panelRef.lastSearch) {\n\t\t\t\tpanelRef.setSearch?.(query.search);\n\t\t\t}\n\t\t\tpanelRef.lastSearch = query.search;\n\n\t\t\tconst info = getMatchInfo(update.state, query.search);\n\t\t\tif (\n\t\t\t\tinfo.current !== panelRef.lastCurrent ||\n\t\t\t\tinfo.total !== panelRef.lastTotal\n\t\t\t) {\n\t\t\t\tpanelRef.lastCurrent = info.current;\n\t\t\t\tpanelRef.lastTotal = info.total;\n\t\t\t\tpanelRef.setMatch?.(info);\n\t\t\t}\n\t\t},\n\t\tdestroy() {\n\t\t\troot.unmount();\n\t\t\tpanelRef.setSearch = null;\n\t\t\tpanelRef.setMatch = null;\n\t\t},\n\t};\n}\n\nconst searchPanelTheme = EditorView.baseTheme({\n\t\".cm-panels-top\": {\n\t\tposition: \"absolute\",\n\t\ttop: \"4px\",\n\t\tright: \"4px\",\n\t\tleft: \"auto\",\n\t\tzIndex: \"10\",\n\t\tbackgroundColor: \"transparent\",\n\t\tborder: \"none\",\n\t},\n\t\".cm-searchMatch\": {\n\t\tbackgroundColor: \"#e9f2fc\",\n\t},\n\t\".cm-searchMatch-selected\": {\n\t\tbackgroundColor: \"#d0e2f8\",\n\t},\n});\n\nconst customSearchExtension = [\n\tsearch({ createPanel: createSearchPanel }),\n\tsearchPanelTheme,\n];\n\nconst customHighlightStyle = HighlightStyle.define([\n\t{ tag: tags.propertyName, color: \"var(--hs-syntax-property)\" },\n\t{ tag: tags.string, color: \"var(--hs-syntax-string)\" },\n\t{ tag: tags.number, color: \"var(--hs-syntax-number)\" },\n\t{ tag: tags.bool, color: \"var(--hs-syntax-keyword)\" },\n\t{ tag: tags.null, color: \"var(--hs-syntax-keyword)\" },\n\t{ tag: tags.keyword, color: \"var(--hs-syntax-keyword)\" },\n\t{ tag: tags.operatorKeyword, color: \"var(--hs-syntax-string)\" },\n\t{ tag: tags.controlKeyword, color: \"var(--hs-syntax-property)\" },\n\t{ tag: tags.typeName, color: \"var(--hs-syntax-number)\" },\n\t{ tag: tags.variableName, color: \"var(--hs-syntax-property)\" },\n\t{ tag: tags.operator, color: \"var(--hs-syntax-string)\" },\n\t{ tag: tags.comment, color: \"var(--hs-syntax-comment)\" },\n\t{ tag: tags.lineComment, color: \"var(--hs-syntax-comment)\" },\n\t{ tag: tags.blockComment, color: \"var(--hs-syntax-comment)\" },\n]);\n\nconst SQL_KEYWORDS = [\n\t\"select\",\n\t\"from\",\n\t\"where\",\n\t\"and\",\n\t\"or\",\n\t\"not\",\n\t\"in\",\n\t\"between\",\n\t\"like\",\n\t\"insert\",\n\t\"update\",\n\t\"delete\",\n\t\"create\",\n\t\"drop\",\n\t\"alter\",\n\t\"table\",\n\t\"index\",\n\t\"join\",\n\t\"inner\",\n\t\"left\",\n\t\"right\",\n\t\"outer\",\n\t\"on\",\n\t\"as\",\n\t\"order\",\n\t\"by\",\n\t\"group\",\n\t\"having\",\n\t\"limit\",\n\t\"offset\",\n\t\"union\",\n\t\"intersect\",\n\t\"except\",\n\t\"distinct\",\n\t\"all\",\n\t\"exists\",\n\t\"case\",\n\t\"when\",\n\t\"then\",\n\t\"else\",\n\t\"end\",\n\t\"null\",\n\t\"true\",\n\t\"false\",\n\t\"is\",\n\t\"asc\",\n\t\"desc\",\n];\n\nconst SQL_BUILTIN = [\n\t\"varchar\",\n\t\"char\",\n\t\"text\",\n\t\"integer\",\n\t\"int\",\n\t\"bigint\",\n\t\"decimal\",\n\t\"numeric\",\n\t\"float\",\n\t\"real\",\n\t\"boolean\",\n\t\"date\",\n\t\"time\",\n\t\"timestamp\",\n\t\"uuid\",\n\t\"count\",\n\t\"sum\",\n\t\"avg\",\n\t\"min\",\n\t\"max\",\n\t\"coalesce\",\n\t\"concat\",\n\t\"substring\",\n\t\"upper\",\n\t\"lower\",\n\t\"trim\",\n\t\"length\",\n\t\"now\",\n\t\"current_date\",\n\t\"current_time\",\n];\n\nconst customSQLDialect = SQLDialect.define({\n\tkeywords: SQL_KEYWORDS.join(\" \"),\n\tbuiltin: SQL_BUILTIN.join(\" \"),\n});\n\ntype LanguageMode = \"json\" | \"http\" | \"sql\" | \"yaml\";\n\nfunction languageExtensions(mode: LanguageMode, sqlExtraBuiltins?: string[]) {\n\tif (mode === \"http\") {\n\t\tconst jsonLang = json();\n\t\tconst yamlLang = yaml();\n\t\treturn [\n\t\t\thttp((ct) =>\n\t\t\t\tct === \"application/json\"\n\t\t\t\t\t? jsonLang.language\n\t\t\t\t\t: ct === \"text/yaml\" ||\n\t\t\t\t\t\t\tct === \"application/yaml\" ||\n\t\t\t\t\t\t\tct === \"application/x-yaml\"\n\t\t\t\t\t\t? yamlLang.language\n\t\t\t\t\t\t: null,\n\t\t\t),\n\t\t\tsyntaxHighlighting(customHighlightStyle),\n\t\t];\n\t} else if (mode === \"sql\") {\n\t\tlet dialect = customSQLDialect;\n\t\tif (sqlExtraBuiltins && sqlExtraBuiltins.length > 0) {\n\t\t\tdialect = SQLDialect.define({\n\t\t\t\tkeywords: SQL_KEYWORDS.join(\" \"),\n\t\t\t\tbuiltin: [...SQL_BUILTIN, ...sqlExtraBuiltins].join(\" \"),\n\t\t\t});\n\t\t}\n\t\treturn [sql({ dialect }), syntaxHighlighting(customHighlightStyle)];\n\t} else if (mode === \"yaml\") {\n\t\treturn [yaml(), syntaxHighlighting(customHighlightStyle)];\n\t} else {\n\t\treturn [\n\t\t\tjson(),\n\t\t\tlinter(jsonParseLinter(), { delay: 300 }),\n\t\t\tsyntaxHighlighting(customHighlightStyle),\n\t\t];\n\t}\n}\n\ntype CodeEditorProps = {\n\treadOnly?: boolean;\n\tisReadOnlyTheme?: boolean;\n\tdefaultValue?: string;\n\tcurrentValue?: string;\n\tonChange?: (value: string) => void;\n\tonUpdate?: (update: ViewUpdate) => void;\n\tid?: string;\n\tmode?: LanguageMode;\n\tviewCallback?: (view: EditorView) => void;\n\tadditionalExtensions?: Extension[];\n\tissueLineNumbers?: { line: number; message?: string }[];\n\tfoldGutter?: boolean;\n\tlintGutter?: boolean;\n\tlineNumbers?: boolean;\n\tsqlExtraBuiltins?: string[];\n};\n\nexport type CodeEditorView = EditorView;\n\nexport function CodeEditor({\n\tdefaultValue,\n\tcurrentValue,\n\tonChange,\n\tonUpdate,\n\tviewCallback,\n\treadOnly = false,\n\tid,\n\tmode = \"json\",\n\tisReadOnlyTheme = false,\n\tadditionalExtensions,\n\tissueLineNumbers,\n\tfoldGutter: enableFoldGutter = true,\n\tlintGutter: enableLintGutter = true,\n\tlineNumbers: enableLineNumbers = true,\n\tsqlExtraBuiltins,\n}: CodeEditorProps) {\n\tconst domRef = React.useRef(null);\n\tconst [view, setView] = React.useState<EditorView | null>(null);\n\n\tconst initialValue = React.useRef(defaultValue ?? \"\");\n\n\tconst onChangeComparment = React.useRef(new Compartment());\n\tconst onUpdateComparment = React.useRef(new Compartment());\n\tconst languageCompartment = React.useRef(new Compartment());\n\tconst readOnlyCompartment = React.useRef(new Compartment());\n\tconst themeCompartment = React.useRef(new Compartment());\n\tconst additionalExtensionsCompartment = React.useRef(new Compartment());\n\n\tReact.useEffect(() => {\n\t\tif (!domRef.current) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst view = new EditorView({\n\t\t\tparent: domRef.current,\n\t\t\tstate: EditorState.create({\n\t\t\t\tdoc: initialValue.current,\n\t\t\t\textensions: [\n\t\t\t\t\tEditorView.contentAttributes.of({ \"data-gramm\": \"false\" }),\n\t\t\t\t\treadOnlyCompartment.current.of(EditorState.readOnly.of(false)),\n\t\t\t\t\t...(enableLineNumbers ? [lineNumbers()] : []),\n\t\t\t\t\t...(enableFoldGutter ? [foldGutter()] : []),\n\t\t\t\t\thighlightSpecialChars(),\n\t\t\t\t\thistory(),\n\t\t\t\t\tdrawSelection(),\n\t\t\t\t\tdropCursor(),\n\t\t\t\t\tEditorState.allowMultipleSelections.of(true),\n\t\t\t\t\tindentOnInput(),\n\t\t\t\t\tlanguageCompartment.current.of([]),\n\t\t\t\t\tbracketMatching(),\n\t\t\t\t\tcloseBrackets(),\n\t\t\t\t\tautocompletion({\n\t\t\t\t\t\ticons: false,\n\t\t\t\t\t\tmaxRenderedOptions: 1000,\n\t\t\t\t\t\taddToOptions: [{ render: renderCompletionIcon, position: 20 }],\n\t\t\t\t\t\toptionClass: (_completion) =>\n\t\t\t\t\t\t\t\"!px-2 !py-1 rounded-md aria-selected:!bg-bg-quaternary aria-selected:!text-text-primary hover:!bg-bg-secondary flex items-center gap-2\",\n\t\t\t\t\t\ttooltipClass: (_state) =>\n\t\t\t\t\t\t\t\"!bg-bg-primary rounded-md p-2 shadow-md !border-border-primary !typo-body\",\n\t\t\t\t\t\tcompareCompletions: (a, b) => {\n\t\t\t\t\t\t\tconst aIsProperty = a.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\tconst bIsProperty = b.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\treturn aIsProperty - bIsProperty;\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\trectangularSelection(),\n\t\t\t\t\tcrosshairCursor(),\n\t\t\t\t\thighlightActiveLine(),\n\t\t\t\t\thighlightActiveLineGutter(),\n\t\t\t\t\thighlightSelectionMatches(),\n\t\t\t\t\tthemeCompartment.current.of(baseTheme),\n\t\t\t\t\tcompletionTheme,\n\t\t\t\t\tkeymap.of([\n\t\t\t\t\t\t...closeBracketsKeymap,\n\t\t\t\t\t\t...defaultKeymap,\n\t\t\t\t\t\t...searchKeymap,\n\t\t\t\t\t\t...historyKeymap,\n\t\t\t\t\t\t...foldKeymap,\n\t\t\t\t\t\t...completionKeymap,\n\t\t\t\t\t\t...lintKeymap,\n\t\t\t\t\t]),\n\t\t\t\t\t...(enableLintGutter ? [lintGutter()] : []),\n\t\t\t\t\tissueLinesField,\n\t\t\t\t\terrorTooltipHandler,\n\t\t\t\t\t...customSearchExtension,\n\t\t\t\t\tonChangeComparment.current.of([]),\n\t\t\t\t\tonUpdateComparment.current.of([]),\n\t\t\t\t\tadditionalExtensionsCompartment.current.of([]),\n\t\t\t\t],\n\t\t\t}),\n\t\t});\n\n\t\tsetView(() => view);\n\n\t\treturn () => {\n\t\t\tview.destroy();\n\t\t\tsetView(() => null);\n\t\t};\n\t}, [enableFoldGutter, enableLineNumbers, enableLintGutter]);\n\n\tReact.useEffect(() => {\n\t\tif (viewCallback && view) {\n\t\t\tviewCallback(view);\n\t\t}\n\t}, [view, viewCallback]);\n\n\tReact.useEffect(() => {\n\t\tview?.dispatch({\n\t\t\teffects: onChangeComparment.current.reconfigure([\n\t\t\t\tEditorView.updateListener.of((update) => {\n\t\t\t\t\tif (update.docChanged && onChange) {\n\t\t\t\t\t\tonChange(update.view.state.doc.toString());\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t]),\n\t\t});\n\t}, [view, onChange]);\n\n\tReact.useEffect(() => {\n\t\tview?.dispatch({\n\t\t\teffects: onUpdateComparment.current.reconfigure([\n\t\t\t\tEditorView.updateListener.of((update) => {\n\t\t\t\t\tif (onUpdate) {\n\t\t\t\t\t\tonUpdate(update);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t]),\n\t\t});\n\t}, [view, onUpdate]);\n\n\t// FIXME: it is probably better to have CM manage its state.\n\tReact.useEffect(() => {\n\t\tif (!view || currentValue === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDoc = view.state.doc.toString();\n\t\tif (currentDoc !== currentValue) {\n\t\t\tview.dispatch({\n\t\t\t\tchanges: {\n\t\t\t\t\tfrom: 0,\n\t\t\t\t\tto: currentDoc.length,\n\t\t\t\t\tinsert: currentValue,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}, [currentValue, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: languageCompartment.current.reconfigure(\n\t\t\t\tlanguageExtensions(mode, sqlExtraBuiltins),\n\t\t\t),\n\t\t});\n\t}, [mode, view, sqlExtraBuiltins]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\treadOnlyCompartment.current.reconfigure(\n\t\t\t\t\tEditorState.readOnly.of(readOnly),\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [readOnly, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\tthemeCompartment.current.reconfigure(\n\t\t\t\t\tisReadOnlyTheme ? readOnlyTheme : baseTheme,\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [isReadOnlyTheme, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\tadditionalExtensionsCompartment.current.reconfigure(\n\t\t\t\t\tadditionalExtensions ?? [],\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [additionalExtensions, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: setIssueLinesEffect.of(issueLineNumbers ?? []),\n\t\t});\n\t}, [issueLineNumbers, view]);\n\n\treturn <div className=\"h-full w-full\" ref={domRef} id={id} />;\n}\n\nconst editorInputTheme = EditorView.theme({\n\t\".cm-content\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t\tfontWeight: \"var(--font-weight-normal)\",\n\t\theight: \"36px\",\n\t\tpadding: \"8px 12px 8px 12px\",\n\t\tfontSize: \"14px\",\n\t},\n\t\".cm-editor\": {\n\t\tfontSize: \"var(--font-size-sm)\",\n\t\tcolor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-cursor, .cm-dropCursor\": {\n\t\tborderLeftColor: \"var(--color-text-primary)\",\n\t},\n\t\"&.cm-editor.cm-focused\": {\n\t\toutline: \"none\",\n\t},\n\t\"&.cm-editor.cm-focused .cm-content\": {\n\t\tborder: \"1px solid var(--color-border-link)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t},\n\t\".cm-line\": {\n\t\tpadding: \"0\",\n\t},\n\t\".cm-tooltip.cm-tooltip-autocomplete > ul\": {\n\t\tmaxHeight: \"400px\",\n\t},\n\t\".cm-completionInfo\": {\n\t\tdisplay: \"none\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t},\n\t\".cm-completionLabel\": {\n\t\tcolor: \"var(--color-text-link)\",\n\t\tfontSize: \"14px\",\n\t},\n\t\".cm-completionDetail\": {\n\t\tdisplay: \"none\",\n\t},\n\t\".cm-completion-icon\": {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\twidth: \"16px\",\n\t\theight: \"16px\",\n\t\tflexShrink: \"0\",\n\t},\n});\n\nfunction getCompletionIcon(completion: Completion): React.FC | null {\n\tif (completion.type === \"function\") return SquareFunctionIcon;\n\tconst detail = completion.detail;\n\tif (!detail) return null;\n\tconst typeName = detail.replace(/\\[\\]$/, \"\");\n\tif (!typeName) return null;\n\tconst firstChar = typeName[0];\n\tif (!firstChar) return null;\n\tconst isComplex = firstChar === firstChar.toUpperCase();\n\treturn isComplex ? ComplexTypeIcon : TypCodeIcon;\n}\n\nfunction renderCompletionIcon(completion: Completion): Node {\n\tconst container = document.createElement(\"div\");\n\tcontainer.className = \"cm-completion-icon\";\n\tconst Icon = getCompletionIcon(completion);\n\tif (Icon) {\n\t\tflushSync(() => {\n\t\t\tcreateRoot(container).render(<Icon />);\n\t\t});\n\t}\n\treturn container;\n}\n\nlet activeTooltip: HTMLDivElement | null = null;\nlet activeRafId: number | null = null;\n\nfunction cleanupActiveTooltip() {\n\tactiveTooltip?.remove();\n\tactiveTooltip = null;\n\tif (activeRafId !== null) {\n\t\tcancelAnimationFrame(activeRafId);\n\t\tactiveRafId = null;\n\t}\n}\n\nfunction renderCompletionDetail(completion: Completion): Node | null {\n\tconst detail = completion.detail;\n\tif (!detail) return null;\n\n\tconst anchor = document.createElement(\"span\");\n\tanchor.style.display = \"none\";\n\n\tconst showTooltip = () => {\n\t\tcleanupActiveTooltip();\n\n\t\tconst tooltip = document.createElement(\"div\");\n\t\ttooltip.textContent = detail;\n\t\tObject.assign(tooltip.style, {\n\t\t\tposition: \"fixed\",\n\t\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\t\tborderRadius: \"var(--radius-md)\",\n\t\t\tpadding: \"8px 12px\",\n\t\t\tfontSize: \"12px\",\n\t\t\tlineHeight: \"1.4\",\n\t\t\tcolor: \"var(--color-text-secondary)\",\n\t\t\tfontFamily: \"var(--font-family-sans)\",\n\t\t\twhiteSpace: \"normal\",\n\t\t\twidth: \"280px\",\n\t\t\tboxShadow: \"0 4px 12px rgba(0, 0, 0, 0.1)\",\n\t\t\tzIndex: \"1000\",\n\t\t\tpointerEvents: \"none\",\n\t\t});\n\t\tdocument.body.appendChild(tooltip);\n\t\tactiveTooltip = tooltip;\n\n\t\tconst autocompleteEl = anchor.closest(\".cm-tooltip-autocomplete\");\n\t\tconst anchorRect = autocompleteEl\n\t\t\t? autocompleteEl.getBoundingClientRect()\n\t\t\t: anchor.getBoundingClientRect();\n\t\ttooltip.style.top = `${anchorRect.top}px`;\n\t\ttooltip.style.left = `${anchorRect.right + 8}px`;\n\n\t\tconst checkAlive = () => {\n\t\t\tif (!anchor.isConnected) {\n\t\t\t\tcleanupActiveTooltip();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactiveRafId = requestAnimationFrame(checkAlive);\n\t\t};\n\t\tactiveRafId = requestAnimationFrame(checkAlive);\n\t};\n\n\trequestAnimationFrame(() => {\n\t\tconst option = anchor.closest(\"li\");\n\t\tif (!option) return;\n\t\toption.addEventListener(\"mouseenter\", showTooltip);\n\t\toption.addEventListener(\"mouseleave\", cleanupActiveTooltip);\n\t});\n\n\treturn anchor;\n}\n\nexport function EditorInput({\n\tadditionalExtensions,\n\tid,\n\tdefaultValue,\n\tcurrentValue,\n\tonChange,\n}: {\n\tadditionalExtensions?: Extension[];\n\tid: string;\n\tdefaultValue?: string;\n\tcurrentValue?: string;\n\tonChange?: (value: string) => void;\n}) {\n\tconst domRef = React.useRef(null);\n\tconst [view, setView] = React.useState<EditorView | null>(null);\n\tconst additionalExtensionsCompartment = React.useRef(new Compartment());\n\tconst onChangeCompartment = React.useRef(new Compartment());\n\tconst initialValue = React.useRef(defaultValue ?? \"\");\n\n\tReact.useEffect(() => {\n\t\tif (!domRef.current) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst view = new EditorView({\n\t\t\tparent: domRef.current,\n\t\t\tstate: EditorState.create({\n\t\t\t\tdoc: initialValue.current,\n\t\t\t\textensions: [\n\t\t\t\t\tautocompletion({\n\t\t\t\t\t\ticons: false,\n\t\t\t\t\t\tmaxRenderedOptions: 1000,\n\t\t\t\t\t\tcloseOnBlur: false,\n\t\t\t\t\t\taddToOptions: [\n\t\t\t\t\t\t\t{ render: renderCompletionIcon, position: 20 },\n\t\t\t\t\t\t\t{ render: renderCompletionDetail, position: 80 },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptionClass: (_completion) =>\n\t\t\t\t\t\t\t\"!px-2 !py-1 rounded-md aria-selected:!bg-bg-quaternary aria-selected:!text-text-primary hover:!bg-bg-secondary grid grid-cols-[16px_1fr] items-center gap-2\",\n\t\t\t\t\t\ttooltipClass: (_state) =>\n\t\t\t\t\t\t\t\"!bg-bg-primary rounded-md p-2 shadow-md !border-border-primary !typo-body\",\n\t\t\t\t\t\tcompareCompletions: (a, b) => {\n\t\t\t\t\t\t\tconst aIsProperty = a.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\tconst bIsProperty = b.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\treturn aIsProperty - bIsProperty;\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tcloseBrackets(),\n\t\t\t\t\thistory(),\n\t\t\t\t\tindentOnInput(),\n\t\t\t\t\teditorInputTheme,\n\t\t\t\t\tEditorView.contentAttributes.of({ \"data-gramm\": \"false\" }),\n\t\t\t\t\t...customSearchExtension,\n\t\t\t\t\tadditionalExtensionsCompartment.current.of([]),\n\t\t\t\t\tonChangeCompartment.current.of([]),\n\t\t\t\t\tkeymap.of([\n\t\t\t\t\t\t{ key: \"Tab\", preventDefault: true, run: acceptCompletion },\n\t\t\t\t\t\t...closeBracketsKeymap,\n\t\t\t\t\t\t...defaultKeymap,\n\t\t\t\t\t\t...searchKeymap,\n\t\t\t\t\t\t...historyKeymap,\n\t\t\t\t\t\t...foldKeymap,\n\t\t\t\t\t\t...completionKeymap,\n\t\t\t\t\t\t...lintKeymap,\n\t\t\t\t\t]),\n\t\t\t\t],\n\t\t\t}),\n\t\t});\n\n\t\tsetView(() => view);\n\n\t\treturn () => {\n\t\t\tview.destroy();\n\t\t\tsetView(() => null);\n\t\t};\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\tadditionalExtensionsCompartment.current.reconfigure(\n\t\t\t\t\tadditionalExtensions ?? [],\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [additionalExtensions, view]);\n\n\tReact.useEffect(() => {\n\t\tview?.dispatch({\n\t\t\teffects: onChangeCompartment.current.reconfigure([\n\t\t\t\tEditorView.updateListener.of((update) => {\n\t\t\t\t\tif (update.docChanged && onChange) {\n\t\t\t\t\t\tonChange(update.view.state.doc.toString());\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t]),\n\t\t});\n\t}, [view, onChange]);\n\n\tReact.useEffect(() => {\n\t\tif (!view || currentValue === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDoc = view.state.doc.toString();\n\t\tif (currentDoc !== currentValue) {\n\t\t\tview.dispatch({\n\t\t\t\tchanges: {\n\t\t\t\t\tfrom: 0,\n\t\t\t\t\tto: currentDoc.length,\n\t\t\t\t\tinsert: currentValue,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}, [currentValue, view]);\n\n\treturn <div className=\"h-full w-full\" ref={domRef} id={id} />;\n}\n"],"names":["acceptCompletion","autocompletion","closeBrackets","closeBracketsKeymap","completionKeymap","defaultKeymap","history","historyKeymap","json","jsonParseLinter","SQLDialect","sql","yaml","bracketMatching","foldGutter","foldKeymap","HighlightStyle","indentOnInput","syntaxHighlighting","linter","lintGutter","lintKeymap","closeSearchPanel","findNext","findPrevious","getSearchQuery","highlightSelectionMatches","SearchQuery","search","searchKeymap","setSearchQuery","Compartment","EditorState","RangeSet","StateEffect","StateField","crosshairCursor","Decoration","drawSelection","dropCursor","EditorView","GutterMarker","gutterLineClass","highlightActiveLine","highlightActiveLineGutter","highlightSpecialChars","keymap","lineNumbers","rectangularSelection","tags","ChevronDown","ChevronUp","X","React","flushSync","createRoot","ComplexTypeIcon","SquareFunctionIcon","TypCodeIcon","http","ErrorLineGutterMarker","elementClass","errorLineMarker","errorLineDecoration","line","class","setIssueLinesEffect","define","errorTooltipEl","showErrorTooltip","anchor","message","hideErrorTooltip","tooltip","document","createElement","textContent","Object","assign","style","position","backgroundColor","border","borderRadius","padding","fontSize","lineHeight","color","fontFamily","boxShadow","zIndex","pointerEvents","maxWidth","whiteSpace","body","appendChild","guttersEl","closest","guttersRect","getBoundingClientRect","anchorRect","left","right","top","remove","issueLinesField","create","gutterMarkers","empty","lineDecorations","none","messages","Map","update","state","tr","effect","effects","is","markers","lineDecos","doc","issue","value","lines","push","range","from","set","of","provide","field","val","decorations","errorTooltipHandler","domEventHandlers","mouseover","event","view","target","gutterEl","lineNo","Number","parseInt","isNaN","get","mouseleave","baseTheme","height","width","paddingTop","paddingBottom","overflow","outline","borderLeftColor","paddingLeft","completionTheme","theme","maxHeight","display","alignItems","gap","flex","minWidth","marginLeft","justifyContent","flexShrink","readOnlyTheme","iconButtonStyle","background","cursor","getMatchInfo","searchText","current","total","toString","sel","selection","main","lowerDoc","toLowerCase","lowerSearch","searchLen","length","pos","idx","indexOf","to","createSearchPanel","dom","root","panelRef","setSearch","setMatch","lastSearch","lastCurrent","lastTotal","Panel","setValue","useState","match","setMatchState","handleChange","newValue","dispatch","div","input","onChange","e","onKeyDown","key","preventDefault","shiftKey","focus","placeholder","span","textAlign","visibility","button","type","onClick","title","size","render","querySelector","setAttribute","q","info","mount","el","select","query","destroy","unmount","searchPanelTheme","customSearchExtension","createPanel","customHighlightStyle","tag","propertyName","string","number","bool","null","keyword","operatorKeyword","controlKeyword","typeName","variableName","operator","comment","lineComment","blockComment","SQL_KEYWORDS","SQL_BUILTIN","customSQLDialect","keywords","join","builtin","languageExtensions","mode","sqlExtraBuiltins","jsonLang","yamlLang","ct","language","dialect","delay","CodeEditor","defaultValue","currentValue","onUpdate","viewCallback","readOnly","id","isReadOnlyTheme","additionalExtensions","issueLineNumbers","enableFoldGutter","enableLintGutter","enableLineNumbers","domRef","useRef","setView","initialValue","onChangeComparment","onUpdateComparment","languageCompartment","readOnlyCompartment","themeCompartment","additionalExtensionsCompartment","useEffect","parent","extensions","contentAttributes","allowMultipleSelections","icons","maxRenderedOptions","addToOptions","renderCompletionIcon","optionClass","_completion","tooltipClass","_state","compareCompletions","a","b","aIsProperty","bIsProperty","reconfigure","updateListener","docChanged","undefined","currentDoc","changes","insert","className","ref","editorInputTheme","fontWeight","getCompletionIcon","completion","detail","replace","firstChar","isComplex","toUpperCase","container","Icon","activeTooltip","activeRafId","cleanupActiveTooltip","cancelAnimationFrame","renderCompletionDetail","showTooltip","autocompleteEl","checkAlive","isConnected","requestAnimationFrame","option","addEventListener","EditorInput","onChangeCompartment","closeOnBlur","run"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/code-editor/index.tsx"],"sourcesContent":["import {\n\tacceptCompletion,\n\tautocompletion,\n\ttype Completion,\n\tcloseBrackets,\n\tcloseBracketsKeymap,\n\tcompletionKeymap,\n} from \"@codemirror/autocomplete\";\nimport { defaultKeymap, history, historyKeymap } from \"@codemirror/commands\";\nimport { json, jsonParseLinter } from \"@codemirror/lang-json\";\nimport { SQLDialect, sql } from \"@codemirror/lang-sql\";\nimport { yaml } from \"@codemirror/lang-yaml\";\nimport {\n\tbracketMatching,\n\tfoldGutter,\n\tfoldKeymap,\n\tHighlightStyle,\n\tindentOnInput,\n\tsyntaxHighlighting,\n} from \"@codemirror/language\";\nimport { linter, lintGutter, lintKeymap } from \"@codemirror/lint\";\nimport {\n\tcloseSearchPanel,\n\tfindNext,\n\tfindPrevious,\n\tgetSearchQuery,\n\thighlightSelectionMatches,\n\tSearchQuery,\n\tsearch,\n\tsearchKeymap,\n\tsetSearchQuery,\n} from \"@codemirror/search\";\nimport {\n\tCompartment,\n\tEditorState,\n\ttype Extension,\n\tRangeSet,\n\tStateEffect,\n\tStateField,\n} from \"@codemirror/state\";\nimport {\n\tcrosshairCursor,\n\tDecoration,\n\tdrawSelection,\n\tdropCursor,\n\tEditorView,\n\tGutterMarker,\n\tgutterLineClass,\n\thighlightActiveLine,\n\thighlightActiveLineGutter,\n\thighlightSpecialChars,\n\tkeymap,\n\tlineNumbers,\n\trectangularSelection,\n\ttype ViewUpdate,\n} from \"@codemirror/view\";\nimport { tags } from \"@lezer/highlight\";\nimport { Braces, ChevronDown, ChevronUp, Terminal, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { ComplexTypeIcon, SquareFunctionIcon, TypCodeIcon } from \"../../icons\";\nimport { http } from \"./http\";\n\n// --- Issue lines: gutter highlighting, line background, hover tooltip ---\n\ntype IssueLine = { line: number; message?: string };\n\nclass ErrorLineGutterMarker extends GutterMarker {\n\telementClass = \"cm-errorLineGutter\";\n}\nconst errorLineMarker = new ErrorLineGutterMarker();\nconst errorLineDecoration = Decoration.line({ class: \"cm-errorLine\" });\n\nconst setIssueLinesEffect = StateEffect.define<IssueLine[]>();\n\nlet errorTooltipEl: HTMLDivElement | null = null;\n\nfunction showErrorTooltip(anchor: Element, message: string) {\n\thideErrorTooltip();\n\n\tconst tooltip = document.createElement(\"div\");\n\ttooltip.textContent = message;\n\tObject.assign(tooltip.style, {\n\t\tposition: \"fixed\",\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t\tpadding: \"6px 10px\",\n\t\tfontSize: \"12px\",\n\t\tlineHeight: \"1.4\",\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t\tboxShadow: \"0 4px 12px rgba(0, 0, 0, 0.1)\",\n\t\tzIndex: \"1000\",\n\t\tpointerEvents: \"none\",\n\t\tmaxWidth: \"400px\",\n\t\twhiteSpace: \"pre-wrap\",\n\t});\n\tdocument.body.appendChild(tooltip);\n\terrorTooltipEl = tooltip;\n\n\tconst guttersEl = anchor.closest(\".cm-gutters\");\n\tconst guttersRect = guttersEl\n\t\t? guttersEl.getBoundingClientRect()\n\t\t: anchor.getBoundingClientRect();\n\tconst anchorRect = anchor.getBoundingClientRect();\n\ttooltip.style.left = `${guttersRect.right + 4}px`;\n\ttooltip.style.top = `${anchorRect.top}px`;\n}\n\nfunction hideErrorTooltip() {\n\terrorTooltipEl?.remove();\n\terrorTooltipEl = null;\n}\n\nconst issueLinesField = StateField.define<{\n\tgutterMarkers: RangeSet<GutterMarker>;\n\tlineDecorations: RangeSet<Decoration>;\n\tmessages: Map<number, string>;\n}>({\n\tcreate() {\n\t\treturn {\n\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\tlineDecorations: Decoration.none,\n\t\t\tmessages: new Map(),\n\t\t};\n\t},\n\tupdate(state, tr) {\n\t\tfor (const effect of tr.effects) {\n\t\t\tif (effect.is(setIssueLinesEffect)) {\n\t\t\t\tconst markers: { from: number; to: number; value: GutterMarker }[] = [];\n\t\t\t\tconst lineDecos: {\n\t\t\t\t\tfrom: number;\n\t\t\t\t\tto: number;\n\t\t\t\t\tvalue: Decoration;\n\t\t\t\t}[] = [];\n\t\t\t\tconst messages = new Map<number, string>();\n\t\t\t\tconst doc = tr.state.doc;\n\n\t\t\t\tfor (const issue of effect.value) {\n\t\t\t\t\tif (issue.line >= 1 && issue.line <= doc.lines) {\n\t\t\t\t\t\tconst line = doc.line(issue.line);\n\t\t\t\t\t\tmarkers.push(errorLineMarker.range(line.from));\n\t\t\t\t\t\tlineDecos.push(errorLineDecoration.range(line.from));\n\t\t\t\t\t\tif (issue.message) {\n\t\t\t\t\t\t\tmessages.set(issue.line, issue.message);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tgutterMarkers: RangeSet.of(markers, true),\n\t\t\t\t\tlineDecorations: Decoration.set(lineDecos, true),\n\t\t\t\t\tmessages,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t},\n\tprovide(field) {\n\t\treturn [\n\t\t\tgutterLineClass.from(field, (val) => val.gutterMarkers),\n\t\t\tEditorView.decorations.from(field, (val) => val.lineDecorations),\n\t\t];\n\t},\n});\n\nconst errorTooltipHandler = EditorView.domEventHandlers({\n\tmouseover(event, view) {\n\t\tconst target = event.target as HTMLElement;\n\t\tconst gutterEl = target.closest(\n\t\t\t\".cm-lineNumbers .cm-gutterElement\",\n\t\t) as HTMLElement | null;\n\t\tif (!gutterEl) {\n\t\t\thideErrorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tconst lineNo = Number.parseInt(gutterEl.textContent ?? \"\", 10);\n\t\tif (Number.isNaN(lineNo)) {\n\t\t\thideErrorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { messages } = view.state.field(issueLinesField);\n\t\tconst message = messages.get(lineNo);\n\t\tif (!message) {\n\t\t\thideErrorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tshowErrorTooltip(gutterEl, message);\n\t\treturn false;\n\t},\n\tmouseleave() {\n\t\thideErrorTooltip();\n\t\treturn false;\n\t},\n});\n\nconst baseTheme = EditorView.theme({\n\t\"&\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\theight: \"100%\",\n\t\twidth: \"100%\",\n\t\tfontSize: \"14px\",\n\t},\n\t\"&.cm-editor\": {\n\t\tpaddingTop: \"0 !important\",\n\t\tpaddingBottom: \"0 !important\",\n\t},\n\t\".cm-scroller\": {\n\t\toverflow: \"auto\",\n\t\tpaddingTop: \"8px\",\n\t\tpaddingBottom: \"8px\",\n\t},\n\t\".cm-content\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t\tpadding: \"0\",\n\t},\n\t\"&.cm-focused\": {\n\t\toutline: \"none\",\n\t},\n\t\".cm-cursor, .cm-dropCursor\": {\n\t\tborderLeftColor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-gutter\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t},\n\t\".cm-gutters\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"none\",\n\t},\n\t\".cm-lineNumbers\": {\n\t\tpaddingLeft: \"16px\",\n\t},\n\t\".cm-activeLineGutter\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tcolor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-activeLine\": {\n\t\tbackgroundColor: \"rgba(255, 255, 255, 0)\",\n\t},\n\t\".cm-errorLineGutter\": {\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n\t\".cm-errorLine\": {\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n});\n\nconst completionTheme = EditorView.theme({\n\t\".cm-tooltip.cm-tooltip-autocomplete > ul\": {\n\t\tmaxHeight: \"400px\",\n\t},\n\t\".cm-tooltip.cm-tooltip-autocomplete > ul > li\": {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"8px\",\n\t},\n\t\".cm-completionLabel\": {\n\t\tflex: \"1\",\n\t\tminWidth: \"0\",\n\t},\n\t\".cm-completionDetail\": {\n\t\tcolor: \"var(--color-text-tertiary)\",\n\t\tfontSize: \"12px\",\n\t\tmarginLeft: \"auto\",\n\t\twhiteSpace: \"nowrap\",\n\t},\n\t\".cm-completionInfo\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t\tcolor: \"var(--color-text-secondary)\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t\tfontSize: \"12px\",\n\t\tpadding: \"8px 12px\",\n\t\tlineHeight: \"1.4\",\n\t\twhiteSpace: \"normal\",\n\t\tmaxWidth: \"300px\",\n\t},\n\t\".cm-completion-icon\": {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\twidth: \"16px\",\n\t\theight: \"16px\",\n\t\tflexShrink: \"0\",\n\t},\n});\n\nconst readOnlyTheme = EditorView.theme({\n\t\"&\": {\n\t\tbackgroundColor: \"var(--color-bg-secondary)\",\n\t\theight: \"100%\",\n\t\twidth: \"100%\",\n\t\tfontSize: \"14px\",\n\t},\n\t\"&.cm-editor\": {\n\t\tpaddingTop: \"0 !important\",\n\t\tpaddingBottom: \"0 !important\",\n\t},\n\t\".cm-scroller\": {\n\t\toverflow: \"auto\",\n\t\tpaddingTop: \"8px\",\n\t\tpaddingBottom: \"8px\",\n\t},\n\t\".cm-content\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t\tpadding: \"0\",\n\t},\n\t\"&.cm-focused\": {\n\t\toutline: \"none\",\n\t},\n\t\".cm-gutter\": {\n\t\tfontFamily: \"var(--font-family-mono)\",\n\t},\n\t\".cm-gutters\": {\n\t\tbackgroundColor: \"var(--color-bg-secondary)\",\n\t\tborder: \"none\",\n\t},\n\t\".cm-lineNumbers\": {\n\t\tpaddingLeft: \"16px\",\n\t},\n\t\".cm-activeLineGutter\": {\n\t\tbackgroundColor: \"var(--color-bg-secondary)\",\n\t\tcolor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-activeLine\": {\n\t\tbackgroundColor: \"rgba(255, 255, 255, 0)\",\n\t},\n\t\".cm-errorLineGutter\": {\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n\t\".cm-errorLine\": {\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n});\n\nconst iconButtonStyle: React.CSSProperties = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n\twidth: \"28px\",\n\theight: \"28px\",\n\tborder: \"none\",\n\tborderRadius: \"var(--radius-sm)\",\n\tbackground: \"transparent\",\n\tcolor: \"var(--color-text-secondary)\",\n\tcursor: \"pointer\",\n\tpadding: 0,\n};\n\nfunction getMatchInfo(\n\tstate: EditorState,\n\tsearchText: string,\n): { current: number; total: number } {\n\tif (!searchText) return { current: 0, total: 0 };\n\tconst doc = state.doc.toString();\n\tconst sel = state.selection.main;\n\tconst lowerDoc = doc.toLowerCase();\n\tconst lowerSearch = searchText.toLowerCase();\n\tconst searchLen = searchText.length;\n\tlet total = 0;\n\tlet current = 0;\n\tlet pos = 0;\n\tfor (;;) {\n\t\tconst idx = lowerDoc.indexOf(lowerSearch, pos);\n\t\tif (idx === -1) break;\n\t\ttotal++;\n\t\tif (idx === sel.from && idx + searchLen === sel.to) {\n\t\t\tcurrent = total;\n\t\t}\n\t\tpos = idx + 1;\n\t}\n\treturn { current, total };\n}\n\nfunction createSearchPanel(view: EditorView) {\n\tconst dom = document.createElement(\"div\");\n\tconst root = createRoot(dom);\n\n\tconst panelRef: {\n\t\tsetSearch: ((v: string) => void) | null;\n\t\tsetMatch: ((info: { current: number; total: number }) => void) | null;\n\t\tlastSearch: string;\n\t\tlastCurrent: number;\n\t\tlastTotal: number;\n\t} = {\n\t\tsetSearch: null,\n\t\tsetMatch: null,\n\t\tlastSearch: \"\",\n\t\tlastCurrent: 0,\n\t\tlastTotal: 0,\n\t};\n\n\tfunction Panel() {\n\t\tconst [value, setValue] = React.useState(\n\t\t\t() => getSearchQuery(view.state).search,\n\t\t);\n\t\tconst [match, setMatchState] = React.useState({ current: 0, total: 0 });\n\n\t\tpanelRef.setSearch = setValue;\n\t\tpanelRef.setMatch = setMatchState;\n\n\t\tconst handleChange = (newValue: string) => {\n\t\t\tsetValue(newValue);\n\t\t\tview.dispatch({\n\t\t\t\teffects: setSearchQuery.of(new SearchQuery({ search: newValue })),\n\t\t\t});\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tgap: \"2px\",\n\t\t\t\t\tpadding: \"6px 8px\",\n\t\t\t\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\t\t\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\t\t\t\tborderRadius: \"var(--radius-md)\",\n\t\t\t\t\tboxShadow: \"0 2px 8px rgba(0, 0, 0, 0.12)\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => handleChange(e.target.value)}\n\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (e.shiftKey) findPrevious(view);\n\t\t\t\t\t\t\telse findNext(view);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (e.key === \"Escape\") {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tcloseSearchPanel(view);\n\t\t\t\t\t\t\tview.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tplaceholder=\"Find...\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: \"28px\",\n\t\t\t\t\t\tpadding: \"0 8px\",\n\t\t\t\t\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\t\t\t\t\tborderRadius: \"var(--radius-md)\",\n\t\t\t\t\t\tfontSize: \"13px\",\n\t\t\t\t\t\tfontFamily: \"var(--font-family-sans)\",\n\t\t\t\t\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\t\t\t\t\tcolor: \"var(--color-text-primary)\",\n\t\t\t\t\t\toutline: \"none\",\n\t\t\t\t\t\tflex: \"0 0 200px\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tfontSize: \"12px\",\n\t\t\t\t\t\tfontFamily: \"var(--font-family-sans)\",\n\t\t\t\t\t\tcolor: \"var(--color-text-secondary)\",\n\t\t\t\t\t\twhiteSpace: \"nowrap\",\n\t\t\t\t\t\tminWidth: \"70px\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\tvisibility: value ? \"visible\" : \"hidden\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{value\n\t\t\t\t\t\t? match.total > 0\n\t\t\t\t\t\t\t? `${match.current} of ${match.total}`\n\t\t\t\t\t\t\t: \"No results\"\n\t\t\t\t\t\t: \"No results\"}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => findPrevious(view)}\n\t\t\t\t\ttitle=\"Previous match\"\n\t\t\t\t\tstyle={iconButtonStyle}\n\t\t\t\t>\n\t\t\t\t\t<ChevronUp size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => findNext(view)}\n\t\t\t\t\ttitle=\"Next match\"\n\t\t\t\t\tstyle={iconButtonStyle}\n\t\t\t\t>\n\t\t\t\t\t<ChevronDown size={16} />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tcloseSearchPanel(view);\n\t\t\t\t\t\tview.focus();\n\t\t\t\t\t}}\n\t\t\t\t\ttitle=\"Close\"\n\t\t\t\t\tstyle={iconButtonStyle}\n\t\t\t\t>\n\t\t\t\t\t<X size={14} />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tflushSync(() => {\n\t\troot.render(<Panel />);\n\t});\n\n\tconst input = dom.querySelector(\"input\");\n\tif (input) input.setAttribute(\"main-field\", \"true\");\n\n\t// Compute initial match info\n\tconst q = getSearchQuery(view.state);\n\tpanelRef.lastSearch = q.search;\n\tif (q.search) {\n\t\tconst info = getMatchInfo(view.state, q.search);\n\t\tpanelRef.lastCurrent = info.current;\n\t\tpanelRef.lastTotal = info.total;\n\t\tpanelRef.setMatch?.(info);\n\t}\n\n\treturn {\n\t\tdom,\n\t\ttop: true,\n\t\tmount() {\n\t\t\tconst el = dom.querySelector(\"input\");\n\t\t\tif (el) {\n\t\t\t\tel.focus();\n\t\t\t\tel.select();\n\t\t\t}\n\t\t},\n\t\tupdate(update: ViewUpdate) {\n\t\t\tconst query = getSearchQuery(update.state);\n\n\t\t\tif (query.search !== panelRef.lastSearch) {\n\t\t\t\tpanelRef.setSearch?.(query.search);\n\t\t\t}\n\t\t\tpanelRef.lastSearch = query.search;\n\n\t\t\tconst info = getMatchInfo(update.state, query.search);\n\t\t\tif (\n\t\t\t\tinfo.current !== panelRef.lastCurrent ||\n\t\t\t\tinfo.total !== panelRef.lastTotal\n\t\t\t) {\n\t\t\t\tpanelRef.lastCurrent = info.current;\n\t\t\t\tpanelRef.lastTotal = info.total;\n\t\t\t\tpanelRef.setMatch?.(info);\n\t\t\t}\n\t\t},\n\t\tdestroy() {\n\t\t\troot.unmount();\n\t\t\tpanelRef.setSearch = null;\n\t\t\tpanelRef.setMatch = null;\n\t\t},\n\t};\n}\n\nconst searchPanelTheme = EditorView.baseTheme({\n\t\".cm-panels-top\": {\n\t\tposition: \"absolute\",\n\t\ttop: \"4px\",\n\t\tright: \"4px\",\n\t\tleft: \"auto\",\n\t\tzIndex: \"10\",\n\t\tbackgroundColor: \"transparent\",\n\t\tborder: \"none\",\n\t},\n\t\".cm-searchMatch\": {\n\t\tbackgroundColor: \"#e9f2fc\",\n\t},\n\t\".cm-searchMatch-selected\": {\n\t\tbackgroundColor: \"#d0e2f8\",\n\t},\n});\n\nconst customSearchExtension = [\n\tsearch({ createPanel: createSearchPanel }),\n\tsearchPanelTheme,\n];\n\nconst customHighlightStyle = HighlightStyle.define([\n\t{ tag: tags.propertyName, color: \"var(--hs-syntax-property)\" },\n\t{ tag: tags.string, color: \"var(--hs-syntax-string)\" },\n\t{ tag: tags.number, color: \"var(--hs-syntax-number)\" },\n\t{ tag: tags.bool, color: \"var(--hs-syntax-keyword)\" },\n\t{ tag: tags.null, color: \"var(--hs-syntax-keyword)\" },\n\t{ tag: tags.keyword, color: \"var(--hs-syntax-keyword)\" },\n\t{ tag: tags.operatorKeyword, color: \"var(--hs-syntax-string)\" },\n\t{ tag: tags.controlKeyword, color: \"var(--hs-syntax-property)\" },\n\t{ tag: tags.typeName, color: \"var(--hs-syntax-number)\" },\n\t{ tag: tags.variableName, color: \"var(--hs-syntax-property)\" },\n\t{ tag: tags.operator, color: \"var(--hs-syntax-string)\" },\n\t{ tag: tags.comment, color: \"var(--hs-syntax-comment)\" },\n\t{ tag: tags.lineComment, color: \"var(--hs-syntax-comment)\" },\n\t{ tag: tags.blockComment, color: \"var(--hs-syntax-comment)\" },\n]);\n\nconst SQL_KEYWORDS = [\n\t\"select\",\n\t\"from\",\n\t\"where\",\n\t\"and\",\n\t\"or\",\n\t\"not\",\n\t\"in\",\n\t\"between\",\n\t\"like\",\n\t\"insert\",\n\t\"update\",\n\t\"delete\",\n\t\"create\",\n\t\"drop\",\n\t\"alter\",\n\t\"table\",\n\t\"index\",\n\t\"join\",\n\t\"inner\",\n\t\"left\",\n\t\"right\",\n\t\"outer\",\n\t\"on\",\n\t\"as\",\n\t\"order\",\n\t\"by\",\n\t\"group\",\n\t\"having\",\n\t\"limit\",\n\t\"offset\",\n\t\"union\",\n\t\"intersect\",\n\t\"except\",\n\t\"distinct\",\n\t\"all\",\n\t\"exists\",\n\t\"case\",\n\t\"when\",\n\t\"then\",\n\t\"else\",\n\t\"end\",\n\t\"null\",\n\t\"true\",\n\t\"false\",\n\t\"is\",\n\t\"asc\",\n\t\"desc\",\n];\n\nconst SQL_BUILTIN = [\n\t\"varchar\",\n\t\"char\",\n\t\"text\",\n\t\"integer\",\n\t\"int\",\n\t\"bigint\",\n\t\"decimal\",\n\t\"numeric\",\n\t\"float\",\n\t\"real\",\n\t\"boolean\",\n\t\"date\",\n\t\"time\",\n\t\"timestamp\",\n\t\"uuid\",\n\t\"count\",\n\t\"sum\",\n\t\"avg\",\n\t\"min\",\n\t\"max\",\n\t\"coalesce\",\n\t\"concat\",\n\t\"substring\",\n\t\"upper\",\n\t\"lower\",\n\t\"trim\",\n\t\"length\",\n\t\"now\",\n\t\"current_date\",\n\t\"current_time\",\n];\n\nconst customSQLDialect = SQLDialect.define({\n\tkeywords: SQL_KEYWORDS.join(\" \"),\n\tbuiltin: SQL_BUILTIN.join(\" \"),\n});\n\ntype LanguageMode = \"json\" | \"http\" | \"sql\" | \"yaml\";\n\nfunction languageExtensions(mode: LanguageMode, sqlExtraBuiltins?: string[]) {\n\tif (mode === \"http\") {\n\t\tconst jsonLang = json();\n\t\tconst yamlLang = yaml();\n\t\treturn [\n\t\t\thttp((ct) =>\n\t\t\t\tct === \"application/json\"\n\t\t\t\t\t? jsonLang.language\n\t\t\t\t\t: ct === \"text/yaml\" ||\n\t\t\t\t\t\t\tct === \"application/yaml\" ||\n\t\t\t\t\t\t\tct === \"application/x-yaml\"\n\t\t\t\t\t\t? yamlLang.language\n\t\t\t\t\t\t: null,\n\t\t\t),\n\t\t\tsyntaxHighlighting(customHighlightStyle),\n\t\t];\n\t} else if (mode === \"sql\") {\n\t\tlet dialect = customSQLDialect;\n\t\tif (sqlExtraBuiltins && sqlExtraBuiltins.length > 0) {\n\t\t\tdialect = SQLDialect.define({\n\t\t\t\tkeywords: SQL_KEYWORDS.join(\" \"),\n\t\t\t\tbuiltin: [...SQL_BUILTIN, ...sqlExtraBuiltins].join(\" \"),\n\t\t\t});\n\t\t}\n\t\treturn [sql({ dialect }), syntaxHighlighting(customHighlightStyle)];\n\t} else if (mode === \"yaml\") {\n\t\treturn [yaml(), syntaxHighlighting(customHighlightStyle)];\n\t} else {\n\t\treturn [\n\t\t\tjson(),\n\t\t\tlinter(jsonParseLinter(), { delay: 300 }),\n\t\t\tsyntaxHighlighting(customHighlightStyle),\n\t\t];\n\t}\n}\n\ntype CodeEditorProps = {\n\treadOnly?: boolean;\n\tisReadOnlyTheme?: boolean;\n\tdefaultValue?: string;\n\tcurrentValue?: string;\n\tonChange?: (value: string) => void;\n\tonUpdate?: (update: ViewUpdate) => void;\n\tid?: string;\n\tmode?: LanguageMode;\n\tviewCallback?: (view: EditorView) => void;\n\tadditionalExtensions?: Extension[];\n\tissueLineNumbers?: { line: number; message?: string }[];\n\tfoldGutter?: boolean;\n\tlintGutter?: boolean;\n\tlineNumbers?: boolean;\n\tsqlExtraBuiltins?: string[];\n};\n\nexport type CodeEditorView = EditorView;\n\nexport function CodeEditor({\n\tdefaultValue,\n\tcurrentValue,\n\tonChange,\n\tonUpdate,\n\tviewCallback,\n\treadOnly = false,\n\tid,\n\tmode = \"json\",\n\tisReadOnlyTheme = false,\n\tadditionalExtensions,\n\tissueLineNumbers,\n\tfoldGutter: enableFoldGutter = true,\n\tlintGutter: enableLintGutter = true,\n\tlineNumbers: enableLineNumbers = true,\n\tsqlExtraBuiltins,\n}: CodeEditorProps) {\n\tconst domRef = React.useRef(null);\n\tconst [view, setView] = React.useState<EditorView | null>(null);\n\n\tconst initialValue = React.useRef(defaultValue ?? \"\");\n\n\tconst onChangeComparment = React.useRef(new Compartment());\n\tconst onUpdateComparment = React.useRef(new Compartment());\n\tconst languageCompartment = React.useRef(new Compartment());\n\tconst readOnlyCompartment = React.useRef(new Compartment());\n\tconst themeCompartment = React.useRef(new Compartment());\n\tconst additionalExtensionsCompartment = React.useRef(new Compartment());\n\n\tReact.useEffect(() => {\n\t\tif (!domRef.current) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst view = new EditorView({\n\t\t\tparent: domRef.current,\n\t\t\tstate: EditorState.create({\n\t\t\t\tdoc: initialValue.current,\n\t\t\t\textensions: [\n\t\t\t\t\tEditorView.contentAttributes.of({ \"data-gramm\": \"false\" }),\n\t\t\t\t\treadOnlyCompartment.current.of(EditorState.readOnly.of(false)),\n\t\t\t\t\t...(enableLineNumbers ? [lineNumbers()] : []),\n\t\t\t\t\t...(enableFoldGutter ? [foldGutter()] : []),\n\t\t\t\t\thighlightSpecialChars(),\n\t\t\t\t\thistory(),\n\t\t\t\t\tdrawSelection(),\n\t\t\t\t\tdropCursor(),\n\t\t\t\t\tEditorState.allowMultipleSelections.of(true),\n\t\t\t\t\tindentOnInput(),\n\t\t\t\t\tlanguageCompartment.current.of([]),\n\t\t\t\t\tbracketMatching(),\n\t\t\t\t\tcloseBrackets(),\n\t\t\t\t\tautocompletion({\n\t\t\t\t\t\ticons: false,\n\t\t\t\t\t\tmaxRenderedOptions: 1000,\n\t\t\t\t\t\taddToOptions: [{ render: renderCompletionIcon, position: 20 }],\n\t\t\t\t\t\toptionClass: (_completion) =>\n\t\t\t\t\t\t\t\"!px-2 !py-1 rounded-md aria-selected:!bg-bg-quaternary aria-selected:!text-text-primary hover:!bg-bg-secondary flex items-center gap-2\",\n\t\t\t\t\t\ttooltipClass: (_state) =>\n\t\t\t\t\t\t\t\"!bg-bg-primary rounded-md p-2 shadow-md !border-border-primary !typo-body\",\n\t\t\t\t\t\tcompareCompletions: (a, b) => {\n\t\t\t\t\t\t\tconst aIsProperty = a.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\tconst bIsProperty = b.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\treturn aIsProperty - bIsProperty;\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\trectangularSelection(),\n\t\t\t\t\tcrosshairCursor(),\n\t\t\t\t\thighlightActiveLine(),\n\t\t\t\t\thighlightActiveLineGutter(),\n\t\t\t\t\thighlightSelectionMatches(),\n\t\t\t\t\tthemeCompartment.current.of(baseTheme),\n\t\t\t\t\tcompletionTheme,\n\t\t\t\t\tkeymap.of([\n\t\t\t\t\t\t...closeBracketsKeymap,\n\t\t\t\t\t\t...defaultKeymap,\n\t\t\t\t\t\t...searchKeymap,\n\t\t\t\t\t\t...historyKeymap,\n\t\t\t\t\t\t...foldKeymap,\n\t\t\t\t\t\t...completionKeymap,\n\t\t\t\t\t\t...lintKeymap,\n\t\t\t\t\t]),\n\t\t\t\t\t...(enableLintGutter ? [lintGutter()] : []),\n\t\t\t\t\tissueLinesField,\n\t\t\t\t\terrorTooltipHandler,\n\t\t\t\t\t...customSearchExtension,\n\t\t\t\t\tonChangeComparment.current.of([]),\n\t\t\t\t\tonUpdateComparment.current.of([]),\n\t\t\t\t\tadditionalExtensionsCompartment.current.of([]),\n\t\t\t\t],\n\t\t\t}),\n\t\t});\n\n\t\tsetView(() => view);\n\n\t\treturn () => {\n\t\t\tview.destroy();\n\t\t\tsetView(() => null);\n\t\t};\n\t}, [enableFoldGutter, enableLineNumbers, enableLintGutter]);\n\n\tReact.useEffect(() => {\n\t\tif (viewCallback && view) {\n\t\t\tviewCallback(view);\n\t\t}\n\t}, [view, viewCallback]);\n\n\tReact.useEffect(() => {\n\t\tview?.dispatch({\n\t\t\teffects: onChangeComparment.current.reconfigure([\n\t\t\t\tEditorView.updateListener.of((update) => {\n\t\t\t\t\tif (update.docChanged && onChange) {\n\t\t\t\t\t\tonChange(update.view.state.doc.toString());\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t]),\n\t\t});\n\t}, [view, onChange]);\n\n\tReact.useEffect(() => {\n\t\tview?.dispatch({\n\t\t\teffects: onUpdateComparment.current.reconfigure([\n\t\t\t\tEditorView.updateListener.of((update) => {\n\t\t\t\t\tif (onUpdate) {\n\t\t\t\t\t\tonUpdate(update);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t]),\n\t\t});\n\t}, [view, onUpdate]);\n\n\t// FIXME: it is probably better to have CM manage its state.\n\tReact.useEffect(() => {\n\t\tif (!view || currentValue === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDoc = view.state.doc.toString();\n\t\tif (currentDoc !== currentValue) {\n\t\t\tview.dispatch({\n\t\t\t\tchanges: {\n\t\t\t\t\tfrom: 0,\n\t\t\t\t\tto: currentDoc.length,\n\t\t\t\t\tinsert: currentValue,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}, [currentValue, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: languageCompartment.current.reconfigure(\n\t\t\t\tlanguageExtensions(mode, sqlExtraBuiltins),\n\t\t\t),\n\t\t});\n\t}, [mode, view, sqlExtraBuiltins]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\treadOnlyCompartment.current.reconfigure(\n\t\t\t\t\tEditorState.readOnly.of(readOnly),\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [readOnly, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\tthemeCompartment.current.reconfigure(\n\t\t\t\t\tisReadOnlyTheme ? readOnlyTheme : baseTheme,\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [isReadOnlyTheme, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\tadditionalExtensionsCompartment.current.reconfigure(\n\t\t\t\t\tadditionalExtensions ?? [],\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [additionalExtensions, view]);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: setIssueLinesEffect.of(issueLineNumbers ?? []),\n\t\t});\n\t}, [issueLineNumbers, view]);\n\n\treturn <div className=\"h-full w-full\" ref={domRef} id={id} />;\n}\n\nconst editorInputTheme = EditorView.theme({\n\t\".cm-content\": {\n\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t\tfontWeight: \"var(--font-weight-normal)\",\n\t\theight: \"36px\",\n\t\tpadding: \"8px 12px 8px 12px\",\n\t\tfontSize: \"14px\",\n\t},\n\t\".cm-editor\": {\n\t\tfontSize: \"var(--font-size-sm)\",\n\t\tcolor: \"var(--color-text-primary)\",\n\t},\n\t\".cm-cursor, .cm-dropCursor\": {\n\t\tborderLeftColor: \"var(--color-text-primary)\",\n\t},\n\t\"&.cm-editor.cm-focused\": {\n\t\toutline: \"none\",\n\t},\n\t\"&.cm-editor.cm-focused .cm-content\": {\n\t\tborder: \"1px solid var(--color-border-link)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t},\n\t\".cm-line\": {\n\t\tpadding: \"0\",\n\t},\n\t\".cm-tooltip.cm-tooltip-autocomplete > ul\": {\n\t\tmaxHeight: \"400px\",\n\t},\n\t\".cm-completionInfo\": {\n\t\tdisplay: \"none\",\n\t\tfontFamily: \"var(--font-family-sans)\",\n\t},\n\t\".cm-completionLabel\": {\n\t\tcolor: \"var(--color-text-link)\",\n\t\tfontSize: \"14px\",\n\t},\n\t\".cm-completionDetail\": {\n\t\tdisplay: \"none\",\n\t},\n\t\".cm-completion-icon\": {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\twidth: \"16px\",\n\t\theight: \"16px\",\n\t\tflexShrink: \"0\",\n\t},\n});\n\nconst KeywordIcon = () => <Terminal size={16} color=\"#717684\" />;\nconst OperatorIcon = () => <Braces size={16} color=\"#717684\" />;\n\nfunction getCompletionIcon(completion: Completion): React.FC | null {\n\tif (completion.type === \"function\") return SquareFunctionIcon;\n\tif (completion.type === \"keyword\") return KeywordIcon;\n\tif (completion.type === \"operator\") return OperatorIcon;\n\tconst detail = completion.detail;\n\tif (!detail) {\n\t\tif (completion.type === \"variable\") return SquareFunctionIcon;\n\t\treturn null;\n\t}\n\tconst typeName = detail.replace(/\\[\\]$/, \"\");\n\tif (!typeName) return null;\n\tconst firstChar = typeName[0];\n\tif (!firstChar) return null;\n\tconst isComplex = firstChar === firstChar.toUpperCase();\n\treturn isComplex ? ComplexTypeIcon : TypCodeIcon;\n}\n\nfunction renderCompletionIcon(completion: Completion): Node {\n\tconst container = document.createElement(\"div\");\n\tcontainer.className = \"cm-completion-icon\";\n\tconst Icon = getCompletionIcon(completion);\n\tif (Icon) {\n\t\tflushSync(() => {\n\t\t\tcreateRoot(container).render(<Icon />);\n\t\t});\n\t}\n\treturn container;\n}\n\nlet activeTooltip: HTMLDivElement | null = null;\nlet activeRafId: number | null = null;\n\nfunction cleanupActiveTooltip() {\n\tactiveTooltip?.remove();\n\tactiveTooltip = null;\n\tif (activeRafId !== null) {\n\t\tcancelAnimationFrame(activeRafId);\n\t\tactiveRafId = null;\n\t}\n}\n\nfunction renderCompletionDetail(completion: Completion): Node | null {\n\tconst detail = completion.detail;\n\tif (!detail) return null;\n\n\tconst anchor = document.createElement(\"span\");\n\tanchor.style.display = \"none\";\n\n\tconst showTooltip = () => {\n\t\tcleanupActiveTooltip();\n\n\t\tconst tooltip = document.createElement(\"div\");\n\t\ttooltip.textContent = detail;\n\t\tObject.assign(tooltip.style, {\n\t\t\tposition: \"fixed\",\n\t\t\tbackgroundColor: \"var(--color-bg-primary)\",\n\t\t\tborder: \"1px solid var(--color-border-primary)\",\n\t\t\tborderRadius: \"var(--radius-md)\",\n\t\t\tpadding: \"8px 12px\",\n\t\t\tfontSize: \"12px\",\n\t\t\tlineHeight: \"1.4\",\n\t\t\tcolor: \"var(--color-text-secondary)\",\n\t\t\tfontFamily: \"var(--font-family-sans)\",\n\t\t\twhiteSpace: \"normal\",\n\t\t\twidth: \"280px\",\n\t\t\tboxShadow: \"0 4px 12px rgba(0, 0, 0, 0.1)\",\n\t\t\tzIndex: \"1000\",\n\t\t\tpointerEvents: \"none\",\n\t\t});\n\t\tdocument.body.appendChild(tooltip);\n\t\tactiveTooltip = tooltip;\n\n\t\tconst autocompleteEl = anchor.closest(\".cm-tooltip-autocomplete\");\n\t\tconst anchorRect = autocompleteEl\n\t\t\t? autocompleteEl.getBoundingClientRect()\n\t\t\t: anchor.getBoundingClientRect();\n\t\ttooltip.style.top = `${anchorRect.top}px`;\n\t\ttooltip.style.left = `${anchorRect.right + 8}px`;\n\n\t\tconst checkAlive = () => {\n\t\t\tif (!anchor.isConnected) {\n\t\t\t\tcleanupActiveTooltip();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactiveRafId = requestAnimationFrame(checkAlive);\n\t\t};\n\t\tactiveRafId = requestAnimationFrame(checkAlive);\n\t};\n\n\trequestAnimationFrame(() => {\n\t\tconst option = anchor.closest(\"li\");\n\t\tif (!option) return;\n\t\toption.addEventListener(\"mouseenter\", showTooltip);\n\t\toption.addEventListener(\"mouseleave\", cleanupActiveTooltip);\n\t});\n\n\treturn anchor;\n}\n\nexport function EditorInput({\n\tadditionalExtensions,\n\tid,\n\tdefaultValue,\n\tcurrentValue,\n\tonChange,\n}: {\n\tadditionalExtensions?: Extension[];\n\tid: string;\n\tdefaultValue?: string;\n\tcurrentValue?: string;\n\tonChange?: (value: string) => void;\n}) {\n\tconst domRef = React.useRef(null);\n\tconst [view, setView] = React.useState<EditorView | null>(null);\n\tconst additionalExtensionsCompartment = React.useRef(new Compartment());\n\tconst onChangeCompartment = React.useRef(new Compartment());\n\tconst initialValue = React.useRef(defaultValue ?? \"\");\n\n\tReact.useEffect(() => {\n\t\tif (!domRef.current) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst view = new EditorView({\n\t\t\tparent: domRef.current,\n\t\t\tstate: EditorState.create({\n\t\t\t\tdoc: initialValue.current,\n\t\t\t\textensions: [\n\t\t\t\t\tautocompletion({\n\t\t\t\t\t\ticons: false,\n\t\t\t\t\t\tmaxRenderedOptions: 1000,\n\t\t\t\t\t\tcloseOnBlur: false,\n\t\t\t\t\t\taddToOptions: [\n\t\t\t\t\t\t\t{ render: renderCompletionIcon, position: 20 },\n\t\t\t\t\t\t\t{ render: renderCompletionDetail, position: 80 },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptionClass: (_completion) =>\n\t\t\t\t\t\t\t\"!px-2 !py-1 rounded-md aria-selected:!bg-bg-quaternary aria-selected:!text-text-primary hover:!bg-bg-secondary grid grid-cols-[16px_1fr] items-center gap-2\",\n\t\t\t\t\t\ttooltipClass: (_state) =>\n\t\t\t\t\t\t\t\"!bg-bg-primary rounded-md p-2 shadow-md !border-border-primary !typo-body\",\n\t\t\t\t\t\tcompareCompletions: (a, b) => {\n\t\t\t\t\t\t\tconst aIsProperty = a.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\tconst bIsProperty = b.type === \"property\" ? 0 : 1;\n\t\t\t\t\t\t\treturn aIsProperty - bIsProperty;\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tcloseBrackets(),\n\t\t\t\t\thistory(),\n\t\t\t\t\tindentOnInput(),\n\t\t\t\t\teditorInputTheme,\n\t\t\t\t\tEditorView.contentAttributes.of({ \"data-gramm\": \"false\" }),\n\t\t\t\t\t...customSearchExtension,\n\t\t\t\t\tadditionalExtensionsCompartment.current.of([]),\n\t\t\t\t\tonChangeCompartment.current.of([]),\n\t\t\t\t\tkeymap.of([\n\t\t\t\t\t\t{ key: \"Tab\", preventDefault: true, run: acceptCompletion },\n\t\t\t\t\t\t...closeBracketsKeymap,\n\t\t\t\t\t\t...defaultKeymap,\n\t\t\t\t\t\t...searchKeymap,\n\t\t\t\t\t\t...historyKeymap,\n\t\t\t\t\t\t...foldKeymap,\n\t\t\t\t\t\t...completionKeymap,\n\t\t\t\t\t\t...lintKeymap,\n\t\t\t\t\t]),\n\t\t\t\t],\n\t\t\t}),\n\t\t});\n\n\t\tsetView(() => view);\n\n\t\treturn () => {\n\t\t\tview.destroy();\n\t\t\tsetView(() => null);\n\t\t};\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\tif (view === null) {\n\t\t\treturn;\n\t\t}\n\t\tview.dispatch({\n\t\t\teffects: [\n\t\t\t\tadditionalExtensionsCompartment.current.reconfigure(\n\t\t\t\t\tadditionalExtensions ?? [],\n\t\t\t\t),\n\t\t\t],\n\t\t});\n\t}, [additionalExtensions, view]);\n\n\tReact.useEffect(() => {\n\t\tview?.dispatch({\n\t\t\teffects: onChangeCompartment.current.reconfigure([\n\t\t\t\tEditorView.updateListener.of((update) => {\n\t\t\t\t\tif (update.docChanged && onChange) {\n\t\t\t\t\t\tonChange(update.view.state.doc.toString());\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t]),\n\t\t});\n\t}, [view, onChange]);\n\n\tReact.useEffect(() => {\n\t\tif (!view || currentValue === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDoc = view.state.doc.toString();\n\t\tif (currentDoc !== currentValue) {\n\t\t\tview.dispatch({\n\t\t\t\tchanges: {\n\t\t\t\t\tfrom: 0,\n\t\t\t\t\tto: currentDoc.length,\n\t\t\t\t\tinsert: currentValue,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}, [currentValue, view]);\n\n\treturn <div className=\"h-full w-full\" ref={domRef} id={id} />;\n}\n"],"names":["acceptCompletion","autocompletion","closeBrackets","closeBracketsKeymap","completionKeymap","defaultKeymap","history","historyKeymap","json","jsonParseLinter","SQLDialect","sql","yaml","bracketMatching","foldGutter","foldKeymap","HighlightStyle","indentOnInput","syntaxHighlighting","linter","lintGutter","lintKeymap","closeSearchPanel","findNext","findPrevious","getSearchQuery","highlightSelectionMatches","SearchQuery","search","searchKeymap","setSearchQuery","Compartment","EditorState","RangeSet","StateEffect","StateField","crosshairCursor","Decoration","drawSelection","dropCursor","EditorView","GutterMarker","gutterLineClass","highlightActiveLine","highlightActiveLineGutter","highlightSpecialChars","keymap","lineNumbers","rectangularSelection","tags","Braces","ChevronDown","ChevronUp","Terminal","X","React","flushSync","createRoot","ComplexTypeIcon","SquareFunctionIcon","TypCodeIcon","http","ErrorLineGutterMarker","elementClass","errorLineMarker","errorLineDecoration","line","class","setIssueLinesEffect","define","errorTooltipEl","showErrorTooltip","anchor","message","hideErrorTooltip","tooltip","document","createElement","textContent","Object","assign","style","position","backgroundColor","border","borderRadius","padding","fontSize","lineHeight","color","fontFamily","boxShadow","zIndex","pointerEvents","maxWidth","whiteSpace","body","appendChild","guttersEl","closest","guttersRect","getBoundingClientRect","anchorRect","left","right","top","remove","issueLinesField","create","gutterMarkers","empty","lineDecorations","none","messages","Map","update","state","tr","effect","effects","is","markers","lineDecos","doc","issue","value","lines","push","range","from","set","of","provide","field","val","decorations","errorTooltipHandler","domEventHandlers","mouseover","event","view","target","gutterEl","lineNo","Number","parseInt","isNaN","get","mouseleave","baseTheme","theme","height","width","paddingTop","paddingBottom","overflow","outline","borderLeftColor","paddingLeft","completionTheme","maxHeight","display","alignItems","gap","flex","minWidth","marginLeft","justifyContent","flexShrink","readOnlyTheme","iconButtonStyle","background","cursor","getMatchInfo","searchText","current","total","toString","sel","selection","main","lowerDoc","toLowerCase","lowerSearch","searchLen","length","pos","idx","indexOf","to","createSearchPanel","dom","root","panelRef","setSearch","setMatch","lastSearch","lastCurrent","lastTotal","Panel","setValue","useState","match","setMatchState","handleChange","newValue","dispatch","div","input","onChange","e","onKeyDown","key","preventDefault","shiftKey","focus","placeholder","span","textAlign","visibility","button","type","onClick","title","size","render","querySelector","setAttribute","q","info","mount","el","select","query","destroy","unmount","searchPanelTheme","customSearchExtension","createPanel","customHighlightStyle","tag","propertyName","string","number","bool","null","keyword","operatorKeyword","controlKeyword","typeName","variableName","operator","comment","lineComment","blockComment","SQL_KEYWORDS","SQL_BUILTIN","customSQLDialect","keywords","join","builtin","languageExtensions","mode","sqlExtraBuiltins","jsonLang","yamlLang","ct","language","dialect","delay","CodeEditor","defaultValue","currentValue","onUpdate","viewCallback","readOnly","id","isReadOnlyTheme","additionalExtensions","issueLineNumbers","enableFoldGutter","enableLintGutter","enableLineNumbers","domRef","useRef","setView","initialValue","onChangeComparment","onUpdateComparment","languageCompartment","readOnlyCompartment","themeCompartment","additionalExtensionsCompartment","useEffect","parent","extensions","contentAttributes","allowMultipleSelections","icons","maxRenderedOptions","addToOptions","renderCompletionIcon","optionClass","_completion","tooltipClass","_state","compareCompletions","a","b","aIsProperty","bIsProperty","reconfigure","updateListener","docChanged","undefined","currentDoc","changes","insert","className","ref","editorInputTheme","fontWeight","KeywordIcon","OperatorIcon","getCompletionIcon","completion","detail","replace","firstChar","isComplex","toUpperCase","container","Icon","activeTooltip","activeRafId","cleanupActiveTooltip","cancelAnimationFrame","renderCompletionDetail","showTooltip","autocompleteEl","checkAlive","isConnected","requestAnimationFrame","option","addEventListener","EditorInput","onChangeCompartment","closeOnBlur","run"],"mappings":"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"}
@@ -183,13 +183,13 @@ function FhirStructureView({ tree }) {
183
183
  tree
184
184
  ]);
185
185
  return /*#__PURE__*/ _jsxs("div", {
186
- className: "h-fit w-fit min-h-0 min-w-0",
186
+ className: "min-h-0 min-w-0",
187
187
  children: [
188
188
  /*#__PURE__*/ _jsxs("div", {
189
- className: "flex items-center gap-2 font-semibold text-xs text-text-secondary border-b py-2 bg-bg-primary sticky top-0 z-20",
189
+ className: "flex items-center gap-2 font-semibold text-xs text-text-secondary border-b py-2 pl-[34px] bg-bg-primary sticky top-0 z-20",
190
190
  children: [
191
191
  /*#__PURE__*/ _jsx("div", {
192
- className: "min-w-[260px] w-[260px] ml-4",
192
+ className: "min-w-[260px] w-[260px]",
193
193
  children: "Name"
194
194
  }),
195
195
  /*#__PURE__*/ _jsx("div", {
@@ -205,7 +205,7 @@ function FhirStructureView({ tree }) {
205
205
  children: "Type"
206
206
  }),
207
207
  /*#__PURE__*/ _jsx("div", {
208
- className: "min-w-[200px] w-[200px]",
208
+ className: "flex-1",
209
209
  children: "Description"
210
210
  })
211
211
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/fhir-structure-view.tsx"],"sourcesContent":["import type { ItemInstance } from \"@headless-tree/core\";\nimport React from \"react\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"#shadcn/components/ui/tooltip\";\nimport { cn } from \"#shadcn/lib/utils.js\";\nimport * as CustomIcon from \"../icons\";\nimport { TreeView, type TreeViewItem } from \"./tree-view\";\n\ntype PackageSpec = {\n\tname: string;\n\tversion: string;\n};\n\ntype Coordinate = {\n\tid?: string;\n\tpackageSpec?: PackageSpec;\n\t\"package-spec\"?: PackageSpec;\n\tlabel?: string;\n};\n\ntype FhirStructure = {\n\ttype?: string;\n\tmin?: string | number;\n\tmax?: string | number;\n\tlastNode?: boolean;\n\tisSummary?: boolean;\n\tisModifier?: boolean;\n\tmustSupport?: boolean;\n\tdatatype?: string;\n\tshort?: string;\n\tdesc?: string;\n\textensionUrl?: string;\n\textensionCoordinate?: Coordinate;\n\tbinding?: {\n\t\tvalueSet: string;\n\t};\n\tvsCoordinate?: Coordinate;\n};\n\nfunction FiledIcon(item: ItemInstance<TreeViewItem<FhirStructure>>) {\n\tconst filedType = item.getItemData()?.meta?.type;\n\n\tswitch (filedType) {\n\t\tcase \"Resource\":\n\t\t\treturn <CustomIcon.ResourceIcon />;\n\t\tcase \"BackboneElement\":\n\t\t\treturn <CustomIcon.BackboneElementIcon />;\n\t\tcase \"Extension\":\n\t\t\treturn <CustomIcon.ExtensionIcon />;\n\t\tcase \"Reference\":\n\t\t\treturn <CustomIcon.ReferenceIcon />;\n\t\tcase \"union\":\n\t\t\treturn <CustomIcon.UnionIcon />;\n\t\tcase \"instant\":\n\t\tcase \"time\":\n\t\tcase \"date\":\n\t\tcase \"dateTime\":\n\t\tcase \"decimal\":\n\t\tcase \"boolean\":\n\t\tcase \"integer\":\n\t\tcase \"string\":\n\t\tcase \"uri\":\n\t\tcase \"base64Binary\":\n\t\tcase \"code\":\n\t\tcase \"id\":\n\t\tcase \"oid\":\n\t\tcase \"unsignedInt\":\n\t\tcase \"positiveInt\":\n\t\tcase \"markdown\":\n\t\tcase \"url\":\n\t\tcase \"canonical\":\n\t\tcase \"uuid\":\n\t\tcase \"integer64\":\n\t\t\treturn <CustomIcon.TypCodeIcon />;\n\t\tdefault:\n\t\t\treturn <CustomIcon.ComplexTypeIcon />;\n\t}\n}\n\nconst customItemFieldNameClass = cn(\n\t\"flex\",\n\t\"items-center\",\n\t\"truncate\",\n\t\"gap-2\",\n\t\"min-w-[calc(260px-var(--tree-padding))]\",\n\t\"w-[calc(260px-var(--tree-padding))]\",\n\t\"in-data-[folder=true]:w-[calc(260px-var(--tree-padding))]\",\n\t\"in-data-[folder=true]:min-w-[calc(260px-var(--tree-padding))]\",\n);\n\nfunction customItemView(item: ItemInstance<TreeViewItem<FhirStructure>>) {\n\tconst fieldName = item.getItemData()?.name;\n\tconst cardinalityMin = item.getItemData()?.meta?.min;\n\tconst cardinalityMax = item.getItemData()?.meta?.max;\n\tconst isSummary = item.getItemData()?.meta?.isSummary;\n\tconst isModifier = item.getItemData()?.meta?.isModifier;\n\tconst mustSupport = item.getItemData()?.meta?.mustSupport;\n\tconst datatype = item.getItemData()?.meta?.type;\n\tconst short = item.getItemData()?.meta?.short;\n\tconst desc = item.getItemData()?.meta?.desc;\n\tconst extensionUrl = item.getItemData()?.meta?.extensionUrl;\n\tconst extensionCoordinate = item.getItemData()?.meta?.extensionCoordinate;\n\tconst binding = item.getItemData()?.meta?.binding;\n\tconst vsCoordinate = item.getItemData()?.meta?.vsCoordinate;\n\treturn (\n\t\t<div className=\"flex items-start gap-2 text-xs\">\n\t\t\t<div className={customItemFieldNameClass}>\n\t\t\t\t{FiledIcon(item)}\n\t\t\t\t{fieldName}\n\t\t\t</div>\n\n\t\t\t<div className=\"flex items-center gap-1 min-w-[60px] w-[60px]\">\n\t\t\t\t{mustSupport && (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<span className=\"px-[2px] max-h-[20px] text-white bg-red-600 rounded cursor-help\">\n\t\t\t\t\t\t\t\tS\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Must be supported</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t)}\n\t\t\t\t{isSummary && (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<span className=\"px-[2px] max-h-[20px] cursor-help\">Σ</span>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Part of the summary set</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t)}\n\t\t\t\t{isModifier && (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<span className=\"px-[2px] max-h-[20px] cursor-help\">!?</span>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Modifying element</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center gap-1 min-w-[50px] w-[50px] typo-code\">\n\t\t\t\t{cardinalityMin && cardinalityMax\n\t\t\t\t\t? `${cardinalityMin}..${cardinalityMax}`\n\t\t\t\t\t: \"\"}\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-1 w-[200px] min-w-[200px]\">\n\t\t\t\t{datatype !== \"union\" && datatype}\n\t\t\t</div>\n\t\t\t<div className=\"text-left overflow-hidden\">\n\t\t\t\t{short && <div className=\"line-clamp-2\">{short}</div>}\n\t\t\t\t{!short && desc && <div className=\"line-clamp-2\">{desc}</div>}\n\t\t\t\t{extensionUrl && (\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t<span>URL:</span>\n\t\t\t\t\t\t{extensionCoordinate?.id ? (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={`#/ig/${extensionCoordinate?.[\"package-spec\"]?.name || extensionCoordinate?.packageSpec?.name}#${extensionCoordinate?.[\"package-spec\"]?.version || extensionCoordinate?.packageSpec?.version}/sd/${extensionCoordinate?.id}`}\n\t\t\t\t\t\t\t\tclassName=\"font-medium hover:underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{extensionCoordinate?.label || extensionUrl}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-medium\">\n\t\t\t\t\t\t\t\t{extensionCoordinate?.label || extensionUrl}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{binding && (\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t<span>Binding:</span>\n\t\t\t\t\t\t{vsCoordinate?.id ? (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={`#/ig/${vsCoordinate?.[\"package-spec\"]?.name || vsCoordinate?.packageSpec?.name}#${vsCoordinate?.[\"package-spec\"]?.version || vsCoordinate?.packageSpec?.version}/vs/${vsCoordinate?.id}`}\n\t\t\t\t\t\t\t\tclassName=\"font-medium hover:underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{vsCoordinate?.label || binding?.valueSet || \"Binding\"}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-medium\">\n\t\t\t\t\t\t\t\t{vsCoordinate?.label || binding?.valueSet || \"Binding\"}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction FhirStructureView({\n\ttree,\n}: {\n\ttree: Record<string, TreeViewItem<FhirStructure>>;\n}) {\n\tconst expandedItemIds = React.useMemo(() => {\n\t\treturn Object.keys(tree ?? {});\n\t}, [tree]);\n\n\treturn (\n\t\t<div className=\"h-fit w-fit min-h-0 min-w-0\">\n\t\t\t<div className=\"flex items-center gap-2 font-semibold text-xs text-text-secondary border-b py-2 bg-bg-primary sticky top-0 z-20\">\n\t\t\t\t<div className=\"min-w-[260px] w-[260px] ml-4\">Name</div>\n\t\t\t\t<div className=\"min-w-[60px] w-[60px]\">Flags</div>\n\t\t\t\t<div className=\"min-w-[50px] w-[50px]\">Card.</div>\n\t\t\t\t<div className=\"min-w-[200px] w-[200px]\">Type</div>\n\t\t\t\t<div className=\"min-w-[200px] w-[200px]\">Description</div>\n\t\t\t</div>\n\t\t\t<TreeView\n\t\t\t\tfocusedItem={null}\n\t\t\t\tonFocusedItemChange={() => {}}\n\t\t\t\thideChevron={false}\n\t\t\t\thorizontalLines={true}\n\t\t\t\tdisableHover={true}\n\t\t\t\tzebra={true}\n\t\t\t\trootItemId=\"root\"\n\t\t\t\titems={tree}\n\t\t\t\tcustomItemView={customItemView}\n\t\t\t\tdefaultExpandedItems={expandedItemIds}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport { FhirStructureView, type FhirStructure };\n"],"names":["React","Tooltip","TooltipContent","TooltipTrigger","cn","CustomIcon","TreeView","FiledIcon","item","filedType","getItemData","meta","type","ResourceIcon","BackboneElementIcon","ExtensionIcon","ReferenceIcon","UnionIcon","TypCodeIcon","ComplexTypeIcon","customItemFieldNameClass","customItemView","fieldName","name","cardinalityMin","min","cardinalityMax","max","isSummary","isModifier","mustSupport","datatype","short","desc","extensionUrl","extensionCoordinate","binding","vsCoordinate","div","className","asChild","span","p","id","a","href","packageSpec","version","label","valueSet","FhirStructureView","tree","expandedItemIds","useMemo","Object","keys","focusedItem","onFocusedItemChange","hideChevron","horizontalLines","disableHover","zebra","rootItemId","items","defaultExpandedItems"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/fhir-structure-view.tsx"],"sourcesContent":["import type { ItemInstance } from \"@headless-tree/core\";\nimport React from \"react\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"#shadcn/components/ui/tooltip\";\nimport { cn } from \"#shadcn/lib/utils.js\";\nimport * as CustomIcon from \"../icons\";\nimport { TreeView, type TreeViewItem } from \"./tree-view\";\n\ntype PackageSpec = {\n\tname: string;\n\tversion: string;\n};\n\ntype Coordinate = {\n\tid?: string;\n\tpackageSpec?: PackageSpec;\n\t\"package-spec\"?: PackageSpec;\n\tlabel?: string;\n};\n\ntype FhirStructure = {\n\ttype?: string;\n\tmin?: string | number;\n\tmax?: string | number;\n\tlastNode?: boolean;\n\tisSummary?: boolean;\n\tisModifier?: boolean;\n\tmustSupport?: boolean;\n\tdatatype?: string;\n\tshort?: string;\n\tdesc?: string;\n\textensionUrl?: string;\n\textensionCoordinate?: Coordinate;\n\tbinding?: {\n\t\tvalueSet: string;\n\t};\n\tvsCoordinate?: Coordinate;\n};\n\nfunction FiledIcon(item: ItemInstance<TreeViewItem<FhirStructure>>) {\n\tconst filedType = item.getItemData()?.meta?.type;\n\n\tswitch (filedType) {\n\t\tcase \"Resource\":\n\t\t\treturn <CustomIcon.ResourceIcon />;\n\t\tcase \"BackboneElement\":\n\t\t\treturn <CustomIcon.BackboneElementIcon />;\n\t\tcase \"Extension\":\n\t\t\treturn <CustomIcon.ExtensionIcon />;\n\t\tcase \"Reference\":\n\t\t\treturn <CustomIcon.ReferenceIcon />;\n\t\tcase \"union\":\n\t\t\treturn <CustomIcon.UnionIcon />;\n\t\tcase \"instant\":\n\t\tcase \"time\":\n\t\tcase \"date\":\n\t\tcase \"dateTime\":\n\t\tcase \"decimal\":\n\t\tcase \"boolean\":\n\t\tcase \"integer\":\n\t\tcase \"string\":\n\t\tcase \"uri\":\n\t\tcase \"base64Binary\":\n\t\tcase \"code\":\n\t\tcase \"id\":\n\t\tcase \"oid\":\n\t\tcase \"unsignedInt\":\n\t\tcase \"positiveInt\":\n\t\tcase \"markdown\":\n\t\tcase \"url\":\n\t\tcase \"canonical\":\n\t\tcase \"uuid\":\n\t\tcase \"integer64\":\n\t\t\treturn <CustomIcon.TypCodeIcon />;\n\t\tdefault:\n\t\t\treturn <CustomIcon.ComplexTypeIcon />;\n\t}\n}\n\nconst customItemFieldNameClass = cn(\n\t\"flex\",\n\t\"items-center\",\n\t\"truncate\",\n\t\"gap-2\",\n\t\"min-w-[calc(260px-var(--tree-padding))]\",\n\t\"w-[calc(260px-var(--tree-padding))]\",\n\t\"in-data-[folder=true]:w-[calc(260px-var(--tree-padding))]\",\n\t\"in-data-[folder=true]:min-w-[calc(260px-var(--tree-padding))]\",\n);\n\nfunction customItemView(item: ItemInstance<TreeViewItem<FhirStructure>>) {\n\tconst fieldName = item.getItemData()?.name;\n\tconst cardinalityMin = item.getItemData()?.meta?.min;\n\tconst cardinalityMax = item.getItemData()?.meta?.max;\n\tconst isSummary = item.getItemData()?.meta?.isSummary;\n\tconst isModifier = item.getItemData()?.meta?.isModifier;\n\tconst mustSupport = item.getItemData()?.meta?.mustSupport;\n\tconst datatype = item.getItemData()?.meta?.type;\n\tconst short = item.getItemData()?.meta?.short;\n\tconst desc = item.getItemData()?.meta?.desc;\n\tconst extensionUrl = item.getItemData()?.meta?.extensionUrl;\n\tconst extensionCoordinate = item.getItemData()?.meta?.extensionCoordinate;\n\tconst binding = item.getItemData()?.meta?.binding;\n\tconst vsCoordinate = item.getItemData()?.meta?.vsCoordinate;\n\treturn (\n\t\t<div className=\"flex items-start gap-2 text-xs\">\n\t\t\t<div className={customItemFieldNameClass}>\n\t\t\t\t{FiledIcon(item)}\n\t\t\t\t{fieldName}\n\t\t\t</div>\n\n\t\t\t<div className=\"flex items-center gap-1 min-w-[60px] w-[60px]\">\n\t\t\t\t{mustSupport && (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<span className=\"px-[2px] max-h-[20px] text-white bg-red-600 rounded cursor-help\">\n\t\t\t\t\t\t\t\tS\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Must be supported</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t)}\n\t\t\t\t{isSummary && (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<span className=\"px-[2px] max-h-[20px] cursor-help\">Σ</span>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Part of the summary set</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t)}\n\t\t\t\t{isModifier && (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<span className=\"px-[2px] max-h-[20px] cursor-help\">!?</span>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Modifying element</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center gap-1 min-w-[50px] w-[50px] typo-code\">\n\t\t\t\t{cardinalityMin && cardinalityMax\n\t\t\t\t\t? `${cardinalityMin}..${cardinalityMax}`\n\t\t\t\t\t: \"\"}\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-1 w-[200px] min-w-[200px]\">\n\t\t\t\t{datatype !== \"union\" && datatype}\n\t\t\t</div>\n\t\t\t<div className=\"text-left overflow-hidden\">\n\t\t\t\t{short && <div className=\"line-clamp-2\">{short}</div>}\n\t\t\t\t{!short && desc && <div className=\"line-clamp-2\">{desc}</div>}\n\t\t\t\t{extensionUrl && (\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t<span>URL:</span>\n\t\t\t\t\t\t{extensionCoordinate?.id ? (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={`#/ig/${extensionCoordinate?.[\"package-spec\"]?.name || extensionCoordinate?.packageSpec?.name}#${extensionCoordinate?.[\"package-spec\"]?.version || extensionCoordinate?.packageSpec?.version}/sd/${extensionCoordinate?.id}`}\n\t\t\t\t\t\t\t\tclassName=\"font-medium hover:underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{extensionCoordinate?.label || extensionUrl}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-medium\">\n\t\t\t\t\t\t\t\t{extensionCoordinate?.label || extensionUrl}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{binding && (\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t<span>Binding:</span>\n\t\t\t\t\t\t{vsCoordinate?.id ? (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={`#/ig/${vsCoordinate?.[\"package-spec\"]?.name || vsCoordinate?.packageSpec?.name}#${vsCoordinate?.[\"package-spec\"]?.version || vsCoordinate?.packageSpec?.version}/vs/${vsCoordinate?.id}`}\n\t\t\t\t\t\t\t\tclassName=\"font-medium hover:underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{vsCoordinate?.label || binding?.valueSet || \"Binding\"}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-medium\">\n\t\t\t\t\t\t\t\t{vsCoordinate?.label || binding?.valueSet || \"Binding\"}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction FhirStructureView({\n\ttree,\n}: {\n\ttree: Record<string, TreeViewItem<FhirStructure>>;\n}) {\n\tconst expandedItemIds = React.useMemo(() => {\n\t\treturn Object.keys(tree ?? {});\n\t}, [tree]);\n\n\treturn (\n\t\t<div className=\"min-h-0 min-w-0\">\n\t\t\t<div className=\"flex items-center gap-2 font-semibold text-xs text-text-secondary border-b py-2 pl-[34px] bg-bg-primary sticky top-0 z-20\">\n\t\t\t\t<div className=\"min-w-[260px] w-[260px]\">Name</div>\n\t\t\t\t<div className=\"min-w-[60px] w-[60px]\">Flags</div>\n\t\t\t\t<div className=\"min-w-[50px] w-[50px]\">Card.</div>\n\t\t\t\t<div className=\"min-w-[200px] w-[200px]\">Type</div>\n\t\t\t\t<div className=\"flex-1\">Description</div>\n\t\t\t</div>\n\t\t\t<TreeView\n\t\t\t\tfocusedItem={null}\n\t\t\t\tonFocusedItemChange={() => {}}\n\t\t\t\thideChevron={false}\n\t\t\t\thorizontalLines={true}\n\t\t\t\tdisableHover={true}\n\t\t\t\tzebra={true}\n\t\t\t\trootItemId=\"root\"\n\t\t\t\titems={tree}\n\t\t\t\tcustomItemView={customItemView}\n\t\t\t\tdefaultExpandedItems={expandedItemIds}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport { FhirStructureView, type FhirStructure };\n"],"names":["React","Tooltip","TooltipContent","TooltipTrigger","cn","CustomIcon","TreeView","FiledIcon","item","filedType","getItemData","meta","type","ResourceIcon","BackboneElementIcon","ExtensionIcon","ReferenceIcon","UnionIcon","TypCodeIcon","ComplexTypeIcon","customItemFieldNameClass","customItemView","fieldName","name","cardinalityMin","min","cardinalityMax","max","isSummary","isModifier","mustSupport","datatype","short","desc","extensionUrl","extensionCoordinate","binding","vsCoordinate","div","className","asChild","span","p","id","a","href","packageSpec","version","label","valueSet","FhirStructureView","tree","expandedItemIds","useMemo","Object","keys","focusedItem","onFocusedItemChange","hideChevron","horizontalLines","disableHover","zebra","rootItemId","items","defaultExpandedItems"],"mappings":"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"}
@@ -4,6 +4,8 @@ import type * as React from "react";
4
4
  declare const switchRootVariants: (props?: ({
5
5
  size?: "small" | "regular" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
- declare function Switch({ className, size, disabled, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root> & VariantProps<typeof switchRootVariants>): import("react/jsx-runtime").JSX.Element;
7
+ declare function Switch({ className, size, disabled, locked, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root> & VariantProps<typeof switchRootVariants> & {
8
+ locked?: boolean;
9
+ }): import("react/jsx-runtime").JSX.Element;
8
10
  export { Switch };
9
11
  //# sourceMappingURL=switch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../../../src/shadcn/components/ui/switch.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAiCpC,QAAA,MAAM,kBAAkB;;8EAUtB,CAAC;AA6BH,iBAAS,MAAM,CAAC,EACf,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,GAAG,KAAK,EACR,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GACnD,YAAY,CAAC,OAAO,kBAAkB,CAAC,2CAcvC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../../../src/shadcn/components/ui/switch.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAiCpC,QAAA,MAAM,kBAAkB;;8EAUtB,CAAC;AA6BH,iBAAS,MAAM,CAAC,EACf,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACR,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GACnD,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB,2CA0BD;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as SwitchPrimitive from "@radix-ui/react-switch";
4
4
  import { cva } from "class-variance-authority";
5
+ import { Lock } from "lucide-react";
5
6
  import { cn } from "../../lib/utils.js";
6
7
  // Switch root base styles
7
8
  const baseSwitchRootStyles = cn(// Layout
@@ -39,7 +40,7 @@ const switchThumbVariants = cva(baseSwitchThumbStyles, {
39
40
  size: "regular"
40
41
  }
41
42
  });
42
- function Switch({ className, size, disabled, ...props }) {
43
+ function Switch({ className, size, disabled, locked, ...props }) {
43
44
  return /*#__PURE__*/ _jsx(SwitchPrimitive.Root, {
44
45
  "data-slot": "switch",
45
46
  className: cn(switchRootVariants({
@@ -49,8 +50,16 @@ function Switch({ className, size, disabled, ...props }) {
49
50
  ...props,
50
51
  children: /*#__PURE__*/ _jsx(SwitchPrimitive.Thumb, {
51
52
  "data-slot": "switch-thumb",
52
- className: switchThumbVariants({
53
+ className: cn(switchThumbVariants({
53
54
  size
55
+ }), locked && "flex items-center justify-center"),
56
+ children: locked && /*#__PURE__*/ _jsx(Lock, {
57
+ size: size === "small" ? 8 : 10,
58
+ strokeWidth: 2.5,
59
+ style: {
60
+ strokeWidth: 2.5
61
+ },
62
+ className: "text-neutral-600"
54
63
  })
55
64
  })
56
65
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/shadcn/components/ui/switch.tsx"],"sourcesContent":["\"use client\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"#shadcn/lib/utils\";\n\n// Switch root base styles\nconst baseSwitchRootStyles = cn(\n\t// Layout\n\t\"peer\",\n\t\"inline-flex\",\n\t\"items-center\",\n\t\"shrink-0\",\n\t// Shape\n\t\"rounded-full\",\n\t// Interaction\n\t\"transition-all\",\n\t\"outline-none\",\n\t\"cursor-pointer\",\n\t// States\n\t\"data-[state=unchecked]:bg-bg-secondary_inverse\",\n\t\"data-[state=checked]:bg-bg-link\",\n\t\"hover:data-[state=unchecked]:bg-bg-secondary_inverse_hover\",\n\t\"hover:data-[state=checked]:bg-bg-link_hover\",\n\t// Focus\n\t\"focus-visible:ring-4\",\n\t\"focus-visible:ring-ring-blue\",\n\t// Disabled\n\t\"disabled:cursor-not-allowed\",\n\t\"disabled:hover:data-[state=unchecked]:bg-bg-disabled\",\n\t\"disabled:hover:data-[state=checked]:bg-bg-link_disabled\",\n\t\"disabled:data-[state=checked]:bg-bg-link_disabled\",\n\t\"disabled:data-[state=unchecked]:bg-bg-disabled\",\n);\n\nconst switchRootVariants = cva(baseSwitchRootStyles, {\n\tvariants: {\n\t\tsize: {\n\t\t\tregular: cn(\"h-6\", \"w-10\"),\n\t\t\tsmall: cn(\"h-4\", \"w-7\"),\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tsize: \"regular\",\n\t},\n});\n\n// Switch thumb base styles\nconst baseSwitchThumbStyles = cn(\n\t// Layout\n\t\"pointer-events-none\",\n\t\"block\",\n\t// Shape\n\t\"rounded-full\",\n\t\"ring-0\",\n\t// Color\n\t\"bg-bg-primary\",\n\t// Animation\n\t\"transition-transform\",\n\t\"data-[state=unchecked]:translate-x-0.5\",\n);\n\nconst switchThumbVariants = cva(baseSwitchThumbStyles, {\n\tvariants: {\n\t\tsize: {\n\t\t\tregular: cn(\"size-5\", \"data-[state=checked]:translate-x-[1.125rem]\"),\n\t\t\tsmall: cn(\"size-3\", \"data-[state=checked]:translate-x-[0.875rem]\"),\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tsize: \"regular\",\n\t},\n});\n\nfunction Switch({\n\tclassName,\n\tsize,\n\tdisabled,\n\t...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> &\n\tVariantProps<typeof switchRootVariants>) {\n\treturn (\n\t\t<SwitchPrimitive.Root\n\t\t\tdata-slot=\"switch\"\n\t\t\tclassName={cn(switchRootVariants({ size }), className)}\n\t\t\tdisabled={disabled}\n\t\t\t{...props}\n\t\t>\n\t\t\t<SwitchPrimitive.Thumb\n\t\t\t\tdata-slot=\"switch-thumb\"\n\t\t\t\tclassName={switchThumbVariants({ size })}\n\t\t\t/>\n\t\t</SwitchPrimitive.Root>\n\t);\n}\n\nexport { Switch };\n"],"names":["SwitchPrimitive","cva","cn","baseSwitchRootStyles","switchRootVariants","variants","size","regular","small","defaultVariants","baseSwitchThumbStyles","switchThumbVariants","Switch","className","disabled","props","Root","data-slot","Thumb"],"mappings":"AAAA;;AACA,YAAYA,qBAAqB,yBAAyB;AAC1D,SAASC,GAAG,QAA2B,2BAA2B;AAGlE,SAASC,EAAE,QAAQ,qBAAoB;AAEvC,0BAA0B;AAC1B,MAAMC,uBAAuBD,GAC5B,SAAS;AACT,QACA,eACA,gBACA,YACA,QAAQ;AACR,gBACA,cAAc;AACd,kBACA,gBACA,kBACA,SAAS;AACT,kDACA,mCACA,8DACA,+CACA,QAAQ;AACR,wBACA,gCACA,WAAW;AACX,+BACA,wDACA,2DACA,qDACA;AAGD,MAAME,qBAAqBH,IAAIE,sBAAsB;IACpDE,UAAU;QACTC,MAAM;YACLC,SAASL,GAAG,OAAO;YACnBM,OAAON,GAAG,OAAO;QAClB;IACD;IACAO,iBAAiB;QAChBH,MAAM;IACP;AACD;AAEA,2BAA2B;AAC3B,MAAMI,wBAAwBR,GAC7B,SAAS;AACT,uBACA,SACA,QAAQ;AACR,gBACA,UACA,QAAQ;AACR,iBACA,YAAY;AACZ,wBACA;AAGD,MAAMS,sBAAsBV,IAAIS,uBAAuB;IACtDL,UAAU;QACTC,MAAM;YACLC,SAASL,GAAG,UAAU;YACtBM,OAAON,GAAG,UAAU;QACrB;IACD;IACAO,iBAAiB;QAChBH,MAAM;IACP;AACD;AAEA,SAASM,OAAO,EACfC,SAAS,EACTP,IAAI,EACJQ,QAAQ,EACR,GAAGC,OAEoC;IACvC,qBACC,KAACf,gBAAgBgB,IAAI;QACpBC,aAAU;QACVJ,WAAWX,GAAGE,mBAAmB;YAAEE;QAAK,IAAIO;QAC5CC,UAAUA;QACT,GAAGC,KAAK;kBAET,cAAA,KAACf,gBAAgBkB,KAAK;YACrBD,aAAU;YACVJ,WAAWF,oBAAoB;gBAAEL;YAAK;;;AAI1C;AAEA,SAASM,MAAM,GAAG"}
1
+ {"version":3,"sources":["../../../../../src/shadcn/components/ui/switch.tsx"],"sourcesContent":["\"use client\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Lock } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"#shadcn/lib/utils\";\n\n// Switch root base styles\nconst baseSwitchRootStyles = cn(\n\t// Layout\n\t\"peer\",\n\t\"inline-flex\",\n\t\"items-center\",\n\t\"shrink-0\",\n\t// Shape\n\t\"rounded-full\",\n\t// Interaction\n\t\"transition-all\",\n\t\"outline-none\",\n\t\"cursor-pointer\",\n\t// States\n\t\"data-[state=unchecked]:bg-bg-secondary_inverse\",\n\t\"data-[state=checked]:bg-bg-link\",\n\t\"hover:data-[state=unchecked]:bg-bg-secondary_inverse_hover\",\n\t\"hover:data-[state=checked]:bg-bg-link_hover\",\n\t// Focus\n\t\"focus-visible:ring-4\",\n\t\"focus-visible:ring-ring-blue\",\n\t// Disabled\n\t\"disabled:cursor-not-allowed\",\n\t\"disabled:hover:data-[state=unchecked]:bg-bg-disabled\",\n\t\"disabled:hover:data-[state=checked]:bg-bg-link_disabled\",\n\t\"disabled:data-[state=checked]:bg-bg-link_disabled\",\n\t\"disabled:data-[state=unchecked]:bg-bg-disabled\",\n);\n\nconst switchRootVariants = cva(baseSwitchRootStyles, {\n\tvariants: {\n\t\tsize: {\n\t\t\tregular: cn(\"h-6\", \"w-10\"),\n\t\t\tsmall: cn(\"h-4\", \"w-7\"),\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tsize: \"regular\",\n\t},\n});\n\n// Switch thumb base styles\nconst baseSwitchThumbStyles = cn(\n\t// Layout\n\t\"pointer-events-none\",\n\t\"block\",\n\t// Shape\n\t\"rounded-full\",\n\t\"ring-0\",\n\t// Color\n\t\"bg-bg-primary\",\n\t// Animation\n\t\"transition-transform\",\n\t\"data-[state=unchecked]:translate-x-0.5\",\n);\n\nconst switchThumbVariants = cva(baseSwitchThumbStyles, {\n\tvariants: {\n\t\tsize: {\n\t\t\tregular: cn(\"size-5\", \"data-[state=checked]:translate-x-[1.125rem]\"),\n\t\t\tsmall: cn(\"size-3\", \"data-[state=checked]:translate-x-[0.875rem]\"),\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\tsize: \"regular\",\n\t},\n});\n\nfunction Switch({\n\tclassName,\n\tsize,\n\tdisabled,\n\tlocked,\n\t...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> &\n\tVariantProps<typeof switchRootVariants> & {\n\t\tlocked?: boolean;\n\t}) {\n\treturn (\n\t\t<SwitchPrimitive.Root\n\t\t\tdata-slot=\"switch\"\n\t\t\tclassName={cn(switchRootVariants({ size }), className)}\n\t\t\tdisabled={disabled}\n\t\t\t{...props}\n\t\t>\n\t\t\t<SwitchPrimitive.Thumb\n\t\t\t\tdata-slot=\"switch-thumb\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tswitchThumbVariants({ size }),\n\t\t\t\t\tlocked && \"flex items-center justify-center\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{locked && (\n\t\t\t\t\t<Lock\n\t\t\t\t\t\tsize={size === \"small\" ? 8 : 10}\n\t\t\t\t\t\tstrokeWidth={2.5}\n\t\t\t\t\t\tstyle={{ strokeWidth: 2.5 }}\n\t\t\t\t\t\tclassName=\"text-neutral-600\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</SwitchPrimitive.Thumb>\n\t\t</SwitchPrimitive.Root>\n\t);\n}\n\nexport { Switch };\n"],"names":["SwitchPrimitive","cva","Lock","cn","baseSwitchRootStyles","switchRootVariants","variants","size","regular","small","defaultVariants","baseSwitchThumbStyles","switchThumbVariants","Switch","className","disabled","locked","props","Root","data-slot","Thumb","strokeWidth","style"],"mappings":"AAAA;;AACA,YAAYA,qBAAqB,yBAAyB;AAC1D,SAASC,GAAG,QAA2B,2BAA2B;AAClE,SAASC,IAAI,QAAQ,eAAe;AAGpC,SAASC,EAAE,QAAQ,qBAAoB;AAEvC,0BAA0B;AAC1B,MAAMC,uBAAuBD,GAC5B,SAAS;AACT,QACA,eACA,gBACA,YACA,QAAQ;AACR,gBACA,cAAc;AACd,kBACA,gBACA,kBACA,SAAS;AACT,kDACA,mCACA,8DACA,+CACA,QAAQ;AACR,wBACA,gCACA,WAAW;AACX,+BACA,wDACA,2DACA,qDACA;AAGD,MAAME,qBAAqBJ,IAAIG,sBAAsB;IACpDE,UAAU;QACTC,MAAM;YACLC,SAASL,GAAG,OAAO;YACnBM,OAAON,GAAG,OAAO;QAClB;IACD;IACAO,iBAAiB;QAChBH,MAAM;IACP;AACD;AAEA,2BAA2B;AAC3B,MAAMI,wBAAwBR,GAC7B,SAAS;AACT,uBACA,SACA,QAAQ;AACR,gBACA,UACA,QAAQ;AACR,iBACA,YAAY;AACZ,wBACA;AAGD,MAAMS,sBAAsBX,IAAIU,uBAAuB;IACtDL,UAAU;QACTC,MAAM;YACLC,SAASL,GAAG,UAAU;YACtBM,OAAON,GAAG,UAAU;QACrB;IACD;IACAO,iBAAiB;QAChBH,MAAM;IACP;AACD;AAEA,SAASM,OAAO,EACfC,SAAS,EACTP,IAAI,EACJQ,QAAQ,EACRC,MAAM,EACN,GAAGC,OAIF;IACD,qBACC,KAACjB,gBAAgBkB,IAAI;QACpBC,aAAU;QACVL,WAAWX,GAAGE,mBAAmB;YAAEE;QAAK,IAAIO;QAC5CC,UAAUA;QACT,GAAGE,KAAK;kBAET,cAAA,KAACjB,gBAAgBoB,KAAK;YACrBD,aAAU;YACVL,WAAWX,GACVS,oBAAoB;gBAAEL;YAAK,IAC3BS,UAAU;sBAGVA,wBACA,KAACd;gBACAK,MAAMA,SAAS,UAAU,IAAI;gBAC7Bc,aAAa;gBACbC,OAAO;oBAAED,aAAa;gBAAI;gBAC1BP,WAAU;;;;AAMhB;AAEA,SAASD,MAAM,GAAG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@health-samurai/react-components",
3
- "version": "0.0.0-alpha.14",
3
+ "version": "0.0.0-alpha.16",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -55,7 +55,7 @@ import {
55
55
  type ViewUpdate,
56
56
  } from "@codemirror/view";
57
57
  import { tags } from "@lezer/highlight";
58
- import { ChevronDown, ChevronUp, X } from "lucide-react";
58
+ import { Braces, ChevronDown, ChevronUp, Terminal, X } from "lucide-react";
59
59
  import * as React from "react";
60
60
  import { flushSync } from "react-dom";
61
61
  import { createRoot } from "react-dom/client";
@@ -200,17 +200,21 @@ const errorTooltipHandler = EditorView.domEventHandlers({
200
200
  },
201
201
  });
202
202
 
203
- const baseTheme = EditorView.baseTheme({
203
+ const baseTheme = EditorView.theme({
204
204
  "&": {
205
205
  backgroundColor: "var(--color-bg-primary)",
206
206
  height: "100%",
207
207
  width: "100%",
208
208
  fontSize: "14px",
209
- paddingTop: "8px",
210
- paddingBottom: "8px",
209
+ },
210
+ "&.cm-editor": {
211
+ paddingTop: "0 !important",
212
+ paddingBottom: "0 !important",
211
213
  },
212
214
  ".cm-scroller": {
213
215
  overflow: "auto",
216
+ paddingTop: "8px",
217
+ paddingBottom: "8px",
214
218
  },
215
219
  ".cm-content": {
216
220
  fontFamily: "var(--font-family-mono)",
@@ -297,11 +301,15 @@ const readOnlyTheme = EditorView.theme({
297
301
  height: "100%",
298
302
  width: "100%",
299
303
  fontSize: "14px",
300
- paddingTop: "8px",
301
- paddingBottom: "8px",
304
+ },
305
+ "&.cm-editor": {
306
+ paddingTop: "0 !important",
307
+ paddingBottom: "0 !important",
302
308
  },
303
309
  ".cm-scroller": {
304
310
  overflow: "auto",
311
+ paddingTop: "8px",
312
+ paddingBottom: "8px",
305
313
  },
306
314
  ".cm-content": {
307
315
  fontFamily: "var(--font-family-mono)",
@@ -1003,10 +1011,18 @@ const editorInputTheme = EditorView.theme({
1003
1011
  },
1004
1012
  });
1005
1013
 
1014
+ const KeywordIcon = () => <Terminal size={16} color="#717684" />;
1015
+ const OperatorIcon = () => <Braces size={16} color="#717684" />;
1016
+
1006
1017
  function getCompletionIcon(completion: Completion): React.FC | null {
1007
1018
  if (completion.type === "function") return SquareFunctionIcon;
1019
+ if (completion.type === "keyword") return KeywordIcon;
1020
+ if (completion.type === "operator") return OperatorIcon;
1008
1021
  const detail = completion.detail;
1009
- if (!detail) return null;
1022
+ if (!detail) {
1023
+ if (completion.type === "variable") return SquareFunctionIcon;
1024
+ return null;
1025
+ }
1010
1026
  const typeName = detail.replace(/\[\]$/, "");
1011
1027
  if (!typeName) return null;
1012
1028
  const firstChar = typeName[0];
@@ -206,13 +206,13 @@ function FhirStructureView({
206
206
  }, [tree]);
207
207
 
208
208
  return (
209
- <div className="h-fit w-fit min-h-0 min-w-0">
210
- <div className="flex items-center gap-2 font-semibold text-xs text-text-secondary border-b py-2 bg-bg-primary sticky top-0 z-20">
211
- <div className="min-w-[260px] w-[260px] ml-4">Name</div>
209
+ <div className="min-h-0 min-w-0">
210
+ <div className="flex items-center gap-2 font-semibold text-xs text-text-secondary border-b py-2 pl-[34px] bg-bg-primary sticky top-0 z-20">
211
+ <div className="min-w-[260px] w-[260px]">Name</div>
212
212
  <div className="min-w-[60px] w-[60px]">Flags</div>
213
213
  <div className="min-w-[50px] w-[50px]">Card.</div>
214
214
  <div className="min-w-[200px] w-[200px]">Type</div>
215
- <div className="min-w-[200px] w-[200px]">Description</div>
215
+ <div className="flex-1">Description</div>
216
216
  </div>
217
217
  <TreeView
218
218
  focusedItem={null}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import * as SwitchPrimitive from "@radix-ui/react-switch";
3
3
  import { cva, type VariantProps } from "class-variance-authority";
4
+ import { Lock } from "lucide-react";
4
5
  import type * as React from "react";
5
6
 
6
7
  import { cn } from "#shadcn/lib/utils";
@@ -77,9 +78,12 @@ function Switch({
77
78
  className,
78
79
  size,
79
80
  disabled,
81
+ locked,
80
82
  ...props
81
83
  }: React.ComponentProps<typeof SwitchPrimitive.Root> &
82
- VariantProps<typeof switchRootVariants>) {
84
+ VariantProps<typeof switchRootVariants> & {
85
+ locked?: boolean;
86
+ }) {
83
87
  return (
84
88
  <SwitchPrimitive.Root
85
89
  data-slot="switch"
@@ -89,8 +93,20 @@ function Switch({
89
93
  >
90
94
  <SwitchPrimitive.Thumb
91
95
  data-slot="switch-thumb"
92
- className={switchThumbVariants({ size })}
93
- />
96
+ className={cn(
97
+ switchThumbVariants({ size }),
98
+ locked && "flex items-center justify-center",
99
+ )}
100
+ >
101
+ {locked && (
102
+ <Lock
103
+ size={size === "small" ? 8 : 10}
104
+ strokeWidth={2.5}
105
+ style={{ strokeWidth: 2.5 }}
106
+ className="text-neutral-600"
107
+ />
108
+ )}
109
+ </SwitchPrimitive.Thumb>
94
110
  </SwitchPrimitive.Root>
95
111
  );
96
112
  }