@nivaro/react 0.3.36 → 0.3.37

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.
Files changed (102) hide show
  1. package/dist/components/slots/CommentsSlot.js +44 -36
  2. package/dist/full.css +1 -1
  3. package/dist/hooks/useSessionRecorder.js +1 -1
  4. package/dist/index.d.ts +9 -1
  5. package/dist/shared/components/AgentBadge.js +26 -0
  6. package/dist/shared/components/AgentQuestionsCard.js +198 -0
  7. package/dist/shared/components/ItemEditForm.js +3329 -3263
  8. package/dist/shared/components/McpConnectionScope.js +480 -0
  9. package/dist/shared/components/MyWorkView.js +223 -208
  10. package/dist/shared/components/RecordReadView.js +620 -575
  11. package/dist/shared/components/chat/ChatPanel.js +683 -671
  12. package/dist/shared/components/imports/DownloadSampleButton.js +69 -0
  13. package/dist/shared/components/imports/ImportConsole.js +106 -104
  14. package/dist/shared/components/imports/RunDetailSheet.js +11 -10
  15. package/dist/shared/components/item-edit/FieldAffordances.js +32 -32
  16. package/dist/shared/components/item-edit/FormTour.js +279 -0
  17. package/dist/shared/components/item-edit/GroupSection.js +377 -360
  18. package/dist/shared/components/item-edit/PersonalDefaultControl.js +28 -28
  19. package/dist/shared/components/item-edit/entry/EntryStrip.js +30 -26
  20. package/dist/shared/components/item-edit/form-density.js +36 -0
  21. package/dist/shared/components/item-edit/useFormUsageBeacon.js +59 -46
  22. package/dist/shared/components/item-edit/usePersonalDefaults.js +312 -296
  23. package/dist/shared/components/layout-editor/AddPanel.js +349 -192
  24. package/dist/shared/components/layout-editor/DesignNode.js +126 -112
  25. package/dist/shared/components/layout-editor/EditorTopBar.js +123 -103
  26. package/dist/shared/components/layout-editor/LayoutEditor.js +829 -751
  27. package/dist/shared/components/layout-editor/PlaceTools.js +334 -0
  28. package/dist/shared/components/layout-editor/SlashInsert.js +252 -0
  29. package/dist/shared/components/layout-editor/StructureMenu.js +285 -242
  30. package/dist/shared/components/layout-editor/add-target.js +54 -43
  31. package/dist/shared/components/layout-editor/ai-forms/AiComposer.js +238 -155
  32. package/dist/shared/components/layout-editor/ai-forms/AiFormsButton.js +1 -1
  33. package/dist/shared/components/layout-editor/ai-forms/ai-forms-api.js +15 -12
  34. package/dist/shared/components/layout-editor/dnd/LayoutDndProvider.js +347 -189
  35. package/dist/shared/components/layout-editor/dnd/TrashZone.js +60 -32
  36. package/dist/shared/components/layout-editor/dnd/UndoChip.js +76 -0
  37. package/dist/shared/components/layout-editor/dnd/merge-drop.js +33 -0
  38. package/dist/shared/components/layout-editor/dnd/multi-drop.js +87 -0
  39. package/dist/shared/components/layout-editor/dnd/node.js +115 -105
  40. package/dist/shared/components/layout-editor/dnd/sensors.js +23 -0
  41. package/dist/shared/components/layout-editor/dnd/trash-drop.js +34 -28
  42. package/dist/shared/components/layout-editor/dnd/trash-links.js +97 -0
  43. package/dist/shared/components/layout-editor/even-row.js +86 -0
  44. package/dist/shared/components/layout-editor/field-list.js +99 -0
  45. package/dist/shared/components/layout-editor/format-painter.js +102 -0
  46. package/dist/shared/components/layout-editor/grid-guides.js +15 -13
  47. package/dist/shared/components/layout-editor/inspector/BehaviourSettings.js +150 -132
  48. package/dist/shared/components/layout-editor/inspector/BulkInspector.js +57 -53
  49. package/dist/shared/components/layout-editor/inspector/EvenRowAction.js +31 -0
  50. package/dist/shared/components/layout-editor/inspector/GroupInspector.js +154 -141
  51. package/dist/shared/components/layout-editor/inspector/Inspector.js +209 -178
  52. package/dist/shared/components/layout-editor/inspector/LookTab.js +106 -98
  53. package/dist/shared/components/layout-editor/inspector/RulesTab.js +38 -37
  54. package/dist/shared/components/layout-editor/inspector/kit.js +280 -223
  55. package/dist/shared/components/layout-editor/keyboard-move.js +15 -15
  56. package/dist/shared/components/layout-editor/lint/LabelStyle.js +201 -0
  57. package/dist/shared/components/layout-editor/lint/LintPanel.js +132 -84
  58. package/dist/shared/components/layout-editor/lint/lint-api.js +65 -28
  59. package/dist/shared/components/layout-editor/nav/NavTools.js +14 -12
  60. package/dist/shared/components/layout-editor/nav/ZoomControls.js +145 -0
  61. package/dist/shared/components/layout-editor/nav/useEditorNav.js +34 -32
  62. package/dist/shared/components/layout-editor/nav/view-prefs.js +100 -15
  63. package/dist/shared/components/layout-editor/outputs/LayoutFile.js +89 -0
  64. package/dist/shared/components/layout-editor/outputs/OutputsButton.js +272 -195
  65. package/dist/shared/components/layout-editor/outputs/layout-file-plan.js +176 -0
  66. package/dist/shared/components/layout-editor/outputs/output-api.js +71 -37
  67. package/dist/shared/components/layout-editor/overview/describe-conditions.js +16 -11
  68. package/dist/shared/components/layout-editor/overview/purpose.js +5 -5
  69. package/dist/shared/components/layout-editor/parity-keys.json.js +1 -1
  70. package/dist/shared/components/layout-editor/pin.js +37 -19
  71. package/dist/shared/components/layout-editor/place-clip.js +257 -0
  72. package/dist/shared/components/layout-editor/preview/PreviewModes.js +27 -26
  73. package/dist/shared/components/layout-editor/preview/PreviewPanes.js +148 -117
  74. package/dist/shared/components/layout-editor/preview/SampleRecord.js +113 -0
  75. package/dist/shared/components/layout-editor/preview/preview-model.js +79 -60
  76. package/dist/shared/components/layout-editor/preview/sample-record.js +105 -0
  77. package/dist/shared/components/layout-editor/removed-log.js +151 -0
  78. package/dist/shared/components/layout-editor/reuse/LibraryRows.js +109 -78
  79. package/dist/shared/components/layout-editor/reuse/linked-sections.js +373 -0
  80. package/dist/shared/components/layout-editor/revert-element.js +140 -0
  81. package/dist/shared/components/layout-editor/section-structure.js +193 -170
  82. package/dist/shared/components/layout-editor/settings/EntrySection.js +63 -45
  83. package/dist/shared/components/layout-editor/settings/LayoutSection.js +63 -32
  84. package/dist/shared/components/layout-editor/settings/ResolveSettings.js +179 -137
  85. package/dist/shared/components/layout-editor/settings/WhoSection.js +18 -17
  86. package/dist/shared/components/layout-editor/settings/settings-registry.js +24 -0
  87. package/dist/shared/components/layout-editor/shortcuts.js +21 -16
  88. package/dist/shared/components/layout-editor/structure-ops.js +221 -195
  89. package/dist/shared/components/layout-editor/usage/UsagePanel.js +133 -85
  90. package/dist/shared/components/layout-editor/usage/refusal-lens.js +130 -0
  91. package/dist/shared/components/layout-editor/usage/usage-api.js +12 -11
  92. package/dist/shared/components/panels/CommentPanel.js +47 -45
  93. package/dist/shared/components/panels/RevisionsPanel.js +66 -64
  94. package/dist/shared/components/panels/TaskPanel.js +395 -332
  95. package/dist/shared/components/profile/AgentsPanel.js +196 -147
  96. package/dist/shared/components/profile/ConnectionRollback.js +329 -0
  97. package/dist/shared/components/profile/MyDefaultsCard.js +526 -520
  98. package/dist/shared/lib/entry-config.js +22 -22
  99. package/dist/shared/lib/form-usage-beacon.js +91 -55
  100. package/dist/shared/lib/layout-lint.js +530 -284
  101. package/dist/shared/lib/layout-resolve.js +58 -44
  102. package/package.json +1 -1
@@ -1,41 +1,41 @@
1
- import { jsx as o, Fragment as S, jsxs as m } from "react/jsx-runtime";
2
- import { EyeOff as xe, Lock as ye, Pin as Ne, UserRound as _e } from "lucide-react";
3
- import { isValidElement as re, Fragment as De, cloneElement as we } from "react";
4
- import { cn as f, formatRelative as Ce } from "../../lib/utils.js";
5
- import { useLayoutDesign as oe, targetKey as $e, isSelectedIn as Te } from "./design-context.js";
6
- import { useDesignDndNode as Re, NO_DND as ze, useDesignDropBody as je } from "./dnd/node.js";
7
- import { ResizeHandle as Fe } from "./grid-guides.js";
8
- import { NoteMarker as Me } from "./NoteMarker.js";
9
- import { FillChip as Ae } from "./usage/FillChip.js";
10
- const te = (e, a) => {
1
+ import { jsx as o, Fragment as L, jsxs as g } from "react/jsx-runtime";
2
+ import { EyeOff as ye, Lock as Ne, Pin as _e, UserRound as we, Link2 as De } from "lucide-react";
3
+ import { isValidElement as oe, Fragment as Ce, cloneElement as $e } from "react";
4
+ import { cn as f, formatRelative as Te } from "../../lib/utils.js";
5
+ import { useLayoutDesign as ie, targetKey as Re, isSelectedIn as ze } from "./design-context.js";
6
+ import { useDesignDndNode as je, NO_DND as Fe, useDesignDropBody as Me } from "./dnd/node.js";
7
+ import { ResizeHandle as Ae } from "./grid-guides.js";
8
+ import { NoteMarker as Ie } from "./NoteMarker.js";
9
+ import { FillChip as Oe } from "./usage/FillChip.js";
10
+ const ne = (e, a) => {
11
11
  typeof e == "function" ? e(a) : e && typeof e == "object" && (e.current = a);
12
12
  };
13
- function ne(...e) {
13
+ function ae(...e) {
14
14
  const a = {};
15
15
  for (const i of e)
16
16
  for (const [r, d] of Object.entries(i)) {
17
17
  const c = a[r];
18
18
  d !== void 0 && (c === void 0 ? a[r] = d : r === "className" ? a[r] = `${c} ${d}` : r === "style" ? a[r] = { ...c, ...d } : r === "ref" ? a[r] = (n) => {
19
- te(c, n), te(d, n);
19
+ ne(c, n), ne(d, n);
20
20
  } : /^on[A-Z]/.test(r) && typeof c == "function" && typeof d == "function" ? a[r] = (...n) => {
21
21
  c(...n), d(...n);
22
22
  } : a[r] = d);
23
23
  }
24
24
  return a;
25
25
  }
26
- const Ie = {
26
+ const Ee = {
27
27
  violet: "bg-violet-50 text-violet-800 ring-violet-200 dark:bg-violet-500/15 dark:text-violet-200 dark:ring-violet-500/30",
28
28
  emerald: "bg-emerald-50 text-emerald-800 ring-emerald-200 dark:bg-emerald-500/15 dark:text-emerald-200 dark:ring-emerald-500/30",
29
29
  amber: "bg-amber-50 text-amber-800 ring-amber-200 dark:bg-amber-500/15 dark:text-amber-200 dark:ring-amber-500/30",
30
30
  slate: "bg-slate-100 text-slate-700 ring-slate-200 dark:bg-slate-800 dark:text-slate-200 dark:ring-slate-700"
31
- }, Oe = "inline-block max-w-[260px] truncate rounded px-1 text-left text-[11px] ring-1", Ee = [
31
+ }, Ke = "inline-block max-w-[260px] truncate rounded px-1 text-left text-[11px] ring-1", Le = [
32
32
  "data-[rule-dependent]:outline-dashed data-[rule-dependent]:outline-2 data-[rule-dependent]:outline-amber-400 dark:data-[rule-dependent]:outline-amber-400/80",
33
33
  "data-[rule-drives]:after:pointer-events-none data-[rule-drives]:after:absolute data-[rule-drives]:after:-bottom-2 data-[rule-drives]:after:right-1 data-[rule-drives]:after:z-10 data-[rule-drives]:after:rounded data-[rule-drives]:after:bg-amber-50 data-[rule-drives]:after:px-1 data-[rule-drives]:after:text-[11px] data-[rule-drives]:after:text-amber-800 data-[rule-drives]:after:ring-1 data-[rule-drives]:after:ring-amber-200 data-[rule-drives]:after:content-[attr(data-rule-drives)] dark:data-[rule-drives]:after:bg-[#413727] dark:data-[rule-drives]:after:text-amber-200 dark:data-[rule-drives]:after:ring-amber-500/30"
34
- ].join(" "), ie = {
34
+ ].join(" "), de = {
35
35
  before: { top: -5, left: 0, right: 0, height: 3 },
36
36
  after: { bottom: -5, left: 0, right: 0, height: 3 }
37
37
  };
38
- function Ke({
38
+ function Se({
39
39
  target: e,
40
40
  children: a,
41
41
  inline: i,
@@ -43,58 +43,60 @@ function Ke({
43
43
  pass: d,
44
44
  ...c
45
45
  }) {
46
- var G, H, U, V, Z, X, q, J, Q, Y;
47
- const n = oe(), g = (n == null ? void 0 : n.inheritedFrom(e)) ?? null, se = c["data-design-copy"] !== void 0, le = c["data-header-folded"] !== void 0, l = ((G = n == null ? void 0 : n.diffMark) == null ? void 0 : G.call(n, e)) ?? null, _ = (l == null ? void 0 : l.kind) === "removed", v = !n || !!g || se || _, D = Re((n == null ? void 0 : n.dnd) ?? ze, e, { disabled: v, noDrop: le });
48
- if (!n) return /* @__PURE__ */ o(S, { children: a });
49
- const ce = $e(e), w = Te(n, e), s = ((H = n.roleMark) == null ? void 0 : H.call(n, e)) ?? null, R = ((U = n.marks) == null ? void 0 : U.call(n, e)) ?? [], b = ((V = n.overlay) == null ? void 0 : V.call(n, e)) ?? null, L = ((Z = n.unsaved) == null ? void 0 : Z.call(n, e)) ?? !1, k = ((X = n.peers) == null ? void 0 : X.call(n, e)) ?? [], ue = R.some((t) => t.highlight), B = ((q = n.note) == null ? void 0 : q.call(n, e)) ?? null, z = B ? /* @__PURE__ */ o(Me, { note: B }) : null, j = v ? {} : D.props, pe = D.dragging, C = v ? null : D.slot, p = r && re(a) ? a : null, ge = (p == null ? void 0 : p.props.className) ?? "", me = /(^|\s)(absolute|fixed|sticky|relative)(\s|$)/.test(ge), he = f(
50
- !me && "relative",
46
+ var G, H, U, V, Z, J, X, q, Q, Y, ee;
47
+ const n = ie(), m = (n == null ? void 0 : n.inheritedFrom(e)) ?? null, le = c["data-design-copy"] !== void 0, ce = c["data-header-folded"] !== void 0, l = ((G = n == null ? void 0 : n.diffMark) == null ? void 0 : G.call(n, e)) ?? null, w = (l == null ? void 0 : l.kind) === "removed", x = !n || !!m || le || w || !!((H = n.locked) != null && H.call(n, e)), b = je((n == null ? void 0 : n.dnd) ?? Fe, e, { disabled: x, noDrop: ce });
48
+ if (!n) return /* @__PURE__ */ o(L, { children: a });
49
+ const ue = Re(e), D = ze(n, e), s = ((U = n.roleMark) == null ? void 0 : U.call(n, e)) ?? null, R = ((V = n.marks) == null ? void 0 : V.call(n, e)) ?? [], k = ((Z = n.overlay) == null ? void 0 : Z.call(n, e)) ?? null, S = ((J = n.unsaved) == null ? void 0 : J.call(n, e)) ?? !1, v = ((X = n.peers) == null ? void 0 : X.call(n, e)) ?? [], pe = R.some((t) => t.highlight), B = ((q = n.note) == null ? void 0 : q.call(n, e)) ?? null, z = B ? /* @__PURE__ */ o(Ie, { note: B }) : null, j = x ? {} : b.props, ge = b.dragging, C = x ? null : b.slot, p = r && oe(a) ? a : null, me = (p == null ? void 0 : p.props.className) ?? "", he = /(^|\s)(absolute|fixed|sticky|relative)(\s|$)/.test(me), fe = f(
50
+ !he && "relative",
51
51
  "cursor-pointer rounded-md outline-offset-2",
52
+ // #3193: on touch a press-and-hold picks the node up — no callout, no text selection.
53
+ "touch-manipulation [-webkit-touch-callout:none] [@media(pointer:coarse)]:select-none",
52
54
  !p && (i ? "inline-block" : "block"),
53
- w ? "outline outline-2 outline-nvr-cyan" : k.length > 0 ? `outline outline-2 ${k[0].outline}` : ue ? "outline-dashed outline-2 outline-violet-400 dark:outline-violet-400/70" : "hover:outline hover:outline-1 hover:outline-slate-300 dark:hover:outline-slate-600",
54
- b == null ? void 0 : b.className,
55
+ D ? "outline outline-2 outline-nvr-cyan" : v.length > 0 ? `outline outline-2 ${v[0].outline}` : pe ? "outline-dashed outline-2 outline-violet-400 dark:outline-violet-400/70" : "hover:outline hover:outline-1 hover:outline-slate-300 dark:hover:outline-slate-600",
56
+ k == null ? void 0 : k.className,
55
57
  "focus-visible:outline focus-visible:outline-2 focus-visible:outline-nvr-cyan",
56
- Ee,
58
+ Le,
57
59
  // The section's "Changed by" shows while the pointer is over it.
58
60
  "[&:hover>[data-design-last-change]]:visible",
59
- pe && "opacity-40",
61
+ ge && "opacity-40",
60
62
  // Hidden for the previewed role: faint, its tags not.
61
63
  (s == null ? void 0 : s.kind) === "hidden" && "[&>:not([data-design-badges])]:opacity-40",
62
- l && He[l.kind],
63
- _ && "cursor-default [&>:not([data-design-badges])]:opacity-40"
64
- ), fe = (t) => {
64
+ l && Ve[l.kind],
65
+ w && "cursor-default [&>:not([data-design-badges])]:opacity-40"
66
+ ), be = (t) => {
65
67
  const u = t.target;
66
68
  if (u.closest("[data-design-target]") !== t.currentTarget) return;
67
- if (_) {
69
+ if (w) {
68
70
  t.preventDefault(), t.stopPropagation();
69
71
  return;
70
72
  }
71
73
  t.shiftKey || t.metaKey || t.ctrlKey ? n.onSelect(e, { additive: !0 }) : n.onSelect(e);
72
- const N = u.closest("[data-design-pass]");
73
- N && t.currentTarget.contains(N) || (t.preventDefault(), t.stopPropagation());
74
- }, be = (t) => {
75
- t.key !== "Enter" || t.target !== t.currentTarget || _ || t.currentTarget.tagName !== "BUTTON" && (t.preventDefault(), t.shiftKey ? n.onSelect(e, { additive: !0 }) : n.onSelect(e));
76
- }, x = c["data-design-tab"] !== void 0 || ((J = p == null ? void 0 : p.props) == null ? void 0 : J["data-design-tab"]) !== void 0, F = {
77
- "data-design-target": ce,
78
- "data-selected": w ? "true" : void 0,
74
+ const _ = u.closest("[data-design-pass]");
75
+ _ && t.currentTarget.contains(_) || (t.preventDefault(), t.stopPropagation());
76
+ }, ke = (t) => {
77
+ t.key !== "Enter" || t.target !== t.currentTarget || w || t.currentTarget.tagName !== "BUTTON" && (t.preventDefault(), t.shiftKey ? n.onSelect(e, { additive: !0 }) : n.onSelect(e));
78
+ }, y = c["data-design-tab"] !== void 0 || ((Q = p == null ? void 0 : p.props) == null ? void 0 : Q["data-design-tab"]) !== void 0, F = {
79
+ "data-design-target": ue,
80
+ "data-selected": D ? "true" : void 0,
79
81
  "data-design-pass": d ? "" : void 0,
80
82
  "data-drop-slot": C ?? void 0,
81
83
  "data-role-mark": s == null ? void 0 : s.kind,
82
- "data-unsaved": L ? "" : void 0,
84
+ "data-unsaved": S ? "" : void 0,
83
85
  "data-diff": l == null ? void 0 : l.kind,
84
86
  // Locked nodes get no dnd attributes; they still take focus to be selected.
85
87
  // So do nodes drag and drop leaves out (a pinned section, #2628).
86
- ...v || !("tabIndex" in j) ? { role: "button", tabIndex: 0 } : {},
87
- ...x && g ? { "data-tip": `From ${g}` } : {},
88
- className: he,
89
- onClickCapture: fe,
90
- onKeyDown: be
91
- }, ke = (s == null ? void 0 : s.kind) === "hidden" ? xe : ye, M = e.kind === "field" || e.kind === "header" ? ((Q = n.fillRate) == null ? void 0 : Q.call(n, e.field)) ?? null : null, y = e.kind === "group" && !x ? ((Y = n.lastChange) == null ? void 0 : Y.call(n, e)) ?? null : null, P = y && [y.by ? `by ${y.by}` : null, y.at ? Ce(y.at) : null].filter(Boolean).join(" · ") || null, A = P && !l ? /* @__PURE__ */ m(
88
+ ...x || !("tabIndex" in j) ? { role: "button", tabIndex: 0 } : {},
89
+ ...y && m ? { "data-tip": `From ${m}` } : {},
90
+ className: fe,
91
+ onClickCapture: be,
92
+ onKeyDown: ke
93
+ }, ve = (s == null ? void 0 : s.kind) === "hidden" ? ye : Ne, M = e.kind === "field" || e.kind === "header" ? ((Y = n.fillRate) == null ? void 0 : Y.call(n, e.field)) ?? null : null, N = e.kind === "group" && !y ? ((ee = n.lastChange) == null ? void 0 : ee.call(n, e)) ?? null : null, P = N && [N.by ? `by ${N.by}` : null, N.at ? Te(N.at) : null].filter(Boolean).join(" · ") || null, A = P && !l ? /* @__PURE__ */ g(
92
94
  "span",
93
95
  {
94
96
  "data-design-last-change": "",
95
97
  className: f(
96
98
  "pointer-events-none absolute -bottom-2 right-1 z-10 rounded bg-white px-1 text-[10.5px] text-slate-500 dark:bg-card dark:text-muted-foreground",
97
- !w && "invisible"
99
+ !D && "invisible"
98
100
  ),
99
101
  children: [
100
102
  "Changed ",
@@ -102,40 +104,41 @@ function Ke({
102
104
  ]
103
105
  }
104
106
  ) : null, h = [];
105
- l && h.push({ rank: 0, text: Ge(l), node: /* @__PURE__ */ o(ae, { diff: l }) }), s && h.push({
107
+ l && h.push({ rank: 0, text: Ue(l), node: /* @__PURE__ */ o(re, { diff: l }) }), s && h.push({
106
108
  rank: 1,
107
109
  text: `${s.kind === "hidden" ? "Hidden" : "Read-only"} for ${s.role}`,
108
- node: /* @__PURE__ */ m(
110
+ node: /* @__PURE__ */ g(
109
111
  "span",
110
112
  {
111
113
  "data-design-role-tag": s.kind,
112
114
  className: "inline-flex items-center gap-0.5 rounded bg-amber-50 px-1 text-[11px] text-amber-800 ring-1 ring-amber-200 dark:bg-amber-500/15 dark:text-amber-200 dark:ring-amber-500/30",
113
115
  children: [
114
- /* @__PURE__ */ o(ke, { "aria-hidden": !0, className: "h-3 w-3" }),
116
+ /* @__PURE__ */ o(ve, { "aria-hidden": !0, className: "h-3 w-3" }),
115
117
  s.kind === "hidden" ? "Hidden" : "Read-only",
116
118
  " for ",
117
119
  s.role
118
120
  ]
119
121
  }
120
122
  )
121
- }), b && h.push({
123
+ }), k && h.push({
122
124
  rank: 1,
123
125
  text: "Who sees it",
124
- node: /* @__PURE__ */ o("span", { "data-design-pass": "", className: "pointer-events-auto", children: b.chip })
126
+ node: /* @__PURE__ */ o("span", { "data-design-pass": "", className: "pointer-events-auto", children: k.chip })
125
127
  }), R.forEach((t, u) => {
126
- const N = f(
127
- Oe,
128
+ const _ = f(
129
+ Ke,
128
130
  t.icon && "inline-flex items-center gap-0.5",
129
131
  t.onClick || t.tip ? "pointer-events-auto" : null,
130
132
  t.onClick && "hover:brightness-95",
131
- Ie[t.tone]
132
- ), ee = /* @__PURE__ */ m(S, { children: [
133
- t.icon === "pin" && /* @__PURE__ */ o(Ne, { "aria-hidden": !0, className: "h-3 w-3" }),
134
- t.icon === "person" && /* @__PURE__ */ o(_e, { "aria-hidden": !0, className: "h-3 w-3" }),
133
+ Ee[t.tone]
134
+ ), te = /* @__PURE__ */ g(L, { children: [
135
+ t.icon === "pin" && /* @__PURE__ */ o(_e, { "aria-hidden": !0, className: "h-3 w-3" }),
136
+ t.icon === "person" && /* @__PURE__ */ o(we, { "aria-hidden": !0, className: "h-3 w-3" }),
137
+ t.icon === "link" && /* @__PURE__ */ o(De, { "aria-hidden": !0, className: "h-3 w-3" }),
135
138
  t.text
136
139
  ] });
137
140
  h.push({
138
- rank: Be(t),
141
+ rank: We(t),
139
142
  text: t.text,
140
143
  node: t.onClick ? /* @__PURE__ */ o(
141
144
  "button",
@@ -145,8 +148,8 @@ function Ke({
145
148
  "data-design-pass": "",
146
149
  "data-tip": t.tip,
147
150
  onClick: t.onClick,
148
- className: N,
149
- children: ee
151
+ className: _,
152
+ children: te
150
153
  },
151
154
  `${u}:${t.text}`
152
155
  ) : /* @__PURE__ */ o(
@@ -154,44 +157,44 @@ function Ke({
154
157
  {
155
158
  "data-design-mark": "",
156
159
  "data-tip": t.tip,
157
- className: N,
158
- children: ee
160
+ className: _,
161
+ children: te
159
162
  },
160
163
  `${u}:${t.text}`
161
164
  )
162
165
  });
163
- }), g && h.push({
166
+ }), m && h.push({
164
167
  rank: 5,
165
- text: `from ${g}`,
166
- node: /* @__PURE__ */ m("span", { className: "rounded bg-slate-100 px-1 text-[11px] text-slate-600 dark:bg-slate-800 dark:text-slate-300", children: [
168
+ text: `from ${m}`,
169
+ node: /* @__PURE__ */ g("span", { className: "rounded bg-slate-100 px-1 text-[11px] text-slate-600 dark:bg-slate-800 dark:text-slate-300", children: [
167
170
  "from ",
168
- g
171
+ m
169
172
  ] })
170
173
  });
171
- const { shown: ve, rest: $ } = Pe(h), W = R.length > 0 || b != null || k.length > 0, T = x && !l ? [...h.map((t) => t.text), ...k.map((t) => t.name)] : [];
172
- T.length > 0 && (F["data-tip"] = g && !s && !W ? `From ${g}` : T.join(" · "));
173
- const I = x && l ? /* @__PURE__ */ o("span", { "data-design-badges": "", className: "pointer-events-none absolute -top-2 right-0 z-10", children: /* @__PURE__ */ o(ae, { diff: l }) }) : T.length > 0 ? /* @__PURE__ */ o(
174
+ const { shown: xe, rest: $ } = Ge(h), W = R.length > 0 || k != null || v.length > 0, T = y && !l ? [...h.map((t) => t.text), ...v.map((t) => t.name)] : [];
175
+ T.length > 0 && (F["data-tip"] = m && !s && !W ? `From ${m}` : T.join(" · "));
176
+ const I = y && l ? /* @__PURE__ */ o("span", { "data-design-badges": "", className: "pointer-events-none absolute -top-2 right-0 z-10", children: /* @__PURE__ */ o(re, { diff: l }) }) : T.length > 0 ? /* @__PURE__ */ o(
174
177
  "span",
175
178
  {
176
179
  "data-design-badges": "",
177
180
  className: f(
178
181
  "pointer-events-none absolute left-1/2 top-1 z-10 h-1.5 w-1.5 -translate-x-1/2 rounded-full",
179
- g && !s && !W ? "bg-slate-500 dark:bg-slate-400" : "bg-violet-500 dark:bg-violet-400"
182
+ m && !s && !W ? "bg-slate-500 dark:bg-slate-400" : "bg-violet-500 dark:bg-violet-400"
180
183
  ),
181
184
  children: /* @__PURE__ */ o("span", { className: "sr-only", children: T.join(" · ") })
182
185
  }
183
- ) : h.length > 0 || k.length > 0 || M != null ? /* @__PURE__ */ m(
186
+ ) : h.length > 0 || v.length > 0 || M != null ? /* @__PURE__ */ g(
184
187
  "span",
185
188
  {
186
189
  "data-design-badges": "",
187
190
  className: "pointer-events-none absolute -top-2 right-1 z-10 flex items-center gap-1",
188
191
  children: [
189
- M != null && /* @__PURE__ */ o(Ae, { pct: M }),
190
- ve.map((t, u) => (
192
+ M != null && /* @__PURE__ */ o(Oe, { pct: M }),
193
+ xe.map((t, u) => (
191
194
  // biome-ignore lint/suspicious/noArrayIndexKey: ranked tags of one node, rebuilt each render
192
- /* @__PURE__ */ o(De, { children: t.node }, u)
195
+ /* @__PURE__ */ o(Ce, { children: t.node }, u)
193
196
  )),
194
- $.length > 0 && /* @__PURE__ */ m(
197
+ $.length > 0 && /* @__PURE__ */ g(
195
198
  "span",
196
199
  {
197
200
  "data-design-more-tags": $.length,
@@ -203,7 +206,7 @@ function Ke({
203
206
  ]
204
207
  }
205
208
  ),
206
- k.map((t) => /* @__PURE__ */ o(
209
+ v.map((t) => /* @__PURE__ */ o(
207
210
  "span",
208
211
  {
209
212
  "data-design-peer": t.id,
@@ -212,20 +215,20 @@ function Ke({
212
215
  "pointer-events-auto inline-flex h-4 w-4 items-center justify-center rounded-full text-[9px] font-semibold ring-1",
213
216
  t.chip
214
217
  ),
215
- children: We(t.name)
218
+ children: He(t.name)
216
219
  },
217
220
  t.id
218
221
  ))
219
222
  ]
220
223
  }
221
- ) : null, O = L ? /* @__PURE__ */ o(
224
+ ) : null, O = S ? /* @__PURE__ */ o(
222
225
  "span",
223
226
  {
224
227
  "data-unsaved-dot": "",
225
228
  className: f(
226
229
  "pointer-events-none absolute z-10 h-2 w-2 rounded-full bg-nvr-cyan ring-2 ring-white dark:ring-slate-900",
227
230
  // A step clips its corners away: the dot sits inside, before the arrow.
228
- x ? "right-4 top-1" : "-left-1 -top-1"
231
+ y ? "right-4 top-1" : "-left-1 -top-1"
229
232
  ),
230
233
  children: /* @__PURE__ */ o("span", { className: "sr-only", children: "unsaved change" })
231
234
  }
@@ -235,19 +238,30 @@ function Ke({
235
238
  "aria-hidden": !0,
236
239
  "data-design-drop-indicator": C,
237
240
  className: "pointer-events-none absolute z-30 rounded-full bg-nvr-cyan shadow-[0_0_0_2px_#fff] dark:shadow-[0_0_0_2px_#0f172a]",
238
- style: D.indicator ?? ie[C]
241
+ style: b.indicator ?? de[C],
242
+ children: b.merge && /* @__PURE__ */ g(
243
+ "span",
244
+ {
245
+ "data-design-merge-label": "",
246
+ className: "absolute right-2 top-1/2 -translate-y-1/2 whitespace-nowrap rounded bg-nvr-cyan px-1.5 text-[11px] font-medium leading-5 text-white",
247
+ children: [
248
+ "Join into ",
249
+ b.merge
250
+ ]
251
+ }
252
+ )
239
253
  }
240
- ) : null, K = w && !v && n.resizeWidth && (e.kind === "field" || e.kind === "slot") && e.group_key !== null ? /* @__PURE__ */ o(Fe, { onCommit: (t) => {
254
+ ) : null, K = D && !x && n.resizeWidth && (e.kind === "field" || e.kind === "slot") && e.group_key !== null ? /* @__PURE__ */ o(Ae, { onCommit: (t) => {
241
255
  var u;
242
256
  return (u = n.resizeWidth) == null ? void 0 : u.call(n, e, t);
243
257
  } }) : null;
244
258
  if (p) {
245
259
  const { children: t, ...u } = p.props;
246
- return we(
260
+ return $e(
247
261
  p,
248
262
  // The child's own classes, style, ref and handlers are kept and merged.
249
- ne(u, c, j, F),
250
- I || A || E || O || z || K ? /* @__PURE__ */ m(S, { children: [
263
+ ae(u, c, j, F),
264
+ I || A || E || O || z || K ? /* @__PURE__ */ g(L, { children: [
251
265
  O,
252
266
  I,
253
267
  A,
@@ -258,7 +272,7 @@ function Ke({
258
272
  ] }) : t
259
273
  );
260
274
  }
261
- return /* @__PURE__ */ m(i ? "span" : "div", { ...ne(c, j, F), children: [
275
+ return /* @__PURE__ */ g(i ? "span" : "div", { ...ae(c, j, F), children: [
262
276
  O,
263
277
  I,
264
278
  A,
@@ -268,17 +282,17 @@ function Ke({
268
282
  a
269
283
  ] });
270
284
  }
271
- function Se(e, a, i, r = {}) {
285
+ function Be(e, a, i, r = {}) {
272
286
  if (!e || i == null || i === !1) return i;
273
- const d = re(i) ? i.key ?? void 0 : void 0;
274
- return /* @__PURE__ */ o(Ke, { target: a, ...r, children: i }, d);
287
+ const d = oe(i) ? i.key ?? void 0 : void 0;
288
+ return /* @__PURE__ */ o(Se, { target: a, ...r, children: i }, d);
275
289
  }
276
- function nt() {
277
- const e = oe();
278
- return (a, i, r) => Se(e, a, i, r);
290
+ function rt() {
291
+ const e = ie();
292
+ return (a, i, r) => Be(e, a, i, r);
279
293
  }
280
- function at({ groupKey: e }) {
281
- const { ref: a, slot: i, indicator: r } = je(e);
294
+ function ot({ groupKey: e }) {
295
+ const { ref: a, slot: i, indicator: r } = Me(e);
282
296
  return /* @__PURE__ */ o(
283
297
  "span",
284
298
  {
@@ -288,11 +302,11 @@ function at({ groupKey: e }) {
288
302
  "data-design-drop-body": e,
289
303
  "data-design-drop-indicator": i ?? void 0,
290
304
  className: "pointer-events-none absolute z-30 rounded-full bg-nvr-cyan shadow-[0_0_0_2px_#fff] dark:shadow-[0_0_0_2px_#0f172a]",
291
- style: i ? r ?? ie[i] : void 0
305
+ style: i ? r ?? de[i] : void 0
292
306
  }
293
307
  );
294
308
  }
295
- function rt() {
309
+ function it() {
296
310
  return /* @__PURE__ */ o(
297
311
  "div",
298
312
  {
@@ -302,30 +316,30 @@ function rt() {
302
316
  }
303
317
  );
304
318
  }
305
- const Le = 2;
306
- function Be(e) {
319
+ const Pe = 2;
320
+ function We(e) {
307
321
  return e.kind === "preview" ? 1 : e.kind === "ai" ? 4 : e.kind === "loop" || e.kind === "personal" || e.highlight ? 2 : 3;
308
322
  }
309
- function Pe(e, a = Le) {
323
+ function Ge(e, a = Pe) {
310
324
  const i = e.map((r, d) => ({ c: r, i: d })).sort((r, d) => r.c.rank - d.c.rank || r.i - d.i).map((r) => r.c);
311
325
  return { shown: i.slice(0, a), rest: i.slice(a) };
312
326
  }
313
- function We(e) {
327
+ function He(e) {
314
328
  return e.trim().split(/\s+/).filter(Boolean).slice(0, 2).map((i) => {
315
329
  var r;
316
330
  return ((r = i[0]) == null ? void 0 : r.toUpperCase()) ?? "";
317
331
  }).join("") || "?";
318
332
  }
319
- function Ge(e) {
320
- const a = de[e.kind].text;
333
+ function Ue(e) {
334
+ const a = se[e.kind].text;
321
335
  return e.kind === "moved" && e.detail ? `Moved ${e.detail}` : e.kind === "changed" && e.detail ? `${a}: ${e.detail}` : a;
322
336
  }
323
- const He = {
337
+ const Ve = {
324
338
  added: "ring-2 ring-emerald-500/70 dark:ring-emerald-400/60",
325
339
  moved: "ring-2 ring-amber-500/70 dark:ring-amber-400/60",
326
340
  changed: "ring-1 ring-violet-500/60 dark:ring-violet-400/50",
327
341
  removed: "ring-1 ring-rose-400/70 dark:ring-rose-400/50"
328
- }, de = {
342
+ }, se = {
329
343
  added: {
330
344
  text: "Added",
331
345
  cls: "bg-emerald-50 text-emerald-800 ring-emerald-200 dark:bg-emerald-500/15 dark:text-emerald-200 dark:ring-emerald-500/30"
@@ -343,9 +357,9 @@ const He = {
343
357
  cls: "bg-rose-50 text-rose-800 ring-rose-200 line-through dark:bg-rose-500/15 dark:text-rose-200 dark:ring-rose-500/30"
344
358
  }
345
359
  };
346
- function ae({ diff: e }) {
347
- const a = de[e.kind];
348
- return /* @__PURE__ */ m(
360
+ function re({ diff: e }) {
361
+ const a = se[e.kind];
362
+ return /* @__PURE__ */ g(
349
363
  "span",
350
364
  {
351
365
  "data-design-diff-tag": e.kind,
@@ -358,12 +372,12 @@ function ae({ diff: e }) {
358
372
  );
359
373
  }
360
374
  export {
361
- at as DesignDropBody,
362
- rt as DesignDropZone,
363
- Ke as DesignNode,
364
- Le as MAX_NODE_TAGS,
365
- Se as designWrap,
366
- Be as markRank,
367
- Pe as rankChips,
368
- nt as useDesignWrap
375
+ ot as DesignDropBody,
376
+ it as DesignDropZone,
377
+ Se as DesignNode,
378
+ Pe as MAX_NODE_TAGS,
379
+ Be as designWrap,
380
+ We as markRank,
381
+ Ge as rankChips,
382
+ rt as useDesignWrap
369
383
  };