@timeax/service-builder 0.0.8 → 0.0.9

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/index.js CHANGED
@@ -3616,6 +3616,136 @@ function commentPosition(anchor, state) {
3616
3616
  }
3617
3617
  return { x: 0, y: 0 };
3618
3618
  }
3619
+ function stableDataString(value) {
3620
+ if (value === null || value === void 0) return String(value);
3621
+ if (typeof value !== "object") return String(value);
3622
+ if (Array.isArray(value)) return `[${value.map(stableDataString).join(",")}]`;
3623
+ const obj = value;
3624
+ const keys = Object.keys(obj).sort();
3625
+ return `{${keys.map((key) => `${key}:${stableDataString(obj[key])}`).join(",")}}`;
3626
+ }
3627
+ function shallowEqualObject(a, b) {
3628
+ if (a === b) return true;
3629
+ if (!a || !b) return false;
3630
+ const aKeys = Object.keys(a);
3631
+ const bKeys = Object.keys(b);
3632
+ if (aKeys.length !== bKeys.length) return false;
3633
+ for (const key of aKeys) {
3634
+ if (!(key in b) || a[key] !== b[key]) return false;
3635
+ }
3636
+ return true;
3637
+ }
3638
+ function applyNodeDecorator(node, decorator) {
3639
+ if (!decorator) return node;
3640
+ const dataPatch = "data" in decorator && decorator.data && typeof decorator.data === "object" ? decorator.data : void 0;
3641
+ const nextData = dataPatch ? { ...node.data, ...dataPatch } : node.data;
3642
+ const nextStyle = "style" in decorator ? decorator.style : node.style;
3643
+ const nextHidden = "hidden" in decorator ? decorator.hidden : node.hidden;
3644
+ const nextSelected = "selected" in decorator ? decorator.selected : node.selected;
3645
+ const dataChanged = dataPatch ? !shallowEqualObject(node.data, nextData) : false;
3646
+ const changed = dataChanged || nextStyle !== node.style || nextHidden !== node.hidden || nextSelected !== node.selected;
3647
+ if (!changed) return node;
3648
+ return {
3649
+ ...node,
3650
+ data: nextData,
3651
+ style: nextStyle,
3652
+ hidden: nextHidden,
3653
+ selected: nextSelected
3654
+ };
3655
+ }
3656
+ function applyEdgeDecorator(edge, decorator) {
3657
+ if (!decorator) return edge;
3658
+ const dataPatch = "data" in decorator && decorator.data && typeof decorator.data === "object" ? decorator.data : void 0;
3659
+ const nextData = dataPatch ? { ...edge.data, ...dataPatch } : edge.data;
3660
+ const nextStyle = "style" in decorator ? decorator.style : edge.style;
3661
+ const nextHidden = "hidden" in decorator ? decorator.hidden : edge.hidden;
3662
+ const dataChanged = dataPatch ? !shallowEqualObject(edge.data, nextData) : false;
3663
+ const changed = dataChanged || nextStyle !== edge.style || nextHidden !== edge.hidden;
3664
+ if (!changed) return edge;
3665
+ return {
3666
+ ...edge,
3667
+ data: nextData,
3668
+ style: nextStyle,
3669
+ hidden: nextHidden
3670
+ };
3671
+ }
3672
+ function mergeNodeRuntime(prev, next) {
3673
+ if (prev.type !== next.type) return next;
3674
+ return {
3675
+ ...prev,
3676
+ ...next,
3677
+ data: next.data,
3678
+ style: next.style,
3679
+ hidden: next.hidden,
3680
+ selected: next.selected,
3681
+ position: next.position
3682
+ };
3683
+ }
3684
+ function mergeEdgeRuntime(prev, next) {
3685
+ return {
3686
+ ...prev,
3687
+ ...next,
3688
+ data: next.data,
3689
+ style: next.style,
3690
+ hidden: next.hidden
3691
+ };
3692
+ }
3693
+ function mergeWithRuntime(prev, next) {
3694
+ const prevNodesById = new Map(prev.nodes.map((node) => [node.id, node]));
3695
+ const prevEdgesById = new Map(prev.edges.map((edge) => [edge.id, edge]));
3696
+ return {
3697
+ nodes: next.nodes.map((node) => {
3698
+ const prevNode = prevNodesById.get(node.id);
3699
+ return prevNode ? mergeNodeRuntime(prevNode, node) : node;
3700
+ }),
3701
+ edges: next.edges.map((edge) => {
3702
+ const prevEdge = prevEdgesById.get(edge.id);
3703
+ return prevEdge ? mergeEdgeRuntime(prevEdge, edge) : edge;
3704
+ })
3705
+ };
3706
+ }
3707
+ function modelEquivalent(a, b) {
3708
+ if (a.nodes.length !== b.nodes.length || a.edges.length !== b.edges.length) return false;
3709
+ for (let i = 0; i < a.nodes.length; i += 1) {
3710
+ const left = a.nodes[i];
3711
+ const right = b.nodes[i];
3712
+ if (left.id !== right.id || left.type !== right.type) return false;
3713
+ if (left.position.x !== right.position.x || left.position.y !== right.position.y) return false;
3714
+ if (left.selected !== right.selected) return false;
3715
+ if (left.hidden !== right.hidden) return false;
3716
+ if (!shallowEqualObject(left.style, right.style)) return false;
3717
+ if (!shallowEqualObject(left.data, right.data)) return false;
3718
+ }
3719
+ for (let i = 0; i < a.edges.length; i += 1) {
3720
+ const left = a.edges[i];
3721
+ const right = b.edges[i];
3722
+ if (left.id !== right.id || left.source !== right.source || left.target !== right.target) return false;
3723
+ if (left.hidden !== right.hidden) return false;
3724
+ if (!shallowEqualObject(left.style, right.style)) return false;
3725
+ if (!shallowEqualObject(left.data, right.data)) return false;
3726
+ }
3727
+ return true;
3728
+ }
3729
+ function buildSnapshotSig(state, api) {
3730
+ const graphNodeSig = state.graph.nodes.map((node) => `${node.id}:${node.kind}:${stableDataString(node.label)}`).join("|");
3731
+ const graphEdgeSig = state.graph.edges.map((edge) => `${edge.kind}:${edge.from}->${edge.to}`).join("|");
3732
+ const positionSig = Object.keys(state.positions).sort().map((id) => {
3733
+ const p = state.positions[id];
3734
+ return `${id}:${p?.x ?? 0},${p?.y ?? 0}`;
3735
+ }).join("|");
3736
+ const commentSig = api.comments.list().filter((thread) => !!thread.anchor).map((thread) => {
3737
+ const anchor = thread.anchor;
3738
+ if (!anchor) return `${thread.id}:none`;
3739
+ if (anchor.type === "free") return `${thread.id}:free:${anchor.position?.x ?? 0},${anchor.position?.y ?? 0}`;
3740
+ if (anchor.type === "node") return `${thread.id}:node:${anchor.nodeId}:${anchor.offset?.dx ?? 0},${anchor.offset?.dy ?? 0}`;
3741
+ return `${thread.id}:${anchor.type ?? "unknown"}`;
3742
+ }).sort().join("|");
3743
+ const selectionSig = Array.from(state.selection ?? []).map(String).sort().join("|");
3744
+ return {
3745
+ graph: `${graphNodeSig}__${graphEdgeSig}__${positionSig}__${commentSig}`,
3746
+ selection: selectionSig
3747
+ };
3748
+ }
3619
3749
  function toRF(state, api, opts) {
3620
3750
  const nodes = state.graph.nodes.map((n, index) => {
3621
3751
  const fallback = {
@@ -3683,18 +3813,97 @@ function useReactFlowAdapter(api, options = {}) {
3683
3813
  const lastViewportRef = useRef3(null);
3684
3814
  const interactionInProgressRef = useRef3(false);
3685
3815
  const pendingSyncRef = useRef3(false);
3816
+ const pendingDecoratorSyncRef = useRef3(false);
3686
3817
  const pendingNodeHistoryRef = useRef3({});
3687
3818
  const dragStartPositionsRef = useRef3({});
3819
+ const suppressSelectionSyncRef = useRef3(false);
3820
+ const suppressSelectionTokenRef = useRef3(0);
3821
+ const suppressSelectionRafRef = useRef3(null);
3822
+ const suppressSelectionTimerRef = useRef3(null);
3823
+ const lastAppliedSigRef = useRef3(null);
3824
+ const [rf, setRF] = useState5(
3825
+ () => toRF(api.snapshot(), api, {
3826
+ nodeDecorators: nodeDecoratorsRef.current,
3827
+ edgeDecorators: edgeDecoratorsRef.current
3828
+ })
3829
+ );
3830
+ const beginAdapterSelectionSync = useCallback5(() => {
3831
+ const token = ++suppressSelectionTokenRef.current;
3832
+ suppressSelectionSyncRef.current = true;
3833
+ if (suppressSelectionRafRef.current !== null && typeof cancelAnimationFrame === "function") {
3834
+ cancelAnimationFrame(suppressSelectionRafRef.current);
3835
+ suppressSelectionRafRef.current = null;
3836
+ }
3837
+ if (suppressSelectionTimerRef.current !== null) {
3838
+ clearTimeout(suppressSelectionTimerRef.current);
3839
+ suppressSelectionTimerRef.current = null;
3840
+ }
3841
+ const release = () => {
3842
+ if (suppressSelectionTokenRef.current !== token) return;
3843
+ if (suppressSelectionRafRef.current !== null && typeof cancelAnimationFrame === "function") {
3844
+ cancelAnimationFrame(suppressSelectionRafRef.current);
3845
+ suppressSelectionRafRef.current = null;
3846
+ }
3847
+ if (suppressSelectionTimerRef.current !== null) {
3848
+ clearTimeout(suppressSelectionTimerRef.current);
3849
+ suppressSelectionTimerRef.current = null;
3850
+ }
3851
+ suppressSelectionSyncRef.current = false;
3852
+ };
3853
+ if (typeof requestAnimationFrame === "function") {
3854
+ suppressSelectionRafRef.current = requestAnimationFrame(() => {
3855
+ suppressSelectionRafRef.current = null;
3856
+ release();
3857
+ });
3858
+ }
3859
+ suppressSelectionTimerRef.current = setTimeout(() => {
3860
+ suppressSelectionTimerRef.current = null;
3861
+ release();
3862
+ }, 34);
3863
+ }, []);
3688
3864
  const syncFromSnapshot = useCallback5(() => {
3689
3865
  const snap = api.snapshot();
3690
- setRF(
3691
- toRF(snap, api, {
3692
- nodeDecorators: nodeDecoratorsRef.current,
3693
- edgeDecorators: edgeDecoratorsRef.current
3694
- })
3695
- );
3696
- }, [api]);
3697
- const requestSync = useCallback5(() => {
3866
+ const sig = buildSnapshotSig(snap, api);
3867
+ const previousSig = lastAppliedSigRef.current;
3868
+ const graphChanged = !previousSig || previousSig.graph !== sig.graph;
3869
+ const selectionChanged = !previousSig || previousSig.selection !== sig.selection;
3870
+ if (!graphChanged && !selectionChanged) return;
3871
+ const next = toRF(snap, api, {
3872
+ nodeDecorators: nodeDecoratorsRef.current,
3873
+ edgeDecorators: edgeDecoratorsRef.current
3874
+ });
3875
+ beginAdapterSelectionSync();
3876
+ setRF((prev) => {
3877
+ const merged = mergeWithRuntime(prev, next);
3878
+ if (modelEquivalent(prev, merged)) return prev;
3879
+ return merged;
3880
+ });
3881
+ lastAppliedSigRef.current = sig;
3882
+ }, [api, beginAdapterSelectionSync]);
3883
+ const applyDecoratorSync = useCallback5(() => {
3884
+ beginAdapterSelectionSync();
3885
+ setRF((prev) => {
3886
+ let nodeChanged = false;
3887
+ let edgeChanged = false;
3888
+ const nextNodes = prev.nodes.map((node) => {
3889
+ if (!nodeDecoratorsRef.current || isCommentId(String(node.id))) return node;
3890
+ const decorator = nodeDecoratorsRef.current(String(node.id)) ?? void 0;
3891
+ const decorated = applyNodeDecorator(node, decorator);
3892
+ if (decorated !== node) nodeChanged = true;
3893
+ return decorated;
3894
+ });
3895
+ const nextEdges = prev.edges.map((edge) => {
3896
+ if (!edgeDecoratorsRef.current) return edge;
3897
+ const decorator = edgeDecoratorsRef.current(String(edge.id)) ?? void 0;
3898
+ const decorated = applyEdgeDecorator(edge, decorator);
3899
+ if (decorated !== edge) edgeChanged = true;
3900
+ return decorated;
3901
+ });
3902
+ if (!nodeChanged && !edgeChanged) return prev;
3903
+ return { nodes: nextNodes, edges: nextEdges };
3904
+ });
3905
+ }, [beginAdapterSelectionSync]);
3906
+ const requestStructuralSync = useCallback5(() => {
3698
3907
  if (interactionInProgressRef.current) {
3699
3908
  pendingSyncRef.current = true;
3700
3909
  return;
@@ -3702,11 +3911,25 @@ function useReactFlowAdapter(api, options = {}) {
3702
3911
  pendingSyncRef.current = false;
3703
3912
  syncFromSnapshot();
3704
3913
  }, [syncFromSnapshot]);
3914
+ const requestDecoratorSync = useCallback5(() => {
3915
+ if (interactionInProgressRef.current) {
3916
+ pendingDecoratorSyncRef.current = true;
3917
+ return;
3918
+ }
3919
+ pendingDecoratorSyncRef.current = false;
3920
+ applyDecoratorSync();
3921
+ }, [applyDecoratorSync]);
3705
3922
  const flushDeferredSync = useCallback5(() => {
3706
- if (interactionInProgressRef.current || !pendingSyncRef.current) return;
3707
- pendingSyncRef.current = false;
3708
- syncFromSnapshot();
3709
- }, [syncFromSnapshot]);
3923
+ if (interactionInProgressRef.current) return;
3924
+ if (pendingSyncRef.current) {
3925
+ pendingSyncRef.current = false;
3926
+ syncFromSnapshot();
3927
+ }
3928
+ if (pendingDecoratorSyncRef.current) {
3929
+ pendingDecoratorSyncRef.current = false;
3930
+ applyDecoratorSync();
3931
+ }
3932
+ }, [applyDecoratorSync, syncFromSnapshot]);
3710
3933
  const startInteraction = useCallback5(() => {
3711
3934
  interactionInProgressRef.current = true;
3712
3935
  }, []);
@@ -3748,38 +3971,45 @@ function useReactFlowAdapter(api, options = {}) {
3748
3971
  }, [options.afterConnect]);
3749
3972
  useEffect6(() => {
3750
3973
  nodeDecoratorsRef.current = nodeDecorators;
3751
- }, [nodeDecorators]);
3974
+ requestDecoratorSync();
3975
+ }, [nodeDecorators, requestDecoratorSync]);
3752
3976
  useEffect6(() => {
3753
3977
  edgeDecoratorsRef.current = edgeDecorators;
3754
- }, [edgeDecorators]);
3978
+ requestDecoratorSync();
3979
+ }, [edgeDecorators, requestDecoratorSync]);
3755
3980
  useEffect6(() => {
3756
- requestSync();
3757
- }, [api, nodeDecorators, edgeDecorators, requestSync]);
3758
- const [rf, setRF] = useState5(
3759
- () => toRF(api.snapshot(), api, {
3760
- nodeDecorators: nodeDecoratorsRef.current,
3761
- edgeDecorators: edgeDecoratorsRef.current
3762
- })
3763
- );
3981
+ requestStructuralSync();
3982
+ }, [api, requestStructuralSync]);
3764
3983
  const snapVector = useMemo5(() => {
3765
3984
  if (!options.snapToGrid) return void 0;
3766
3985
  if (options.snapToGrid === true) return [8, 8];
3767
3986
  return [options.snapToGrid.x || 8, options.snapToGrid.y || 8];
3768
3987
  }, [options.snapToGrid]);
3769
3988
  useEffect6(() => {
3770
- const offGraph = api.on("graph:update", requestSync);
3771
- const offSelection = api.on("selection:change", requestSync);
3772
- const offState = api.on("state:change", requestSync);
3773
- const offCommentCreate = api.on("comment:thread:create", requestSync);
3774
- const offCommentUpdate = api.on("comment:thread:update", requestSync);
3775
- const offCommentDelete = api.on("comment:thread:delete", requestSync);
3776
- const offCommentMove = api.on("comment:move", requestSync);
3777
- const offCommentResolve = api.on("comment:resolve", requestSync);
3989
+ const offGraph = api.on("graph:update", requestStructuralSync);
3990
+ const offSelection = api.on("selection:change", requestStructuralSync);
3991
+ const offState = api.on("state:change", requestStructuralSync);
3992
+ const offCommentCreate = api.on("comment:thread:create", requestStructuralSync);
3993
+ const offCommentUpdate = api.on("comment:thread:update", requestStructuralSync);
3994
+ const offCommentDelete = api.on("comment:thread:delete", requestStructuralSync);
3995
+ const offCommentMove = api.on("comment:move", requestStructuralSync);
3996
+ const offCommentResolve = api.on("comment:resolve", requestStructuralSync);
3778
3997
  return () => {
3779
3998
  interactionInProgressRef.current = false;
3780
3999
  pendingSyncRef.current = false;
4000
+ pendingDecoratorSyncRef.current = false;
3781
4001
  pendingNodeHistoryRef.current = {};
3782
4002
  dragStartPositionsRef.current = {};
4003
+ if (suppressSelectionRafRef.current !== null && typeof cancelAnimationFrame === "function") {
4004
+ cancelAnimationFrame(suppressSelectionRafRef.current);
4005
+ suppressSelectionRafRef.current = null;
4006
+ }
4007
+ if (suppressSelectionTimerRef.current !== null) {
4008
+ clearTimeout(suppressSelectionTimerRef.current);
4009
+ suppressSelectionTimerRef.current = null;
4010
+ }
4011
+ suppressSelectionTokenRef.current += 1;
4012
+ suppressSelectionSyncRef.current = false;
3783
4013
  offGraph();
3784
4014
  offSelection();
3785
4015
  offState();
@@ -3789,7 +4019,7 @@ function useReactFlowAdapter(api, options = {}) {
3789
4019
  offCommentMove();
3790
4020
  offCommentResolve();
3791
4021
  };
3792
- }, [api, requestSync]);
4022
+ }, [api, requestStructuralSync]);
3793
4023
  const applySnap = useCallback5(
3794
4024
  (pos) => {
3795
4025
  if (!snapVector) return pos;
@@ -3867,7 +4097,7 @@ function useReactFlowAdapter(api, options = {}) {
3867
4097
  }
3868
4098
  }
3869
4099
  if (Object.keys(posUpdates).length > 0) setPositionsThrottled(posUpdates);
3870
- if (selectionDirty) {
4100
+ if (selectionDirty && !suppressSelectionSyncRef.current) {
3871
4101
  const next = nextNodesSnapshot.filter((node) => !isCommentId(node.id) && node.selected).map((node) => String(node.id));
3872
4102
  const current = api.getSelection().map(String);
3873
4103
  if (!sameIdSet(next, current)) api.select(next);
@@ -6680,62 +6910,27 @@ var Header = ({ menu = [] }) => {
6680
6910
  var header_default = Header;
6681
6911
 
6682
6912
  // src/components/ui/scroll-area.tsx
6683
- import "react";
6684
- import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
6685
- import { jsx as jsx27, jsxs as jsxs20 } from "react/jsx-runtime";
6686
- function ScrollArea({
6687
- className,
6688
- children,
6689
- ...props
6690
- }) {
6691
- return /* @__PURE__ */ jsxs20(
6692
- ScrollAreaPrimitive.Root,
6693
- {
6694
- "data-slot": "scroll-area",
6695
- className: cn("relative", className),
6696
- ...props,
6697
- children: [
6698
- /* @__PURE__ */ jsx27(
6699
- ScrollAreaPrimitive.Viewport,
6700
- {
6701
- "data-slot": "scroll-area-viewport",
6702
- className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",
6703
- children
6704
- }
6705
- ),
6706
- /* @__PURE__ */ jsx27(ScrollBar, {}),
6707
- /* @__PURE__ */ jsx27(ScrollAreaPrimitive.Corner, {})
6708
- ]
6709
- }
6710
- );
6711
- }
6712
- function ScrollBar({
6713
- className,
6714
- orientation = "vertical",
6715
- ...props
6716
- }) {
6913
+ import * as React11 from "react";
6914
+ import { jsx as jsx27 } from "react/jsx-runtime";
6915
+ var ScrollArea = React11.forwardRef(function ScrollArea2({ className, children, ...props }, ref) {
6916
+ return /* @__PURE__ */ jsx27("div", { "data-slot": "scroll-area", ref, className: cn("relative size-full overflow-auto", className), ...props, children });
6917
+ });
6918
+ var ScrollBar = React11.forwardRef(function ScrollBar2({ className, orientation = "vertical", ...props }, ref) {
6717
6919
  return /* @__PURE__ */ jsx27(
6718
- ScrollAreaPrimitive.ScrollAreaScrollbar,
6920
+ "div",
6719
6921
  {
6720
6922
  "data-slot": "scroll-area-scrollbar",
6721
- orientation,
6923
+ ref,
6924
+ "aria-hidden": "true",
6722
6925
  className: cn(
6723
- "flex touch-none p-px transition-colors select-none",
6724
- orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent",
6725
- orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent",
6926
+ "pointer-events-none absolute opacity-0",
6927
+ orientation === "vertical" ? "right-0 top-0 h-full w-0" : "bottom-0 left-0 h-0 w-full",
6726
6928
  className
6727
6929
  ),
6728
- ...props,
6729
- children: /* @__PURE__ */ jsx27(
6730
- ScrollAreaPrimitive.ScrollAreaThumb,
6731
- {
6732
- "data-slot": "scroll-area-thumb",
6733
- className: "bg-border relative flex-1 rounded-full"
6734
- }
6735
- )
6930
+ ...props
6736
6931
  }
6737
6932
  );
6738
- }
6933
+ });
6739
6934
 
6740
6935
  // src/panels/left/assets/index.tsx
6741
6936
  import { useInputs } from "@timeax/digital-service-engine/react";
@@ -6743,7 +6938,7 @@ import { useWorkspace as useWorkspace8 } from "@timeax/digital-service-engine/wo
6743
6938
  import { useMemo as useMemo11, useState as useState12 } from "react";
6744
6939
  import { CiSearch } from "react-icons/ci";
6745
6940
  import { LuBox, LuShapes } from "react-icons/lu";
6746
- import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
6941
+ import { jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
6747
6942
  function toTitle(value) {
6748
6943
  return value.split(/[-_:]/g).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
6749
6944
  }
@@ -6775,8 +6970,8 @@ function AssetsPanel() {
6775
6970
  const filteredTemplates = lower ? templates2.filter(
6776
6971
  (item) => item.name.toLowerCase().includes(lower) || String(item.kind ?? "").toLowerCase().includes(lower)
6777
6972
  ) : templates2;
6778
- return /* @__PURE__ */ jsxs21("div", { className: "flex h-full min-h-0 flex-col rounded-2xl border border-slate-200/80 bg-white/90 p-3 shadow-sm dark:border-slate-800 dark:bg-slate-950/80", children: [
6779
- /* @__PURE__ */ jsxs21("label", { className: "relative", children: [
6973
+ return /* @__PURE__ */ jsxs20("div", { className: "flex h-full min-h-0 flex-col rounded-2xl border border-slate-200/80 bg-white/90 p-3 shadow-sm dark:border-slate-800 dark:bg-slate-950/80", children: [
6974
+ /* @__PURE__ */ jsxs20("label", { className: "relative", children: [
6780
6975
  /* @__PURE__ */ jsx28(CiSearch, { className: "pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 text-slate-400" }),
6781
6976
  /* @__PURE__ */ jsx28(
6782
6977
  "input",
@@ -6788,13 +6983,13 @@ function AssetsPanel() {
6788
6983
  }
6789
6984
  )
6790
6985
  ] }),
6791
- /* @__PURE__ */ jsxs21(ScrollArea, { className: "mt-3 min-h-0 flex-1 pr-1", children: [
6792
- /* @__PURE__ */ jsxs21("section", { children: [
6793
- /* @__PURE__ */ jsxs21("h4", { className: "mb-2 flex items-center gap-2 text-xs font-semibold tracking-wide text-slate-500 uppercase dark:text-slate-400", children: [
6986
+ /* @__PURE__ */ jsxs20(ScrollArea, { className: "mt-3 min-h-0 flex-1 pr-1", children: [
6987
+ /* @__PURE__ */ jsxs20("section", { children: [
6988
+ /* @__PURE__ */ jsxs20("h4", { className: "mb-2 flex items-center gap-2 text-xs font-semibold tracking-wide text-slate-500 uppercase dark:text-slate-400", children: [
6794
6989
  /* @__PURE__ */ jsx28(LuShapes, {}),
6795
6990
  "Built-in Inputs"
6796
6991
  ] }),
6797
- /* @__PURE__ */ jsx28("div", { className: "grid grid-cols-2 gap-2", children: filteredBuiltins.length ? filteredBuiltins.map((item) => /* @__PURE__ */ jsxs21(
6992
+ /* @__PURE__ */ jsx28("div", { className: "grid grid-cols-2 gap-2", children: filteredBuiltins.length ? filteredBuiltins.map((item) => /* @__PURE__ */ jsxs20(
6798
6993
  "button",
6799
6994
  {
6800
6995
  type: "button",
@@ -6819,13 +7014,13 @@ function AssetsPanel() {
6819
7014
  item.key
6820
7015
  )) : /* @__PURE__ */ jsx28(EmptyState, { title: "No built-ins", description: "No registry input entries matched your search.", className: "min-h-36" }) })
6821
7016
  ] }),
6822
- /* @__PURE__ */ jsxs21("section", { className: "mt-5", children: [
6823
- /* @__PURE__ */ jsxs21("h4", { className: "mb-2 flex items-center gap-2 text-xs font-semibold tracking-wide text-slate-500 uppercase dark:text-slate-400", children: [
7017
+ /* @__PURE__ */ jsxs20("section", { className: "mt-5", children: [
7018
+ /* @__PURE__ */ jsxs20("h4", { className: "mb-2 flex items-center gap-2 text-xs font-semibold tracking-wide text-slate-500 uppercase dark:text-slate-400", children: [
6824
7019
  /* @__PURE__ */ jsx28(LuBox, {}),
6825
7020
  "Saved Templates"
6826
7021
  ] }),
6827
7022
  /* @__PURE__ */ jsx28(WorkspaceBootInlineNotice, { boot: ws.boot, sections: ["templates"], className: "mb-3" }),
6828
- /* @__PURE__ */ jsx28("div", { className: "grid grid-cols-2 gap-2", children: filteredTemplates.length ? filteredTemplates.map((item) => /* @__PURE__ */ jsxs21(
7023
+ /* @__PURE__ */ jsx28("div", { className: "grid grid-cols-2 gap-2", children: filteredTemplates.length ? filteredTemplates.map((item) => /* @__PURE__ */ jsxs20(
6829
7024
  "button",
6830
7025
  {
6831
7026
  type: "button",
@@ -8035,7 +8230,7 @@ import { VscChevronRight } from "react-icons/vsc";
8035
8230
 
8036
8231
  // src/components/sort-tree/node.tsx
8037
8232
  import * as React21 from "react";
8038
- import { jsx as jsx32, jsxs as jsxs22 } from "react/jsx-runtime";
8233
+ import { jsx as jsx32, jsxs as jsxs21 } from "react/jsx-runtime";
8039
8234
  function Node({ node, matched, isEditing, onCommit, onCancel }) {
8040
8235
  const spanRef = React21.useRef(null);
8041
8236
  React21.useEffect(() => {
@@ -8066,7 +8261,7 @@ function Node({ node, matched, isEditing, onCommit, onCancel }) {
8066
8261
  onCancel?.();
8067
8262
  }
8068
8263
  };
8069
- return /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2 truncate " + (matched ? "rounded bg-yellow-200/50 px-1" : ""), children: [
8264
+ return /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-2 truncate " + (matched ? "rounded bg-yellow-200/50 px-1" : ""), children: [
8070
8265
  node.icon ? /* @__PURE__ */ jsx32("span", { className: "inline-flex items-center", children: node.icon }) : null,
8071
8266
  /* @__PURE__ */ jsx32(
8072
8267
  "span",
@@ -8084,7 +8279,7 @@ function Node({ node, matched, isEditing, onCommit, onCancel }) {
8084
8279
  }
8085
8280
 
8086
8281
  // src/components/sort-tree/node-row.tsx
8087
- import { jsx as jsx33, jsxs as jsxs23 } from "react/jsx-runtime";
8282
+ import { jsx as jsx33, jsxs as jsxs22 } from "react/jsx-runtime";
8088
8283
  function NodeRow({
8089
8284
  node,
8090
8285
  path,
@@ -8115,7 +8310,7 @@ function NodeRow({
8115
8310
  e.stopPropagation();
8116
8311
  callback?.(e);
8117
8312
  };
8118
- return /* @__PURE__ */ jsxs23(
8313
+ return /* @__PURE__ */ jsxs22(
8119
8314
  "div",
8120
8315
  {
8121
8316
  className: ["tree-row", rowClassName || "", isDragging ? "is-dragging" : ""].join(" "),
@@ -8129,7 +8324,7 @@ function NodeRow({
8129
8324
  children: [
8130
8325
  showBinding ? /* @__PURE__ */ jsx33("div", { className: "tree-rail", style: { width: pad }, children: binding.guides.map((g, i) => /* @__PURE__ */ jsx33("span", { className: "tree-col", "data-show": g ? "1" : "0", style: { width: indent } }, i)) }) : /* @__PURE__ */ jsx33("div", { style: { width: pad } }),
8131
8326
  showBinding && /* @__PURE__ */ jsx33("div", { className: "tree-elbow", style: { width: indent } }),
8132
- /* @__PURE__ */ jsx33("div", { className: "min-w-0 flex-1", children: isDragging ? /* @__PURE__ */ jsxs23(
8327
+ /* @__PURE__ */ jsx33("div", { className: "min-w-0 flex-1", children: isDragging ? /* @__PURE__ */ jsxs22(
8133
8328
  "div",
8134
8329
  {
8135
8330
  "aria-hidden": "true",
@@ -8201,7 +8396,7 @@ function NodeRow({
8201
8396
  }
8202
8397
 
8203
8398
  // src/components/sort-tree/internal/render-row.tsx
8204
- import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
8399
+ import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
8205
8400
  var ZONE_HEIGHT = 6;
8206
8401
  function useRenderRow(args) {
8207
8402
  const {
@@ -8292,7 +8487,7 @@ function useRenderRow(args) {
8292
8487
  // fallback
8293
8488
  },
8294
8489
  onMouseDown: (e) => onRowPointerDown(e, rIndex, r.node),
8295
- children: /* @__PURE__ */ jsxs24("div", { className: cn(skinClass, activeClassString), style: { borderRadius: "inherit" }, children: [
8490
+ children: /* @__PURE__ */ jsxs23("div", { className: cn(skinClass, activeClassString), style: { borderRadius: "inherit" }, children: [
8296
8491
  /* @__PURE__ */ jsx34(DropZone, { id: zoneId(r.path, "before"), height: ZONE_HEIGHT, onNativeDrop: handleExternalDrop, disabled: disableZones }),
8297
8492
  /* @__PURE__ */ jsx34(OnDroppableWrap, { id: zoneId(r.path, "on"), onNativeDrop: handleExternalDrop, disabled: disableZones, children: /* @__PURE__ */ jsx34(DraggableRow, { id: draggableId, disabled: disabledDrag, children: /* @__PURE__ */ jsx34(
8298
8493
  NodeRow,
@@ -8400,7 +8595,7 @@ function useRenderRow(args) {
8400
8595
  }
8401
8596
 
8402
8597
  // src/components/sort-tree/sort-tree.tsx
8403
- import { jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
8598
+ import { jsx as jsx35, jsxs as jsxs24 } from "react/jsx-runtime";
8404
8599
  function SortTreeInner(props, ref) {
8405
8600
  const {
8406
8601
  data,
@@ -8693,7 +8888,7 @@ function SortTreeInner(props, ref) {
8693
8888
  loadChildren
8694
8889
  ]
8695
8890
  );
8696
- return /* @__PURE__ */ jsxs25(DndContext, { sensors, onDragStart: handleDragStart, onDragEnd: handleDragEnd, collisionDetection, children: [
8891
+ return /* @__PURE__ */ jsxs24(DndContext, { sensors, onDragStart: handleDragStart, onDragEnd: handleDragEnd, collisionDetection, children: [
8697
8892
  /* @__PURE__ */ jsx35("div", { className, style, tabIndex: 0, onKeyDown, children: height ? /* @__PURE__ */ jsx35(
8698
8893
  List,
8699
8894
  {
@@ -8987,7 +9182,7 @@ import { LuTags as LuTags3 } from "react-icons/lu";
8987
9182
  import { MdOutlineAdd } from "react-icons/md";
8988
9183
  import { RxInput as RxInput3 } from "react-icons/rx";
8989
9184
  import { VscNewFolder } from "react-icons/vsc";
8990
- import { jsx as jsx38, jsxs as jsxs26 } from "react/jsx-runtime";
9185
+ import { jsx as jsx38, jsxs as jsxs25 } from "react/jsx-runtime";
8991
9186
  function filterTree(nodes, query) {
8992
9187
  if (!query.trim()) return nodes;
8993
9188
  const lower = query.toLowerCase();
@@ -9065,7 +9260,7 @@ var Layers = () => {
9065
9260
  const handleFieldSearchBlur = () => {
9066
9261
  if (!fieldSearch.trim()) setIsFieldSearchOpen(false);
9067
9262
  };
9068
- return /* @__PURE__ */ jsxs26("div", { className: "flex h-full min-h-0 flex-1 flex-col overflow-hidden rounded-2xl border border-slate-200/80 bg-white/90 shadow-sm dark:border-slate-800 dark:bg-slate-950/80", children: [
9263
+ return /* @__PURE__ */ jsxs25("div", { className: "flex h-full min-h-0 flex-1 flex-col overflow-hidden rounded-2xl border border-slate-200/80 bg-white/90 shadow-sm dark:border-slate-800 dark:bg-slate-950/80", children: [
9069
9264
  /* @__PURE__ */ jsx38(
9070
9265
  Panel,
9071
9266
  {
@@ -9074,13 +9269,13 @@ var Layers = () => {
9074
9269
  minHeight: 180,
9075
9270
  maxHeight: 520,
9076
9271
  className: "flex min-h-45 flex-col rounded-none! border-b border-slate-200/80 bg-transparent dark:border-slate-800",
9077
- children: /* @__PURE__ */ jsxs26("section", { className: "flex min-h-0 flex-1 flex-col px-4 pt-4 pb-3", children: [
9078
- /* @__PURE__ */ jsxs26("div", { className: "flex items-start justify-between gap-3", children: [
9079
- /* @__PURE__ */ jsxs26("div", { className: "min-w-0", children: [
9272
+ children: /* @__PURE__ */ jsxs25("section", { className: "flex min-h-0 flex-1 flex-col px-4 pt-4 pb-3", children: [
9273
+ /* @__PURE__ */ jsxs25("div", { className: "flex items-start justify-between gap-3", children: [
9274
+ /* @__PURE__ */ jsxs25("div", { className: "min-w-0", children: [
9080
9275
  /* @__PURE__ */ jsx38("h3", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: "Tag hierarchy" }),
9081
9276
  /* @__PURE__ */ jsx38("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: "Structure the visible groups and inheritance tree." })
9082
9277
  ] }),
9083
- /* @__PURE__ */ jsxs26("div", { className: "flex items-center gap-1", children: [
9278
+ /* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-1", children: [
9084
9279
  /* @__PURE__ */ jsx38(
9085
9280
  "button",
9086
9281
  {
@@ -9101,7 +9296,7 @@ var Layers = () => {
9101
9296
  )
9102
9297
  ] })
9103
9298
  ] }),
9104
- /* @__PURE__ */ jsxs26("div", { className: "mt-3 flex min-h-0 flex-1 flex-col gap-3", children: [
9299
+ /* @__PURE__ */ jsxs25("div", { className: "mt-3 flex min-h-0 flex-1 flex-col gap-3", children: [
9105
9300
  isTagSearchOpen || hasTagSearch ? /* @__PURE__ */ jsx38(
9106
9301
  PanelSearch,
9107
9302
  {
@@ -9159,13 +9354,13 @@ var Layers = () => {
9159
9354
  ] })
9160
9355
  }
9161
9356
  ),
9162
- /* @__PURE__ */ jsxs26("section", { className: "flex min-h-0 flex-1 flex-col px-4 pt-3 pb-4", children: [
9163
- /* @__PURE__ */ jsxs26("div", { className: "flex items-start justify-between gap-3", children: [
9164
- /* @__PURE__ */ jsxs26("div", { className: "min-w-0", children: [
9357
+ /* @__PURE__ */ jsxs25("section", { className: "flex min-h-0 flex-1 flex-col px-4 pt-3 pb-4", children: [
9358
+ /* @__PURE__ */ jsxs25("div", { className: "flex items-start justify-between gap-3", children: [
9359
+ /* @__PURE__ */ jsxs25("div", { className: "min-w-0", children: [
9165
9360
  /* @__PURE__ */ jsx38("h3", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: "Fields in view" }),
9166
9361
  /* @__PURE__ */ jsx38("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: `Under ${activeTagLabel}` })
9167
9362
  ] }),
9168
- /* @__PURE__ */ jsxs26("div", { className: "flex items-center gap-1", children: [
9363
+ /* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-1", children: [
9169
9364
  /* @__PURE__ */ jsx38(
9170
9365
  "button",
9171
9366
  {
@@ -9207,7 +9402,7 @@ var Layers = () => {
9207
9402
  )
9208
9403
  ] })
9209
9404
  ] }),
9210
- /* @__PURE__ */ jsxs26("div", { className: "mt-3 flex min-h-0 flex-1 flex-col gap-3", children: [
9405
+ /* @__PURE__ */ jsxs25("div", { className: "mt-3 flex min-h-0 flex-1 flex-col gap-3", children: [
9211
9406
  isFieldSearchOpen || hasFieldSearch ? /* @__PURE__ */ jsx38(
9212
9407
  PanelSearch,
9213
9408
  {
@@ -9350,7 +9545,7 @@ function TabsContent({
9350
9545
  // src/panels/left/index.tsx
9351
9546
  import { CiGrid32 } from "react-icons/ci";
9352
9547
  import { MdOutlineLayers } from "react-icons/md";
9353
- import { jsx as jsx40, jsxs as jsxs27 } from "react/jsx-runtime";
9548
+ import { jsx as jsx40, jsxs as jsxs26 } from "react/jsx-runtime";
9354
9549
  var Left = ({ menu }) => {
9355
9550
  const tabClassName = cn(
9356
9551
  "rounded-xl! py-2! shadow-none!",
@@ -9364,15 +9559,15 @@ var Left = ({ menu }) => {
9364
9559
  edges: ["right"],
9365
9560
  maxWidth: 420,
9366
9561
  minWidth: 320,
9367
- children: /* @__PURE__ */ jsxs27("div", { className: "flex h-full flex-col", children: [
9562
+ children: /* @__PURE__ */ jsxs26("div", { className: "flex h-full flex-col", children: [
9368
9563
  /* @__PURE__ */ jsx40(header_default, { menu }),
9369
- /* @__PURE__ */ jsx40("div", { className: "flex min-h-0 flex-1 flex-col gap-2 py-2", children: /* @__PURE__ */ jsxs27(Tabs, { defaultValue: "layers", className: "flex min-h-0 flex-1 flex-col px-3", children: [
9370
- /* @__PURE__ */ jsxs27(TabsList, { className: "grid h-auto grid-cols-2 rounded-2xl bg-slate-100 p-1 dark:bg-slate-900", children: [
9371
- /* @__PURE__ */ jsx40(TabsTrigger, { className: tabClassName, value: "layers", children: /* @__PURE__ */ jsxs27("span", { className: "flex items-center gap-2", children: [
9564
+ /* @__PURE__ */ jsx40("div", { className: "flex min-h-0 flex-1 flex-col gap-2 py-2", children: /* @__PURE__ */ jsxs26(Tabs, { defaultValue: "layers", className: "flex min-h-0 flex-1 flex-col px-3", children: [
9565
+ /* @__PURE__ */ jsxs26(TabsList, { className: "grid h-auto grid-cols-2 rounded-2xl bg-slate-100 p-1 dark:bg-slate-900", children: [
9566
+ /* @__PURE__ */ jsx40(TabsTrigger, { className: tabClassName, value: "layers", children: /* @__PURE__ */ jsxs26("span", { className: "flex items-center gap-2", children: [
9372
9567
  /* @__PURE__ */ jsx40(MdOutlineLayers, {}),
9373
9568
  /* @__PURE__ */ jsx40("span", { children: "Layers" })
9374
9569
  ] }) }),
9375
- /* @__PURE__ */ jsx40(TabsTrigger, { className: tabClassName, value: "assets", children: /* @__PURE__ */ jsxs27("span", { className: "flex items-center gap-2", children: [
9570
+ /* @__PURE__ */ jsx40(TabsTrigger, { className: tabClassName, value: "assets", children: /* @__PURE__ */ jsxs26("span", { className: "flex items-center gap-2", children: [
9376
9571
  /* @__PURE__ */ jsx40(CiGrid32, {}),
9377
9572
  /* @__PURE__ */ jsx40("span", { children: "Assets" })
9378
9573
  ] }) })
@@ -9392,7 +9587,7 @@ import { useMemo as useMemo18 } from "react";
9392
9587
  import { GoChevronDown } from "react-icons/go";
9393
9588
  import { HiOutlineDotsHorizontal } from "react-icons/hi";
9394
9589
  import { PiUserPlusThin } from "react-icons/pi";
9395
- import { jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
9590
+ import { jsx as jsx41, jsxs as jsxs27 } from "react/jsx-runtime";
9396
9591
  function getInitials(name) {
9397
9592
  const parts = name.trim().split(/\s+/).filter(Boolean);
9398
9593
  if (!parts.length) return "?";
@@ -9454,22 +9649,22 @@ var Users = ({ users, onViewUser, onSetMain, onToggleAdmin, onRemoveUser, onInvi
9454
9649
  return bScore - aScore || a.name.localeCompare(b.name);
9455
9650
  });
9456
9651
  }, [users]);
9457
- return /* @__PURE__ */ jsxs28(Popover, { children: [
9458
- /* @__PURE__ */ jsx41(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs28(
9652
+ return /* @__PURE__ */ jsxs27(Popover, { children: [
9653
+ /* @__PURE__ */ jsx41(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs27(
9459
9654
  "button",
9460
9655
  {
9461
9656
  type: "button",
9462
9657
  className: "flex items-center gap-2 rounded-xl border border-transparent px-1 py-1 transition hover:border-slate-200 hover:bg-white dark:hover:border-slate-800 dark:hover:bg-slate-950",
9463
9658
  children: [
9464
- /* @__PURE__ */ jsxs28("div", { className: "flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-white dark:*:data-[slot=avatar]:ring-slate-950", children: [
9465
- visibleUsers.map((user) => /* @__PURE__ */ jsxs28("div", { className: "relative", children: [
9466
- /* @__PURE__ */ jsxs28(Avatar, { className: "h-8 w-8", children: [
9659
+ /* @__PURE__ */ jsxs27("div", { className: "flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-white dark:*:data-[slot=avatar]:ring-slate-950", children: [
9660
+ visibleUsers.map((user) => /* @__PURE__ */ jsxs27("div", { className: "relative", children: [
9661
+ /* @__PURE__ */ jsxs27(Avatar, { className: "h-8 w-8", children: [
9467
9662
  /* @__PURE__ */ jsx41(AvatarImage, { src: user.avatar, alt: user.name }),
9468
9663
  /* @__PURE__ */ jsx41(AvatarFallback, { children: getInitials(user.name) })
9469
9664
  ] }),
9470
9665
  user.isOnline ? /* @__PURE__ */ jsx41("span", { className: "absolute right-0 bottom-0 h-2 w-2 rounded-full bg-emerald-500 ring-2 ring-white dark:ring-slate-950" }) : null
9471
9666
  ] }, user.id)),
9472
- extra > 0 ? /* @__PURE__ */ jsxs28("div", { className: "flex h-8 w-8 items-center justify-center rounded-full border border-dashed border-slate-300 bg-slate-100 text-xs font-medium text-slate-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300", children: [
9667
+ extra > 0 ? /* @__PURE__ */ jsxs27("div", { className: "flex h-8 w-8 items-center justify-center rounded-full border border-dashed border-slate-300 bg-slate-100 text-xs font-medium text-slate-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-300", children: [
9473
9668
  "+",
9474
9669
  extra
9475
9670
  ] }) : null
@@ -9478,14 +9673,14 @@ var Users = ({ users, onViewUser, onSetMain, onToggleAdmin, onRemoveUser, onInvi
9478
9673
  ]
9479
9674
  }
9480
9675
  ) }),
9481
- /* @__PURE__ */ jsxs28(PopoverContent, { align: "start", className: "w-[380px] rounded-3xl border-slate-200 bg-white/98 p-0 shadow-2xl dark:border-slate-800 dark:bg-slate-950/98", children: [
9482
- /* @__PURE__ */ jsx41("div", { className: "border-b border-slate-200 px-4 py-4 dark:border-slate-800", children: /* @__PURE__ */ jsxs28("div", { className: "flex items-start justify-between gap-3", children: [
9483
- /* @__PURE__ */ jsxs28("div", { children: [
9676
+ /* @__PURE__ */ jsxs27(PopoverContent, { align: "start", className: "w-[380px] rounded-3xl border-slate-200 bg-white/98 p-0 shadow-2xl dark:border-slate-800 dark:bg-slate-950/98", children: [
9677
+ /* @__PURE__ */ jsx41("div", { className: "border-b border-slate-200 px-4 py-4 dark:border-slate-800", children: /* @__PURE__ */ jsxs27("div", { className: "flex items-start justify-between gap-3", children: [
9678
+ /* @__PURE__ */ jsxs27("div", { children: [
9484
9679
  /* @__PURE__ */ jsx41("div", { className: "text-[10px] font-semibold uppercase tracking-[0.18em] text-slate-400 dark:text-slate-500", children: "Collaborators" }),
9485
9680
  /* @__PURE__ */ jsx41("h3", { className: "mt-1 text-base font-semibold text-slate-900 dark:text-slate-100", children: "Branch authors" }),
9486
9681
  /* @__PURE__ */ jsx41("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: "Presence, roles, and access for the active branch." })
9487
9682
  ] }),
9488
- /* @__PURE__ */ jsxs28(
9683
+ /* @__PURE__ */ jsxs27(
9489
9684
  Button,
9490
9685
  {
9491
9686
  type: "button",
@@ -9507,9 +9702,9 @@ var Users = ({ users, onViewUser, onSetMain, onToggleAdmin, onRemoveUser, onInvi
9507
9702
  "div",
9508
9703
  {
9509
9704
  className: "rounded-2xl border border-slate-200/80 bg-slate-50/80 p-3 shadow-sm dark:border-slate-800 dark:bg-slate-900/70",
9510
- children: /* @__PURE__ */ jsxs28("div", { className: "flex items-start gap-3", children: [
9511
- /* @__PURE__ */ jsxs28("div", { className: "relative", children: [
9512
- /* @__PURE__ */ jsxs28(Avatar, { className: "h-11 w-11 border border-white shadow-sm dark:border-slate-950", children: [
9705
+ children: /* @__PURE__ */ jsxs27("div", { className: "flex items-start gap-3", children: [
9706
+ /* @__PURE__ */ jsxs27("div", { className: "relative", children: [
9707
+ /* @__PURE__ */ jsxs27(Avatar, { className: "h-11 w-11 border border-white shadow-sm dark:border-slate-950", children: [
9513
9708
  /* @__PURE__ */ jsx41(AvatarImage, { src: user.avatar, alt: user.name }),
9514
9709
  /* @__PURE__ */ jsx41(AvatarFallback, { children: getInitials(user.name) })
9515
9710
  ] }),
@@ -9523,9 +9718,9 @@ var Users = ({ users, onViewUser, onSetMain, onToggleAdmin, onRemoveUser, onInvi
9523
9718
  }
9524
9719
  )
9525
9720
  ] }),
9526
- /* @__PURE__ */ jsxs28("div", { className: "min-w-0 flex-1", children: [
9527
- /* @__PURE__ */ jsxs28("div", { className: "flex items-start justify-between gap-3", children: [
9528
- /* @__PURE__ */ jsxs28("div", { className: "min-w-0", children: [
9721
+ /* @__PURE__ */ jsxs27("div", { className: "min-w-0 flex-1", children: [
9722
+ /* @__PURE__ */ jsxs27("div", { className: "flex items-start justify-between gap-3", children: [
9723
+ /* @__PURE__ */ jsxs27("div", { className: "min-w-0", children: [
9529
9724
  /* @__PURE__ */ jsx41("div", { className: "truncate text-sm font-semibold text-slate-900 dark:text-slate-100", children: user.name }),
9530
9725
  /* @__PURE__ */ jsx41("div", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: statusLabel })
9531
9726
  ] }),
@@ -9551,7 +9746,7 @@ var Users = ({ users, onViewUser, onSetMain, onToggleAdmin, onRemoveUser, onInvi
9551
9746
  }
9552
9747
  )
9553
9748
  ] }),
9554
- /* @__PURE__ */ jsxs28("div", { className: "mt-3 flex flex-wrap gap-2", children: [
9749
+ /* @__PURE__ */ jsxs27("div", { className: "mt-3 flex flex-wrap gap-2", children: [
9555
9750
  (user.roles?.length ? user.roles : ["viewer"]).map((role) => /* @__PURE__ */ jsx41("span", { className: cn("rounded-full border px-2.5 py-1 text-[11px] font-semibold capitalize", roleClass(role)), children: formatRole(role) }, `${user.id}-${role}`)),
9556
9751
  /* @__PURE__ */ jsx41("span", { className: "rounded-full border border-slate-200 bg-white px-2.5 py-1 text-[11px] font-medium text-slate-500 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-300", children: permissionsLabel })
9557
9752
  ] })
@@ -9571,7 +9766,7 @@ import { useCanvas as useCanvas6, useWorkspace as useWorkspace9 } from "@timeax/
9571
9766
  import { useMemo as useMemo19 } from "react";
9572
9767
  import { MdOutlinePlayArrow } from "react-icons/md";
9573
9768
  import { PiShareFatThin } from "react-icons/pi";
9574
- import { jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
9769
+ import { jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
9575
9770
  var Header2 = ({ onShare, onPlay }) => {
9576
9771
  const ws = useWorkspace9();
9577
9772
  const canvas = useCanvas6();
@@ -9606,8 +9801,8 @@ var Header2 = ({ onShare, onPlay }) => {
9606
9801
  const onShareClick = () => {
9607
9802
  onShare?.(ws.snapshot.data);
9608
9803
  };
9609
- return /* @__PURE__ */ jsxs29("div", { className: "flex items-center justify-between gap-3 border-b border-slate-200 px-3 py-3 dark:border-slate-800", children: [
9610
- /* @__PURE__ */ jsxs29("div", { className: "min-w-0 flex items-center gap-3", children: [
9804
+ return /* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between gap-3 border-b border-slate-200 px-3 py-3 dark:border-slate-800", children: [
9805
+ /* @__PURE__ */ jsxs28("div", { className: "min-w-0 flex items-center gap-3", children: [
9611
9806
  /* @__PURE__ */ jsx42(users_default, { users }),
9612
9807
  /* @__PURE__ */ jsx42(
9613
9808
  BuilderIconButton,
@@ -9669,7 +9864,7 @@ function CollapsibleContent2({
9669
9864
  import { InputField as InputField3 } from "@timeax/form-palette";
9670
9865
  import * as React28 from "react";
9671
9866
  import { createCache as createCache2, createIndexedDBDriver as createIndexedDBDriver2, createMemoryDriver as createMemoryDriver2 } from "@timeax/cache-store";
9672
- import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
9867
+ import { jsx as jsx44, jsxs as jsxs29 } from "react/jsx-runtime";
9673
9868
  var OPEN_DB_NAME = "dgp-cache";
9674
9869
  var OPEN_STORE_NAME = "kv";
9675
9870
  var OPEN_NS = "comment-thread-open";
@@ -9752,7 +9947,7 @@ function PersonAvatar({
9752
9947
  sizeClass = "h-8 w-8",
9753
9948
  fallback
9754
9949
  }) {
9755
- return /* @__PURE__ */ jsxs30(Avatar, { className: sizeClass, children: [
9950
+ return /* @__PURE__ */ jsxs29(Avatar, { className: sizeClass, children: [
9756
9951
  person.avatar?.src ? /* @__PURE__ */ jsx44(AvatarImage, { src: person.avatar.src, alt: person.avatar.alt ?? `Avatar of ${person.name}` }) : null,
9757
9952
  /* @__PURE__ */ jsx44(AvatarFallback, { children: fallback ?? initials(person.name) })
9758
9953
  ] });
@@ -9764,7 +9959,7 @@ function ReplyInputRow({
9764
9959
  onSubmit,
9765
9960
  className
9766
9961
  }) {
9767
- return /* @__PURE__ */ jsxs30("div", { className: cx("flex items-center gap-3", className), children: [
9962
+ return /* @__PURE__ */ jsxs29("div", { className: cx("flex items-center gap-3", className), children: [
9768
9963
  /* @__PURE__ */ jsx44(PersonAvatar, { person: { name: you.name, avatar: you.avatar }, fallback: initials(you.name) }),
9769
9964
  /* @__PURE__ */ jsx44(
9770
9965
  InputField3,
@@ -9785,10 +9980,10 @@ function ReplyInputRow({
9785
9980
  }
9786
9981
  function CommentItem({ msg, identities, formatTime }) {
9787
9982
  const author = resolveAuthor(msg, identities);
9788
- return /* @__PURE__ */ jsxs30("div", { className: "flex items-start gap-3", children: [
9983
+ return /* @__PURE__ */ jsxs29("div", { className: "flex items-start gap-3", children: [
9789
9984
  /* @__PURE__ */ jsx44(PersonAvatar, { person: author }),
9790
- /* @__PURE__ */ jsxs30("div", { className: "flex-1", children: [
9791
- /* @__PURE__ */ jsxs30("div", { className: "flex items-center justify-between", children: [
9985
+ /* @__PURE__ */ jsxs29("div", { className: "flex-1", children: [
9986
+ /* @__PURE__ */ jsxs29("div", { className: "flex items-center justify-between", children: [
9792
9987
  /* @__PURE__ */ jsx44("p", { className: "text-sm font-semibold text-gray-800 dark:text-white", children: author.name }),
9793
9988
  /* @__PURE__ */ jsx44("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: formatTime(msg.createdAt) })
9794
9989
  ] }),
@@ -9810,7 +10005,7 @@ function CommentThreadView({ thread, identities, you, highlight, formatTime, onR
9810
10005
  };
9811
10006
  if (!main) return null;
9812
10007
  const [open, setOpen] = useThreadOpenState(thread.id, true);
9813
- return /* @__PURE__ */ jsxs30(
10008
+ return /* @__PURE__ */ jsxs29(
9814
10009
  "div",
9815
10010
  {
9816
10011
  className: cx(
@@ -9818,11 +10013,11 @@ function CommentThreadView({ thread, identities, you, highlight, formatTime, onR
9818
10013
  ),
9819
10014
  children: [
9820
10015
  isHighlighted ? /* @__PURE__ */ jsx44(ActiveDot, {}) : null,
9821
- /* @__PURE__ */ jsxs30(Collapsible, { open, onOpenChange: setOpen, children: [
10016
+ /* @__PURE__ */ jsxs29(Collapsible, { open, onOpenChange: setOpen, children: [
9822
10017
  /* @__PURE__ */ jsx44(CollapsibleTrigger2, { asChild: true, children: /* @__PURE__ */ jsx44("div", { className: "px-3 py-4", children: /* @__PURE__ */ jsx44(CommentItem, { msg: main, identities, formatTime: fmt }) }) }),
9823
- /* @__PURE__ */ jsx44(CollapsibleContent2, { children: /* @__PURE__ */ jsx44("div", { className: "border-t border-gray-200 bg-gray-50 p-4 pl-6 dark:border-gray-700 dark:bg-gray-800/50", children: /* @__PURE__ */ jsxs30("div", { className: "flex items-start gap-4", children: [
10018
+ /* @__PURE__ */ jsx44(CollapsibleContent2, { children: /* @__PURE__ */ jsx44("div", { className: "border-t border-gray-200 bg-gray-50 p-4 pl-6 dark:border-gray-700 dark:bg-gray-800/50", children: /* @__PURE__ */ jsxs29("div", { className: "flex items-start gap-4", children: [
9824
10019
  /* @__PURE__ */ jsx44("div", { className: "ml-1 w-px shrink-0 self-stretch bg-gray-300 dark:bg-gray-600" }),
9825
- /* @__PURE__ */ jsxs30("div", { className: "flex-1 space-y-4", children: [
10020
+ /* @__PURE__ */ jsxs29("div", { className: "flex-1 space-y-4", children: [
9826
10021
  replies.map((r) => /* @__PURE__ */ jsx44(CommentItem, { msg: r, identities, formatTime: fmt }, r.id)),
9827
10022
  /* @__PURE__ */ jsx44(ReplyInputRow, { id: thread.id, you, value, setValue, onSubmit: submit })
9828
10023
  ] })
@@ -9833,7 +10028,7 @@ function CommentThreadView({ thread, identities, you, highlight, formatTime, onR
9833
10028
  );
9834
10029
  }
9835
10030
  function ActiveDot() {
9836
- return /* @__PURE__ */ jsxs30("span", { className: "absolute -top-1.5 -left-1.5 flex h-3 w-3", children: [
10031
+ return /* @__PURE__ */ jsxs29("span", { className: "absolute -top-1.5 -left-1.5 flex h-3 w-3", children: [
9837
10032
  /* @__PURE__ */ jsx44("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-75" }),
9838
10033
  /* @__PURE__ */ jsx44("span", { className: "relative inline-flex h-3 w-3 rounded-full bg-primary" })
9839
10034
  ] });
@@ -9844,7 +10039,7 @@ import { useWorkspace as useWorkspace10 } from "@timeax/digital-service-engine/w
9844
10039
  import { InputField as InputField4 } from "@timeax/form-palette";
9845
10040
  import { useMemo as useMemo21, useState as useState22 } from "react";
9846
10041
  import { MdOutlineSend } from "react-icons/md";
9847
- import { jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
10042
+ import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
9848
10043
  var Comments = () => {
9849
10044
  const ws = useWorkspace10();
9850
10045
  const [value, setValue] = useState22("");
@@ -9857,12 +10052,12 @@ var Comments = () => {
9857
10052
  (thread) => thread.messages.some((message) => `${message.authorName ?? ""} ${message.body}`.toLowerCase().includes(lower))
9858
10053
  );
9859
10054
  }, [ws.comments.threads.data, query]);
9860
- return /* @__PURE__ */ jsxs31("div", { className: "flex h-full min-h-0 flex-col overflow-hidden", children: [
9861
- /* @__PURE__ */ jsxs31("div", { className: "flex items-center justify-between px-4 pt-4", children: [
10055
+ return /* @__PURE__ */ jsxs30("div", { className: "flex h-full min-h-0 flex-col overflow-hidden", children: [
10056
+ /* @__PURE__ */ jsxs30("div", { className: "flex items-center justify-between px-4 pt-4", children: [
9862
10057
  /* @__PURE__ */ jsx45("div", { children: /* @__PURE__ */ jsx45("h3", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: "All comments" }) }),
9863
10058
  /* @__PURE__ */ jsx45("button", { className: "text-xs font-semibold text-blue-600 hover:underline dark:text-blue-300", children: "Mark as read" })
9864
10059
  ] }),
9865
- /* @__PURE__ */ jsxs31("div", { className: "px-4 pt-3", children: [
10060
+ /* @__PURE__ */ jsxs30("div", { className: "px-4 pt-3", children: [
9866
10061
  /* @__PURE__ */ jsx45(PanelSearch, { value: query, onChange: setQuery, placeholder: "Search comments or authors" }),
9867
10062
  /* @__PURE__ */ jsx45(WorkspaceBootInlineNotice, { boot: ws.boot, sections: ["comments"], className: "mt-3" })
9868
10063
  ] }),
@@ -9970,7 +10165,7 @@ function FieldLabel(props) {
9970
10165
  import * as React31 from "react";
9971
10166
  import { MdOutlineOpenInNew, MdOutlineRemoveCircleOutline } from "react-icons/md";
9972
10167
  import { TiWarning } from "react-icons/ti";
9973
- import { jsx as jsx48, jsxs as jsxs32 } from "react/jsx-runtime";
10168
+ import { jsx as jsx48, jsxs as jsxs31 } from "react/jsx-runtime";
9974
10169
  var SectionCtx = React31.createContext(null);
9975
10170
  function useSectionCtx() {
9976
10171
  const ctx = React31.useContext(SectionCtx);
@@ -10026,7 +10221,7 @@ var Section = Object.assign(SectionRoot, {
10026
10221
  });
10027
10222
  function buildSectionActionButton({ className, icon, tooltip, iconOnly = false, badge, children, ...props }, ref) {
10028
10223
  const derivedAriaLabel = props["aria-label"] ?? (typeof tooltip === "string" ? tooltip : typeof children === "string" ? children : typeof props.title === "string" ? props.title : void 0);
10029
- const button = /* @__PURE__ */ jsxs32(
10224
+ const button = /* @__PURE__ */ jsxs31(
10030
10225
  "button",
10031
10226
  {
10032
10227
  ref,
@@ -10048,7 +10243,7 @@ function buildSectionActionButton({ className, icon, tooltip, iconOnly = false,
10048
10243
  }
10049
10244
  );
10050
10245
  if (!tooltip) return button;
10051
- return /* @__PURE__ */ jsxs32(Tooltip, { children: [
10246
+ return /* @__PURE__ */ jsxs31(Tooltip, { children: [
10052
10247
  /* @__PURE__ */ jsx48(TooltipTrigger, { asChild: true, children: button }),
10053
10248
  /* @__PURE__ */ jsx48(TooltipContent, { side: "bottom", children: tooltip })
10054
10249
  ] });
@@ -10063,8 +10258,8 @@ function IncludesList({ className, children }) {
10063
10258
  return /* @__PURE__ */ jsx48("div", { className: cn("space-y-2", className), children });
10064
10259
  }
10065
10260
  function IncludesItem({ title, badge, actions, className }) {
10066
- return /* @__PURE__ */ jsxs32("div", { className: cn("flex items-center justify-between rounded-md p-2", "bg-gray-50 dark:bg-gray-800/50", className), children: [
10067
- /* @__PURE__ */ jsxs32("div", { className: "flex min-w-0 items-center gap-2", children: [
10261
+ return /* @__PURE__ */ jsxs31("div", { className: cn("flex items-center justify-between rounded-md p-2", "bg-gray-50 dark:bg-gray-800/50", className), children: [
10262
+ /* @__PURE__ */ jsxs31("div", { className: "flex min-w-0 items-center gap-2", children: [
10068
10263
  /* @__PURE__ */ jsx48("span", { className: "truncate text-sm text-gray-800 dark:text-gray-200", children: title }),
10069
10264
  badge
10070
10265
  ] }),
@@ -10077,8 +10272,8 @@ function IncludesItemMissing({
10077
10272
  className,
10078
10273
  icon
10079
10274
  }) {
10080
- return /* @__PURE__ */ jsxs32("div", { className: cn("flex items-center justify-between rounded-md p-2", "bg-red-50 dark:bg-red-900/20", className), children: [
10081
- /* @__PURE__ */ jsxs32("div", { className: "flex min-w-0 items-center gap-2", children: [
10275
+ return /* @__PURE__ */ jsxs31("div", { className: cn("flex items-center justify-between rounded-md p-2", "bg-red-50 dark:bg-red-900/20", className), children: [
10276
+ /* @__PURE__ */ jsxs31("div", { className: "flex min-w-0 items-center gap-2", children: [
10082
10277
  /* @__PURE__ */ jsx48("span", { className: "shrink-0 text-base text-red-500 dark:text-red-400", children: icon ?? /* @__PURE__ */ jsx48("span", { className: "material-symbols-outlined", children: /* @__PURE__ */ jsx48(TiWarning, {}) }) }),
10083
10278
  /* @__PURE__ */ jsx48("span", { className: "truncate text-sm text-red-700 dark:text-red-300", children: message })
10084
10279
  ] }),
@@ -10143,7 +10338,7 @@ import { useCanvas as useCanvas7, useWorkspace as useWorkspace11 } from "@timeax
10143
10338
  import { InputField as InputField5 } from "@timeax/form-palette";
10144
10339
  import { useMemo as useMemo23, useState as useState24 } from "react";
10145
10340
  import { BsPlus } from "react-icons/bs";
10146
- import { Fragment as Fragment9, jsx as jsx50, jsxs as jsxs33 } from "react/jsx-runtime";
10341
+ import { Fragment as Fragment9, jsx as jsx50, jsxs as jsxs32 } from "react/jsx-runtime";
10147
10342
  function AddService({ className, data, disabled, disabledMessage, readOnly, readOnlyMessage, emptyMessage }) {
10148
10343
  const ws = useWorkspace11();
10149
10344
  const canvas = useCanvas7();
@@ -10151,19 +10346,19 @@ function AddService({ className, data, disabled, disabledMessage, readOnly, read
10151
10346
  const connectedService = data.raw.service_id != null ? services2[data.raw.service_id] : void 0;
10152
10347
  const isReadOnly = Boolean(disabled || readOnly);
10153
10348
  const helperMessage = readOnlyMessage ?? disabledMessage;
10154
- return /* @__PURE__ */ jsxs33(Section, { className, children: [
10155
- /* @__PURE__ */ jsxs33(Section.Header, { children: [
10349
+ return /* @__PURE__ */ jsxs32(Section, { className, children: [
10350
+ /* @__PURE__ */ jsxs32(Section.Header, { children: [
10156
10351
  /* @__PURE__ */ jsx50(Section.Title, { children: "Service" }),
10157
10352
  /* @__PURE__ */ jsx50(Section.Actions, { children: !isReadOnly ? /* @__PURE__ */ jsx50(AddServicePopover, { data, services: Object.values(services2) }) : null })
10158
10353
  ] }),
10159
- /* @__PURE__ */ jsxs33(Section.Content, { children: [
10354
+ /* @__PURE__ */ jsxs32(Section.Content, { children: [
10160
10355
  helperMessage ? /* @__PURE__ */ jsx50("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: helperMessage }) : null,
10161
10356
  /* @__PURE__ */ jsx50(RenderIf, { data: connectedService, emptyMessage: isReadOnly ? emptyMessage ?? null : emptyMessage ?? "None", children: (service) => /* @__PURE__ */ jsx50(Fragment9, { children: /* @__PURE__ */ jsx50(
10162
10357
  IncludesItem,
10163
10358
  {
10164
10359
  title: service.name ?? `Service ${service.id}`,
10165
10360
  className: "items-start!",
10166
- badge: /* @__PURE__ */ jsxs33("span", { className: "rounded-full bg-slate-200 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.16em] text-slate-600 dark:bg-slate-800 dark:text-slate-300", children: [
10361
+ badge: /* @__PURE__ */ jsxs32("span", { className: "rounded-full bg-slate-200 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.16em] text-slate-600 dark:bg-slate-800 dark:text-slate-300", children: [
10167
10362
  "#",
10168
10363
  service.id
10169
10364
  ] }),
@@ -10182,19 +10377,19 @@ function AddService({ className, data, disabled, disabledMessage, readOnly, read
10182
10377
  }
10183
10378
  function ServiceSummary({ service, nodeId, disabled }) {
10184
10379
  const canvas = useCanvas7();
10185
- return /* @__PURE__ */ jsxs33("div", { className: "mt-2 rounded-md bg-gray-50 p-3 text-sm dark:bg-gray-800/50", children: [
10186
- /* @__PURE__ */ jsxs33("div", { className: "space-y-1 text-xs text-gray-600 dark:text-gray-300", children: [
10187
- /* @__PURE__ */ jsxs33("p", { children: [
10380
+ return /* @__PURE__ */ jsxs32("div", { className: "mt-2 rounded-md bg-gray-50 p-3 text-sm dark:bg-gray-800/50", children: [
10381
+ /* @__PURE__ */ jsxs32("div", { className: "space-y-1 text-xs text-gray-600 dark:text-gray-300", children: [
10382
+ /* @__PURE__ */ jsxs32("p", { children: [
10188
10383
  /* @__PURE__ */ jsx50("span", { className: "font-medium text-gray-800 dark:text-gray-200", children: "Category:" }),
10189
10384
  " ",
10190
10385
  service.category ?? "Uncategorised"
10191
10386
  ] }),
10192
- /* @__PURE__ */ jsxs33("p", { children: [
10387
+ /* @__PURE__ */ jsxs32("p", { children: [
10193
10388
  /* @__PURE__ */ jsx50("span", { className: "font-medium text-gray-800 dark:text-gray-200", children: "Rate:" }),
10194
10389
  " ",
10195
10390
  service.rate
10196
10391
  ] }),
10197
- /* @__PURE__ */ jsxs33("p", { children: [
10392
+ /* @__PURE__ */ jsxs32("p", { children: [
10198
10393
  /* @__PURE__ */ jsx50("span", { className: "font-medium text-gray-800 dark:text-gray-200", children: "Range:" }),
10199
10394
  " ",
10200
10395
  service.min ?? 0,
@@ -10230,11 +10425,11 @@ function AddServicePopover({ data, services: services2 }) {
10230
10425
  service
10231
10426
  }));
10232
10427
  }, [services2, query]);
10233
- return /* @__PURE__ */ jsxs33(Popover, { open, onOpenChange: setOpen, children: [
10428
+ return /* @__PURE__ */ jsxs32(Popover, { open, onOpenChange: setOpen, children: [
10234
10429
  /* @__PURE__ */ jsx50(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx50(SectionActionTriggerButton, { icon: /* @__PURE__ */ jsx50(BsPlus, {}), children: "Add" }) }),
10235
- /* @__PURE__ */ jsx50(PopoverContent, { className: "w-96", children: /* @__PURE__ */ jsxs33("div", { className: "flex flex-col gap-3", children: [
10430
+ /* @__PURE__ */ jsx50(PopoverContent, { className: "w-96", children: /* @__PURE__ */ jsxs32("div", { className: "flex flex-col gap-3", children: [
10236
10431
  /* @__PURE__ */ jsx50(InputField5, { variant: "text", value: query, onChange: (e) => setQuery(e.value ?? ""), placeholder: "Search services..." }),
10237
- /* @__PURE__ */ jsx50(ScrollArea, { className: "h-72 pr-1", children: /* @__PURE__ */ jsx50("div", { className: "space-y-2 pr-2", children: options.length ? options.map((option) => /* @__PURE__ */ jsxs33(
10432
+ /* @__PURE__ */ jsx50(ScrollArea, { className: "h-72 pr-1", children: /* @__PURE__ */ jsx50("div", { className: "space-y-2 pr-2", children: options.length ? options.map((option) => /* @__PURE__ */ jsxs32(
10238
10433
  "button",
10239
10434
  {
10240
10435
  type: "button",
@@ -10242,7 +10437,7 @@ function AddServicePopover({ data, services: services2 }) {
10242
10437
  className: `w-full rounded-md border px-3 py-2 text-left transition ${selected === option.value ? "border-blue-300 bg-blue-50 dark:border-blue-500/40 dark:bg-blue-500/10" : "border-slate-200 hover:border-slate-300 hover:bg-slate-50 dark:border-slate-700 dark:hover:border-slate-600 dark:hover:bg-slate-900"}`,
10243
10438
  children: [
10244
10439
  /* @__PURE__ */ jsx50("div", { className: "text-sm font-medium text-slate-900 dark:text-slate-100", children: option.label }),
10245
- /* @__PURE__ */ jsxs33("div", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: [
10440
+ /* @__PURE__ */ jsxs32("div", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: [
10246
10441
  option.description ?? "Uncategorised",
10247
10442
  " \u2022 Rate ",
10248
10443
  option.service.rate
@@ -10324,7 +10519,7 @@ function buildQuantityRule(valueBy, base = {}) {
10324
10519
  }
10325
10520
 
10326
10521
  // src/panels/right/partials/properties/components/descriptor-settings.tsx
10327
- import { jsx as jsx51, jsxs as jsxs34 } from "react/jsx-runtime";
10522
+ import { jsx as jsx51, jsxs as jsxs33 } from "react/jsx-runtime";
10328
10523
  var RESERVED_DESCRIPTOR_KEYS = /* @__PURE__ */ new Set([
10329
10524
  "options",
10330
10525
  "label",
@@ -10476,7 +10671,7 @@ function FieldDescription({
10476
10671
  onReset
10477
10672
  }) {
10478
10673
  if (!description && !canReset) return null;
10479
- return /* @__PURE__ */ jsxs34("div", { className: "flex items-start justify-between gap-3", children: [
10674
+ return /* @__PURE__ */ jsxs33("div", { className: "flex items-start justify-between gap-3", children: [
10480
10675
  /* @__PURE__ */ jsx51("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: description }),
10481
10676
  canReset ? /* @__PURE__ */ jsx51(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 px-2 text-xs", onClick: onReset, children: "Reset" }) : null
10482
10677
  ] });
@@ -10485,7 +10680,7 @@ function DescriptorPrimitiveField({ schema, value, hasOverride, onSet, onClear,
10485
10680
  switch (schema.type) {
10486
10681
  case "string": {
10487
10682
  const options = schema.enum?.map((item) => ({ label: item, value: item }));
10488
- return /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
10683
+ return /* @__PURE__ */ jsxs33("div", { className: "space-y-2", children: [
10489
10684
  /* @__PURE__ */ jsx51(FieldDescription, { description: schema.description, canReset: hasOverride, onReset: () => onClear(path) }),
10490
10685
  /* @__PURE__ */ jsx51(
10491
10686
  InputField6,
@@ -10508,7 +10703,7 @@ function DescriptorPrimitiveField({ schema, value, hasOverride, onSet, onClear,
10508
10703
  ] });
10509
10704
  }
10510
10705
  case "number":
10511
- return /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
10706
+ return /* @__PURE__ */ jsxs33("div", { className: "space-y-2", children: [
10512
10707
  /* @__PURE__ */ jsx51(FieldDescription, { description: schema.description, canReset: hasOverride, onReset: () => onClear(path) }),
10513
10708
  /* @__PURE__ */ jsx51(
10514
10709
  InputField6,
@@ -10529,7 +10724,7 @@ function DescriptorPrimitiveField({ schema, value, hasOverride, onSet, onClear,
10529
10724
  )
10530
10725
  ] });
10531
10726
  case "boolean":
10532
- return /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
10727
+ return /* @__PURE__ */ jsxs33("div", { className: "space-y-2", children: [
10533
10728
  /* @__PURE__ */ jsx51(FieldDescription, { description: schema.description, canReset: hasOverride, onReset: () => onClear(path) }),
10534
10729
  /* @__PURE__ */ jsx51(
10535
10730
  InputField6,
@@ -10547,7 +10742,7 @@ function DescriptorPrimitiveField({ schema, value, hasOverride, onSet, onClear,
10547
10742
  value: item.value,
10548
10743
  description: item.description
10549
10744
  }));
10550
- return /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
10745
+ return /* @__PURE__ */ jsxs33("div", { className: "space-y-2", children: [
10551
10746
  /* @__PURE__ */ jsx51(FieldDescription, { description: schema.description, canReset: hasOverride, onReset: () => onClear(path) }),
10552
10747
  /* @__PURE__ */ jsx51(
10553
10748
  InputField6,
@@ -10616,15 +10811,15 @@ function DescriptorObjectField({ schema, value, hasOverride, onSet, onClear, pat
10616
10811
  setActiveShapes((current) => ({ ...current, [nextKey]: draftShape }));
10617
10812
  setDraftKey("");
10618
10813
  };
10619
- return /* @__PURE__ */ jsx51("div", { className: "rounded-xl border border-slate-200/80 p-3 dark:border-slate-800", children: /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
10620
- /* @__PURE__ */ jsxs34("div", { className: "flex items-start justify-between gap-3", children: [
10621
- /* @__PURE__ */ jsxs34("div", { children: [
10814
+ return /* @__PURE__ */ jsx51("div", { className: "rounded-xl border border-slate-200/80 p-3 dark:border-slate-800", children: /* @__PURE__ */ jsxs33("div", { className: "space-y-2", children: [
10815
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-start justify-between gap-3", children: [
10816
+ /* @__PURE__ */ jsxs33("div", { children: [
10622
10817
  /* @__PURE__ */ jsx51("h4", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: schema.label }),
10623
10818
  /* @__PURE__ */ jsx51("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: schema.description })
10624
10819
  ] }),
10625
10820
  allowClear && hasOverride ? /* @__PURE__ */ jsx51(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 px-2 text-xs", onClick: () => onClear(path), children: "Reset" }) : null
10626
10821
  ] }),
10627
- /* @__PURE__ */ jsxs34("div", { className: "space-y-4", children: [
10822
+ /* @__PURE__ */ jsxs33("div", { className: "space-y-4", children: [
10628
10823
  orderedEntries.map(([key, childSchema]) => /* @__PURE__ */ jsx51(
10629
10824
  DescriptorNodeField,
10630
10825
  {
@@ -10641,8 +10836,8 @@ function DescriptorObjectField({ schema, value, hasOverride, onSet, onClear, pat
10641
10836
  const shapeKey = activeShapes[key] ?? inferShapeKey(schema.shape, objectValue[key]);
10642
10837
  const shapeSchema = (shapeKey && schema.shape?.[shapeKey]) ?? shapeEntries[0]?.[1];
10643
10838
  if (!shapeSchema) return null;
10644
- return /* @__PURE__ */ jsxs34("div", { className: "space-y-3 rounded-lg border border-dashed border-slate-200 p-3 dark:border-slate-700", children: [
10645
- /* @__PURE__ */ jsxs34("div", { className: "grid gap-3 md:grid-cols-[minmax(0,1fr)_180px_auto]", children: [
10839
+ return /* @__PURE__ */ jsxs33("div", { className: "space-y-3 rounded-lg border border-dashed border-slate-200 p-3 dark:border-slate-700", children: [
10840
+ /* @__PURE__ */ jsxs33("div", { className: "grid gap-3 md:grid-cols-[minmax(0,1fr)_180px_auto]", children: [
10646
10841
  /* @__PURE__ */ jsx51(
10647
10842
  InputField6,
10648
10843
  {
@@ -10674,7 +10869,7 @@ function DescriptorObjectField({ schema, value, hasOverride, onSet, onClear, pat
10674
10869
  });
10675
10870
  }
10676
10871
  }
10677
- ) : /* @__PURE__ */ jsxs34("div", { className: "flex items-end text-xs text-slate-500 dark:text-slate-400", children: [
10872
+ ) : /* @__PURE__ */ jsxs33("div", { className: "flex items-end text-xs text-slate-500 dark:text-slate-400", children: [
10678
10873
  "Shape: ",
10679
10874
  shapeKey ?? shapeEntries[0]?.[0] ?? "Custom"
10680
10875
  ] }),
@@ -10708,7 +10903,7 @@ function DescriptorObjectField({ schema, value, hasOverride, onSet, onClear, pat
10708
10903
  )
10709
10904
  ] }, key);
10710
10905
  }),
10711
- schema.editable && shapeEntries.length ? /* @__PURE__ */ jsxs34("div", { className: "grid gap-3 rounded-lg border border-dashed border-slate-200 p-3 md:grid-cols-[minmax(0,1fr)_180px_auto] dark:border-slate-700", children: [
10906
+ schema.editable && shapeEntries.length ? /* @__PURE__ */ jsxs33("div", { className: "grid gap-3 rounded-lg border border-dashed border-slate-200 p-3 md:grid-cols-[minmax(0,1fr)_180px_auto] dark:border-slate-700", children: [
10712
10907
  /* @__PURE__ */ jsx51(
10713
10908
  InputField6,
10714
10909
  {
@@ -10756,15 +10951,15 @@ function DescriptorArrayField({ schema, value, hasOverride, onSet, onClear, path
10756
10951
  setActiveShapes((current) => ({ ...current, [nextIndex]: draftShape }));
10757
10952
  }
10758
10953
  };
10759
- return /* @__PURE__ */ jsx51("div", { className: "rounded-xl border border-slate-200/80 p-3 dark:border-slate-800", children: /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
10760
- /* @__PURE__ */ jsxs34("div", { className: "flex items-start justify-between gap-3", children: [
10761
- /* @__PURE__ */ jsxs34("div", { children: [
10954
+ return /* @__PURE__ */ jsx51("div", { className: "rounded-xl border border-slate-200/80 p-3 dark:border-slate-800", children: /* @__PURE__ */ jsxs33("div", { className: "space-y-2", children: [
10955
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-start justify-between gap-3", children: [
10956
+ /* @__PURE__ */ jsxs33("div", { children: [
10762
10957
  /* @__PURE__ */ jsx51("h4", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: schema.label }),
10763
10958
  /* @__PURE__ */ jsx51("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: schema.description })
10764
10959
  ] }),
10765
10960
  allowClear && hasOverride ? /* @__PURE__ */ jsx51(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 px-2 text-xs", onClick: () => onClear(path), children: "Reset" }) : null
10766
10961
  ] }),
10767
- /* @__PURE__ */ jsxs34("div", { className: "space-y-4", children: [
10962
+ /* @__PURE__ */ jsxs33("div", { className: "space-y-4", children: [
10768
10963
  schema.items ? schema.items.map((childSchema, index) => /* @__PURE__ */ jsx51(
10769
10964
  DescriptorNodeField,
10770
10965
  {
@@ -10781,9 +10976,9 @@ function DescriptorArrayField({ schema, value, hasOverride, onSet, onClear, path
10781
10976
  const shapeKey = activeShapes[index] ?? inferShapeKey(schema.shape, item);
10782
10977
  const itemSchema = schema.item ?? (shapeKey ? schema.shape?.[shapeKey] : void 0) ?? shapeEntries[0]?.[1];
10783
10978
  if (!itemSchema) return null;
10784
- return /* @__PURE__ */ jsxs34("div", { className: "space-y-3 rounded-lg border border-dashed border-slate-200 p-3 dark:border-slate-700", children: [
10785
- /* @__PURE__ */ jsxs34("div", { className: "grid gap-3 md:grid-cols-[minmax(0,1fr)_180px_auto]", children: [
10786
- /* @__PURE__ */ jsxs34("div", { className: "flex items-end text-xs text-slate-500 dark:text-slate-400", children: [
10979
+ return /* @__PURE__ */ jsxs33("div", { className: "space-y-3 rounded-lg border border-dashed border-slate-200 p-3 dark:border-slate-700", children: [
10980
+ /* @__PURE__ */ jsxs33("div", { className: "grid gap-3 md:grid-cols-[minmax(0,1fr)_180px_auto]", children: [
10981
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-end text-xs text-slate-500 dark:text-slate-400", children: [
10787
10982
  formatLabel(schema.label),
10788
10983
  " item ",
10789
10984
  index + 1
@@ -10837,8 +11032,8 @@ function DescriptorArrayField({ schema, value, hasOverride, onSet, onClear, path
10837
11032
  )
10838
11033
  ] }, `${path.join(".")}:${index}`);
10839
11034
  }),
10840
- !schema.items && (schema.editable ?? true) ? /* @__PURE__ */ jsxs34("div", { className: "grid gap-3 rounded-lg border border-dashed border-slate-200 p-3 md:grid-cols-[minmax(0,1fr)_180px_auto] dark:border-slate-700", children: [
10841
- /* @__PURE__ */ jsxs34("div", { className: "flex items-end text-xs text-slate-500 dark:text-slate-400", children: [
11035
+ !schema.items && (schema.editable ?? true) ? /* @__PURE__ */ jsxs33("div", { className: "grid gap-3 rounded-lg border border-dashed border-slate-200 p-3 md:grid-cols-[minmax(0,1fr)_180px_auto] dark:border-slate-700", children: [
11036
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-end text-xs text-slate-500 dark:text-slate-400", children: [
10842
11037
  "Add another ",
10843
11038
  schema.label.toLowerCase()
10844
11039
  ] }),
@@ -10913,7 +11108,7 @@ import { InputField as InputField7 } from "@timeax/form-palette";
10913
11108
  import { useMemo as useMemo25 } from "react";
10914
11109
  import { BsPlus as BsPlus2 } from "react-icons/bs";
10915
11110
  import { MdDeleteOutline } from "react-icons/md";
10916
- import { jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
11111
+ import { jsx as jsx52, jsxs as jsxs34 } from "react/jsx-runtime";
10917
11112
  var ruleOptions = [
10918
11113
  { label: "Value", value: "value" },
10919
11114
  { label: "Length", value: "length" },
@@ -10973,10 +11168,10 @@ function QuantitySection({ node }) {
10973
11168
  const hasQuantityDefault = capabilities.quantity.canEditDefault && quantityDefault !== void 0;
10974
11169
  const canAddRule = capabilities.quantity.canEditRule && !hasFieldRule;
10975
11170
  const canAddDefault = capabilities.quantity.canEditDefault && !hasQuantityDefault;
10976
- return /* @__PURE__ */ jsxs35(Section, { children: [
10977
- /* @__PURE__ */ jsxs35(Section.Header, { children: [
11171
+ return /* @__PURE__ */ jsxs34(Section, { children: [
11172
+ /* @__PURE__ */ jsxs34(Section.Header, { children: [
10978
11173
  /* @__PURE__ */ jsx52(Section.Title, { children: "Quantity" }),
10979
- canAddRule || canAddDefault || hasFieldRule || hasQuantityDefault ? /* @__PURE__ */ jsxs35(Section.Actions, { children: [
11174
+ canAddRule || canAddDefault || hasFieldRule || hasQuantityDefault ? /* @__PURE__ */ jsxs34(Section.Actions, { children: [
10980
11175
  canAddRule ? /* @__PURE__ */ jsx52(
10981
11176
  SectionActionButton,
10982
11177
  {
@@ -11022,9 +11217,9 @@ function QuantitySection({ node }) {
11022
11217
  ) : null
11023
11218
  ] }) : null
11024
11219
  ] }),
11025
- /* @__PURE__ */ jsx52(Section.Content, { children: node.kind === "field" ? /* @__PURE__ */ jsxs35("div", { className: "space-y-4", children: [
11026
- hasFieldRule ? /* @__PURE__ */ jsxs35("div", { className: "space-y-3 rounded-xl border border-slate-200 p-3 dark:border-slate-800", children: [
11027
- /* @__PURE__ */ jsxs35("div", { className: "space-y-2", children: [
11220
+ /* @__PURE__ */ jsx52(Section.Content, { children: node.kind === "field" ? /* @__PURE__ */ jsxs34("div", { className: "space-y-4", children: [
11221
+ hasFieldRule ? /* @__PURE__ */ jsxs34("div", { className: "space-y-3 rounded-xl border border-slate-200 p-3 dark:border-slate-800", children: [
11222
+ /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
11028
11223
  /* @__PURE__ */ jsx52("div", { className: "grid grid-cols-3 gap-2 rounded-lg bg-slate-100 p-1 dark:bg-slate-900", children: ruleOptions.map((option) => {
11029
11224
  const active = fieldRule?.valueBy === option.value;
11030
11225
  return /* @__PURE__ */ jsx52(
@@ -11053,7 +11248,7 @@ function QuantitySection({ node }) {
11053
11248
  onChange: (e) => updateRule({ code: String(e.value ?? "") })
11054
11249
  }
11055
11250
  ) : null,
11056
- /* @__PURE__ */ jsxs35("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
11251
+ /* @__PURE__ */ jsxs34("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
11057
11252
  /* @__PURE__ */ jsx52(
11058
11253
  InputField7,
11059
11254
  {
@@ -11106,7 +11301,7 @@ function QuantitySection({ node }) {
11106
11301
  )
11107
11302
  ] })
11108
11303
  ] }) : null,
11109
- capabilities.quantity.canEditDefault ? hasQuantityDefault ? /* @__PURE__ */ jsxs35("div", { className: "space-y-2 rounded-xl border border-slate-200 p-3 dark:border-slate-800", children: [
11304
+ capabilities.quantity.canEditDefault ? hasQuantityDefault ? /* @__PURE__ */ jsxs34("div", { className: "space-y-2 rounded-xl border border-slate-200 p-3 dark:border-slate-800", children: [
11110
11305
  /* @__PURE__ */ jsx52(
11111
11306
  InputField7,
11112
11307
  {
@@ -11119,7 +11314,7 @@ function QuantitySection({ node }) {
11119
11314
  ),
11120
11315
  capabilities.quantity.defaultHelp ? /* @__PURE__ */ jsx52("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: capabilities.quantity.defaultHelp }) : null
11121
11316
  ] }) : null : null
11122
- ] }) : hasQuantityDefault ? /* @__PURE__ */ jsxs35("div", { className: "space-y-2", children: [
11317
+ ] }) : hasQuantityDefault ? /* @__PURE__ */ jsxs34("div", { className: "space-y-2", children: [
11123
11318
  /* @__PURE__ */ jsx52(
11124
11319
  InputField7,
11125
11320
  {
@@ -11141,7 +11336,7 @@ import { useCanvas as useCanvas9 } from "@timeax/digital-service-engine/workspac
11141
11336
  import { InputField as InputField8 } from "@timeax/form-palette";
11142
11337
  import { BsPencil, BsPlus as BsPlus3 } from "react-icons/bs";
11143
11338
  import { MdDeleteOutline as MdDeleteOutline2 } from "react-icons/md";
11144
- import { Fragment as Fragment10, jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
11339
+ import { Fragment as Fragment10, jsx as jsx53, jsxs as jsxs35 } from "react/jsx-runtime";
11145
11340
  var utilityModes = [
11146
11341
  { label: "Flat", value: "flat" },
11147
11342
  { label: "Per quantity", value: "per_quantity" },
@@ -11193,10 +11388,10 @@ function UtilitySection({ node }) {
11193
11388
  canvas.api.editor.updateOption(node.id, { meta: nextMeta });
11194
11389
  });
11195
11390
  };
11196
- return /* @__PURE__ */ jsxs36(Section, { children: [
11197
- /* @__PURE__ */ jsxs36(Section.Header, { children: [
11391
+ return /* @__PURE__ */ jsxs35(Section, { children: [
11392
+ /* @__PURE__ */ jsxs35(Section.Header, { children: [
11198
11393
  /* @__PURE__ */ jsx53(Section.Title, { children: "Utility" }),
11199
- /* @__PURE__ */ jsxs36(Section.Actions, { children: [
11394
+ /* @__PURE__ */ jsxs35(Section.Actions, { children: [
11200
11395
  !hasStoredUtility && !isActiveUtility ? /* @__PURE__ */ jsx53(
11201
11396
  SectionActionButton,
11202
11397
  {
@@ -11229,10 +11424,10 @@ function UtilitySection({ node }) {
11229
11424
  ) : null
11230
11425
  ] })
11231
11426
  ] }),
11232
- /* @__PURE__ */ jsx53(Section.Content, { children: hasUtilityConfiguration ? /* @__PURE__ */ jsxs36("div", { className: "space-y-3", children: [
11427
+ /* @__PURE__ */ jsx53(Section.Content, { children: hasUtilityConfiguration ? /* @__PURE__ */ jsxs35("div", { className: "space-y-3", children: [
11233
11428
  !hasStoredUtility ? /* @__PURE__ */ jsx53("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: "This node is marked as utility-priced, but its utility marker is missing. Fill in the values below to repair it." }) : null,
11234
11429
  hasStoredUtility && !isActiveUtility ? /* @__PURE__ */ jsx53("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: "This node still has utility marker values stored, but its pricing role is base. Activate utility to apply these charges, or clear the marker." }) : null,
11235
- /* @__PURE__ */ jsxs36(Fragment10, { children: [
11430
+ /* @__PURE__ */ jsxs35(Fragment10, { children: [
11236
11431
  /* @__PURE__ */ jsx53(
11237
11432
  InputField8,
11238
11433
  {
@@ -11311,7 +11506,7 @@ import { InputField as InputField9 } from "@timeax/form-palette";
11311
11506
  import { useMemo as useMemo26 } from "react";
11312
11507
  import { BsPlus as BsPlus4 } from "react-icons/bs";
11313
11508
  import { MdDeleteOutline as MdDeleteOutline3 } from "react-icons/md";
11314
- import { jsx as jsx54, jsxs as jsxs37 } from "react/jsx-runtime";
11509
+ import { jsx as jsx54, jsxs as jsxs36 } from "react/jsx-runtime";
11315
11510
  var opOptions = [
11316
11511
  { label: "Equals", value: "eq" },
11317
11512
  { label: "Not equal", value: "neq" },
@@ -11384,7 +11579,7 @@ function TypedScalarEditor({
11384
11579
  onChange
11385
11580
  }) {
11386
11581
  const scalarType = inferScalarType(value);
11387
- return /* @__PURE__ */ jsx54("div", { className: "space-y-3 rounded-lg border border-slate-200/80 p-3 dark:border-slate-800", children: /* @__PURE__ */ jsxs37("div", { className: "grid gap-3 md:grid-cols-[160px_minmax(0,1fr)]", children: [
11582
+ return /* @__PURE__ */ jsx54("div", { className: "space-y-3 rounded-lg border border-slate-200/80 p-3 dark:border-slate-800", children: /* @__PURE__ */ jsxs36("div", { className: "grid gap-3 md:grid-cols-[160px_minmax(0,1fr)]", children: [
11388
11583
  /* @__PURE__ */ jsx54(
11389
11584
  InputField9,
11390
11585
  {
@@ -11430,17 +11625,17 @@ function TypedScalarListEditor({
11430
11625
  onChange
11431
11626
  }) {
11432
11627
  const items = (values ?? []).filter((value) => ["string", "number", "boolean"].includes(typeof value));
11433
- return /* @__PURE__ */ jsxs37("div", { className: "space-y-3 rounded-lg border border-slate-200/80 p-3 dark:border-slate-800", children: [
11434
- /* @__PURE__ */ jsxs37("div", { className: "flex items-center justify-between gap-3", children: [
11435
- /* @__PURE__ */ jsxs37("div", { children: [
11628
+ return /* @__PURE__ */ jsxs36("div", { className: "space-y-3 rounded-lg border border-slate-200/80 p-3 dark:border-slate-800", children: [
11629
+ /* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between gap-3", children: [
11630
+ /* @__PURE__ */ jsxs36("div", { children: [
11436
11631
  /* @__PURE__ */ jsx54("h4", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: "Allowed values" }),
11437
11632
  /* @__PURE__ */ jsx54("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: "Rule values are checked in the order shown here." })
11438
11633
  ] }),
11439
11634
  /* @__PURE__ */ jsx54(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onChange([...items, ""]), children: "Add value" })
11440
11635
  ] }),
11441
- items.length ? /* @__PURE__ */ jsx54("div", { className: "space-y-3", children: items.map((item, index) => /* @__PURE__ */ jsxs37("div", { className: "space-y-3 rounded-lg border border-dashed border-slate-200 p-3 dark:border-slate-700", children: [
11442
- /* @__PURE__ */ jsxs37("div", { className: "flex items-center justify-between gap-3", children: [
11443
- /* @__PURE__ */ jsxs37("div", { className: "text-xs font-medium tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: [
11636
+ items.length ? /* @__PURE__ */ jsx54("div", { className: "space-y-3", children: items.map((item, index) => /* @__PURE__ */ jsxs36("div", { className: "space-y-3 rounded-lg border border-dashed border-slate-200 p-3 dark:border-slate-700", children: [
11637
+ /* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between gap-3", children: [
11638
+ /* @__PURE__ */ jsxs36("div", { className: "text-xs font-medium tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: [
11444
11639
  "Value ",
11445
11640
  index + 1
11446
11641
  ] }),
@@ -11474,10 +11669,10 @@ function ValidationRuleCard({
11474
11669
  onRemove
11475
11670
  }) {
11476
11671
  const valueBy = rule.valueBy ?? "value";
11477
- return /* @__PURE__ */ jsxs37("div", { className: "space-y-4 rounded-xl border border-slate-200 p-4 dark:border-slate-800", children: [
11478
- /* @__PURE__ */ jsxs37("div", { className: "flex items-start justify-between gap-3", children: [
11479
- /* @__PURE__ */ jsxs37("div", { children: [
11480
- /* @__PURE__ */ jsxs37("div", { className: "text-xs font-medium tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: [
11672
+ return /* @__PURE__ */ jsxs36("div", { className: "space-y-4 rounded-xl border border-slate-200 p-4 dark:border-slate-800", children: [
11673
+ /* @__PURE__ */ jsxs36("div", { className: "flex items-start justify-between gap-3", children: [
11674
+ /* @__PURE__ */ jsxs36("div", { children: [
11675
+ /* @__PURE__ */ jsxs36("div", { className: "text-xs font-medium tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: [
11481
11676
  "Rule ",
11482
11677
  index + 1
11483
11678
  ] }),
@@ -11494,7 +11689,7 @@ function ValidationRuleCard({
11494
11689
  }
11495
11690
  )
11496
11691
  ] }),
11497
- /* @__PURE__ */ jsxs37("div", { className: "grid gap-3 md:grid-cols-2", children: [
11692
+ /* @__PURE__ */ jsxs36("div", { className: "grid gap-3 md:grid-cols-2", children: [
11498
11693
  /* @__PURE__ */ jsx54(
11499
11694
  InputField9,
11500
11695
  {
@@ -11554,7 +11749,7 @@ function ValidationRuleCard({
11554
11749
  )
11555
11750
  }
11556
11751
  ) : null,
11557
- rule.op === "between" ? /* @__PURE__ */ jsxs37("div", { className: "grid gap-3 md:grid-cols-2", children: [
11752
+ rule.op === "between" ? /* @__PURE__ */ jsxs36("div", { className: "grid gap-3 md:grid-cols-2", children: [
11558
11753
  /* @__PURE__ */ jsx54(
11559
11754
  InputField9,
11560
11755
  {
@@ -11598,7 +11793,7 @@ function ValidationRuleCard({
11598
11793
  )
11599
11794
  }
11600
11795
  ) : null,
11601
- rule.op === "match" ? /* @__PURE__ */ jsxs37("div", { className: "grid gap-3 md:grid-cols-2", children: [
11796
+ rule.op === "match" ? /* @__PURE__ */ jsxs36("div", { className: "grid gap-3 md:grid-cols-2", children: [
11602
11797
  /* @__PURE__ */ jsx54(
11603
11798
  InputField9,
11604
11799
  {
@@ -11672,10 +11867,10 @@ function ValidationSection({ node }) {
11672
11867
  const removeRuleAt = (index) => {
11673
11868
  persistRules(rules.filter((_, ruleIndex) => ruleIndex !== index));
11674
11869
  };
11675
- return /* @__PURE__ */ jsxs37(Section, { children: [
11676
- /* @__PURE__ */ jsxs37(Section.Header, { children: [
11870
+ return /* @__PURE__ */ jsxs36(Section, { children: [
11871
+ /* @__PURE__ */ jsxs36(Section.Header, { children: [
11677
11872
  /* @__PURE__ */ jsx54(Section.Title, { children: "Validation" }),
11678
- /* @__PURE__ */ jsxs37(Section.Actions, { children: [
11873
+ /* @__PURE__ */ jsxs36(Section.Actions, { children: [
11679
11874
  !rules.length ? /* @__PURE__ */ jsx54(SectionActionButton, { icon: /* @__PURE__ */ jsx54(BsPlus4, {}), iconOnly: true, tooltip: "Add validation", "aria-label": "Add validation", onClick: addRule }) : null,
11680
11875
  rules.length ? /* @__PURE__ */ jsx54(
11681
11876
  SectionActionButton,
@@ -11689,7 +11884,7 @@ function ValidationSection({ node }) {
11689
11884
  ) : null
11690
11885
  ] })
11691
11886
  ] }),
11692
- /* @__PURE__ */ jsx54(Section.Content, { children: rules.length ? /* @__PURE__ */ jsxs37("div", { className: "space-y-4", children: [
11887
+ /* @__PURE__ */ jsx54(Section.Content, { children: rules.length ? /* @__PURE__ */ jsxs36("div", { className: "space-y-4", children: [
11693
11888
  rules.map((rule, index) => /* @__PURE__ */ jsx54(
11694
11889
  ValidationRuleCard,
11695
11890
  {
@@ -11701,7 +11896,7 @@ function ValidationSection({ node }) {
11701
11896
  `${index}-${rule.op}-${rule.valueBy ?? "value"}`
11702
11897
  )),
11703
11898
  /* @__PURE__ */ jsx54(Button, { type: "button", variant: "outline", size: "sm", onClick: addRule, children: "Add another rule" })
11704
- ] }) : /* @__PURE__ */ jsxs37("div", { className: "space-y-3 rounded-xl border border-dashed border-slate-200 p-4 dark:border-slate-800", children: [
11899
+ ] }) : /* @__PURE__ */ jsxs36("div", { className: "space-y-3 rounded-xl border border-dashed border-slate-200 p-4 dark:border-slate-800", children: [
11705
11900
  /* @__PURE__ */ jsx54("p", { className: "text-sm font-medium text-slate-900 dark:text-slate-100", children: "No validation rules yet" }),
11706
11901
  /* @__PURE__ */ jsx54("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: "Add ordered rules to validate this field value, its length, or an eval-derived subject. The first failing rule supplies the field message." }),
11707
11902
  /* @__PURE__ */ jsx54(Button, { type: "button", variant: "outline", size: "sm", onClick: addRule, children: "Add validation" })
@@ -11719,12 +11914,12 @@ import { useMemo as useMemo27, useState as useState27 } from "react";
11719
11914
  import { InputField as InputField10 } from "@timeax/form-palette";
11720
11915
  import { useState as useState26 } from "react";
11721
11916
  import { BsPlus as BsPlus5 } from "react-icons/bs";
11722
- import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
11917
+ import { jsx as jsx55, jsxs as jsxs37 } from "react/jsx-runtime";
11723
11918
  function AddIncludesPopover({ open, onOpenChange, onSelect, options }) {
11724
11919
  const [value, setValue] = useState26();
11725
- return /* @__PURE__ */ jsxs38(Popover, { open, onOpenChange, children: [
11920
+ return /* @__PURE__ */ jsxs37(Popover, { open, onOpenChange, children: [
11726
11921
  /* @__PURE__ */ jsx55(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx55(SectionActionTriggerButton, { icon: /* @__PURE__ */ jsx55(BsPlus5, {}), children: "Add" }) }),
11727
- /* @__PURE__ */ jsx55(PopoverContent, { children: /* @__PURE__ */ jsxs38("div", { className: "flex flex-col gap-2", children: [
11922
+ /* @__PURE__ */ jsx55(PopoverContent, { children: /* @__PURE__ */ jsxs37("div", { className: "flex flex-col gap-2", children: [
11728
11923
  /* @__PURE__ */ jsx55(
11729
11924
  InputField10,
11730
11925
  {
@@ -11755,7 +11950,7 @@ function AddIncludesPopover({ open, onOpenChange, onSelect, options }) {
11755
11950
  }
11756
11951
 
11757
11952
  // src/panels/right/partials/properties/components/Union.tsx
11758
- import { jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
11953
+ import { jsx as jsx56, jsxs as jsxs38 } from "react/jsx-runtime";
11759
11954
  function IncExcludeSection({ node, mode, capability }) {
11760
11955
  const canvas = useCanvas11();
11761
11956
  const [open, setOpen] = useState27(false);
@@ -11791,8 +11986,8 @@ function IncExcludeSection({ node, mode, capability }) {
11791
11986
  }));
11792
11987
  }, [canvas.props.fields, node]);
11793
11988
  const name = mode.slice(0, -1);
11794
- return /* @__PURE__ */ jsxs39(Section, { children: [
11795
- /* @__PURE__ */ jsxs39(Section.Header, { children: [
11989
+ return /* @__PURE__ */ jsxs38(Section, { children: [
11990
+ /* @__PURE__ */ jsxs38(Section.Header, { children: [
11796
11991
  /* @__PURE__ */ jsx56(Section.Title, { children: mode == "includes" ? "Includes" : "Excludes" }),
11797
11992
  /* @__PURE__ */ jsx56(Section.Actions, { children: canEdit ? /* @__PURE__ */ jsx56(
11798
11993
  AddIncludesPopover,
@@ -11804,7 +11999,7 @@ function IncExcludeSection({ node, mode, capability }) {
11804
11999
  }
11805
12000
  ) : null })
11806
12001
  ] }),
11807
- /* @__PURE__ */ jsxs39(Section.Content, { children: [
12002
+ /* @__PURE__ */ jsxs38(Section.Content, { children: [
11808
12003
  helperMessage ? /* @__PURE__ */ jsx56("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: helperMessage }) : null,
11809
12004
  /* @__PURE__ */ jsx56(RenderIf, { data: (node[mode]?.size ?? 0) > 0, emptyMessage: "None", children: /* @__PURE__ */ jsx56(IncludesList, { children: Array.from(node[mode] ?? []).map((id) => {
11810
12005
  const field = fields[id];
@@ -11836,7 +12031,7 @@ function IncExcludeSection({ node, mode, capability }) {
11836
12031
  }
11837
12032
 
11838
12033
  // src/panels/right/partials/properties/field-properties.tsx
11839
- import { Fragment as Fragment11, jsx as jsx57, jsxs as jsxs40 } from "react/jsx-runtime";
12034
+ import { Fragment as Fragment11, jsx as jsx57, jsxs as jsxs39 } from "react/jsx-runtime";
11840
12035
  var getVariant = (node) => {
11841
12036
  const variant = node.raw.meta?.variant;
11842
12037
  return typeof variant === "string" && variant.trim() ? variant.trim() : void 0;
@@ -11928,12 +12123,12 @@ function FieldProperties({ className, node }) {
11928
12123
  const nextVariant = String(rawVariant ?? "default");
11929
12124
  applyDescriptorTransition(currentType, nextVariant === "default" ? void 0 : nextVariant);
11930
12125
  };
11931
- return /* @__PURE__ */ jsx57("div", { className, children: /* @__PURE__ */ jsxs40("div", { className: "space-y-4", children: [
11932
- /* @__PURE__ */ jsxs40(Section, { children: [
12126
+ return /* @__PURE__ */ jsx57("div", { className, children: /* @__PURE__ */ jsxs39("div", { className: "space-y-4", children: [
12127
+ /* @__PURE__ */ jsxs39(Section, { children: [
11933
12128
  /* @__PURE__ */ jsx57(Section.Header, { children: /* @__PURE__ */ jsx57(Section.Title, { children: "Field identity" }) }),
11934
- /* @__PURE__ */ jsxs40(Section.Content, { children: [
12129
+ /* @__PURE__ */ jsxs39(Section.Content, { children: [
11935
12130
  /* @__PURE__ */ jsx57("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "Core field metadata used by the service engine and preview form." }),
11936
- /* @__PURE__ */ jsxs40("div", { className: "space-y-3", children: [
12131
+ /* @__PURE__ */ jsxs39("div", { className: "space-y-3", children: [
11937
12132
  /* @__PURE__ */ jsx57(
11938
12133
  InputField11,
11939
12134
  {
@@ -11989,11 +12184,11 @@ function FieldProperties({ className, node }) {
11989
12184
  ] })
11990
12185
  ] }),
11991
12186
  /* @__PURE__ */ jsx57(Separator2, {}),
11992
- /* @__PURE__ */ jsxs40(Section, { children: [
12187
+ /* @__PURE__ */ jsxs39(Section, { children: [
11993
12188
  /* @__PURE__ */ jsx57(Section.Header, { children: /* @__PURE__ */ jsx57(Section.Title, { children: "Defaults and help" }) }),
11994
- /* @__PURE__ */ jsxs40(Section.Content, { children: [
12189
+ /* @__PURE__ */ jsxs39(Section.Content, { children: [
11995
12190
  /* @__PURE__ */ jsx57("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "Preview-oriented defaults passed to the form palette." }),
11996
- /* @__PURE__ */ jsxs40("div", { className: "space-y-3", children: [
12191
+ /* @__PURE__ */ jsxs39("div", { className: "space-y-3", children: [
11997
12192
  /* @__PURE__ */ jsx57(
11998
12193
  InputField11,
11999
12194
  {
@@ -12018,11 +12213,11 @@ function FieldProperties({ className, node }) {
12018
12213
  ] })
12019
12214
  ] }),
12020
12215
  /* @__PURE__ */ jsx57(Separator2, {}),
12021
- /* @__PURE__ */ jsxs40(Section, { defaultOpen: false, children: [
12216
+ /* @__PURE__ */ jsxs39(Section, { defaultOpen: false, children: [
12022
12217
  /* @__PURE__ */ jsx57(Section.Header, { children: /* @__PURE__ */ jsx57(Section.Title, { children: "Input appearance and behavior" }) }),
12023
- /* @__PURE__ */ jsxs40(Section.Content, { children: [
12218
+ /* @__PURE__ */ jsxs39(Section.Content, { children: [
12024
12219
  /* @__PURE__ */ jsx57("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "Descriptor-owned runtime props. The schema comes from the input registry and overrides are stored in field defaults." }),
12025
- descriptor ? /* @__PURE__ */ jsx57(DescriptorSettings, { schema: descriptorUi, defaults, onChange: updateDefaults }) : /* @__PURE__ */ jsxs40("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: [
12220
+ descriptor ? /* @__PURE__ */ jsx57(DescriptorSettings, { schema: descriptorUi, defaults, onChange: updateDefaults }) : /* @__PURE__ */ jsxs39("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: [
12026
12221
  "No input descriptor was found for this field type",
12027
12222
  currentVariant ? ` / ${currentVariant}` : "",
12028
12223
  "."
@@ -12036,9 +12231,9 @@ function FieldProperties({ className, node }) {
12036
12231
  /* @__PURE__ */ jsx57(Separator2, {}),
12037
12232
  /* @__PURE__ */ jsx57(utility_section_default, { node }),
12038
12233
  /* @__PURE__ */ jsx57(Separator2, {}),
12039
- /* @__PURE__ */ jsxs40(Section, { children: [
12234
+ /* @__PURE__ */ jsxs39(Section, { children: [
12040
12235
  /* @__PURE__ */ jsx57(Section.Header, { children: /* @__PURE__ */ jsx57(Section.Title, { children: "Binding summary" }) }),
12041
- /* @__PURE__ */ jsxs40(Section.Content, { children: [
12236
+ /* @__PURE__ */ jsxs39(Section.Content, { children: [
12042
12237
  /* @__PURE__ */ jsx57("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "Where this field appears and how it behaves in the active branch." }),
12043
12238
  /* @__PURE__ */ jsx57(
12044
12239
  PropertyList,
@@ -12053,12 +12248,12 @@ function FieldProperties({ className, node }) {
12053
12248
  ] })
12054
12249
  ] }),
12055
12250
  /* @__PURE__ */ jsx57(Separator2, {}),
12056
- options.length ? /* @__PURE__ */ jsxs40(Fragment11, { children: [
12057
- /* @__PURE__ */ jsxs40(Section, { children: [
12251
+ options.length ? /* @__PURE__ */ jsxs39(Fragment11, { children: [
12252
+ /* @__PURE__ */ jsxs39(Section, { children: [
12058
12253
  /* @__PURE__ */ jsx57(Section.Header, { children: /* @__PURE__ */ jsx57(Section.Title, { children: "Options" }) }),
12059
- /* @__PURE__ */ jsxs40(Section.Content, { children: [
12254
+ /* @__PURE__ */ jsxs39(Section.Content, { children: [
12060
12255
  /* @__PURE__ */ jsx57("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "Current option labels available on this field." }),
12061
- /* @__PURE__ */ jsx57("div", { className: "space-y-2", children: options.map((option) => /* @__PURE__ */ jsxs40(
12256
+ /* @__PURE__ */ jsx57("div", { className: "space-y-2", children: options.map((option) => /* @__PURE__ */ jsxs39(
12062
12257
  "div",
12063
12258
  {
12064
12259
  className: "flex items-center justify-between rounded-xl bg-slate-50 px-3 py-2 text-sm dark:bg-slate-900",
@@ -12081,11 +12276,11 @@ function FieldProperties({ className, node }) {
12081
12276
  ] }),
12082
12277
  /* @__PURE__ */ jsx57(Separator2, {})
12083
12278
  ] }) : null,
12084
- capabilities.triggerMappings.canEdit ? /* @__PURE__ */ jsxs40(Fragment11, { children: [
12279
+ capabilities.triggerMappings.canEdit ? /* @__PURE__ */ jsxs39(Fragment11, { children: [
12085
12280
  /* @__PURE__ */ jsx57(IncExcludeSection, { node, mode: "includes", capability: capabilities.triggerMappings }),
12086
12281
  /* @__PURE__ */ jsx57(Separator2, {}),
12087
12282
  /* @__PURE__ */ jsx57(IncExcludeSection, { node, mode: "excludes", capability: capabilities.triggerMappings })
12088
- ] }) : /* @__PURE__ */ jsxs40(Section, { children: [
12283
+ ] }) : /* @__PURE__ */ jsxs39(Section, { children: [
12089
12284
  /* @__PURE__ */ jsx57(Section.Header, { children: /* @__PURE__ */ jsx57(Section.Title, { children: "Trigger mappings" }) }),
12090
12285
  /* @__PURE__ */ jsx57(Section.Content, { children: /* @__PURE__ */ jsx57("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: capabilities.triggerMappings.message }) })
12091
12286
  ] }),
@@ -12098,18 +12293,18 @@ var field_properties_default = FieldProperties;
12098
12293
  // src/panels/right/partials/properties/option-properties.tsx
12099
12294
  import { useCanvas as useCanvas13 } from "@timeax/digital-service-engine/workspace";
12100
12295
  import { InputField as InputField12 } from "@timeax/form-palette";
12101
- import { jsx as jsx58, jsxs as jsxs41 } from "react/jsx-runtime";
12296
+ import { jsx as jsx58, jsxs as jsxs40 } from "react/jsx-runtime";
12102
12297
  function OptionProperties({ className, node }) {
12103
12298
  const canvas = useCanvas13();
12104
12299
  const capabilities = getOptionPropertyCapabilities(node);
12105
12300
  const field = node.field();
12106
12301
  const options = field.raw.options ?? [];
12107
- return /* @__PURE__ */ jsx58("div", { className, children: /* @__PURE__ */ jsxs41("div", { className: "space-y-4", children: [
12108
- /* @__PURE__ */ jsxs41(Section, { children: [
12302
+ return /* @__PURE__ */ jsx58("div", { className, children: /* @__PURE__ */ jsxs40("div", { className: "space-y-4", children: [
12303
+ /* @__PURE__ */ jsxs40(Section, { children: [
12109
12304
  /* @__PURE__ */ jsx58(Section.Header, { children: /* @__PURE__ */ jsx58(Section.Title, { children: "Option identity" }) }),
12110
- /* @__PURE__ */ jsxs41(Section.Content, { children: [
12305
+ /* @__PURE__ */ jsxs40(Section.Content, { children: [
12111
12306
  /* @__PURE__ */ jsx58("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "Edit the currently focused option node." }),
12112
- /* @__PURE__ */ jsxs41("div", { className: "space-y-3", children: [
12307
+ /* @__PURE__ */ jsxs40("div", { className: "space-y-3", children: [
12113
12308
  /* @__PURE__ */ jsx58(
12114
12309
  InputField12,
12115
12310
  {
@@ -12147,9 +12342,9 @@ function OptionProperties({ className, node }) {
12147
12342
  /* @__PURE__ */ jsx58(Separator2, {}),
12148
12343
  /* @__PURE__ */ jsx58(utility_section_default, { node }),
12149
12344
  /* @__PURE__ */ jsx58(Separator2, {}),
12150
- /* @__PURE__ */ jsxs41(Section, { children: [
12345
+ /* @__PURE__ */ jsxs40(Section, { children: [
12151
12346
  /* @__PURE__ */ jsx58(Section.Header, { children: /* @__PURE__ */ jsx58(Section.Title, { children: "Option mapping" }) }),
12152
- /* @__PURE__ */ jsxs41(Section.Content, { children: [
12347
+ /* @__PURE__ */ jsxs40(Section.Content, { children: [
12153
12348
  /* @__PURE__ */ jsx58("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "How this option participates in visible field mappings." }),
12154
12349
  /* @__PURE__ */ jsx58(
12155
12350
  PropertyList,
@@ -12188,11 +12383,11 @@ import { TiDelete } from "react-icons/ti";
12188
12383
  import { Form, InputField as InputField13 } from "@timeax/form-palette";
12189
12384
  import "react";
12190
12385
  import { BsPlus as BsPlus6 } from "react-icons/bs";
12191
- import { jsx as jsx59, jsxs as jsxs42 } from "react/jsx-runtime";
12386
+ import { jsx as jsx59, jsxs as jsxs41 } from "react/jsx-runtime";
12192
12387
  function AddConstraintsPopover({ open, onOpenChange, constraints, allConstraints, onSubmit }) {
12193
- return /* @__PURE__ */ jsxs42(Popover, { open, onOpenChange, children: [
12388
+ return /* @__PURE__ */ jsxs41(Popover, { open, onOpenChange, children: [
12194
12389
  /* @__PURE__ */ jsx59(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx59(SectionActionTriggerButton, { icon: /* @__PURE__ */ jsx59(BsPlus6, {}), children: "Add" }) }),
12195
- /* @__PURE__ */ jsx59(PopoverContent, { children: /* @__PURE__ */ jsx59(RenderIf, { data: allConstraints, children: /* @__PURE__ */ jsxs42(
12390
+ /* @__PURE__ */ jsx59(PopoverContent, { children: /* @__PURE__ */ jsx59(RenderIf, { data: allConstraints, children: /* @__PURE__ */ jsxs41(
12196
12391
  Form,
12197
12392
  {
12198
12393
  wrapped: true,
@@ -12223,20 +12418,20 @@ function AddConstraintsPopover({ open, onOpenChange, constraints, allConstraints
12223
12418
 
12224
12419
  // src/panels/right/partials/properties/tag/ConstraintOriginPopover.tsx
12225
12420
  import "react";
12226
- import { jsx as jsx60, jsxs as jsxs43 } from "react/jsx-runtime";
12421
+ import { jsx as jsx60, jsxs as jsxs42 } from "react/jsx-runtime";
12227
12422
  function ConstraintOriginPopover({ constraint, onClearSelf, onClearSubtree }) {
12228
- return /* @__PURE__ */ jsxs43(Popover, { children: [
12423
+ return /* @__PURE__ */ jsxs42(Popover, { children: [
12229
12424
  /* @__PURE__ */ jsx60(PopoverTrigger, { className: "flex items-center gap-1", children: "Owner" }),
12230
- /* @__PURE__ */ jsx60(PopoverContent, { className: "w-fit p-0", children: /* @__PURE__ */ jsxs43("div", { className: "max-w-[320px] p-3 text-sm", children: [
12425
+ /* @__PURE__ */ jsx60(PopoverContent, { className: "w-fit p-0", children: /* @__PURE__ */ jsxs42("div", { className: "max-w-[320px] p-3 text-sm", children: [
12231
12426
  /* @__PURE__ */ jsx60("div", { className: "font-medium", children: "Clear constraint?" }),
12232
- /* @__PURE__ */ jsxs43("div", { className: "mt-1 text-muted-foreground", children: [
12427
+ /* @__PURE__ */ jsxs42("div", { className: "mt-1 text-muted-foreground", children: [
12233
12428
  "You're about to clear ",
12234
12429
  /* @__PURE__ */ jsx60("span", { className: "font-medium", children: constraint }),
12235
12430
  " on this tag. Descendants may inherit a different value (or none) after this change."
12236
12431
  ] }),
12237
- /* @__PURE__ */ jsxs43("div", { className: "mt-3 space-y-2", children: [
12432
+ /* @__PURE__ */ jsxs42("div", { className: "mt-3 space-y-2", children: [
12238
12433
  /* @__PURE__ */ jsx60("div", { className: "text-muted-foreground", children: "Do you want to also clear it for the whole subtree (\xE2\u20AC\u0153shake the tree\xE2\u20AC\x9D)?" }),
12239
- /* @__PURE__ */ jsxs43("div", { className: "flex items-center justify-end gap-2", children: [
12434
+ /* @__PURE__ */ jsxs42("div", { className: "flex items-center justify-end gap-2", children: [
12240
12435
  /* @__PURE__ */ jsx60(
12241
12436
  "button",
12242
12437
  {
@@ -12264,24 +12459,24 @@ function ConstraintOriginPopover({ constraint, onClearSelf, onClearSubtree }) {
12264
12459
  // src/panels/right/partials/properties/tag/ConstraintOverridePopover.tsx
12265
12460
  import { AlertTriangle } from "lucide-react";
12266
12461
  import "react";
12267
- import { jsx as jsx61, jsxs as jsxs44 } from "react/jsx-runtime";
12462
+ import { jsx as jsx61, jsxs as jsxs43 } from "react/jsx-runtime";
12268
12463
  function ConstraintOverridePopover({ constraint, onClear }) {
12269
- return /* @__PURE__ */ jsxs44(Popover, { children: [
12270
- /* @__PURE__ */ jsxs44(PopoverTrigger, { className: "flex items-center gap-1", children: [
12464
+ return /* @__PURE__ */ jsxs43(Popover, { children: [
12465
+ /* @__PURE__ */ jsxs43(PopoverTrigger, { className: "flex items-center gap-1", children: [
12271
12466
  /* @__PURE__ */ jsx61(AlertTriangle, { className: "size-3 text-yellow-400" }),
12272
12467
  "Overridden"
12273
12468
  ] }),
12274
- /* @__PURE__ */ jsx61(PopoverContent, { className: "w-fit p-0", children: /* @__PURE__ */ jsxs44("div", { className: "max-w-[320px] p-3 text-sm", children: [
12469
+ /* @__PURE__ */ jsx61(PopoverContent, { className: "w-fit p-0", children: /* @__PURE__ */ jsxs43("div", { className: "max-w-[320px] p-3 text-sm", children: [
12275
12470
  /* @__PURE__ */ jsx61("div", { className: "font-medium", children: "Constraint override detected" }),
12276
- /* @__PURE__ */ jsxs44("div", { className: "mt-1 text-muted-foreground", children: [
12471
+ /* @__PURE__ */ jsxs43("div", { className: "mt-1 text-muted-foreground", children: [
12277
12472
  "This tag tries to set ",
12278
12473
  /* @__PURE__ */ jsx61("span", { className: "font-medium", children: constraint }),
12279
12474
  ", but an ancestor tag already decided it. Overrides don't apply \xE2\u20AC\u201D the ancestor value wins."
12280
12475
  ] }),
12281
- /* @__PURE__ */ jsxs44("div", { className: "mt-3 space-y-1", children: [
12476
+ /* @__PURE__ */ jsxs43("div", { className: "mt-3 space-y-1", children: [
12282
12477
  /* @__PURE__ */ jsx61("div", { className: "font-medium", children: "How to fix" }),
12283
- /* @__PURE__ */ jsxs44("ul", { className: "list-disc pl-4 text-muted-foreground", children: [
12284
- /* @__PURE__ */ jsxs44("li", { children: [
12478
+ /* @__PURE__ */ jsxs43("ul", { className: "list-disc pl-4 text-muted-foreground", children: [
12479
+ /* @__PURE__ */ jsxs43("li", { children: [
12285
12480
  "Click ",
12286
12481
  /* @__PURE__ */ jsx61("span", { className: "font-medium", children: "Origin" }),
12287
12482
  " to jump to the ancestor that set the rule, then make the value match there (or remove it)."
@@ -12303,14 +12498,14 @@ function ConstraintOverridePopover({ constraint, onClear }) {
12303
12498
  }
12304
12499
 
12305
12500
  // src/panels/right/partials/properties/tag/TagConstraintsSection.tsx
12306
- import { Fragment as Fragment12, jsx as jsx62, jsxs as jsxs45 } from "react/jsx-runtime";
12501
+ import { Fragment as Fragment12, jsx as jsx62, jsxs as jsxs44 } from "react/jsx-runtime";
12307
12502
  function TagConstraintsSection({ node }) {
12308
12503
  const constraints = Object.keys(node.raw.constraints ?? {});
12309
12504
  const canvas = useCanvas14();
12310
12505
  const [open, setOpen] = useState29(false);
12311
12506
  const allConstraints = useMemo29(() => canvas.api.getConstraints() ?? [], [canvas.props]);
12312
- return /* @__PURE__ */ jsx62(Fragment12, { children: /* @__PURE__ */ jsxs45(Section, { children: [
12313
- /* @__PURE__ */ jsxs45(Section.Header, { children: [
12507
+ return /* @__PURE__ */ jsx62(Fragment12, { children: /* @__PURE__ */ jsxs44(Section, { children: [
12508
+ /* @__PURE__ */ jsxs44(Section.Header, { children: [
12314
12509
  /* @__PURE__ */ jsx62(Section.Title, { children: "Constraints" }),
12315
12510
  /* @__PURE__ */ jsx62(Section.Actions, { children: /* @__PURE__ */ jsx62(
12316
12511
  AddConstraintsPopover,
@@ -12405,10 +12600,10 @@ function TagExcludesSection({ node }) {
12405
12600
  }
12406
12601
 
12407
12602
  // src/panels/right/partials/properties/tag.tsx
12408
- import { Fragment as Fragment13, jsx as jsx65, jsxs as jsxs46 } from "react/jsx-runtime";
12603
+ import { Fragment as Fragment13, jsx as jsx65, jsxs as jsxs45 } from "react/jsx-runtime";
12409
12604
  function TagProperties({ node }) {
12410
12605
  const capabilities = getTagPropertyCapabilities();
12411
- return /* @__PURE__ */ jsxs46(Fragment13, { children: [
12606
+ return /* @__PURE__ */ jsxs45(Fragment13, { children: [
12412
12607
  /* @__PURE__ */ jsx65(TagConstraintsSection, { node }),
12413
12608
  /* @__PURE__ */ jsx65(Separator2, {}),
12414
12609
  /* @__PURE__ */ jsx65(quantity_section_default, { node }),
@@ -12427,7 +12622,7 @@ import { InputField as InputField15 } from "@timeax/form-palette";
12427
12622
  import { useMemo as useMemo30, useState as useState30 } from "react";
12428
12623
  import { AiOutlineLoading3Quarters } from "react-icons/ai";
12429
12624
  import { MdOutlineContentCopy } from "react-icons/md";
12430
- import { jsx as jsx66, jsxs as jsxs47 } from "react/jsx-runtime";
12625
+ import { jsx as jsx66, jsxs as jsxs46 } from "react/jsx-runtime";
12431
12626
  var kinds = {
12432
12627
  tag: TagProperties,
12433
12628
  option: option_properties_default,
@@ -12445,20 +12640,20 @@ var Properties = () => {
12445
12640
  if (!Kind) {
12446
12641
  return /* @__PURE__ */ jsx66("div", { className: "p-4", children: /* @__PURE__ */ jsx66(EmptyState, { title: "No active node selected", description: "Pick a tag, field, or option from the layers panel or canvas to inspect its core settings." }) });
12447
12642
  }
12448
- return /* @__PURE__ */ jsx66("div", { className: "flex h-full flex-col overflow-hidden", children: /* @__PURE__ */ jsx66(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxs47("div", { className: "flex flex-col gap-4 px-4 py-4", children: [
12643
+ return /* @__PURE__ */ jsx66("div", { className: "flex h-full flex-col overflow-hidden", children: /* @__PURE__ */ jsx66(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxs46("div", { className: "flex flex-col gap-4 px-4 py-4", children: [
12449
12644
  /* @__PURE__ */ jsx66(WorkspaceBootInlineNotice, { boot: ws.boot, sections: ["snapshotBody", "policies"] }),
12450
- /* @__PURE__ */ jsxs47(Section, { children: [
12645
+ /* @__PURE__ */ jsxs46(Section, { children: [
12451
12646
  /* @__PURE__ */ jsx66(Section.Header, { children: /* @__PURE__ */ jsx66(Section.Title, { children: "Selection overview" }) }),
12452
- /* @__PURE__ */ jsxs47(Section.Content, { children: [
12647
+ /* @__PURE__ */ jsxs46(Section.Content, { children: [
12453
12648
  /* @__PURE__ */ jsx66("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "The inspector stays synced with the active canvas and layers selection." }),
12454
- /* @__PURE__ */ jsxs47("div", { className: "flex items-start justify-between gap-3", children: [
12455
- /* @__PURE__ */ jsxs47("div", { children: [
12649
+ /* @__PURE__ */ jsxs46("div", { className: "flex items-start justify-between gap-3", children: [
12650
+ /* @__PURE__ */ jsxs46("div", { children: [
12456
12651
  /* @__PURE__ */ jsx66("div", { className: "text-sm font-semibold capitalize text-slate-900 dark:text-slate-100", children: node.kind }),
12457
12652
  /* @__PURE__ */ jsx66("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: getNodeSummary(node) })
12458
12653
  ] }),
12459
12654
  /* @__PURE__ */ jsx66(SelectionBadge, { active: true, selected: true })
12460
12655
  ] }),
12461
- /* @__PURE__ */ jsxs47("div", { className: "mt-3 space-y-3", children: [
12656
+ /* @__PURE__ */ jsxs46("div", { className: "mt-3 space-y-3", children: [
12462
12657
  /* @__PURE__ */ jsx66(
12463
12658
  InputField15,
12464
12659
  {
@@ -12515,7 +12710,7 @@ var Properties = () => {
12515
12710
 
12516
12711
  // src/panels/right/components/wireframe-tags-widget.tsx
12517
12712
  import { IoClose } from "react-icons/io5";
12518
- import { Fragment as Fragment14, jsx as jsx67, jsxs as jsxs48 } from "react/jsx-runtime";
12713
+ import { Fragment as Fragment14, jsx as jsx67, jsxs as jsxs47 } from "react/jsx-runtime";
12519
12714
  function noticeToneClass(notice) {
12520
12715
  const color = (notice.color ?? "").toLowerCase();
12521
12716
  if (color.includes("red") || color.includes("rose") || color.includes("danger")) {
@@ -12548,7 +12743,7 @@ function WireframeTagsWidget({
12548
12743
  onTagDragOver,
12549
12744
  onTagDrop
12550
12745
  }) {
12551
- return /* @__PURE__ */ jsxs48("div", { className: "flex flex-wrap items-center gap-2", children: [
12746
+ return /* @__PURE__ */ jsxs47("div", { className: "flex flex-wrap items-center gap-2", children: [
12552
12747
  /* @__PURE__ */ jsx67(
12553
12748
  "small",
12554
12749
  {
@@ -12558,8 +12753,8 @@ function WireframeTagsWidget({
12558
12753
  children: "Tags:"
12559
12754
  }
12560
12755
  ),
12561
- /* @__PURE__ */ jsx67("div", { className: "flex flex-wrap items-center gap-1.5", children: visibleTag ? /* @__PURE__ */ jsxs48(Fragment14, { children: [
12562
- parents.map((item) => /* @__PURE__ */ jsxs48(
12756
+ /* @__PURE__ */ jsx67("div", { className: "flex flex-wrap items-center gap-1.5", children: visibleTag ? /* @__PURE__ */ jsxs47(Fragment14, { children: [
12757
+ parents.map((item) => /* @__PURE__ */ jsxs47(
12563
12758
  "button",
12564
12759
  {
12565
12760
  type: "button",
@@ -12583,7 +12778,7 @@ function WireframeTagsWidget({
12583
12778
  },
12584
12779
  item.id
12585
12780
  )),
12586
- /* @__PURE__ */ jsxs48(
12781
+ /* @__PURE__ */ jsxs47(
12587
12782
  "button",
12588
12783
  {
12589
12784
  type: "button",
@@ -12606,7 +12801,7 @@ function WireframeTagsWidget({
12606
12801
  }
12607
12802
  ),
12608
12803
  children.map((item) => {
12609
- return /* @__PURE__ */ jsxs48(
12804
+ return /* @__PURE__ */ jsxs47(
12610
12805
  "button",
12611
12806
  {
12612
12807
  type: "button",
@@ -12631,7 +12826,7 @@ function WireframeTagsWidget({
12631
12826
  );
12632
12827
  })
12633
12828
  ] }) : children.length ? children.map((item) => {
12634
- return /* @__PURE__ */ jsxs48(
12829
+ return /* @__PURE__ */ jsxs47(
12635
12830
  "button",
12636
12831
  {
12637
12832
  type: "button",
@@ -12656,7 +12851,8 @@ var wireframe_tags_widget_default = WireframeTagsWidget;
12656
12851
  import { useOrderFlow, Wrapper } from "@timeax/digital-service-engine/react";
12657
12852
  import { useCanvas as useCanvas16, useWorkspace as useWorkspace13 } from "@timeax/digital-service-engine/workspace";
12658
12853
  import { useCallback as useCallback16, useMemo as useMemo31 } from "react";
12659
- import { jsx as jsx68, jsxs as jsxs49 } from "react/jsx-runtime";
12854
+ import { jsx as jsx68, jsxs as jsxs48 } from "react/jsx-runtime";
12855
+ var CHECKBOX_SINGLE_EXTRA_PROPS = Object.freeze({ single: true });
12660
12856
  function Wireframe() {
12661
12857
  const canvas = useCanvas16();
12662
12858
  const ws = useWorkspace13();
@@ -12722,8 +12918,8 @@ function Wireframe() {
12722
12918
  },
12723
12919
  [canvas.api, canvas.setActive]
12724
12920
  );
12725
- return /* @__PURE__ */ jsxs49("div", { className: "flex h-full min-h-0 flex-col", children: [
12726
- /* @__PURE__ */ jsx68("div", { className: "min-h-0 flex-1 overflow-auto p-4", children: /* @__PURE__ */ jsx68("div", { className: "mx-auto max-w-md", children: /* @__PURE__ */ jsxs49("div", { className: "flex flex-col gap-4", children: [
12921
+ return /* @__PURE__ */ jsxs48("div", { className: "flex h-full min-h-0 flex-col", children: [
12922
+ /* @__PURE__ */ jsx68("div", { className: "min-h-0 flex-1 overflow-auto p-4", children: /* @__PURE__ */ jsx68("div", { className: "mx-auto max-w-md", children: /* @__PURE__ */ jsxs48("div", { className: "flex flex-col gap-4", children: [
12727
12923
  /* @__PURE__ */ jsx68(WorkspaceBootInlineNotice, { boot: ws.boot, sections: ["snapshotBody", "policies"] }),
12728
12924
  /* @__PURE__ */ jsx68(
12729
12925
  wireframe_tags_widget_default,
@@ -12762,7 +12958,7 @@ function Wireframe() {
12762
12958
  }
12763
12959
  }
12764
12960
  ),
12765
- /* @__PURE__ */ jsx68("div", { className: "border-t border-slate-200 pt-3 dark:border-slate-800", children: visibleFields.length ? visibleFields.map((field) => {
12961
+ /* @__PURE__ */ jsx68("div", { className: "border-t border-slate-200 pt-3 flex flex-col gap-2 dark:border-slate-800", children: visibleFields.length ? visibleFields.map((field) => {
12766
12962
  return /* @__PURE__ */ jsx68("div", { onClick: () => select(field.id), className: "cursor-pointer pb-2", children: /* @__PURE__ */ jsx68(
12767
12963
  "div",
12768
12964
  {
@@ -12796,10 +12992,9 @@ function Wireframe() {
12796
12992
  children: /* @__PURE__ */ jsx68(
12797
12993
  Wrapper,
12798
12994
  {
12799
- extraProps: { ...field.type == "checkbox" && !field.options ? { single: true } : {} },
12995
+ extraProps: field.type === "checkbox" && !field.options ? CHECKBOX_SINGLE_EXTRA_PROPS : void 0,
12800
12996
  field
12801
- },
12802
- field.id
12997
+ }
12803
12998
  )
12804
12999
  }
12805
13000
  ) }, field.id);
@@ -12820,7 +13015,7 @@ var wireframe_default = Wireframe;
12820
13015
  // src/panels/right/index.tsx
12821
13016
  import { OrderFlowProvider, useInputs as useInputs3 } from "@timeax/digital-service-engine/react";
12822
13017
  import { useCanvas as useCanvas17 } from "@timeax/digital-service-engine/workspace";
12823
- import { jsx as jsx69, jsxs as jsxs50 } from "react/jsx-runtime";
13018
+ import { jsx as jsx69, jsxs as jsxs49 } from "react/jsx-runtime";
12824
13019
  var RightPanel = ({ onShare, onPlay }) => {
12825
13020
  const tabClassName = cn(
12826
13021
  "m-0! rounded-none! border-t-0! border-r-0! border-b-2! border-l-0! border-transparent! py-2.5! shadow-none!",
@@ -12837,10 +13032,10 @@ var RightPanel = ({ onShare, onPlay }) => {
12837
13032
  maxWidth: 420,
12838
13033
  minWidth: 320,
12839
13034
  className: "flex h-dvh max-h-dvh w-100 flex-col rounded-none! border-l border-slate-200 bg-[linear-gradient(180deg,rgba(255,255,255,0.98),rgba(248,250,252,0.98))] dark:border-slate-800 dark:bg-[linear-gradient(180deg,rgba(2,6,23,0.98),rgba(15,23,42,0.98))]",
12840
- children: /* @__PURE__ */ jsxs50("div", { className: "flex h-full flex-col", children: [
13035
+ children: /* @__PURE__ */ jsxs49("div", { className: "flex h-full flex-col", children: [
12841
13036
  /* @__PURE__ */ jsx69(header_default2, { onShare, onPlay }),
12842
- /* @__PURE__ */ jsxs50(Tabs, { className: "grow gap-0 overflow-hidden", defaultValue: "wireframe", children: [
12843
- /* @__PURE__ */ jsxs50(TabsList, { className: "grid h-fit w-full grid-cols-3 rounded-none! border-b border-slate-200 bg-transparent p-0 dark:border-slate-800", children: [
13037
+ /* @__PURE__ */ jsxs49(Tabs, { className: "grow gap-0 overflow-hidden", defaultValue: "wireframe", children: [
13038
+ /* @__PURE__ */ jsxs49(TabsList, { className: "grid h-fit w-full grid-cols-3 rounded-none! border-b border-slate-200 bg-transparent p-0 dark:border-slate-800", children: [
12844
13039
  /* @__PURE__ */ jsx69(TabsTrigger, { className: tabClassName, value: "comments", children: "Comments" }),
12845
13040
  /* @__PURE__ */ jsx69(TabsTrigger, { className: tabClassName, value: "properties", children: "Properties" }),
12846
13041
  /* @__PURE__ */ jsx69(TabsTrigger, { className: tabClassName, value: "wireframe", children: "Wireframe" })
@@ -13016,7 +13211,7 @@ import cloneDeep2 from "lodash/cloneDeep";
13016
13211
  import { Suspense, lazy, createContext as createContext4, useCallback as useCallback17, useContext as useContext4, useEffect as useEffect18, useMemo as useMemo32, useState as useState31 } from "react";
13017
13212
  import { createPortal as createPortal3 } from "react-dom";
13018
13213
  import { FiX as FiX3 } from "react-icons/fi";
13019
- import { jsx as jsx70, jsxs as jsxs51 } from "react/jsx-runtime";
13214
+ import { jsx as jsx70, jsxs as jsxs50 } from "react/jsx-runtime";
13020
13215
  var LazyFallbackEditor = lazy(async () => {
13021
13216
  const mod = await import("@timeax/digital-service-engine/react");
13022
13217
  return { default: mod.FallbackEditor };
@@ -13143,7 +13338,7 @@ function FallbackEditorModalProvider({ children }) {
13143
13338
  }),
13144
13339
  [close, launch, openForNode, openForService]
13145
13340
  );
13146
- return /* @__PURE__ */ jsxs51(FallbackEditorModalContext.Provider, { value, children: [
13341
+ return /* @__PURE__ */ jsxs50(FallbackEditorModalContext.Provider, { value, children: [
13147
13342
  children,
13148
13343
  typeof document !== "undefined" && launch ? createPortal3(
13149
13344
  /* @__PURE__ */ jsx70(
@@ -13153,15 +13348,15 @@ function FallbackEditorModalProvider({ children }) {
13153
13348
  onMouseDown: (event) => {
13154
13349
  if (event.target === event.currentTarget) close();
13155
13350
  },
13156
- children: /* @__PURE__ */ jsxs51(
13351
+ children: /* @__PURE__ */ jsxs50(
13157
13352
  "div",
13158
13353
  {
13159
13354
  className: cn(
13160
13355
  "flex h-[min(90vh,56rem)] w-[min(96vw,88rem)] flex-col overflow-hidden rounded-[28px] border border-slate-200 bg-white shadow-2xl dark:border-slate-800 dark:bg-slate-950"
13161
13356
  ),
13162
13357
  children: [
13163
- /* @__PURE__ */ jsxs51("div", { className: "flex items-start justify-between gap-4 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
13164
- /* @__PURE__ */ jsxs51("div", { className: "min-w-0", children: [
13358
+ /* @__PURE__ */ jsxs50("div", { className: "flex items-start justify-between gap-4 border-b border-slate-200 px-6 py-4 dark:border-slate-800", children: [
13359
+ /* @__PURE__ */ jsxs50("div", { className: "min-w-0", children: [
13165
13360
  /* @__PURE__ */ jsx70("h2", { className: "text-lg font-semibold text-slate-900 dark:text-slate-100", children: launchTitle }),
13166
13361
  /* @__PURE__ */ jsx70("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: launchDescription })
13167
13362
  ] }),
@@ -13415,7 +13610,7 @@ function toNodeChip(canvas, id) {
13415
13610
  }
13416
13611
 
13417
13612
  // src/workspace/bottom-panel/console-tab.tsx
13418
- import { Fragment as Fragment15, jsx as jsx72, jsxs as jsxs52 } from "react/jsx-runtime";
13613
+ import { Fragment as Fragment15, jsx as jsx72, jsxs as jsxs51 } from "react/jsx-runtime";
13419
13614
  function ConsoleTab({
13420
13615
  errors,
13421
13616
  notices,
@@ -13444,20 +13639,20 @@ function ConsoleTab({
13444
13639
  ];
13445
13640
  const activeIntro = introState[subTab];
13446
13641
  const introCopy = getConsoleIntroCopy(subTab);
13447
- return /* @__PURE__ */ jsxs52("div", { className: "space-y-4", children: [
13448
- !activeIntro.closed ? /* @__PURE__ */ jsx72("div", { className: "rounded-2xl border border-sky-200/80 bg-sky-50/70 p-3 dark:border-sky-500/20 dark:bg-sky-500/10", children: /* @__PURE__ */ jsxs52("div", { className: "flex items-start justify-between gap-3", children: [
13449
- /* @__PURE__ */ jsxs52("div", { className: "min-w-0", children: [
13642
+ return /* @__PURE__ */ jsxs51("div", { className: "space-y-4", children: [
13643
+ !activeIntro.closed ? /* @__PURE__ */ jsx72("div", { className: "rounded-2xl border border-sky-200/80 bg-sky-50/70 p-3 dark:border-sky-500/20 dark:bg-sky-500/10", children: /* @__PURE__ */ jsxs51("div", { className: "flex items-start justify-between gap-3", children: [
13644
+ /* @__PURE__ */ jsxs51("div", { className: "min-w-0", children: [
13450
13645
  /* @__PURE__ */ jsx72("p", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: introCopy.title }),
13451
- !activeIntro.minimized ? /* @__PURE__ */ jsxs52(Fragment15, { children: [
13646
+ !activeIntro.minimized ? /* @__PURE__ */ jsxs51(Fragment15, { children: [
13452
13647
  /* @__PURE__ */ jsx72("p", { className: "mt-1 text-xs text-slate-600 dark:text-slate-300", children: introCopy.description }),
13453
- /* @__PURE__ */ jsxs52("div", { className: "mt-2 flex flex-wrap items-center gap-2 text-[11px] text-slate-500 dark:text-slate-400", children: [
13648
+ /* @__PURE__ */ jsxs51("div", { className: "mt-2 flex flex-wrap items-center gap-2 text-[11px] text-slate-500 dark:text-slate-400", children: [
13454
13649
  /* @__PURE__ */ jsx72("span", { className: "rounded-full bg-white/80 px-2 py-0.5 dark:bg-slate-900/70", children: validating ? "Validating..." : "Console idle" }),
13455
13650
  /* @__PURE__ */ jsx72("span", { className: "rounded-full bg-white/80 px-2 py-0.5 dark:bg-slate-900/70", children: shortcutLabel }),
13456
13651
  /* @__PURE__ */ jsx72("span", { className: "rounded-full bg-white/80 px-2 py-0.5 dark:bg-slate-900/70", children: "Press Escape to close" })
13457
13652
  ] })
13458
13653
  ] }) : null
13459
13654
  ] }),
13460
- /* @__PURE__ */ jsxs52("div", { className: "flex items-center gap-2 text-xs", children: [
13655
+ /* @__PURE__ */ jsxs51("div", { className: "flex items-center gap-2 text-xs", children: [
13461
13656
  /* @__PURE__ */ jsx72(
13462
13657
  "button",
13463
13658
  {
@@ -13478,9 +13673,9 @@ function ConsoleTab({
13478
13673
  )
13479
13674
  ] })
13480
13675
  ] }) }) : null,
13481
- /* @__PURE__ */ jsxs52("div", { className: "rounded-2xl border border-slate-200 bg-white/70 p-3 dark:border-slate-800 dark:bg-slate-950/40", children: [
13482
- /* @__PURE__ */ jsxs52("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
13483
- /* @__PURE__ */ jsx72("div", { className: "flex flex-wrap items-center gap-2", children: subTabs.map((tab) => /* @__PURE__ */ jsxs52(
13676
+ /* @__PURE__ */ jsxs51("div", { className: "rounded-2xl border border-slate-200 bg-white/70 p-3 dark:border-slate-800 dark:bg-slate-950/40", children: [
13677
+ /* @__PURE__ */ jsxs51("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
13678
+ /* @__PURE__ */ jsx72("div", { className: "flex flex-wrap items-center gap-2", children: subTabs.map((tab) => /* @__PURE__ */ jsxs51(
13484
13679
  "button",
13485
13680
  {
13486
13681
  type: "button",
@@ -13496,12 +13691,12 @@ function ConsoleTab({
13496
13691
  },
13497
13692
  tab.id
13498
13693
  )) }),
13499
- subTab === "logs" && logRows.length ? /* @__PURE__ */ jsxs52(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => errors.clear("logs"), className: "h-8 rounded-xl px-3 text-xs", children: [
13694
+ subTab === "logs" && logRows.length ? /* @__PURE__ */ jsxs51(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => errors.clear("logs"), className: "h-8 rounded-xl px-3 text-xs", children: [
13500
13695
  /* @__PURE__ */ jsx72(FiTrash2, {}),
13501
13696
  "Clear logs"
13502
13697
  ] }) : null
13503
13698
  ] }),
13504
- /* @__PURE__ */ jsxs52("div", { className: "mt-3 flex flex-wrap items-center gap-2", children: [
13699
+ /* @__PURE__ */ jsxs51("div", { className: "mt-3 flex flex-wrap items-center gap-2", children: [
13505
13700
  /* @__PURE__ */ jsx72("span", { className: "text-[11px] font-semibold tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: "Scope" }),
13506
13701
  /* @__PURE__ */ jsx72(
13507
13702
  "button",
@@ -13527,7 +13722,7 @@ function ConsoleTab({
13527
13722
  children: "Active node"
13528
13723
  }
13529
13724
  ),
13530
- subTab !== "logs" ? /* @__PURE__ */ jsxs52(Fragment15, { children: [
13725
+ subTab !== "logs" ? /* @__PURE__ */ jsxs51(Fragment15, { children: [
13531
13726
  /* @__PURE__ */ jsx72("span", { className: "ml-2 text-[11px] font-semibold tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: "Severity" }),
13532
13727
  ["all", "error", "warning", "info"].map((option) => /* @__PURE__ */ jsx72(
13533
13728
  "button",
@@ -13573,20 +13768,20 @@ function NoticeCard({ notice, onNodeClick }) {
13573
13768
  const canvas = useCanvas20();
13574
13769
  const targetNodeId = notice.target.scope === "node" ? notice.target.node_id : null;
13575
13770
  const targetChip = notice.target.scope === "node" ? toNodeChip(canvas, notice.target.node_id) : "Global notice";
13576
- return /* @__PURE__ */ jsx72("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-800 dark:bg-slate-950/90", children: /* @__PURE__ */ jsxs52("div", { className: "flex items-start gap-3", children: [
13771
+ return /* @__PURE__ */ jsx72("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-800 dark:bg-slate-950/90", children: /* @__PURE__ */ jsxs51("div", { className: "flex items-start gap-3", children: [
13577
13772
  /* @__PURE__ */ jsx72("div", { className: "mt-0.5", children: iconForSeverity(notice.severity) }),
13578
- /* @__PURE__ */ jsxs52("div", { className: "min-w-0 flex-1 space-y-2", children: [
13579
- /* @__PURE__ */ jsxs52("div", { className: "flex flex-wrap items-center gap-2", children: [
13773
+ /* @__PURE__ */ jsxs51("div", { className: "min-w-0 flex-1 space-y-2", children: [
13774
+ /* @__PURE__ */ jsxs51("div", { className: "flex flex-wrap items-center gap-2", children: [
13580
13775
  /* @__PURE__ */ jsx72("span", { className: severityBadgeClassName(notice.severity), children: notice.kind }),
13581
13776
  /* @__PURE__ */ jsx72("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-semibold tracking-[0.16em] text-slate-600 uppercase dark:bg-slate-900 dark:text-slate-300", children: notice.type }),
13582
13777
  /* @__PURE__ */ jsx72("span", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: notice.title })
13583
13778
  ] }),
13584
13779
  notice.description ? /* @__PURE__ */ jsx72("p", { className: "text-sm text-slate-600 dark:text-slate-300", children: notice.description }) : null,
13585
- notice.reason ? /* @__PURE__ */ jsxs52("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: [
13780
+ notice.reason ? /* @__PURE__ */ jsxs51("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: [
13586
13781
  "Reason: ",
13587
13782
  notice.reason
13588
13783
  ] }) : null,
13589
- /* @__PURE__ */ jsxs52("div", { className: "flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
13784
+ /* @__PURE__ */ jsxs51("div", { className: "flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
13590
13785
  notice.target.scope === "node" ? /* @__PURE__ */ jsx72(
13591
13786
  "button",
13592
13787
  {
@@ -13597,11 +13792,11 @@ function NoticeCard({ notice, onNodeClick }) {
13597
13792
  }
13598
13793
  ) : /* @__PURE__ */ jsx72("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-xs text-slate-700 dark:bg-slate-900 dark:text-slate-300", children: targetChip }),
13599
13794
  notice.marked_at ? /* @__PURE__ */ jsx72("span", { children: new Date(notice.marked_at).toLocaleString() }) : null,
13600
- notice.icon ? /* @__PURE__ */ jsxs52("span", { children: [
13795
+ notice.icon ? /* @__PURE__ */ jsxs51("span", { children: [
13601
13796
  "Icon: ",
13602
13797
  notice.icon
13603
13798
  ] }) : null,
13604
- notice.color ? /* @__PURE__ */ jsxs52("span", { children: [
13799
+ notice.color ? /* @__PURE__ */ jsxs51("span", { children: [
13605
13800
  "Color: ",
13606
13801
  notice.color
13607
13802
  ] }) : null
@@ -13617,10 +13812,10 @@ function ValidationCard({ row, onNodeClick }) {
13617
13812
  {
13618
13813
  className: "rounded-2xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-800 dark:bg-slate-950/90",
13619
13814
  onClick: () => scope.length && canvas.api.setHighlighted(scope),
13620
- children: /* @__PURE__ */ jsxs52("div", { className: "flex items-start gap-3", children: [
13815
+ children: /* @__PURE__ */ jsxs51("div", { className: "flex items-start gap-3", children: [
13621
13816
  /* @__PURE__ */ jsx72("div", { className: "mt-0.5", children: iconForSeverity(row.severity) }),
13622
- /* @__PURE__ */ jsxs52("div", { className: "min-w-0 flex-1", children: [
13623
- /* @__PURE__ */ jsxs52("div", { className: "flex flex-wrap items-center gap-2", children: [
13817
+ /* @__PURE__ */ jsxs51("div", { className: "min-w-0 flex-1", children: [
13818
+ /* @__PURE__ */ jsxs51("div", { className: "flex flex-wrap items-center gap-2", children: [
13624
13819
  /* @__PURE__ */ jsx72("span", { className: severityBadgeClassName(row.severity), children: row.code.replaceAll("_", " ") }),
13625
13820
  /* @__PURE__ */ jsx72("span", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: row.message })
13626
13821
  ] }),
@@ -13639,16 +13834,16 @@ function ValidationCard({ row, onNodeClick }) {
13639
13834
  );
13640
13835
  }
13641
13836
  function LogCard({ row, onRemove }) {
13642
- return /* @__PURE__ */ jsx72("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-800 dark:bg-slate-950/90", children: /* @__PURE__ */ jsxs52("div", { className: "flex items-start gap-3", children: [
13837
+ return /* @__PURE__ */ jsx72("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-800 dark:bg-slate-950/90", children: /* @__PURE__ */ jsxs51("div", { className: "flex items-start gap-3", children: [
13643
13838
  /* @__PURE__ */ jsx72("div", { className: "mt-0.5", children: /* @__PURE__ */ jsx72(FiInfo2, { className: "text-lg text-sky-500" }) }),
13644
- /* @__PURE__ */ jsxs52("div", { className: "min-w-0 flex-1", children: [
13645
- /* @__PURE__ */ jsxs52("div", { className: "flex flex-wrap items-center gap-2", children: [
13839
+ /* @__PURE__ */ jsxs51("div", { className: "min-w-0 flex-1", children: [
13840
+ /* @__PURE__ */ jsxs51("div", { className: "flex flex-wrap items-center gap-2", children: [
13646
13841
  /* @__PURE__ */ jsx72("span", { className: "rounded-full bg-sky-100 px-2.5 py-1 text-[10px] font-semibold tracking-[0.16em] text-sky-700 uppercase dark:bg-sky-500/15 dark:text-sky-200", children: row.code ?? "log" }),
13647
13842
  /* @__PURE__ */ jsx72("span", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: row.message })
13648
13843
  ] }),
13649
- /* @__PURE__ */ jsxs52("div", { className: "mt-3 flex items-center justify-between gap-3 text-xs text-slate-500 dark:text-slate-400", children: [
13844
+ /* @__PURE__ */ jsxs51("div", { className: "mt-3 flex items-center justify-between gap-3 text-xs text-slate-500 dark:text-slate-400", children: [
13650
13845
  /* @__PURE__ */ jsx72("span", { children: new Date(row.createdAt).toLocaleTimeString() }),
13651
- /* @__PURE__ */ jsxs52(Button, { type: "button", variant: "ghost", size: "sm", onClick: onRemove, className: "h-7 rounded-xl px-2 text-xs", children: [
13846
+ /* @__PURE__ */ jsxs51(Button, { type: "button", variant: "ghost", size: "sm", onClick: onRemove, className: "h-7 rounded-xl px-2 text-xs", children: [
13652
13847
  /* @__PURE__ */ jsx72(FiX4, {}),
13653
13848
  "Dismiss"
13654
13849
  ] })
@@ -13777,7 +13972,7 @@ function isScalar(value) {
13777
13972
  }
13778
13973
 
13779
13974
  // src/workspace/bottom-panel/service-picker-dialog.tsx
13780
- import { jsx as jsx73, jsxs as jsxs53 } from "react/jsx-runtime";
13975
+ import { jsx as jsx73, jsxs as jsxs52 } from "react/jsx-runtime";
13781
13976
  function ServicePickerDialog({
13782
13977
  open,
13783
13978
  groupLabel,
@@ -13823,7 +14018,7 @@ function ServicePickerDialog({
13823
14018
  const selectedCount = selectedIds.size;
13824
14019
  const canConfirm = selectedCount > 0;
13825
14020
  return createPortal4(
13826
- /* @__PURE__ */ jsx73("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-slate-950/45 p-4", children: /* @__PURE__ */ jsxs53(
14021
+ /* @__PURE__ */ jsx73("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-slate-950/45 p-4", children: /* @__PURE__ */ jsxs52(
13827
14022
  "div",
13828
14023
  {
13829
14024
  role: "dialog",
@@ -13831,15 +14026,15 @@ function ServicePickerDialog({
13831
14026
  "aria-label": "Service picker",
13832
14027
  className: "flex h-[min(80vh,42rem)] w-[min(72rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-3xl border border-slate-200 bg-white shadow-2xl dark:border-slate-800 dark:bg-slate-950",
13833
14028
  children: [
13834
- /* @__PURE__ */ jsx73("div", { className: "border-b border-slate-200 px-5 py-4 dark:border-slate-800", children: /* @__PURE__ */ jsxs53("div", { className: "flex items-start justify-between gap-4", children: [
13835
- /* @__PURE__ */ jsxs53("div", { children: [
14029
+ /* @__PURE__ */ jsx73("div", { className: "border-b border-slate-200 px-5 py-4 dark:border-slate-800", children: /* @__PURE__ */ jsxs52("div", { className: "flex items-start justify-between gap-4", children: [
14030
+ /* @__PURE__ */ jsxs52("div", { children: [
13836
14031
  /* @__PURE__ */ jsx73("h3", { className: "text-lg font-semibold text-slate-900 dark:text-slate-100", children: "Assign services to group" }),
13837
14032
  /* @__PURE__ */ jsx73("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: groupLabel ? `Pick one or more services to append into ${groupLabel}.` : "Pick one or more services to append into the selected catalog group." })
13838
14033
  ] }),
13839
14034
  /* @__PURE__ */ jsx73(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onOpenChange(false), className: "rounded-xl", children: "Close" })
13840
14035
  ] }) }),
13841
- /* @__PURE__ */ jsxs53("div", { className: "grid h-full min-h-0 flex-1 overflow-hidden md:grid-cols-[18rem_minmax(0,1fr)]", children: [
13842
- /* @__PURE__ */ jsx73("div", { className: "min-h-0 border-r border-slate-200 dark:border-slate-800", children: /* @__PURE__ */ jsx73(ScrollArea, { className: "h-full min-h-0", children: /* @__PURE__ */ jsxs53("div", { className: "space-y-4 p-4", children: [
14036
+ /* @__PURE__ */ jsxs52("div", { className: "grid h-full min-h-0 flex-1 overflow-hidden md:grid-cols-[18rem_minmax(0,1fr)]", children: [
14037
+ /* @__PURE__ */ jsx73("div", { className: "min-h-0 border-r border-slate-200 dark:border-slate-800", children: /* @__PURE__ */ jsx73(ScrollArea, { className: "h-full min-h-0", children: /* @__PURE__ */ jsxs52("div", { className: "space-y-4 p-4", children: [
13843
14038
  /* @__PURE__ */ jsx73(FilterField, { label: "Search", children: /* @__PURE__ */ jsx73(
13844
14039
  InputField16,
13845
14040
  {
@@ -13890,7 +14085,7 @@ function ServicePickerDialog({
13890
14085
  }))
13891
14086
  }
13892
14087
  ) }),
13893
- /* @__PURE__ */ jsxs53("div", { className: "grid grid-cols-2 gap-2", children: [
14088
+ /* @__PURE__ */ jsxs52("div", { className: "grid grid-cols-2 gap-2", children: [
13894
14089
  /* @__PURE__ */ jsx73(FilterField, { label: "Min rate", children: /* @__PURE__ */ jsx73(
13895
14090
  InputField16,
13896
14091
  {
@@ -13914,7 +14109,7 @@ function ServicePickerDialog({
13914
14109
  }
13915
14110
  ) })
13916
14111
  ] }),
13917
- /* @__PURE__ */ jsx73(FilterField, { label: "Name keyword", children: /* @__PURE__ */ jsxs53("div", { className: "space-y-2", children: [
14112
+ /* @__PURE__ */ jsx73(FilterField, { label: "Name keyword", children: /* @__PURE__ */ jsxs52("div", { className: "space-y-2", children: [
13918
14113
  /* @__PURE__ */ jsx73(
13919
14114
  InputField16,
13920
14115
  {
@@ -13985,8 +14180,8 @@ function ServicePickerDialog({
13985
14180
  }
13986
14181
  ) })
13987
14182
  ] }) }) }),
13988
- /* @__PURE__ */ jsxs53("div", { className: "flex min-h-0 flex-col overflow-hidden", children: [
13989
- /* @__PURE__ */ jsxs53("div", { className: "border-b border-slate-200 px-4 py-3 text-sm text-slate-500 dark:border-slate-800 dark:text-slate-400", children: [
14183
+ /* @__PURE__ */ jsxs52("div", { className: "flex min-h-0 flex-col overflow-hidden", children: [
14184
+ /* @__PURE__ */ jsxs52("div", { className: "border-b border-slate-200 px-4 py-3 text-sm text-slate-500 dark:border-slate-800 dark:text-slate-400", children: [
13990
14185
  filteredServices.length,
13991
14186
  " service",
13992
14187
  filteredServices.length === 1 ? "" : "s",
@@ -13996,7 +14191,7 @@ function ServicePickerDialog({
13996
14191
  const id = String(service.id);
13997
14192
  const selected = selectedIds.has(id);
13998
14193
  const alreadyAssigned = existingGroupServiceIds.has(id);
13999
- return /* @__PURE__ */ jsxs53(
14194
+ return /* @__PURE__ */ jsxs52(
14000
14195
  "label",
14001
14196
  {
14002
14197
  className: cn(
@@ -14018,12 +14213,12 @@ function ServicePickerDialog({
14018
14213
  })
14019
14214
  }
14020
14215
  ),
14021
- /* @__PURE__ */ jsxs53("div", { className: "min-w-0 flex-1", children: [
14022
- /* @__PURE__ */ jsxs53("div", { className: "flex items-center justify-between gap-3", children: [
14023
- /* @__PURE__ */ jsxs53("div", { className: "min-w-0", children: [
14216
+ /* @__PURE__ */ jsxs52("div", { className: "min-w-0 flex-1", children: [
14217
+ /* @__PURE__ */ jsxs52("div", { className: "flex items-center justify-between gap-3", children: [
14218
+ /* @__PURE__ */ jsxs52("div", { className: "min-w-0", children: [
14024
14219
  /* @__PURE__ */ jsx73("div", { className: "truncate text-sm font-semibold text-slate-900 dark:text-slate-100", children: service.name }),
14025
- /* @__PURE__ */ jsxs53("div", { className: "mt-1 flex flex-wrap gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
14026
- /* @__PURE__ */ jsxs53("span", { children: [
14220
+ /* @__PURE__ */ jsxs52("div", { className: "mt-1 flex flex-wrap gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
14221
+ /* @__PURE__ */ jsxs52("span", { children: [
14027
14222
  "#",
14028
14223
  service.id
14029
14224
  ] }),
@@ -14033,8 +14228,8 @@ function ServicePickerDialog({
14033
14228
  ] }),
14034
14229
  alreadyAssigned ? /* @__PURE__ */ jsx73("span", { className: "rounded-full bg-emerald-50 px-2.5 py-1 text-[11px] text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-200", children: "Already in group" }) : null
14035
14230
  ] }),
14036
- /* @__PURE__ */ jsxs53("div", { className: "mt-3 flex flex-wrap gap-2", children: [
14037
- service.rate != null ? /* @__PURE__ */ jsxs53("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[11px] text-slate-600 dark:bg-slate-900 dark:text-slate-300", children: [
14231
+ /* @__PURE__ */ jsxs52("div", { className: "mt-3 flex flex-wrap gap-2", children: [
14232
+ service.rate != null ? /* @__PURE__ */ jsxs52("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[11px] text-slate-600 dark:bg-slate-900 dark:text-slate-300", children: [
14038
14233
  "Rate ",
14039
14234
  service.rate
14040
14235
  ] }) : null,
@@ -14048,14 +14243,14 @@ function ServicePickerDialog({
14048
14243
  }) : /* @__PURE__ */ jsx73("div", { className: "rounded-2xl border border-dashed border-slate-300 px-4 py-10 text-center text-sm text-slate-500 dark:border-slate-700 dark:text-slate-400", children: "No services match the current filters." }) }) })
14049
14244
  ] })
14050
14245
  ] }),
14051
- /* @__PURE__ */ jsxs53("div", { className: "flex items-center justify-between gap-3 border-t border-slate-200 px-5 py-4 dark:border-slate-800", children: [
14052
- /* @__PURE__ */ jsxs53("div", { className: "text-sm text-slate-500 dark:text-slate-400", children: [
14246
+ /* @__PURE__ */ jsxs52("div", { className: "flex items-center justify-between gap-3 border-t border-slate-200 px-5 py-4 dark:border-slate-800", children: [
14247
+ /* @__PURE__ */ jsxs52("div", { className: "text-sm text-slate-500 dark:text-slate-400", children: [
14053
14248
  selectedCount,
14054
14249
  " service",
14055
14250
  selectedCount === 1 ? "" : "s",
14056
14251
  " selected"
14057
14252
  ] }),
14058
- /* @__PURE__ */ jsxs53("div", { className: "flex items-center gap-2", children: [
14253
+ /* @__PURE__ */ jsxs52("div", { className: "flex items-center gap-2", children: [
14059
14254
  /* @__PURE__ */ jsx73(Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false), className: "rounded-xl", children: "Cancel" }),
14060
14255
  /* @__PURE__ */ jsx73(
14061
14256
  Button,
@@ -14079,7 +14274,7 @@ function ServicePickerDialog({
14079
14274
  );
14080
14275
  }
14081
14276
  function FilterField({ label, children }) {
14082
- return /* @__PURE__ */ jsxs53("label", { className: "block space-y-1.5", children: [
14277
+ return /* @__PURE__ */ jsxs52("label", { className: "block space-y-1.5", children: [
14083
14278
  /* @__PURE__ */ jsx73("span", { className: "text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-500 dark:text-slate-400", children: label }),
14084
14279
  children
14085
14280
  ] });
@@ -14135,7 +14330,7 @@ import { FaFolderOpen } from "react-icons/fa";
14135
14330
  import { FiEdit2, FiFilter, FiFolderPlus, FiPlus as FiPlus2, FiTrash2 as FiTrash22 } from "react-icons/fi";
14136
14331
 
14137
14332
  // src/workspace/bottom-panel/service-detail-card.tsx
14138
- import { jsx as jsx75, jsxs as jsxs54 } from "react/jsx-runtime";
14333
+ import { jsx as jsx75, jsxs as jsxs53 } from "react/jsx-runtime";
14139
14334
  function ServiceDetailCard({
14140
14335
  mode,
14141
14336
  row,
@@ -14146,16 +14341,16 @@ function ServiceDetailCard({
14146
14341
  }) {
14147
14342
  const summary = row.summary;
14148
14343
  const service = row.service;
14149
- return /* @__PURE__ */ jsxs54("div", { className: "space-y-5", children: [
14150
- /* @__PURE__ */ jsxs54("div", { className: "rounded-3xl border border-slate-200 bg-slate-50/80 p-5 dark:border-slate-800 dark:bg-slate-900/40", children: [
14151
- /* @__PURE__ */ jsxs54("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
14152
- /* @__PURE__ */ jsxs54("div", { className: "min-w-0", children: [
14153
- /* @__PURE__ */ jsxs54("div", { className: "flex items-center gap-2", children: [
14344
+ return /* @__PURE__ */ jsxs53("div", { className: "space-y-5", children: [
14345
+ /* @__PURE__ */ jsxs53("div", { className: "rounded-3xl border border-slate-200 bg-slate-50/80 p-5 dark:border-slate-800 dark:bg-slate-900/40", children: [
14346
+ /* @__PURE__ */ jsxs53("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
14347
+ /* @__PURE__ */ jsxs53("div", { className: "min-w-0", children: [
14348
+ /* @__PURE__ */ jsxs53("div", { className: "flex items-center gap-2", children: [
14154
14349
  /* @__PURE__ */ jsx75(StatusDot, { tone: row.statusTone, className: "mt-0.5" }),
14155
14350
  /* @__PURE__ */ jsx75("h5", { className: "truncate text-lg font-semibold text-slate-900 dark:text-slate-100", children: summary.name })
14156
14351
  ] }),
14157
- /* @__PURE__ */ jsxs54("div", { className: "mt-2 flex flex-wrap gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
14158
- /* @__PURE__ */ jsxs54("span", { children: [
14352
+ /* @__PURE__ */ jsxs53("div", { className: "mt-2 flex flex-wrap gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
14353
+ /* @__PURE__ */ jsxs53("span", { children: [
14159
14354
  "#",
14160
14355
  summary.id
14161
14356
  ] }),
@@ -14163,7 +14358,7 @@ function ServiceDetailCard({
14163
14358
  summary.platformId ? /* @__PURE__ */ jsx75("span", { children: summary.platformId }) : null
14164
14359
  ] })
14165
14360
  ] }),
14166
- /* @__PURE__ */ jsxs54("div", { className: "flex items-center gap-2", children: [
14361
+ /* @__PURE__ */ jsxs53("div", { className: "flex items-center gap-2", children: [
14167
14362
  mode === "active" && onOpenFallbackQuickAdd ? /* @__PURE__ */ jsx75(
14168
14363
  "button",
14169
14364
  {
@@ -14185,14 +14380,14 @@ function ServiceDetailCard({
14185
14380
  /* @__PURE__ */ jsx75("span", { className: statusBadgeClassName(row.statusTone), children: row.statusLabel })
14186
14381
  ] })
14187
14382
  ] }),
14188
- /* @__PURE__ */ jsxs54("div", { className: "mt-4 grid gap-3 sm:grid-cols-2", children: [
14383
+ /* @__PURE__ */ jsxs53("div", { className: "mt-4 grid gap-3 sm:grid-cols-2", children: [
14189
14384
  /* @__PURE__ */ jsx75(DetailMetric, { label: "Rate", value: summary.rate != null ? String(summary.rate) : "Not set" }),
14190
14385
  /* @__PURE__ */ jsx75(DetailMetric, { label: "Estimate", value: summary.estimate ?? "No estimate" }),
14191
14386
  /* @__PURE__ */ jsx75(DetailMetric, { label: "Min", value: summary.min != null ? String(summary.min) : "0" }),
14192
14387
  /* @__PURE__ */ jsx75(DetailMetric, { label: "Max", value: summary.max != null ? String(summary.max) : "Unlimited" })
14193
14388
  ] })
14194
14389
  ] }),
14195
- mode !== "active" ? /* @__PURE__ */ jsxs54("section", { className: "space-y-3", children: [
14390
+ mode !== "active" ? /* @__PURE__ */ jsxs53("section", { className: "space-y-3", children: [
14196
14391
  /* @__PURE__ */ jsx75(
14197
14392
  SectionTitle2,
14198
14393
  {
@@ -14200,8 +14395,8 @@ function ServiceDetailCard({
14200
14395
  description: mode === "catalog" ? "This summary shows how the service fits the current visible-group context while browsing catalog groups." : "This summary shows how the service fits the current visible-group context."
14201
14396
  }
14202
14397
  ),
14203
- /* @__PURE__ */ jsxs54("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-950/80", children: [
14204
- /* @__PURE__ */ jsxs54("div", { className: "flex flex-wrap gap-2", children: [
14398
+ /* @__PURE__ */ jsxs53("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-950/80", children: [
14399
+ /* @__PURE__ */ jsxs53("div", { className: "flex flex-wrap gap-2", children: [
14205
14400
  /* @__PURE__ */ jsx75(FilterChip, { label: row.check?.fitsConstraints ? "Constraints fit" : "Constraint mismatch", tone: row.check?.fitsConstraints ? "success" : "danger" }),
14206
14401
  /* @__PURE__ */ jsx75(FilterChip, { label: row.check?.passesRate ? "Rate ok" : "Rate blocked", tone: row.check?.passesRate ? "success" : "warning" }),
14207
14402
  /* @__PURE__ */ jsx75(
@@ -14215,14 +14410,14 @@ function ServiceDetailCard({
14215
14410
  row.reasonLabels.length ? /* @__PURE__ */ jsx75("div", { className: "mt-3 flex flex-wrap gap-2", children: row.reasonLabels.map((reason) => /* @__PURE__ */ jsx75("span", { className: "rounded-full bg-amber-50 px-2.5 py-1 text-xs text-amber-700 dark:bg-amber-500/10 dark:text-amber-200", children: reason }, `${row.id}:${reason}`)) }) : /* @__PURE__ */ jsx75("p", { className: "mt-3 text-sm text-slate-500 dark:text-slate-400", children: "This service is a clean fit for the current visible-group and selected-trigger context." })
14216
14411
  ] })
14217
14412
  ] }) : null,
14218
- /* @__PURE__ */ jsxs54("section", { className: "space-y-3", children: [
14413
+ /* @__PURE__ */ jsxs53("section", { className: "space-y-3", children: [
14219
14414
  /* @__PURE__ */ jsx75(SectionTitle2, { title: "Capabilities", description: "Flags and pricing hints attached to this service." }),
14220
- /* @__PURE__ */ jsx75("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-950/80", children: summary.flags.length || service?.meta ? /* @__PURE__ */ jsxs54("div", { className: "flex flex-wrap gap-2", children: [
14415
+ /* @__PURE__ */ jsx75("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-950/80", children: summary.flags.length || service?.meta ? /* @__PURE__ */ jsxs53("div", { className: "flex flex-wrap gap-2", children: [
14221
14416
  summary.flags.map((flag) => /* @__PURE__ */ jsx75("span", { className: "rounded-full bg-emerald-50 px-2.5 py-1 text-xs text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-200", children: flag }, flag)),
14222
14417
  Object.keys(service?.meta ?? {}).slice(0, 3).map((key) => /* @__PURE__ */ jsx75("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-xs text-slate-600 dark:bg-slate-900 dark:text-slate-300", children: key }, key))
14223
14418
  ] }) : /* @__PURE__ */ jsx75("p", { className: "text-sm text-slate-500 dark:text-slate-400", children: "No capability flags were published for this service." }) })
14224
14419
  ] }),
14225
- /* @__PURE__ */ jsxs54("section", { className: "space-y-3", children: [
14420
+ /* @__PURE__ */ jsxs53("section", { className: "space-y-3", children: [
14226
14421
  /* @__PURE__ */ jsx75(SectionTitle2, { title: "Bindings", description: "Nodes currently connected to this service. Click any node to jump back into the canvas." }),
14227
14422
  /* @__PURE__ */ jsx75("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-950/80", children: summary.attachedNodeIds.length ? /* @__PURE__ */ jsx75("div", { className: "flex flex-wrap gap-2", children: summary.attachedNodeIds.map((nodeId, index) => /* @__PURE__ */ jsx75(
14228
14423
  "button",
@@ -14238,13 +14433,13 @@ function ServiceDetailCard({
14238
14433
  ] });
14239
14434
  }
14240
14435
  function SectionTitle2({ title, description }) {
14241
- return /* @__PURE__ */ jsxs54("div", { children: [
14436
+ return /* @__PURE__ */ jsxs53("div", { children: [
14242
14437
  /* @__PURE__ */ jsx75("p", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: title }),
14243
14438
  /* @__PURE__ */ jsx75("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: description })
14244
14439
  ] });
14245
14440
  }
14246
14441
  function DetailMetric({ label, value }) {
14247
- return /* @__PURE__ */ jsxs54("div", { className: "rounded-2xl bg-white px-4 py-3 dark:bg-slate-950", children: [
14442
+ return /* @__PURE__ */ jsxs53("div", { className: "rounded-2xl bg-white px-4 py-3 dark:bg-slate-950", children: [
14248
14443
  /* @__PURE__ */ jsx75("p", { className: "text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-400 dark:text-slate-500", children: label }),
14249
14444
  /* @__PURE__ */ jsx75("p", { className: "mt-2 text-sm font-semibold text-slate-900 dark:text-slate-100", children: value })
14250
14445
  ] });
@@ -14254,22 +14449,22 @@ function FilterChip({ label, tone = "default" }) {
14254
14449
  }
14255
14450
 
14256
14451
  // src/workspace/bottom-panel/services-split-pane.tsx
14257
- import { jsx as jsx76, jsxs as jsxs55 } from "react/jsx-runtime";
14452
+ import { jsx as jsx76, jsxs as jsxs54 } from "react/jsx-runtime";
14258
14453
  var UNGROUPED_TREE_VALUE = "__catalog_ungrouped__";
14259
14454
  function ServicesSplitPane(props) {
14260
14455
  const emptyTitle = props.mode === "active" ? "No active services yet" : "No services match this view";
14261
14456
  const emptyDescription = props.mode === "active" ? "Connect a service to a tag, field, or option and it will appear here with its bindings." : props.mode === "catalog" ? "Select a catalog group or create one to organize source services for faster assignment." : "Try changing the search or toggles to bring more services into view.";
14262
- return /* @__PURE__ */ jsx76("div", { className: "min-h-90 p-4", children: /* @__PURE__ */ jsxs55(ResizablePanelGroup, { direction: "horizontal", className: "min-h-90", children: [
14263
- /* @__PURE__ */ jsx76(ResizablePanel, { defaultSize: 44, minSize: 30, children: /* @__PURE__ */ jsxs55("section", { className: "flex h-full min-h-0 flex-col overflow-hidden", children: [
14264
- /* @__PURE__ */ jsxs55("div", { className: "space-y-3 border-b border-slate-100 pr-4 dark:border-slate-800", children: [
14265
- /* @__PURE__ */ jsxs55("div", { className: "flex items-center justify-between gap-3", children: [
14457
+ return /* @__PURE__ */ jsx76("div", { className: "min-h-90 p-4", children: /* @__PURE__ */ jsxs54(ResizablePanelGroup, { direction: "horizontal", className: "min-h-90", children: [
14458
+ /* @__PURE__ */ jsx76(ResizablePanel, { defaultSize: 44, minSize: 30, children: /* @__PURE__ */ jsxs54("section", { className: "flex h-full min-h-0 flex-col overflow-hidden", children: [
14459
+ /* @__PURE__ */ jsxs54("div", { className: "space-y-3 border-b border-slate-100 pr-4 dark:border-slate-800", children: [
14460
+ /* @__PURE__ */ jsxs54("div", { className: "flex items-center justify-between gap-3", children: [
14266
14461
  /* @__PURE__ */ jsx76("div", { children: /* @__PURE__ */ jsx76("h4", { className: "mt-1 text-base font-semibold text-slate-900 dark:text-slate-100", children: props.mode === "active" ? "Attached services" : props.mode === "catalog" ? "Catalog workspace" : "All services" }) }),
14267
- /* @__PURE__ */ jsxs55("div", { className: "flex items-center gap-2", children: [
14462
+ /* @__PURE__ */ jsxs54("div", { className: "flex items-center gap-2", children: [
14268
14463
  props.mode === "catalog" ? /* @__PURE__ */ jsx76("span", { className: "rounded-full bg-blue-50 px-2.5 py-1 text-[10px] font-semibold tracking-[0.16em] text-blue-700 uppercase dark:bg-blue-500/10 dark:text-blue-200", children: props.selectedCatalogGroupLabel ?? "Ungrouped" }) : null,
14269
14464
  /* @__PURE__ */ jsx76("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-semibold tracking-[0.16em] text-slate-600 uppercase dark:bg-slate-900 dark:text-slate-300", children: props.rows.length })
14270
14465
  ] })
14271
14466
  ] }),
14272
- props.mode === "all" && props.appliedSnapshot?.selectedTag ? /* @__PURE__ */ jsxs55("div", { className: "flex flex-wrap gap-2 pb-3", children: [
14467
+ props.mode === "all" && props.appliedSnapshot?.selectedTag ? /* @__PURE__ */ jsxs54("div", { className: "flex flex-wrap gap-2 pb-3", children: [
14273
14468
  /* @__PURE__ */ jsx76(FilterChip2, { label: `Context tag: ${props.appliedSnapshot.selectedTag.label}` }),
14274
14469
  /* @__PURE__ */ jsx76(
14275
14470
  FilterChip2,
@@ -14306,7 +14501,7 @@ function ServicesSplitPane(props) {
14306
14501
  }
14307
14502
  ) }) : null
14308
14503
  ] }),
14309
- /* @__PURE__ */ jsx76(ScrollArea, { className: "h-[calc(var(--bottom-panel-height)-15rem)] max-h-[calc(var(--bottom-panel-height)-15rem)] min-h-0 flex-1", children: /* @__PURE__ */ jsx76("div", { className: "space-y-2 p-3 pl-0", children: props.rows.length === 0 ? /* @__PURE__ */ jsx76(EmptyState, { title: emptyTitle, description: emptyDescription }) : props.rows.map((row) => /* @__PURE__ */ jsxs55(
14504
+ /* @__PURE__ */ jsx76(ScrollArea, { className: "h-[calc(var(--bottom-panel-height)-15rem)] max-h-[calc(var(--bottom-panel-height)-15rem)] min-h-0 flex-1", children: /* @__PURE__ */ jsx76("div", { className: "space-y-2 p-3 pl-0", children: props.rows.length === 0 ? /* @__PURE__ */ jsx76(EmptyState, { title: emptyTitle, description: emptyDescription }) : props.rows.map((row) => /* @__PURE__ */ jsxs54(
14310
14505
  "button",
14311
14506
  {
14312
14507
  type: "button",
@@ -14319,14 +14514,14 @@ function ServicesSplitPane(props) {
14319
14514
  props.selectedRowId === row.id ? "border-blue-300 bg-blue-50 shadow-sm dark:border-blue-500/40 dark:bg-blue-500/10" : "border-slate-200 bg-white hover:border-slate-300 hover:bg-slate-50 dark:border-slate-800 dark:bg-slate-950/60 dark:hover:border-slate-700"
14320
14515
  ),
14321
14516
  children: [
14322
- /* @__PURE__ */ jsxs55("div", { className: "flex items-start justify-between gap-3", children: [
14323
- /* @__PURE__ */ jsxs55("div", { className: "min-w-0", children: [
14324
- /* @__PURE__ */ jsxs55("div", { className: "flex items-center gap-2", children: [
14517
+ /* @__PURE__ */ jsxs54("div", { className: "flex items-start justify-between gap-3", children: [
14518
+ /* @__PURE__ */ jsxs54("div", { className: "min-w-0", children: [
14519
+ /* @__PURE__ */ jsxs54("div", { className: "flex items-center gap-2", children: [
14325
14520
  /* @__PURE__ */ jsx76(StatusDot, { tone: row.statusTone }),
14326
14521
  /* @__PURE__ */ jsx76("span", { className: "truncate text-sm font-semibold text-slate-900 dark:text-slate-100", children: row.summary.name })
14327
14522
  ] }),
14328
- /* @__PURE__ */ jsxs55("div", { className: "mt-1 flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
14329
- /* @__PURE__ */ jsxs55("span", { children: [
14523
+ /* @__PURE__ */ jsxs54("div", { className: "mt-1 flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400", children: [
14524
+ /* @__PURE__ */ jsxs54("span", { children: [
14330
14525
  "#",
14331
14526
  row.summary.id
14332
14527
  ] }),
@@ -14336,13 +14531,13 @@ function ServicesSplitPane(props) {
14336
14531
  ] }),
14337
14532
  /* @__PURE__ */ jsx76("span", { className: statusBadgeClassName(row.statusTone), children: row.statusLabel })
14338
14533
  ] }),
14339
- /* @__PURE__ */ jsxs55("div", { className: "mt-3 flex flex-wrap items-center gap-2", children: [
14340
- /* @__PURE__ */ jsxs55("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[11px] text-slate-600 dark:bg-slate-900 dark:text-slate-300", children: [
14534
+ /* @__PURE__ */ jsxs54("div", { className: "mt-3 flex flex-wrap items-center gap-2", children: [
14535
+ /* @__PURE__ */ jsxs54("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[11px] text-slate-600 dark:bg-slate-900 dark:text-slate-300", children: [
14341
14536
  row.summary.attachmentCount,
14342
14537
  " node",
14343
14538
  row.summary.attachmentCount === 1 ? "" : "s"
14344
14539
  ] }),
14345
- row.summary.rate != null ? /* @__PURE__ */ jsxs55("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[11px] text-slate-600 dark:bg-slate-900 dark:text-slate-300", children: [
14540
+ row.summary.rate != null ? /* @__PURE__ */ jsxs54("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[11px] text-slate-600 dark:bg-slate-900 dark:text-slate-300", children: [
14346
14541
  "Rate ",
14347
14542
  row.summary.rate
14348
14543
  ] }) : null,
@@ -14361,8 +14556,8 @@ function ServicesSplitPane(props) {
14361
14556
  )) }) })
14362
14557
  ] }) }),
14363
14558
  /* @__PURE__ */ jsx76(ResizableHandle, { withHandle: true }),
14364
- /* @__PURE__ */ jsx76(ResizablePanel, { defaultSize: 56, minSize: 36, children: /* @__PURE__ */ jsxs55("section", { className: "flex h-full min-h-0 flex-col overflow-hidden", children: [
14365
- /* @__PURE__ */ jsxs55("div", { className: "border-b border-slate-100 px-4 dark:border-slate-800", children: [
14559
+ /* @__PURE__ */ jsx76(ResizablePanel, { defaultSize: 56, minSize: 36, children: /* @__PURE__ */ jsxs54("section", { className: "flex h-full min-h-0 flex-col overflow-hidden", children: [
14560
+ /* @__PURE__ */ jsxs54("div", { className: "border-b border-slate-100 px-4 dark:border-slate-800", children: [
14366
14561
  /* @__PURE__ */ jsx76("p", { className: "text-xs font-semibold tracking-[0.18em] text-slate-400 uppercase dark:text-slate-500", children: "Service detail" }),
14367
14562
  /* @__PURE__ */ jsx76("h4", { className: "mt-1 text-base font-semibold text-slate-900 dark:text-slate-100", children: props.detailRow ? props.detailRow.summary.name : "Select a service" }),
14368
14563
  /* @__PURE__ */ jsx76("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: props.mode === "active" ? "Highlight connected nodes, inspect usage, and jump back into the canvas." : props.mode === "catalog" ? "Inspect compatibility, pricing, and bindings while browsing manual catalog groups." : "Inspect compatibility, pricing, and bindings before assigning the service to a node." })
@@ -14399,7 +14594,7 @@ function CatalogContextPopover({
14399
14594
  onDraftContextChange
14400
14595
  }) {
14401
14596
  const context = draftContext;
14402
- return /* @__PURE__ */ jsxs55(Popover, { open, onOpenChange, children: [
14597
+ return /* @__PURE__ */ jsxs54(Popover, { open, onOpenChange, children: [
14403
14598
  /* @__PURE__ */ jsx76(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx76(
14404
14599
  "button",
14405
14600
  {
@@ -14412,7 +14607,7 @@ function CatalogContextPopover({
14412
14607
  children: /* @__PURE__ */ jsx76(FiFilter, {})
14413
14608
  }
14414
14609
  ) }),
14415
- /* @__PURE__ */ jsxs55(
14610
+ /* @__PURE__ */ jsxs54(
14416
14611
  PopoverContent,
14417
14612
  {
14418
14613
  align: "end",
@@ -14420,30 +14615,30 @@ function CatalogContextPopover({
14420
14615
  collisionPadding: 16,
14421
14616
  className: "max-h-[min(32rem,var(--radix-popover-content-available-height))] w-[min(24rem,calc(100vw-2rem))] overflow-hidden rounded-2xl p-0",
14422
14617
  children: [
14423
- /* @__PURE__ */ jsxs55("div", { className: "border-b border-slate-200 px-4 py-3 dark:border-slate-800", children: [
14618
+ /* @__PURE__ */ jsxs54("div", { className: "border-b border-slate-200 px-4 py-3 dark:border-slate-800", children: [
14424
14619
  /* @__PURE__ */ jsx76("div", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: "Catalog context" }),
14425
14620
  /* @__PURE__ */ jsx76("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: "Control compatibility checks here, or link them to the current workspace context." })
14426
14621
  ] }),
14427
- /* @__PURE__ */ jsx76(ScrollArea, { className: "h-[calc(var(--radix-popover-content-available-height)-4.5rem)] max-h-[calc(var(--radix-popover-content-available-height)-4.5rem)]", children: /* @__PURE__ */ jsxs55("div", { className: "space-y-4 p-4", children: [
14428
- /* @__PURE__ */ jsxs55("label", { className: "flex items-start justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14429
- /* @__PURE__ */ jsxs55("span", { className: "min-w-0", children: [
14622
+ /* @__PURE__ */ jsx76(ScrollArea, { className: "h-[calc(var(--radix-popover-content-available-height)-4.5rem)] max-h-[calc(var(--radix-popover-content-available-height)-4.5rem)]", children: /* @__PURE__ */ jsxs54("div", { className: "space-y-4 p-4", children: [
14623
+ /* @__PURE__ */ jsxs54("label", { className: "flex items-start justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14624
+ /* @__PURE__ */ jsxs54("span", { className: "min-w-0", children: [
14430
14625
  /* @__PURE__ */ jsx76("span", { className: "block font-medium", children: "Compatible only" }),
14431
14626
  /* @__PURE__ */ jsx76("span", { className: "mt-1 block text-xs text-slate-500 dark:text-slate-400", children: "Show only services that fit this catalog context safely." })
14432
14627
  ] }),
14433
14628
  /* @__PURE__ */ jsx76("input", { type: "checkbox", checked: compatibleOnly, onChange: (event) => onCompatibleOnlyChange(event.target.checked) })
14434
14629
  ] }),
14435
- /* @__PURE__ */ jsxs55("label", { className: "flex items-start justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14436
- /* @__PURE__ */ jsxs55("span", { className: "min-w-0", children: [
14630
+ /* @__PURE__ */ jsxs54("label", { className: "flex items-start justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14631
+ /* @__PURE__ */ jsxs54("span", { className: "min-w-0", children: [
14437
14632
  /* @__PURE__ */ jsx76("span", { className: "block font-medium", children: "Link to current context" }),
14438
14633
  /* @__PURE__ */ jsx76("span", { className: "mt-1 block text-xs text-slate-500 dark:text-slate-400", children: "Mirror the current canvas tag and selected buttons while linked." })
14439
14634
  ] }),
14440
14635
  /* @__PURE__ */ jsx76("input", { type: "checkbox", checked: contextLinked, onChange: (event) => onContextLinkedChange(event.target.checked) })
14441
14636
  ] }),
14442
- /* @__PURE__ */ jsxs55("div", { className: "space-y-2 rounded-2xl border border-slate-200 bg-slate-50/70 p-3 dark:border-slate-800 dark:bg-slate-900/40", children: [
14637
+ /* @__PURE__ */ jsxs54("div", { className: "space-y-2 rounded-2xl border border-slate-200 bg-slate-50/70 p-3 dark:border-slate-800 dark:bg-slate-900/40", children: [
14443
14638
  /* @__PURE__ */ jsx76("div", { className: "text-xs font-semibold tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: "Tags" }),
14444
14639
  /* @__PURE__ */ jsx76("div", { className: "space-y-2", children: (draftSnapshot?.tags ?? []).map((tag) => {
14445
14640
  const selected = context?.selectedTagId === tag.id;
14446
- return /* @__PURE__ */ jsxs55("label", { className: "flex items-start gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14641
+ return /* @__PURE__ */ jsxs54("label", { className: "flex items-start gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14447
14642
  /* @__PURE__ */ jsx76(
14448
14643
  "input",
14449
14644
  {
@@ -14462,20 +14657,20 @@ function CatalogContextPopover({
14462
14657
  })
14463
14658
  }
14464
14659
  ),
14465
- /* @__PURE__ */ jsxs55("span", { className: "min-w-0", children: [
14660
+ /* @__PURE__ */ jsxs54("span", { className: "min-w-0", children: [
14466
14661
  /* @__PURE__ */ jsx76("span", { className: "block font-medium", children: tag.label }),
14467
14662
  tag.description ? /* @__PURE__ */ jsx76("span", { className: "block text-xs text-slate-500 dark:text-slate-400", children: tag.description }) : null
14468
14663
  ] })
14469
14664
  ] }, tag.id);
14470
14665
  }) })
14471
14666
  ] }),
14472
- /* @__PURE__ */ jsxs55("div", { className: "space-y-2 rounded-2xl border border-slate-200 bg-slate-50/70 p-3 dark:border-slate-800 dark:bg-slate-900/40", children: [
14667
+ /* @__PURE__ */ jsxs54("div", { className: "space-y-2 rounded-2xl border border-slate-200 bg-slate-50/70 p-3 dark:border-slate-800 dark:bg-slate-900/40", children: [
14473
14668
  /* @__PURE__ */ jsx76("div", { className: "text-xs font-semibold tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: "Selected buttons" }),
14474
- draftSnapshot?.buttonGroups?.length ? /* @__PURE__ */ jsx76("div", { className: "space-y-3", children: draftSnapshot.buttonGroups.map((group) => /* @__PURE__ */ jsxs55("div", { className: "space-y-2", children: [
14669
+ draftSnapshot?.buttonGroups?.length ? /* @__PURE__ */ jsx76("div", { className: "space-y-3", children: draftSnapshot.buttonGroups.map((group) => /* @__PURE__ */ jsxs54("div", { className: "space-y-2", children: [
14475
14670
  /* @__PURE__ */ jsx76("div", { className: "text-sm font-medium text-slate-900 dark:text-slate-100", children: group.label }),
14476
14671
  /* @__PURE__ */ jsx76("div", { className: "space-y-1", children: group.options.map((option) => {
14477
14672
  const checked = context?.selectedButtons.includes(option.id) ?? false;
14478
- return /* @__PURE__ */ jsxs55(
14673
+ return /* @__PURE__ */ jsxs54(
14479
14674
  "label",
14480
14675
  {
14481
14676
  className: "flex items-start gap-3 text-sm text-slate-900 dark:text-slate-100",
@@ -14497,7 +14692,7 @@ function CatalogContextPopover({
14497
14692
  })
14498
14693
  }
14499
14694
  ),
14500
- /* @__PURE__ */ jsxs55("span", { className: "min-w-0", children: [
14695
+ /* @__PURE__ */ jsxs54("span", { className: "min-w-0", children: [
14501
14696
  /* @__PURE__ */ jsx76("span", { className: "block", children: option.label }),
14502
14697
  option.description ? /* @__PURE__ */ jsx76("span", { className: "block text-xs text-slate-500 dark:text-slate-400", children: option.description }) : null
14503
14698
  ] })
@@ -14508,9 +14703,9 @@ function CatalogContextPopover({
14508
14703
  }) })
14509
14704
  ] }, group.id)) }) : /* @__PURE__ */ jsx76("div", { className: "text-sm text-slate-500 dark:text-slate-400", children: "No visible trigger options for the selected tag." })
14510
14705
  ] }),
14511
- /* @__PURE__ */ jsxs55("div", { className: "space-y-2 rounded-2xl border border-slate-200 bg-slate-50/70 p-3 dark:border-slate-800 dark:bg-slate-900/40", children: [
14706
+ /* @__PURE__ */ jsxs54("div", { className: "space-y-2 rounded-2xl border border-slate-200 bg-slate-50/70 p-3 dark:border-slate-800 dark:bg-slate-900/40", children: [
14512
14707
  /* @__PURE__ */ jsx76("div", { className: "text-xs font-semibold tracking-[0.16em] text-slate-500 uppercase dark:text-slate-400", children: "Safety" }),
14513
- /* @__PURE__ */ jsxs55("label", { className: "flex items-center justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14708
+ /* @__PURE__ */ jsxs54("label", { className: "flex items-center justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14514
14709
  /* @__PURE__ */ jsx76("span", { children: "Strict safety" }),
14515
14710
  /* @__PURE__ */ jsx76(
14516
14711
  "input",
@@ -14525,7 +14720,7 @@ function CatalogContextPopover({
14525
14720
  }
14526
14721
  )
14527
14722
  ] }),
14528
- /* @__PURE__ */ jsxs55("label", { className: "flex items-center justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14723
+ /* @__PURE__ */ jsxs54("label", { className: "flex items-center justify-between gap-3 text-sm text-slate-900 dark:text-slate-100", children: [
14529
14724
  /* @__PURE__ */ jsx76("span", { children: "Enforce policies" }),
14530
14725
  /* @__PURE__ */ jsx76(
14531
14726
  "input",
@@ -14561,8 +14756,8 @@ function CatalogToolbar({
14561
14756
  }) {
14562
14757
  const treeValue = selectedGroupId ?? (ungroupedSelected ? UNGROUPED_TREE_VALUE : void 0);
14563
14758
  const treeOptions = buildCatalogGroupTreeOptions(groups);
14564
- return /* @__PURE__ */ jsxs55("div", { className: "flex items-center justify-between gap-3", children: [
14565
- /* @__PURE__ */ jsxs55("div", { className: "flex flex-wrap items-center gap-2", children: [
14759
+ return /* @__PURE__ */ jsxs54("div", { className: "flex items-center justify-between gap-3", children: [
14760
+ /* @__PURE__ */ jsxs54("div", { className: "flex flex-wrap items-center gap-2", children: [
14566
14761
  /* @__PURE__ */ jsx76(
14567
14762
  GroupInputPopoverButton,
14568
14763
  {
@@ -14644,7 +14839,7 @@ function GroupInputPopoverButton({
14644
14839
  useEffect20(() => {
14645
14840
  if (open) setValue(initialValue);
14646
14841
  }, [initialValue, open]);
14647
- return /* @__PURE__ */ jsxs55(Popover, { open, onOpenChange: setOpen, children: [
14842
+ return /* @__PURE__ */ jsxs54(Popover, { open, onOpenChange: setOpen, children: [
14648
14843
  /* @__PURE__ */ jsx76(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx76(
14649
14844
  "button",
14650
14845
  {
@@ -14659,8 +14854,8 @@ function GroupInputPopoverButton({
14659
14854
  children: icon
14660
14855
  }
14661
14856
  ) }),
14662
- /* @__PURE__ */ jsx76(PopoverContent, { align: "start", side: "bottom", sideOffset: 8, collisionPadding: 16, className: "w-80 rounded-2xl", children: /* @__PURE__ */ jsxs55("div", { className: "space-y-3", children: [
14663
- /* @__PURE__ */ jsxs55("div", { children: [
14857
+ /* @__PURE__ */ jsx76(PopoverContent, { align: "start", side: "bottom", sideOffset: 8, collisionPadding: 16, className: "w-80 rounded-2xl", children: /* @__PURE__ */ jsxs54("div", { className: "space-y-3", children: [
14858
+ /* @__PURE__ */ jsxs54("div", { children: [
14664
14859
  /* @__PURE__ */ jsx76("div", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: title }),
14665
14860
  /* @__PURE__ */ jsx76("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: "Names are editor-side catalog labels only." })
14666
14861
  ] }),
@@ -14675,7 +14870,7 @@ function GroupInputPopoverButton({
14675
14870
  autoComplete: "off"
14676
14871
  }
14677
14872
  ),
14678
- /* @__PURE__ */ jsxs55("div", { className: "flex justify-end gap-2", children: [
14873
+ /* @__PURE__ */ jsxs54("div", { className: "flex justify-end gap-2", children: [
14679
14874
  /* @__PURE__ */ jsx76(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setOpen(false), className: "rounded-xl", children: "Cancel" }),
14680
14875
  /* @__PURE__ */ jsx76(
14681
14876
  Button,
@@ -14707,7 +14902,7 @@ function ConfirmPopoverButton({
14707
14902
  onConfirm
14708
14903
  }) {
14709
14904
  const [open, setOpen] = useState33(false);
14710
- return /* @__PURE__ */ jsxs55(Popover, { open, onOpenChange: setOpen, children: [
14905
+ return /* @__PURE__ */ jsxs54(Popover, { open, onOpenChange: setOpen, children: [
14711
14906
  /* @__PURE__ */ jsx76(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx76(
14712
14907
  "button",
14713
14908
  {
@@ -14722,12 +14917,12 @@ function ConfirmPopoverButton({
14722
14917
  children: icon
14723
14918
  }
14724
14919
  ) }),
14725
- /* @__PURE__ */ jsx76(PopoverContent, { align: "start", side: "bottom", sideOffset: 8, collisionPadding: 16, className: "w-80 rounded-2xl", children: /* @__PURE__ */ jsxs55("div", { className: "space-y-3", children: [
14726
- /* @__PURE__ */ jsxs55("div", { children: [
14920
+ /* @__PURE__ */ jsx76(PopoverContent, { align: "start", side: "bottom", sideOffset: 8, collisionPadding: 16, className: "w-80 rounded-2xl", children: /* @__PURE__ */ jsxs54("div", { className: "space-y-3", children: [
14921
+ /* @__PURE__ */ jsxs54("div", { children: [
14727
14922
  /* @__PURE__ */ jsx76("div", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: title }),
14728
14923
  /* @__PURE__ */ jsx76("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: description })
14729
14924
  ] }),
14730
- /* @__PURE__ */ jsxs55("div", { className: "flex justify-end gap-2", children: [
14925
+ /* @__PURE__ */ jsxs54("div", { className: "flex justify-end gap-2", children: [
14731
14926
  /* @__PURE__ */ jsx76(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setOpen(false), className: "rounded-xl", children: "Cancel" }),
14732
14927
  /* @__PURE__ */ jsx76(
14733
14928
  Button,
@@ -14752,7 +14947,7 @@ function ToolbarIconButton({
14752
14947
  disabled = false,
14753
14948
  onClick
14754
14949
  }) {
14755
- return /* @__PURE__ */ jsxs55(Tooltip, { children: [
14950
+ return /* @__PURE__ */ jsxs54(Tooltip, { children: [
14756
14951
  /* @__PURE__ */ jsx76(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx76(
14757
14952
  "button",
14758
14953
  {
@@ -14786,7 +14981,7 @@ function buildCatalogGroupTreeOptions(groups, parentId = null) {
14786
14981
  }
14787
14982
 
14788
14983
  // src/workspace/bottom-panel/index.tsx
14789
- import { Fragment as Fragment16, jsx as jsx77, jsxs as jsxs56 } from "react/jsx-runtime";
14984
+ import { Fragment as Fragment16, jsx as jsx77, jsxs as jsxs55 } from "react/jsx-runtime";
14790
14985
  var DRAG_MIME = "application/x-service-builder-service";
14791
14986
  function BottomConsolePanel({ controller, errors, activeServices, allServices, onServiceDragStateChange }) {
14792
14987
  const canvas = useCanvas21();
@@ -14902,6 +15097,7 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
14902
15097
  useEffect21(() => {
14903
15098
  const editor = canvas.api.editor;
14904
15099
  const ensured = editor.getCatalog?.() ?? editor.ensureCatalog?.();
15100
+ console.log(ensured);
14905
15101
  if (ensured) setCatalogState(ensured);
14906
15102
  const offCatalogChange = canvas.api.on("catalog:change", ({ catalog }) => {
14907
15103
  const next = catalog ?? editor.getCatalog?.() ?? editor.ensureCatalog?.();
@@ -15119,7 +15315,7 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
15119
15315
  }
15120
15316
  ) });
15121
15317
  }, [controller.activeTab, activeSearch, allSearch, setActiveSearch, setAllSearch]);
15122
- return /* @__PURE__ */ jsxs56("div", { ref: panelContainerRef, className: "pointer-events-none absolute inset-0", children: [
15318
+ return /* @__PURE__ */ jsxs55("div", { ref: panelContainerRef, className: "pointer-events-none absolute inset-0", children: [
15123
15319
  /* @__PURE__ */ jsx77(
15124
15320
  ServicePickerDialog,
15125
15321
  {
@@ -15133,7 +15329,7 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
15133
15329
  onConfirm: handleConfirmAssignServices
15134
15330
  }
15135
15331
  ),
15136
- /* @__PURE__ */ jsxs56(
15332
+ /* @__PURE__ */ jsxs55(
15137
15333
  Panel,
15138
15334
  {
15139
15335
  ref: panelRef,
@@ -15164,8 +15360,8 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
15164
15360
  ["--bottom-panel-height"]: controller.height + "px"
15165
15361
  },
15166
15362
  children: [
15167
- /* @__PURE__ */ jsxs56("div", { className: "flex items-center justify-between gap-3 border-b border-slate-200/80 px-3 py-2 dark:border-slate-800/80", children: [
15168
- /* @__PURE__ */ jsx77("div", { className: "flex min-w-0 items-center gap-1", children: tabs.map((tab) => /* @__PURE__ */ jsxs56(
15363
+ /* @__PURE__ */ jsxs55("div", { className: "flex items-center justify-between gap-3 border-b border-slate-200/80 px-3 py-2 dark:border-slate-800/80", children: [
15364
+ /* @__PURE__ */ jsx77("div", { className: "flex min-w-0 items-center gap-1", children: tabs.map((tab) => /* @__PURE__ */ jsxs55(
15169
15365
  "button",
15170
15366
  {
15171
15367
  type: "button",
@@ -15191,8 +15387,8 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
15191
15387
  },
15192
15388
  tab.id
15193
15389
  )) }),
15194
- /* @__PURE__ */ jsxs56("div", { className: "flex items-center gap-1", children: [
15195
- /* @__PURE__ */ jsxs56(
15390
+ /* @__PURE__ */ jsxs55("div", { className: "flex items-center gap-1", children: [
15391
+ /* @__PURE__ */ jsxs55(
15196
15392
  "button",
15197
15393
  {
15198
15394
  type: "button",
@@ -15207,7 +15403,7 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
15207
15403
  ]
15208
15404
  }
15209
15405
  ),
15210
- /* @__PURE__ */ jsxs56("div", { className: "hidden items-center gap-2 rounded-xl border border-slate-200/80 px-2 py-1 text-xs text-slate-500 md:flex dark:border-slate-800 dark:text-slate-400", children: [
15406
+ /* @__PURE__ */ jsxs55("div", { className: "hidden items-center gap-2 rounded-xl border border-slate-200/80 px-2 py-1 text-xs text-slate-500 md:flex dark:border-slate-800 dark:text-slate-400", children: [
15211
15407
  /* @__PURE__ */ jsx77(LuGripHorizontal, {}),
15212
15408
  /* @__PURE__ */ jsx77("span", { children: "Resize from top or side edges" })
15213
15409
  ] }),
@@ -15224,13 +15420,13 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
15224
15420
  )
15225
15421
  ] })
15226
15422
  ] }),
15227
- /* @__PURE__ */ jsxs56("div", { className: "flex min-h-0 flex-1 flex-col bg-slate-50/70 dark:bg-slate-950/40", children: [
15228
- controller.activeTab !== "console" ? /* @__PURE__ */ jsxs56("div", { className: "flex items-center justify-between gap-3 border-b border-slate-200/70 px-4 py-3 dark:border-slate-800/70", children: [
15229
- /* @__PURE__ */ jsxs56("div", { className: "min-w-0", children: [
15423
+ /* @__PURE__ */ jsxs55("div", { className: "flex min-h-0 flex-1 flex-col bg-slate-50/70 dark:bg-slate-950/40", children: [
15424
+ controller.activeTab !== "console" ? /* @__PURE__ */ jsxs55("div", { className: "flex items-center justify-between gap-3 border-b border-slate-200/70 px-4 py-3 dark:border-slate-800/70", children: [
15425
+ /* @__PURE__ */ jsxs55("div", { className: "min-w-0", children: [
15230
15426
  /* @__PURE__ */ jsx77("p", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100", children: controller.activeTab === "activeServices" ? "Connected services" : "Service catalog" }),
15231
15427
  /* @__PURE__ */ jsx77("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: controller.activeTab === "activeServices" ? "Bound services can be highlighted back onto the canvas from here." : catalogPanelMode === "catalog" ? "Browse source services through manual editor-side catalog groups while keeping detail and compatibility visible." : "Browse every source service, filter by current visible-group compatibility, and drag it onto nodes." })
15232
15428
  ] }),
15233
- /* @__PURE__ */ jsx77("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsxs56("div", { className: "relative flex items-center gap-2", children: [
15429
+ /* @__PURE__ */ jsx77("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsxs55("div", { className: "relative flex items-center gap-2", children: [
15234
15430
  searchOpen ? Search : null,
15235
15431
  /* @__PURE__ */ jsx77(
15236
15432
  HeaderIconButton,
@@ -15241,7 +15437,7 @@ function BottomConsolePanel({ controller, errors, activeServices, allServices, o
15241
15437
  children: /* @__PURE__ */ jsx77(FiSearch, {})
15242
15438
  }
15243
15439
  ),
15244
- controller.activeTab === "allServices" ? /* @__PURE__ */ jsxs56(Fragment16, { children: [
15440
+ controller.activeTab === "allServices" ? /* @__PURE__ */ jsxs55(Fragment16, { children: [
15245
15441
  /* @__PURE__ */ jsx77(
15246
15442
  CatalogContextPopover,
15247
15443
  {
@@ -15369,7 +15565,7 @@ function HeaderIconButton({
15369
15565
  active = false,
15370
15566
  onClick
15371
15567
  }) {
15372
- return /* @__PURE__ */ jsxs56(Tooltip, { children: [
15568
+ return /* @__PURE__ */ jsxs55(Tooltip, { children: [
15373
15569
  /* @__PURE__ */ jsx77(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx77(
15374
15570
  "button",
15375
15571
  {
@@ -15387,7 +15583,7 @@ function HeaderIconButton({
15387
15583
  ] });
15388
15584
  }
15389
15585
  function CatalogModeSwitch({ mode, onChange }) {
15390
- return /* @__PURE__ */ jsxs56("div", { className: "inline-flex items-center rounded-xl border border-slate-200 bg-white p-1 dark:border-slate-800 dark:bg-slate-950", children: [
15586
+ return /* @__PURE__ */ jsxs55("div", { className: "inline-flex items-center rounded-xl border border-slate-200 bg-white p-1 dark:border-slate-800 dark:bg-slate-950", children: [
15391
15587
  /* @__PURE__ */ jsx77(
15392
15588
  "button",
15393
15589
  {
@@ -16043,7 +16239,7 @@ var workspaceBackend = createMemoryWorkspaceBackend({
16043
16239
  });
16044
16240
 
16045
16241
  // src/index.tsx
16046
- import { Fragment as Fragment17, jsx as jsx78, jsxs as jsxs57 } from "react/jsx-runtime";
16242
+ import { Fragment as Fragment17, jsx as jsx78, jsxs as jsxs56 } from "react/jsx-runtime";
16047
16243
  var inputRegistry = createInputRegistry();
16048
16244
  registerEntries(inputRegistry);
16049
16245
  function WorkspaceLayout({ onShare, onPlay, menu }) {
@@ -16053,9 +16249,9 @@ function WorkspaceLayout({ onShare, onPlay, menu }) {
16053
16249
  const bottomPanel = useBottomConsolePanel();
16054
16250
  const [draggingServiceId, setDraggingServiceId] = useState35(null);
16055
16251
  const serviceSummary = useMemo35(() => buildServiceSummaries(canvas, ws), [canvas.props, canvas.selectionInfo, canvas.activeId, ws.services.data]);
16056
- return /* @__PURE__ */ jsx78(FallbackQuickAddProvider, { children: /* @__PURE__ */ jsx78(NodeContextMenuProvider, { children: /* @__PURE__ */ jsx78(FallbackEditorModalProvider, { children: /* @__PURE__ */ jsxs57("div", { className: "relative flex h-screen flex-col overflow-hidden *:font-display", children: [
16252
+ return /* @__PURE__ */ jsx78(FallbackQuickAddProvider, { children: /* @__PURE__ */ jsx78(NodeContextMenuProvider, { children: /* @__PURE__ */ jsx78(FallbackEditorModalProvider, { children: /* @__PURE__ */ jsxs56("div", { className: "relative flex h-screen flex-col overflow-hidden *:font-display", children: [
16057
16253
  /* @__PURE__ */ jsx78("div", { className: "pointer-events-none absolute top-4 left-1/2 z-30 w-full max-w-2xl -translate-x-1/2 px-4", children: /* @__PURE__ */ jsx78("div", { className: "pointer-events-auto", children: /* @__PURE__ */ jsx78(WorkspaceBootStatusSurface, { boot: ws.boot }) }) }),
16058
- /* @__PURE__ */ jsxs57("div", { className: "flex grow overflow-hidden", children: [
16254
+ /* @__PURE__ */ jsxs56("div", { className: "flex grow overflow-hidden", children: [
16059
16255
  /* @__PURE__ */ jsx78(left_default, { menu }),
16060
16256
  /* @__PURE__ */ jsx78(
16061
16257
  CanvasPanel,
@@ -16156,7 +16352,7 @@ var Styles = `
16156
16352
 
16157
16353
  `;
16158
16354
  function ServiceBuilder({ backend, actor, onShare, onPlay, menu }) {
16159
- return /* @__PURE__ */ jsxs57(Fragment17, { children: [
16355
+ return /* @__PURE__ */ jsxs56(Fragment17, { children: [
16160
16356
  /* @__PURE__ */ jsx78("style", { children: Styles }),
16161
16357
  /* @__PURE__ */ jsx78(InputsProvider, { initialRegistry: inputRegistry, children: /* @__PURE__ */ jsx78(Workspace, { backend, actor, children: () => /* @__PURE__ */ jsx78(WorkspaceLayout, { onShare, onPlay, menu }) }) })
16162
16358
  ] });