@almadar/ui 2.36.0 → 2.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,4 +31,4 @@ export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElem
31
31
  /** onChange handler - accepts events from input, select, or textarea */
32
32
  onChange?: React.ChangeEventHandler<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>;
33
33
  }
34
- export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>>;
34
+ export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>>;
@@ -12,8 +12,25 @@ var ReactMarkdown = require('react-markdown');
12
12
  var remarkGfm = require('remark-gfm');
13
13
  var remarkMath = require('remark-math');
14
14
  var rehypeKatex = require('rehype-katex');
15
- var SyntaxHighlighter = require('react-syntax-highlighter/dist/esm/prism');
15
+ var SyntaxHighlighter = require('react-syntax-highlighter/dist/esm/prism-light');
16
16
  var dark = require('react-syntax-highlighter/dist/esm/styles/prism/vsc-dark-plus');
17
+ var syntax = require('@almadar/syntax');
18
+ var langJson = require('react-syntax-highlighter/dist/esm/languages/prism/json');
19
+ var langJavascript = require('react-syntax-highlighter/dist/esm/languages/prism/javascript');
20
+ var langTypescript = require('react-syntax-highlighter/dist/esm/languages/prism/typescript');
21
+ var langJsx = require('react-syntax-highlighter/dist/esm/languages/prism/jsx');
22
+ var langTsx = require('react-syntax-highlighter/dist/esm/languages/prism/tsx');
23
+ var langCss = require('react-syntax-highlighter/dist/esm/languages/prism/css');
24
+ var langMarkdown = require('react-syntax-highlighter/dist/esm/languages/prism/markdown');
25
+ var langBash = require('react-syntax-highlighter/dist/esm/languages/prism/bash');
26
+ var langYaml = require('react-syntax-highlighter/dist/esm/languages/prism/yaml');
27
+ var langRust = require('react-syntax-highlighter/dist/esm/languages/prism/rust');
28
+ var langPython = require('react-syntax-highlighter/dist/esm/languages/prism/python');
29
+ var langSql = require('react-syntax-highlighter/dist/esm/languages/prism/sql');
30
+ var langDiff = require('react-syntax-highlighter/dist/esm/languages/prism/diff');
31
+ var langToml = require('react-syntax-highlighter/dist/esm/languages/prism/toml');
32
+ var langGo = require('react-syntax-highlighter/dist/esm/languages/prism/go');
33
+ var langGraphql = require('react-syntax-highlighter/dist/esm/languages/prism/graphql');
17
34
  var reactLeaflet = require('react-leaflet');
18
35
  var L = require('leaflet');
19
36
  require('leaflet/dist/leaflet.css');
@@ -50,6 +67,22 @@ var remarkMath__default = /*#__PURE__*/_interopDefault(remarkMath);
50
67
  var rehypeKatex__default = /*#__PURE__*/_interopDefault(rehypeKatex);
51
68
  var SyntaxHighlighter__default = /*#__PURE__*/_interopDefault(SyntaxHighlighter);
52
69
  var dark__default = /*#__PURE__*/_interopDefault(dark);
70
+ var langJson__default = /*#__PURE__*/_interopDefault(langJson);
71
+ var langJavascript__default = /*#__PURE__*/_interopDefault(langJavascript);
72
+ var langTypescript__default = /*#__PURE__*/_interopDefault(langTypescript);
73
+ var langJsx__default = /*#__PURE__*/_interopDefault(langJsx);
74
+ var langTsx__default = /*#__PURE__*/_interopDefault(langTsx);
75
+ var langCss__default = /*#__PURE__*/_interopDefault(langCss);
76
+ var langMarkdown__default = /*#__PURE__*/_interopDefault(langMarkdown);
77
+ var langBash__default = /*#__PURE__*/_interopDefault(langBash);
78
+ var langYaml__default = /*#__PURE__*/_interopDefault(langYaml);
79
+ var langRust__default = /*#__PURE__*/_interopDefault(langRust);
80
+ var langPython__default = /*#__PURE__*/_interopDefault(langPython);
81
+ var langSql__default = /*#__PURE__*/_interopDefault(langSql);
82
+ var langDiff__default = /*#__PURE__*/_interopDefault(langDiff);
83
+ var langToml__default = /*#__PURE__*/_interopDefault(langToml);
84
+ var langGo__default = /*#__PURE__*/_interopDefault(langGo);
85
+ var langGraphql__default = /*#__PURE__*/_interopDefault(langGraphql);
53
86
  var L__default = /*#__PURE__*/_interopDefault(L);
54
87
 
55
88
  var __defProp = Object.defineProperty;
@@ -8661,6 +8694,51 @@ var MarkdownContent = React90__namespace.default.memo(
8661
8694
  (prev, next) => prev.content === next.content && prev.className === next.className && prev.direction === next.direction
8662
8695
  );
8663
8696
  MarkdownContent.displayName = "MarkdownContent";
8697
+ SyntaxHighlighter__default.default.registerLanguage("json", langJson__default.default);
8698
+ SyntaxHighlighter__default.default.registerLanguage("javascript", langJavascript__default.default);
8699
+ SyntaxHighlighter__default.default.registerLanguage("js", langJavascript__default.default);
8700
+ SyntaxHighlighter__default.default.registerLanguage("typescript", langTypescript__default.default);
8701
+ SyntaxHighlighter__default.default.registerLanguage("ts", langTypescript__default.default);
8702
+ SyntaxHighlighter__default.default.registerLanguage("jsx", langJsx__default.default);
8703
+ SyntaxHighlighter__default.default.registerLanguage("tsx", langTsx__default.default);
8704
+ SyntaxHighlighter__default.default.registerLanguage("css", langCss__default.default);
8705
+ SyntaxHighlighter__default.default.registerLanguage("markdown", langMarkdown__default.default);
8706
+ SyntaxHighlighter__default.default.registerLanguage("md", langMarkdown__default.default);
8707
+ SyntaxHighlighter__default.default.registerLanguage("bash", langBash__default.default);
8708
+ SyntaxHighlighter__default.default.registerLanguage("shell", langBash__default.default);
8709
+ SyntaxHighlighter__default.default.registerLanguage("sh", langBash__default.default);
8710
+ SyntaxHighlighter__default.default.registerLanguage("yaml", langYaml__default.default);
8711
+ SyntaxHighlighter__default.default.registerLanguage("yml", langYaml__default.default);
8712
+ SyntaxHighlighter__default.default.registerLanguage("rust", langRust__default.default);
8713
+ SyntaxHighlighter__default.default.registerLanguage("python", langPython__default.default);
8714
+ SyntaxHighlighter__default.default.registerLanguage("py", langPython__default.default);
8715
+ SyntaxHighlighter__default.default.registerLanguage("sql", langSql__default.default);
8716
+ SyntaxHighlighter__default.default.registerLanguage("diff", langDiff__default.default);
8717
+ SyntaxHighlighter__default.default.registerLanguage("toml", langToml__default.default);
8718
+ SyntaxHighlighter__default.default.registerLanguage("go", langGo__default.default);
8719
+ SyntaxHighlighter__default.default.registerLanguage("graphql", langGraphql__default.default);
8720
+ SyntaxHighlighter__default.default.registerLanguage("orb", syntax.orbLanguage);
8721
+ var orbStyleOverrides = {
8722
+ "orb-binding": { color: syntax.ORB_COLORS.dark.binding, fontWeight: "bold" },
8723
+ "orb-effect": { color: syntax.ORB_COLORS.dark.effect, fontWeight: "bold" },
8724
+ "orb-event": { color: syntax.ORB_COLORS.dark.event },
8725
+ "orb-slot": { color: syntax.ORB_COLORS.dark.uiSlot },
8726
+ "orb-structural": { color: syntax.ORB_COLORS.dark.structural },
8727
+ "orb-field-type": { color: syntax.ORB_COLORS.dark.fieldType },
8728
+ "orb-persistence": { color: syntax.ORB_COLORS.dark.persistence },
8729
+ "orb-pattern": { color: syntax.ORB_COLORS.dark.pattern },
8730
+ "orb-behavior": { color: syntax.ORB_COLORS.dark.behavior },
8731
+ "orb-unknown-op": { color: syntax.ORB_COLORS.dark.error, textDecoration: "wavy underline" },
8732
+ "orb-op-arithmetic": { color: syntax.ORB_COLORS.dark.arithmetic, fontWeight: "bold" },
8733
+ "orb-op-comparison": { color: syntax.ORB_COLORS.dark.comparison },
8734
+ "orb-op-logic": { color: syntax.ORB_COLORS.dark.logic },
8735
+ "orb-op-string": { color: syntax.ORB_COLORS.dark.string },
8736
+ "orb-op-collection": { color: syntax.ORB_COLORS.dark.collection },
8737
+ "orb-op-time": { color: syntax.ORB_COLORS.dark.time },
8738
+ "orb-op-control": { color: syntax.ORB_COLORS.dark.control },
8739
+ "orb-op-async": { color: syntax.ORB_COLORS.dark.async }
8740
+ };
8741
+ var orbStyle = { ...dark__default.default, ...orbStyleOverrides };
8664
8742
  var CodeBlock = React90__namespace.default.memo(
8665
8743
  ({
8666
8744
  code: rawCode,
@@ -8671,6 +8749,8 @@ var CodeBlock = React90__namespace.default.memo(
8671
8749
  className
8672
8750
  }) => {
8673
8751
  const code = typeof rawCode === "string" ? rawCode : String(rawCode ?? "");
8752
+ const isOrb = language === "orb";
8753
+ const activeStyle = isOrb ? orbStyle : dark__default.default;
8674
8754
  const eventBus = useEventBus();
8675
8755
  const { t: _t } = useTranslate();
8676
8756
  const scrollRef = React90.useRef(null);
@@ -8750,7 +8830,7 @@ var CodeBlock = React90__namespace.default.memo(
8750
8830
  {
8751
8831
  PreTag: "div",
8752
8832
  language,
8753
- style: dark__default.default,
8833
+ style: activeStyle,
8754
8834
  customStyle: {
8755
8835
  backgroundColor: "transparent",
8756
8836
  borderRadius: 0,
@@ -33009,22 +33089,33 @@ function VerifyModePanel({
33009
33089
  }) {
33010
33090
  const scrollRef = React90__namespace.useRef(null);
33011
33091
  const prevCountRef = React90__namespace.useRef(0);
33092
+ const [walkStep, setWalkStep] = React90__namespace.useState(null);
33093
+ React90__namespace.useEffect(() => {
33094
+ const interval = setInterval(() => {
33095
+ const w = window;
33096
+ const step = w.__orbitalWalkStep;
33097
+ if (step) setWalkStep(step);
33098
+ }, 300);
33099
+ return () => clearInterval(interval);
33100
+ }, []);
33012
33101
  React90__namespace.useEffect(() => {
33013
33102
  if (transitions.length > prevCountRef.current && scrollRef.current) {
33014
33103
  scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
33015
33104
  }
33016
33105
  prevCountRef.current = transitions.length;
33017
33106
  }, [transitions.length]);
33018
- return /* @__PURE__ */ jsxRuntime.jsxs(
33107
+ const hudBottom = typeof document !== "undefined" ? document.getElementById("slot-hud-bottom") : null;
33108
+ const panel = /* @__PURE__ */ jsxRuntime.jsxs(
33019
33109
  "div",
33020
33110
  {
33021
33111
  className: cn(
33022
33112
  "runtime-debugger runtime-debugger--verify",
33023
- "fixed bottom-0 left-0 right-0 flex flex-col bg-gray-900 text-white border-t-2 border-cyan-500",
33113
+ "flex flex-col bg-gray-900 text-white border-t-2 border-cyan-500",
33114
+ hudBottom ? "" : "fixed bottom-0 left-0 right-0",
33024
33115
  className
33025
33116
  ),
33026
33117
  "data-testid": "debugger-verify",
33027
- style: { zIndex: 99999, height: "25vh" },
33118
+ style: { height: "25vh", zIndex: hudBottom ? void 0 : 40 },
33028
33119
  children: [
33029
33120
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-3 py-1.5 flex items-center gap-3 text-xs font-mono border-b border-gray-700 flex-shrink-0", children: [
33030
33121
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
@@ -33038,10 +33129,35 @@ function VerifyModePanel({
33038
33129
  ] }),
33039
33130
  traitStates && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-cyan-400 truncate max-w-[400px]", children: traitStates })
33040
33131
  ] }),
33041
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-gray-500 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) })
33132
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
33133
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-gray-500 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsxRuntime.jsx(TransitionRow, { trace }, trace.id)) }) }) }),
33134
+ walkStep && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-56 flex-shrink-0 border-l border-gray-700 px-2 py-1 text-xs font-mono overflow-y-auto", children: [
33135
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-cyan-400 font-bold mb-1", children: [
33136
+ "Walk Step ",
33137
+ walkStep.stepIndex,
33138
+ "/",
33139
+ walkStep.stepTotal
33140
+ ] }),
33141
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-gray-300 mb-1", children: walkStep.traitName }),
33142
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 mb-1", children: [
33143
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-300", children: walkStep.from }),
33144
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-500", children: "--" }),
33145
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-green-300", children: walkStep.event }),
33146
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-500", children: "-->" }),
33147
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-yellow-300", children: walkStep.to })
33148
+ ] }),
33149
+ walkStep.guardCase && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: walkStep.guardCase === "pass" ? "text-green-400" : "text-red-400", children: [
33150
+ "guard: ",
33151
+ walkStep.guardCase
33152
+ ] }),
33153
+ walkStep.isRepositioning && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-gray-500 italic", children: "repositioning" }),
33154
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: walkStep.accepted ? "text-green-400 mt-1" : "text-red-400 mt-1", children: walkStep.accepted ? "\u2713 accepted" : "\u2717 rejected" })
33155
+ ] })
33156
+ ] })
33042
33157
  ]
33043
33158
  }
33044
33159
  );
33160
+ return hudBottom ? reactDom.createPortal(panel, hudBottom) : panel;
33045
33161
  }
33046
33162
  function RuntimeDebugger({
33047
33163
  position = "bottom-right",
@@ -12,8 +12,25 @@ import ReactMarkdown from 'react-markdown';
12
12
  import remarkGfm from 'remark-gfm';
13
13
  import remarkMath from 'remark-math';
14
14
  import rehypeKatex from 'rehype-katex';
15
- import SyntaxHighlighter from 'react-syntax-highlighter/dist/esm/prism';
15
+ import SyntaxHighlighter from 'react-syntax-highlighter/dist/esm/prism-light';
16
16
  import dark from 'react-syntax-highlighter/dist/esm/styles/prism/vsc-dark-plus';
17
+ import { orbLanguage, ORB_COLORS } from '@almadar/syntax';
18
+ import langJson from 'react-syntax-highlighter/dist/esm/languages/prism/json';
19
+ import langJavascript from 'react-syntax-highlighter/dist/esm/languages/prism/javascript';
20
+ import langTypescript from 'react-syntax-highlighter/dist/esm/languages/prism/typescript';
21
+ import langJsx from 'react-syntax-highlighter/dist/esm/languages/prism/jsx';
22
+ import langTsx from 'react-syntax-highlighter/dist/esm/languages/prism/tsx';
23
+ import langCss from 'react-syntax-highlighter/dist/esm/languages/prism/css';
24
+ import langMarkdown from 'react-syntax-highlighter/dist/esm/languages/prism/markdown';
25
+ import langBash from 'react-syntax-highlighter/dist/esm/languages/prism/bash';
26
+ import langYaml from 'react-syntax-highlighter/dist/esm/languages/prism/yaml';
27
+ import langRust from 'react-syntax-highlighter/dist/esm/languages/prism/rust';
28
+ import langPython from 'react-syntax-highlighter/dist/esm/languages/prism/python';
29
+ import langSql from 'react-syntax-highlighter/dist/esm/languages/prism/sql';
30
+ import langDiff from 'react-syntax-highlighter/dist/esm/languages/prism/diff';
31
+ import langToml from 'react-syntax-highlighter/dist/esm/languages/prism/toml';
32
+ import langGo from 'react-syntax-highlighter/dist/esm/languages/prism/go';
33
+ import langGraphql from 'react-syntax-highlighter/dist/esm/languages/prism/graphql';
17
34
  import { MapContainer, TileLayer, Marker, Popup, useMap } from 'react-leaflet';
18
35
  import L from 'leaflet';
19
36
  import 'leaflet/dist/leaflet.css';
@@ -8631,6 +8648,51 @@ var MarkdownContent = React90__default.memo(
8631
8648
  (prev, next) => prev.content === next.content && prev.className === next.className && prev.direction === next.direction
8632
8649
  );
8633
8650
  MarkdownContent.displayName = "MarkdownContent";
8651
+ SyntaxHighlighter.registerLanguage("json", langJson);
8652
+ SyntaxHighlighter.registerLanguage("javascript", langJavascript);
8653
+ SyntaxHighlighter.registerLanguage("js", langJavascript);
8654
+ SyntaxHighlighter.registerLanguage("typescript", langTypescript);
8655
+ SyntaxHighlighter.registerLanguage("ts", langTypescript);
8656
+ SyntaxHighlighter.registerLanguage("jsx", langJsx);
8657
+ SyntaxHighlighter.registerLanguage("tsx", langTsx);
8658
+ SyntaxHighlighter.registerLanguage("css", langCss);
8659
+ SyntaxHighlighter.registerLanguage("markdown", langMarkdown);
8660
+ SyntaxHighlighter.registerLanguage("md", langMarkdown);
8661
+ SyntaxHighlighter.registerLanguage("bash", langBash);
8662
+ SyntaxHighlighter.registerLanguage("shell", langBash);
8663
+ SyntaxHighlighter.registerLanguage("sh", langBash);
8664
+ SyntaxHighlighter.registerLanguage("yaml", langYaml);
8665
+ SyntaxHighlighter.registerLanguage("yml", langYaml);
8666
+ SyntaxHighlighter.registerLanguage("rust", langRust);
8667
+ SyntaxHighlighter.registerLanguage("python", langPython);
8668
+ SyntaxHighlighter.registerLanguage("py", langPython);
8669
+ SyntaxHighlighter.registerLanguage("sql", langSql);
8670
+ SyntaxHighlighter.registerLanguage("diff", langDiff);
8671
+ SyntaxHighlighter.registerLanguage("toml", langToml);
8672
+ SyntaxHighlighter.registerLanguage("go", langGo);
8673
+ SyntaxHighlighter.registerLanguage("graphql", langGraphql);
8674
+ SyntaxHighlighter.registerLanguage("orb", orbLanguage);
8675
+ var orbStyleOverrides = {
8676
+ "orb-binding": { color: ORB_COLORS.dark.binding, fontWeight: "bold" },
8677
+ "orb-effect": { color: ORB_COLORS.dark.effect, fontWeight: "bold" },
8678
+ "orb-event": { color: ORB_COLORS.dark.event },
8679
+ "orb-slot": { color: ORB_COLORS.dark.uiSlot },
8680
+ "orb-structural": { color: ORB_COLORS.dark.structural },
8681
+ "orb-field-type": { color: ORB_COLORS.dark.fieldType },
8682
+ "orb-persistence": { color: ORB_COLORS.dark.persistence },
8683
+ "orb-pattern": { color: ORB_COLORS.dark.pattern },
8684
+ "orb-behavior": { color: ORB_COLORS.dark.behavior },
8685
+ "orb-unknown-op": { color: ORB_COLORS.dark.error, textDecoration: "wavy underline" },
8686
+ "orb-op-arithmetic": { color: ORB_COLORS.dark.arithmetic, fontWeight: "bold" },
8687
+ "orb-op-comparison": { color: ORB_COLORS.dark.comparison },
8688
+ "orb-op-logic": { color: ORB_COLORS.dark.logic },
8689
+ "orb-op-string": { color: ORB_COLORS.dark.string },
8690
+ "orb-op-collection": { color: ORB_COLORS.dark.collection },
8691
+ "orb-op-time": { color: ORB_COLORS.dark.time },
8692
+ "orb-op-control": { color: ORB_COLORS.dark.control },
8693
+ "orb-op-async": { color: ORB_COLORS.dark.async }
8694
+ };
8695
+ var orbStyle = { ...dark, ...orbStyleOverrides };
8634
8696
  var CodeBlock = React90__default.memo(
8635
8697
  ({
8636
8698
  code: rawCode,
@@ -8641,6 +8703,8 @@ var CodeBlock = React90__default.memo(
8641
8703
  className
8642
8704
  }) => {
8643
8705
  const code = typeof rawCode === "string" ? rawCode : String(rawCode ?? "");
8706
+ const isOrb = language === "orb";
8707
+ const activeStyle = isOrb ? orbStyle : dark;
8644
8708
  const eventBus = useEventBus();
8645
8709
  const { t: _t } = useTranslate();
8646
8710
  const scrollRef = useRef(null);
@@ -8720,7 +8784,7 @@ var CodeBlock = React90__default.memo(
8720
8784
  {
8721
8785
  PreTag: "div",
8722
8786
  language,
8723
- style: dark,
8787
+ style: activeStyle,
8724
8788
  customStyle: {
8725
8789
  backgroundColor: "transparent",
8726
8790
  borderRadius: 0,
@@ -32979,22 +33043,33 @@ function VerifyModePanel({
32979
33043
  }) {
32980
33044
  const scrollRef = React90.useRef(null);
32981
33045
  const prevCountRef = React90.useRef(0);
33046
+ const [walkStep, setWalkStep] = React90.useState(null);
33047
+ React90.useEffect(() => {
33048
+ const interval = setInterval(() => {
33049
+ const w = window;
33050
+ const step = w.__orbitalWalkStep;
33051
+ if (step) setWalkStep(step);
33052
+ }, 300);
33053
+ return () => clearInterval(interval);
33054
+ }, []);
32982
33055
  React90.useEffect(() => {
32983
33056
  if (transitions.length > prevCountRef.current && scrollRef.current) {
32984
33057
  scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
32985
33058
  }
32986
33059
  prevCountRef.current = transitions.length;
32987
33060
  }, [transitions.length]);
32988
- return /* @__PURE__ */ jsxs(
33061
+ const hudBottom = typeof document !== "undefined" ? document.getElementById("slot-hud-bottom") : null;
33062
+ const panel = /* @__PURE__ */ jsxs(
32989
33063
  "div",
32990
33064
  {
32991
33065
  className: cn(
32992
33066
  "runtime-debugger runtime-debugger--verify",
32993
- "fixed bottom-0 left-0 right-0 flex flex-col bg-gray-900 text-white border-t-2 border-cyan-500",
33067
+ "flex flex-col bg-gray-900 text-white border-t-2 border-cyan-500",
33068
+ hudBottom ? "" : "fixed bottom-0 left-0 right-0",
32994
33069
  className
32995
33070
  ),
32996
33071
  "data-testid": "debugger-verify",
32997
- style: { zIndex: 99999, height: "25vh" },
33072
+ style: { height: "25vh", zIndex: hudBottom ? void 0 : 40 },
32998
33073
  children: [
32999
33074
  /* @__PURE__ */ jsxs("div", { className: "px-3 py-1.5 flex items-center gap-3 text-xs font-mono border-b border-gray-700 flex-shrink-0", children: [
33000
33075
  /* @__PURE__ */ jsx(Badge, { variant: failedChecks > 0 ? "danger" : "success", size: "sm", children: failedChecks > 0 ? `${failedChecks} fail` : "OK" }),
@@ -33008,10 +33083,35 @@ function VerifyModePanel({
33008
33083
  ] }),
33009
33084
  traitStates && /* @__PURE__ */ jsx("span", { className: "text-cyan-400 truncate max-w-[400px]", children: traitStates })
33010
33085
  ] }),
33011
- /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-gray-500 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) })
33086
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
33087
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "px-2 py-1", children: transitions.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-gray-500 text-xs font-mono py-2 text-center", children: "Waiting for transitions..." }) : /* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: transitions.map((trace) => /* @__PURE__ */ jsx(TransitionRow, { trace }, trace.id)) }) }) }),
33088
+ walkStep && /* @__PURE__ */ jsxs("div", { className: "w-56 flex-shrink-0 border-l border-gray-700 px-2 py-1 text-xs font-mono overflow-y-auto", children: [
33089
+ /* @__PURE__ */ jsxs("div", { className: "text-cyan-400 font-bold mb-1", children: [
33090
+ "Walk Step ",
33091
+ walkStep.stepIndex,
33092
+ "/",
33093
+ walkStep.stepTotal
33094
+ ] }),
33095
+ /* @__PURE__ */ jsx("div", { className: "text-gray-300 mb-1", children: walkStep.traitName }),
33096
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 mb-1", children: [
33097
+ /* @__PURE__ */ jsx("span", { className: "text-yellow-300", children: walkStep.from }),
33098
+ /* @__PURE__ */ jsx("span", { className: "text-gray-500", children: "--" }),
33099
+ /* @__PURE__ */ jsx("span", { className: "text-green-300", children: walkStep.event }),
33100
+ /* @__PURE__ */ jsx("span", { className: "text-gray-500", children: "-->" }),
33101
+ /* @__PURE__ */ jsx("span", { className: "text-yellow-300", children: walkStep.to })
33102
+ ] }),
33103
+ walkStep.guardCase && /* @__PURE__ */ jsxs("div", { className: walkStep.guardCase === "pass" ? "text-green-400" : "text-red-400", children: [
33104
+ "guard: ",
33105
+ walkStep.guardCase
33106
+ ] }),
33107
+ walkStep.isRepositioning && /* @__PURE__ */ jsx("div", { className: "text-gray-500 italic", children: "repositioning" }),
33108
+ /* @__PURE__ */ jsx("div", { className: walkStep.accepted ? "text-green-400 mt-1" : "text-red-400 mt-1", children: walkStep.accepted ? "\u2713 accepted" : "\u2717 rejected" })
33109
+ ] })
33110
+ ] })
33012
33111
  ]
33013
33112
  }
33014
33113
  );
33114
+ return hudBottom ? createPortal(panel, hudBottom) : panel;
33015
33115
  }
33016
33116
  function RuntimeDebugger({
33017
33117
  position = "bottom-right",
@@ -28,6 +28,10 @@ export interface FlowCanvasProps {
28
28
  }) => void;
29
29
  onLevelChange?: (level: ViewLevel, orbital?: string) => void;
30
30
  initialOrbital?: string;
31
+ /** Enable editing in the inspector. When true, fields become inputs. */
32
+ editable?: boolean;
33
+ /** Called when the user edits the schema via the inspector. */
34
+ onSchemaChange?: (schema: OrbitalSchema) => void;
31
35
  /** @deprecated Use onNodeClick instead. Kept for AvlCosmicZoom compat. */
32
36
  onZoomChange?: (level: string, context: Record<string, string | undefined>) => void;
33
37
  /** @deprecated Not used in V3. */
@@ -0,0 +1,29 @@
1
+ /**
2
+ * OrbInspector
3
+ *
4
+ * Universal contextual inspector for .orb programs. Built into FlowCanvas.
5
+ * Two tabs: Inspector (contextual sections) and Code (.orb syntax view).
6
+ *
7
+ * Inspector shows different sections based on what was clicked:
8
+ * - Orbital header → entity fields, traits, pages
9
+ * - Pattern element → pattern props, entity (if entity-aware), transition (if fires event)
10
+ * - Transition node → state diagram, guard, effects, render-ui source
11
+ *
12
+ * Code tab shows the .orb representation of the selected context.
13
+ *
14
+ * When `editable` is true, inspector fields become inputs.
15
+ */
16
+ import React from 'react';
17
+ import type { OrbitalSchema } from '@almadar/core';
18
+ import type { PreviewNodeData } from '../../molecules/avl/avl-preview-types';
19
+ export interface OrbInspectorProps {
20
+ node: PreviewNodeData;
21
+ schema: OrbitalSchema;
22
+ editable?: boolean;
23
+ onSchemaChange?: (schema: OrbitalSchema) => void;
24
+ onClose: () => void;
25
+ }
26
+ export declare function OrbInspector({ node, schema, editable, onSchemaChange, onClose }: OrbInspectorProps): React.ReactElement;
27
+ export declare namespace OrbInspector {
28
+ var displayName: string;
29
+ }
@@ -6,6 +6,7 @@
6
6
  * @packageDocumentation
7
7
  */
8
8
  export { FlowCanvas, type FlowCanvasProps } from './FlowCanvas';
9
+ export { OrbInspector, type OrbInspectorProps } from './OrbInspector';
9
10
  export { ZoomBreadcrumb, type ZoomBreadcrumbProps } from './ZoomBreadcrumb';
10
11
  export { ZoomLegend, type ZoomLegendProps } from './ZoomLegend';
11
12
  export { AvlCosmicZoom, type AvlCosmicZoomProps } from './AvlCosmicZoom';
@@ -18,8 +18,25 @@ var ReactMarkdown = require('react-markdown');
18
18
  var remarkGfm = require('remark-gfm');
19
19
  var remarkMath = require('remark-math');
20
20
  var rehypeKatex = require('rehype-katex');
21
- var SyntaxHighlighter = require('react-syntax-highlighter/dist/esm/prism');
21
+ var SyntaxHighlighter = require('react-syntax-highlighter/dist/esm/prism-light');
22
22
  var dark = require('react-syntax-highlighter/dist/esm/styles/prism/vsc-dark-plus');
23
+ var syntax = require('@almadar/syntax');
24
+ var langJson = require('react-syntax-highlighter/dist/esm/languages/prism/json');
25
+ var langJavascript = require('react-syntax-highlighter/dist/esm/languages/prism/javascript');
26
+ var langTypescript = require('react-syntax-highlighter/dist/esm/languages/prism/typescript');
27
+ var langJsx = require('react-syntax-highlighter/dist/esm/languages/prism/jsx');
28
+ var langTsx = require('react-syntax-highlighter/dist/esm/languages/prism/tsx');
29
+ var langCss = require('react-syntax-highlighter/dist/esm/languages/prism/css');
30
+ var langMarkdown = require('react-syntax-highlighter/dist/esm/languages/prism/markdown');
31
+ var langBash = require('react-syntax-highlighter/dist/esm/languages/prism/bash');
32
+ var langYaml = require('react-syntax-highlighter/dist/esm/languages/prism/yaml');
33
+ var langRust = require('react-syntax-highlighter/dist/esm/languages/prism/rust');
34
+ var langPython = require('react-syntax-highlighter/dist/esm/languages/prism/python');
35
+ var langSql = require('react-syntax-highlighter/dist/esm/languages/prism/sql');
36
+ var langDiff = require('react-syntax-highlighter/dist/esm/languages/prism/diff');
37
+ var langToml = require('react-syntax-highlighter/dist/esm/languages/prism/toml');
38
+ var langGo = require('react-syntax-highlighter/dist/esm/languages/prism/go');
39
+ var langGraphql = require('react-syntax-highlighter/dist/esm/languages/prism/graphql');
23
40
 
24
41
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
25
42
 
@@ -50,6 +67,22 @@ var remarkMath__default = /*#__PURE__*/_interopDefault(remarkMath);
50
67
  var rehypeKatex__default = /*#__PURE__*/_interopDefault(rehypeKatex);
51
68
  var SyntaxHighlighter__default = /*#__PURE__*/_interopDefault(SyntaxHighlighter);
52
69
  var dark__default = /*#__PURE__*/_interopDefault(dark);
70
+ var langJson__default = /*#__PURE__*/_interopDefault(langJson);
71
+ var langJavascript__default = /*#__PURE__*/_interopDefault(langJavascript);
72
+ var langTypescript__default = /*#__PURE__*/_interopDefault(langTypescript);
73
+ var langJsx__default = /*#__PURE__*/_interopDefault(langJsx);
74
+ var langTsx__default = /*#__PURE__*/_interopDefault(langTsx);
75
+ var langCss__default = /*#__PURE__*/_interopDefault(langCss);
76
+ var langMarkdown__default = /*#__PURE__*/_interopDefault(langMarkdown);
77
+ var langBash__default = /*#__PURE__*/_interopDefault(langBash);
78
+ var langYaml__default = /*#__PURE__*/_interopDefault(langYaml);
79
+ var langRust__default = /*#__PURE__*/_interopDefault(langRust);
80
+ var langPython__default = /*#__PURE__*/_interopDefault(langPython);
81
+ var langSql__default = /*#__PURE__*/_interopDefault(langSql);
82
+ var langDiff__default = /*#__PURE__*/_interopDefault(langDiff);
83
+ var langToml__default = /*#__PURE__*/_interopDefault(langToml);
84
+ var langGo__default = /*#__PURE__*/_interopDefault(langGo);
85
+ var langGraphql__default = /*#__PURE__*/_interopDefault(langGraphql);
53
86
 
54
87
  var __defProp = Object.defineProperty;
55
88
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -3270,6 +3303,51 @@ var MarkdownContent = React113__namespace.default.memo(
3270
3303
  (prev, next) => prev.content === next.content && prev.className === next.className && prev.direction === next.direction
3271
3304
  );
3272
3305
  MarkdownContent.displayName = "MarkdownContent";
3306
+ SyntaxHighlighter__default.default.registerLanguage("json", langJson__default.default);
3307
+ SyntaxHighlighter__default.default.registerLanguage("javascript", langJavascript__default.default);
3308
+ SyntaxHighlighter__default.default.registerLanguage("js", langJavascript__default.default);
3309
+ SyntaxHighlighter__default.default.registerLanguage("typescript", langTypescript__default.default);
3310
+ SyntaxHighlighter__default.default.registerLanguage("ts", langTypescript__default.default);
3311
+ SyntaxHighlighter__default.default.registerLanguage("jsx", langJsx__default.default);
3312
+ SyntaxHighlighter__default.default.registerLanguage("tsx", langTsx__default.default);
3313
+ SyntaxHighlighter__default.default.registerLanguage("css", langCss__default.default);
3314
+ SyntaxHighlighter__default.default.registerLanguage("markdown", langMarkdown__default.default);
3315
+ SyntaxHighlighter__default.default.registerLanguage("md", langMarkdown__default.default);
3316
+ SyntaxHighlighter__default.default.registerLanguage("bash", langBash__default.default);
3317
+ SyntaxHighlighter__default.default.registerLanguage("shell", langBash__default.default);
3318
+ SyntaxHighlighter__default.default.registerLanguage("sh", langBash__default.default);
3319
+ SyntaxHighlighter__default.default.registerLanguage("yaml", langYaml__default.default);
3320
+ SyntaxHighlighter__default.default.registerLanguage("yml", langYaml__default.default);
3321
+ SyntaxHighlighter__default.default.registerLanguage("rust", langRust__default.default);
3322
+ SyntaxHighlighter__default.default.registerLanguage("python", langPython__default.default);
3323
+ SyntaxHighlighter__default.default.registerLanguage("py", langPython__default.default);
3324
+ SyntaxHighlighter__default.default.registerLanguage("sql", langSql__default.default);
3325
+ SyntaxHighlighter__default.default.registerLanguage("diff", langDiff__default.default);
3326
+ SyntaxHighlighter__default.default.registerLanguage("toml", langToml__default.default);
3327
+ SyntaxHighlighter__default.default.registerLanguage("go", langGo__default.default);
3328
+ SyntaxHighlighter__default.default.registerLanguage("graphql", langGraphql__default.default);
3329
+ SyntaxHighlighter__default.default.registerLanguage("orb", syntax.orbLanguage);
3330
+ var orbStyleOverrides = {
3331
+ "orb-binding": { color: syntax.ORB_COLORS.dark.binding, fontWeight: "bold" },
3332
+ "orb-effect": { color: syntax.ORB_COLORS.dark.effect, fontWeight: "bold" },
3333
+ "orb-event": { color: syntax.ORB_COLORS.dark.event },
3334
+ "orb-slot": { color: syntax.ORB_COLORS.dark.uiSlot },
3335
+ "orb-structural": { color: syntax.ORB_COLORS.dark.structural },
3336
+ "orb-field-type": { color: syntax.ORB_COLORS.dark.fieldType },
3337
+ "orb-persistence": { color: syntax.ORB_COLORS.dark.persistence },
3338
+ "orb-pattern": { color: syntax.ORB_COLORS.dark.pattern },
3339
+ "orb-behavior": { color: syntax.ORB_COLORS.dark.behavior },
3340
+ "orb-unknown-op": { color: syntax.ORB_COLORS.dark.error, textDecoration: "wavy underline" },
3341
+ "orb-op-arithmetic": { color: syntax.ORB_COLORS.dark.arithmetic, fontWeight: "bold" },
3342
+ "orb-op-comparison": { color: syntax.ORB_COLORS.dark.comparison },
3343
+ "orb-op-logic": { color: syntax.ORB_COLORS.dark.logic },
3344
+ "orb-op-string": { color: syntax.ORB_COLORS.dark.string },
3345
+ "orb-op-collection": { color: syntax.ORB_COLORS.dark.collection },
3346
+ "orb-op-time": { color: syntax.ORB_COLORS.dark.time },
3347
+ "orb-op-control": { color: syntax.ORB_COLORS.dark.control },
3348
+ "orb-op-async": { color: syntax.ORB_COLORS.dark.async }
3349
+ };
3350
+ var orbStyle = { ...dark__default.default, ...orbStyleOverrides };
3273
3351
  var CodeBlock = React113__namespace.default.memo(
3274
3352
  ({
3275
3353
  code: rawCode,
@@ -3280,6 +3358,8 @@ var CodeBlock = React113__namespace.default.memo(
3280
3358
  className
3281
3359
  }) => {
3282
3360
  const code = typeof rawCode === "string" ? rawCode : String(rawCode ?? "");
3361
+ const isOrb = language === "orb";
3362
+ const activeStyle = isOrb ? orbStyle : dark__default.default;
3283
3363
  const eventBus = useEventBus();
3284
3364
  const { t: _t } = useTranslate();
3285
3365
  const scrollRef = React113.useRef(null);
@@ -3359,7 +3439,7 @@ var CodeBlock = React113__namespace.default.memo(
3359
3439
  {
3360
3440
  PreTag: "div",
3361
3441
  language,
3362
- style: dark__default.default,
3442
+ style: activeStyle,
3363
3443
  customStyle: {
3364
3444
  backgroundColor: "transparent",
3365
3445
  borderRadius: 0,