impact-nova 2.5.2 → 2.5.3

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.
@@ -1,55 +1,63 @@
1
- import { buildColumnStateFromTree as c } from "./build-column-state-from-tree.js";
2
- import { mergePartialOrderedColumnState as f } from "./data-table-column-state.js";
3
- import { afterSynchronousColumnApply as d } from "./data-table-column-apply.js";
4
- import { buildColumnTreeWithCache as C, readColumnTreeCache as y, readGridLayoutFingerprint as p, readGridVisibilityFingerprint as S, writeColumnTreeCache as b } from "./data-table-column-tree-cache.js";
1
+ import { buildColumnStateFromTree as y } from "./build-column-state-from-tree.js";
2
+ import { mergePartialOrderedColumnState as C } from "./data-table-column-state.js";
3
+ import { afterSynchronousColumnApply as p } from "./data-table-column-apply.js";
4
+ import { readColumnTreeCache as l, readGridLayoutFingerprint as s, readGridVisibilityFingerprint as m, buildColumnTreeWithCache as b, writeColumnTreeCache as S } from "./data-table-column-tree-cache.js";
5
5
  import { subscribeGridApiEvent as h } from "../ag-grid-react/grid-api-event-subscription.js";
6
- const u = {
6
+ const i = {
7
7
  frozenColumns: "__prewarm_frozen__",
8
8
  scrollableColumns: "__prewarm_scrollable__"
9
9
  }, n = /* @__PURE__ */ new WeakMap(), r = /* @__PURE__ */ new WeakMap();
10
- function a(e) {
10
+ function c(e) {
11
11
  return typeof e.isDestroyed == "function" && e.isDestroyed();
12
12
  }
13
- function E(e) {
13
+ function D(e) {
14
14
  return r.get(e) === !0;
15
15
  }
16
- function _(e) {
16
+ function F(e) {
17
17
  return n.get(e) === !0;
18
18
  }
19
- function W(e) {
19
+ function V(e) {
20
20
  n.set(e, !0), globalThis.setTimeout(() => {
21
21
  n.delete(e);
22
22
  }, 0);
23
23
  }
24
- function G(e) {
25
- a(e) || C(e, u);
24
+ function _(e) {
25
+ if (c(e))
26
+ return;
27
+ const t = l(e, i);
28
+ if (t) {
29
+ const o = s(e), u = m(e);
30
+ if (o === t.gridLayoutFingerprint && u === t.gridVisibilityFingerprint)
31
+ return;
32
+ }
33
+ b(e, i);
26
34
  }
27
- function F(e) {
28
- const t = y(e, u);
35
+ function G(e) {
36
+ const t = l(e, i);
29
37
  if (!t)
30
38
  return;
31
- const i = p(e), l = S(e);
32
- if (i === t.gridLayoutFingerprint && l === t.gridVisibilityFingerprint)
39
+ const o = s(e), u = m(e);
40
+ if (o === t.gridLayoutFingerprint && u === t.gridVisibilityFingerprint)
33
41
  return;
34
- const o = c(t.items);
35
- if (o.length === 0)
42
+ const a = y(t.items);
43
+ if (a.length === 0)
36
44
  return;
37
45
  r.set(e, !0);
38
- const m = e.getColumnState(), s = f(m, o);
39
- e.applyColumnState({ state: s, applyOrder: !0 }), d(() => {
40
- r.delete(e), b(e, t.items);
46
+ const f = e.getColumnState(), d = C(f, a);
47
+ e.applyColumnState({ state: d, applyOrder: !0 }), p(() => {
48
+ r.delete(e), S(e, t.items);
41
49
  });
42
50
  }
43
51
  function L(e) {
44
- if (!a(e)) {
45
- if (_(e)) {
46
- G(e);
52
+ if (!c(e)) {
53
+ if (F(e)) {
54
+ _(e);
47
55
  return;
48
56
  }
49
- F(e);
57
+ G(e);
50
58
  }
51
59
  }
52
- function B(e) {
60
+ function g(e) {
53
61
  if (typeof e.addEventListener != "function")
54
62
  return () => {
55
63
  };
@@ -61,9 +69,9 @@ function B(e) {
61
69
  };
62
70
  }
63
71
  export {
64
- W as deferColumnRuntimeStateGuard,
65
- _ as isColumnRuntimeStateGuardDeferred,
66
- E as isColumnRuntimeStateGuardUpdating,
67
- G as rebuildColumnTreeCacheFromGrid,
68
- B as scheduleColumnRuntimeStateGuard
72
+ V as deferColumnRuntimeStateGuard,
73
+ F as isColumnRuntimeStateGuardDeferred,
74
+ D as isColumnRuntimeStateGuardUpdating,
75
+ _ as rebuildColumnTreeCacheFromGrid,
76
+ g as scheduleColumnRuntimeStateGuard
69
77
  };
@@ -1,69 +1,77 @@
1
1
  import { buildColumnTreeFromGrid as G } from "./build-column-tree-from-grid.js";
2
- import { computeColumnListSyncFingerprints as _ } from "./data-table-column-list-sync.js";
3
- import { fingerprintColumnTreeIndicators as M, normalizeColumnPinned as w } from "./data-table-column-apply.js";
2
+ import { computeColumnListSyncFingerprints as M } from "./data-table-column-list-sync.js";
3
+ import { fingerprintColumnTreeIndicators as _, normalizeColumnPinned as w } from "./data-table-column-apply.js";
4
4
  import { patchColumnTreeIndicatorsFromGrid as V } from "./patch-column-tree-indicators-from-grid.js";
5
5
  import { patchColumnTreeVisibilityFromGrid as C } from "./patch-column-tree-visibility-from-grid.js";
6
- function f(n) {
6
+ function m(n) {
7
7
  return n.map((i) => {
8
- const r = w(i.pinned) ?? "0";
9
- return `${i.colId}:${r}`;
8
+ const t = w(i.pinned) ?? "0";
9
+ return `${i.colId}:${t}`;
10
10
  }).join("|");
11
11
  }
12
12
  function d(n) {
13
13
  return n.map((i) => `${i.colId}:${i.hide ? "0" : "1"}`).join("|");
14
14
  }
15
- function H(n) {
16
- return f(n.getColumnState());
15
+ function x(n) {
16
+ return m(n.getColumnState());
17
17
  }
18
- function O(n) {
18
+ function H(n) {
19
19
  return d(n.getColumnState());
20
20
  }
21
- const p = /* @__PURE__ */ new WeakMap(), F = {
21
+ const p = /* @__PURE__ */ new WeakMap(), h = {
22
22
  frozenColumns: "__prewarm_frozen__",
23
23
  scrollableColumns: "__prewarm_scrollable__"
24
24
  };
25
25
  function P(n) {
26
26
  return typeof n.isDestroyed == "function" && n.isDestroyed();
27
27
  }
28
- function I(n, i) {
29
- return n.map((r) => r.id === "root-frozen" ? { ...r, label: i.frozenColumns } : r.id === "root-scrollable" ? { ...r, label: i.scrollableColumns } : r);
28
+ function F(n, i) {
29
+ return n.map((t) => t.id === "root-frozen" ? { ...t, label: i.frozenColumns } : t.id === "root-scrollable" ? { ...t, label: i.scrollableColumns } : t);
30
30
  }
31
31
  function b(n, i) {
32
- const r = p.get(n);
33
- return r ? {
34
- fingerprints: r.fingerprints,
35
- items: I(r.items, i),
36
- gridLayoutFingerprint: r.gridLayoutFingerprint,
37
- gridVisibilityFingerprint: r.gridVisibilityFingerprint
32
+ const t = p.get(n);
33
+ return t ? {
34
+ fingerprints: t.fingerprints,
35
+ items: F(t.items, i),
36
+ gridLayoutFingerprint: t.gridLayoutFingerprint,
37
+ gridVisibilityFingerprint: t.gridVisibilityFingerprint
38
38
  } : null;
39
39
  }
40
- function l(n, i) {
41
- const r = _(i), t = n.getColumnState();
40
+ function u(n, i) {
41
+ const t = M(i), r = n.getColumnState();
42
42
  return p.set(n, {
43
- fingerprints: r,
44
- items: I(i, F),
45
- gridLayoutFingerprint: f(t),
46
- gridVisibilityFingerprint: d(t)
47
- }), r;
43
+ fingerprints: t,
44
+ items: F(i, h),
45
+ gridLayoutFingerprint: m(r),
46
+ gridVisibilityFingerprint: d(r)
47
+ }), t;
48
48
  }
49
- function h(n, i) {
50
- const r = G(n, i);
51
- return r ? (l(n, r), r) : null;
49
+ function I(n, i) {
50
+ const t = G(n, i);
51
+ return t ? (u(n, t), t) : null;
52
52
  }
53
53
  function z(n) {
54
- const { gridApi: i, labels: r, previousFingerprints: t } = n, e = b(i, r), y = i.getColumnState(), v = f(y), T = d(y), k = t.layout === "" && t.visibility === "" && t.indicators === "";
54
+ const { gridApi: i, labels: t, previousFingerprints: r } = n, e = b(i, t), y = i.getColumnState(), v = m(y), T = d(y), k = r.layout === "" && r.visibility === "" && r.indicators === "";
55
55
  if (e) {
56
- const s = V(
56
+ const o = V(
57
57
  e.items,
58
58
  i
59
- ), S = M(s), u = v !== e.gridLayoutFingerprint, c = T !== e.gridVisibilityFingerprint, a = S !== e.fingerprints.indicators;
60
- if (!u && !c && !a) {
59
+ ), S = _(o), c = v !== e.gridLayoutFingerprint, a = T !== e.gridVisibilityFingerprint, f = S !== e.fingerprints.indicators;
60
+ if (!c && !a && !f) {
61
61
  if (k) {
62
- const o = l(i, s);
62
+ const l = u(i, o);
63
+ return {
64
+ rootItems: o,
65
+ syncMode: "structural",
66
+ fingerprints: l
67
+ };
68
+ }
69
+ if (r.layout !== e.fingerprints.layout || r.visibility !== e.fingerprints.visibility || r.indicators !== e.fingerprints.indicators) {
70
+ const l = u(i, o);
63
71
  return {
64
- rootItems: s,
72
+ rootItems: o,
65
73
  syncMode: "structural",
66
- fingerprints: o
74
+ fingerprints: l
67
75
  };
68
76
  }
69
77
  return {
@@ -72,45 +80,45 @@ function z(n) {
72
80
  fingerprints: e.fingerprints
73
81
  };
74
82
  }
75
- if (!u && c && !a) {
76
- const o = C(
77
- s,
83
+ if (!c && a && !f) {
84
+ const s = C(
85
+ o,
78
86
  i
79
- ), m = l(i, o);
87
+ ), l = u(i, s);
80
88
  return {
81
- rootItems: o,
89
+ rootItems: s,
82
90
  syncMode: "visibility-only",
83
- fingerprints: m
91
+ fingerprints: l
84
92
  };
85
93
  }
86
- if (!u && !c && a) {
87
- const o = l(i, s);
94
+ if (!c && !a && f) {
95
+ const s = u(i, o);
88
96
  return {
89
- rootItems: s,
97
+ rootItems: o,
90
98
  syncMode: "indicators-only",
91
- fingerprints: o
99
+ fingerprints: s
92
100
  };
93
101
  }
94
- if (!u && c && a) {
95
- const o = C(
96
- s,
102
+ if (!c && a && f) {
103
+ const s = C(
104
+ o,
97
105
  i
98
- ), m = l(i, o);
106
+ ), l = u(i, s);
99
107
  return {
100
- rootItems: o,
108
+ rootItems: s,
101
109
  syncMode: "visibility-only",
102
- fingerprints: m
110
+ fingerprints: l
103
111
  };
104
112
  }
105
113
  }
106
- const g = h(i, r);
114
+ const g = I(i, t);
107
115
  if (!g)
108
116
  return {
109
117
  rootItems: null,
110
118
  syncMode: "skip",
111
- fingerprints: t
119
+ fingerprints: r
112
120
  };
113
- const L = b(i, r)?.fingerprints ?? {
121
+ const L = b(i, t)?.fingerprints ?? {
114
122
  layout: "",
115
123
  visibility: "",
116
124
  indicators: ""
@@ -124,27 +132,27 @@ function z(n) {
124
132
  function $(n) {
125
133
  return typeof n.getColumnState == "function" && (typeof n.getAllGridColumns == "function" || typeof n.getColumns == "function");
126
134
  }
127
- function B(n) {
135
+ function O(n) {
128
136
  return z(n).syncMode === "skip";
129
137
  }
130
138
  function E(n) {
131
- let i = !1, r = 0, t;
139
+ let i = !1, t = 0, r;
132
140
  const e = () => {
133
- i || P(n) || !$(n) || p.has(n) || h(n, F);
141
+ i || P(n) || !$(n) || p.has(n) || I(n, h);
134
142
  };
135
- return r = requestAnimationFrame(() => {
136
- i || (typeof requestIdleCallback < "u" ? t = requestIdleCallback(e, { timeout: 3e3 }) : setTimeout(e, 0));
143
+ return t = requestAnimationFrame(() => {
144
+ i || (typeof requestIdleCallback < "u" ? r = requestIdleCallback(e, { timeout: 3e3 }) : setTimeout(e, 0));
137
145
  }), () => {
138
- i = !0, r && cancelAnimationFrame(r), t !== void 0 && typeof cancelIdleCallback < "u" && cancelIdleCallback(t);
146
+ i = !0, t && cancelAnimationFrame(t), r !== void 0 && typeof cancelIdleCallback < "u" && cancelIdleCallback(r);
139
147
  };
140
148
  }
141
149
  export {
142
- h as buildColumnTreeWithCache,
143
- B as peekColumnListSyncWouldSkip,
150
+ I as buildColumnTreeWithCache,
151
+ O as peekColumnListSyncWouldSkip,
144
152
  b as readColumnTreeCache,
145
- H as readGridLayoutFingerprint,
146
- O as readGridVisibilityFingerprint,
153
+ x as readGridLayoutFingerprint,
154
+ H as readGridVisibilityFingerprint,
147
155
  z as resolveColumnTreeFromCacheOrGrid,
148
156
  E as scheduleColumnTreePrewarm,
149
- l as writeColumnTreeCache
157
+ u as writeColumnTreeCache
150
158
  };
@@ -3,8 +3,7 @@ import { Badge as s } from "../../data-display/badge/badge.js";
3
3
  import { FilterPopoverContent as u } from "../../flows/filter-strip/filter-tag-list.js";
4
4
  import { Popover as b, PopoverTrigger as f } from "../../feedback/popover/popover.js";
5
5
  import { Tooltip as g, TooltipTrigger as v, TooltipContent as x } from "../../feedback/tooltip/tooltip.js";
6
- import "react";
7
- function I({
6
+ function w({
8
7
  tags: o,
9
8
  title: l = "Attributes",
10
9
  maxVisibleTags: n = 4,
@@ -71,5 +70,5 @@ function I({
71
70
  );
72
71
  }
73
72
  export {
74
- I as ExpandableListItemAttributes
73
+ w as ExpandableListItemAttributes
75
74
  };
@@ -1,9 +1,8 @@
1
1
  import { jsx as e, jsxs as s } from "react/jsx-runtime";
2
2
  import { ScrollOverflowAffordance as o } from "../../layout/horizontal-scroller/scroll-overflow-affordance.js";
3
- import "react";
4
3
  import { OverflowTooltip as r } from "../../feedback/tooltip/overflow-tooltip.js";
5
4
  const m = 128;
6
- function f({
5
+ function x({
7
6
  columns: i,
8
7
  sectionId: l = "metrics"
9
8
  }) {
@@ -51,5 +50,5 @@ function f({
51
50
  );
52
51
  }
53
52
  export {
54
- f as ExpandableListItemMetrics
53
+ x as ExpandableListItemMetrics
55
54
  };
@@ -1,7 +1,6 @@
1
1
  import { jsxs as t, jsx as e } from "react/jsx-runtime";
2
2
  import { Tooltip as l, TooltipTrigger as n, TooltipContent as o } from "./tooltip.js";
3
- import "react";
4
- const p = (i, r, a) => /* @__PURE__ */ t(l, { children: [
3
+ const d = (i, r, a) => /* @__PURE__ */ t(l, { children: [
5
4
  /* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e("span", { className: "inline-flex items-center justify-center h-full w-full", children: i }) }),
6
5
  /* @__PURE__ */ e(o, { variant: "tertiary", className: a, children: r })
7
6
  ] }), h = (i, r) => /* @__PURE__ */ t(l, { children: [
@@ -10,5 +9,5 @@ const p = (i, r, a) => /* @__PURE__ */ t(l, { children: [
10
9
  ] });
11
10
  export {
12
11
  h as defaultAccordionTooltipRender,
13
- p as defaultTabTooltipRender
12
+ d as defaultTabTooltipRender
14
13
  };
@@ -2,17 +2,17 @@ import { jsx as r, jsxs as h, Fragment as z } from "react/jsx-runtime";
2
2
  import * as o from "react";
3
3
  import { Person as G, Monitor as U, PriorityAlert as q, Locked as O, Reset as B } from "impact-nova-icons";
4
4
  import { cn as p } from "../../../lib/utils.js";
5
- import { Kbd as $ } from "../../primitives/kbd/kbd.js";
6
- import { keybindingToString as H } from "../../primitives/kbd/keybinding-display.js";
7
5
  import { OverflowTooltip as A } from "../../feedback/tooltip/overflow-tooltip.js";
8
- import { ModuleRegistry as V, AllCommunityModule as J } from "ag-grid-community";
9
- import { AllEnterpriseModule as Q } from "ag-grid-enterprise";
10
- import { DataTable as X, DataTableContent as Y } from "../../data/data-table/data-table.js";
6
+ import { ModuleRegistry as $, AllCommunityModule as H } from "ag-grid-community";
7
+ import { AllEnterpriseModule as V } from "ag-grid-enterprise";
8
+ import { DataTable as J, DataTableContent as Q } from "../../data/data-table/data-table.js";
11
9
  import { AG_CELL_NO_PADDING as F } from "../../data/ag-grid-react/cell-renderers/index.js";
10
+ import { Kbd as X } from "../../primitives/kbd/kbd.js";
11
+ import { keybindingToString as Y } from "../../primitives/kbd/keybinding-display.js";
12
12
  import { useCommandPalette as Z } from "./use-command-palette.js";
13
13
  import { COMMAND_SOURCE_LABELS as m, keybindingFromEvent as W, isReservedShortcut as ee } from "./utils.js";
14
14
  import { BadgeCellRenderer as te } from "../../data/ag-grid-react/cell-renderers/badge-cell-renderer.js";
15
- V.registerModules([J, Q]);
15
+ $.registerModules([H, V]);
16
16
  function re(a) {
17
17
  const t = a.data;
18
18
  return t ? /* @__PURE__ */ h("div", { className: "flex items-center gap-2 min-w-0 h-full", children: [
@@ -69,7 +69,7 @@ function ne(a) {
69
69
  "flex items-center justify-end h-full w-full text-end",
70
70
  t.customisable ? "cursor-pointer" : "cursor-default opacity-70"
71
71
  ),
72
- children: /* @__PURE__ */ r($, { keybinding: t.keybinding, size: "sm" })
72
+ children: /* @__PURE__ */ r(X, { keybinding: t.keybinding, size: "sm" })
73
73
  }
74
74
  ) : t.customisable ? /* @__PURE__ */ r(
75
75
  "button",
@@ -133,7 +133,7 @@ function le({
133
133
  description: e.description || "",
134
134
  category: e.category || "General",
135
135
  keybinding: i,
136
- keybindingDisplay: i ? H(i) : "",
136
+ keybindingDisplay: i ? Y(i) : "",
137
137
  scope: e.scope,
138
138
  source: D,
139
139
  sourceColor: T ? "primary" : "neutral",
@@ -278,10 +278,10 @@ function le({
278
278
  u?.type === "conflict" ? /* @__PURE__ */ r(q, { className: "h-3.5 w-3.5 shrink-0" }) : u?.type === "reserved" ? /* @__PURE__ */ r(O, { className: "h-3.5 w-3.5 shrink-0" }) : c ? /* @__PURE__ */ r("span", { className: "shrink-0 text-base", children: "⌨️" }) : null,
279
279
  /* @__PURE__ */ r("span", { children: u ? u.text : L })
280
280
  ] }) : null;
281
- return /* @__PURE__ */ h(X, { className: p("flex flex-col w-full h-full border-t-0", a), children: [
281
+ return /* @__PURE__ */ h(J, { className: p("flex flex-col w-full h-full border-t-0", a), children: [
282
282
  s ? s(E) : E,
283
283
  /* @__PURE__ */ r(
284
- Y,
284
+ Q,
285
285
  {
286
286
  rowData: y,
287
287
  columnDefs: I,
@@ -6,8 +6,8 @@ import { cn as o } from "../../../lib/utils.js";
6
6
  import { MultiColorFilter as F, Cross as P, InfoBadge as u } from "impact-nova-icons";
7
7
  import { Button as D } from "../../primitives/button/button.js";
8
8
  import { Tooltip as c, TooltipTrigger as f, TooltipContent as h } from "../../feedback/tooltip/tooltip.js";
9
- import { Kbd as S } from "../../primitives/kbd/kbd.js";
10
- import { OverflowTooltip as j } from "../../feedback/tooltip/overflow-tooltip.js";
9
+ import { OverflowTooltip as S } from "../../feedback/tooltip/overflow-tooltip.js";
10
+ import { Kbd as j } from "../../primitives/kbd/kbd.js";
11
11
  import { useImpactNovaI18n as v } from "../../../i18n/use-impact-nova-i18n.js";
12
12
  import { useOverlayHostDismissNestedLayersOnNavigation as I } from "../../../lib/overlay/overlay-portal-context.js";
13
13
  import { preventDismissOnTooltipOutside as x } from "../../../lib/overlay/prevent-dismiss-on-tooltip-outside.js";
@@ -145,14 +145,14 @@ const O = ({
145
145
  ),
146
146
  /* @__PURE__ */ a("div", { className: "flex items-center gap-1 min-w-0", children: [
147
147
  /* @__PURE__ */ e(
148
- j,
148
+ S,
149
149
  {
150
150
  triggerClassName: "truncate font-['Manrope'] block min-w-0",
151
151
  content: t.tooltipKeybinding ? /* @__PURE__ */ a("span", { className: "flex items-center gap-2", children: [
152
152
  t.label,
153
153
  " ",
154
154
  /* @__PURE__ */ e(
155
- S,
155
+ j,
156
156
  {
157
157
  keybinding: t.tooltipKeybinding,
158
158
  size: "sm"
@@ -1,9 +1,8 @@
1
1
  import { jsx as r } from "react/jsx-runtime";
2
2
  import { cn as x } from "../../../../lib/utils.js";
3
- import "react";
4
3
  import { OverflowTooltip as m } from "../../../feedback/tooltip/overflow-tooltip.js";
5
4
  import { isInvertedSelection as h, isOptionArray as d } from "../utils/select.js";
6
- function C({
5
+ function w({
7
6
  isMulti: u,
8
7
  isDisabled: p,
9
8
  internalValue: o,
@@ -53,5 +52,5 @@ function C({
53
52
  );
54
53
  }
55
54
  export {
56
- C as SelectTriggerValue
55
+ w as SelectTriggerValue
57
56
  };
@@ -1,14 +1,13 @@
1
1
  import { jsxs as s, jsx as t } from "react/jsx-runtime";
2
2
  import * as i from "@radix-ui/react-popover";
3
3
  import { Checkbox as P } from "../../checkbox/checkbox.js";
4
- import "react";
5
4
  import { OverflowTooltip as y } from "../../../feedback/tooltip/overflow-tooltip.js";
6
5
  import { ChevronRight as A, Checkmark as O } from "impact-nova-icons";
7
6
  import { cn as v } from "../../../../lib/utils.js";
8
7
  import { useOverlayPortalContainer as T } from "../../../../lib/overlay/overlay-portal-context.js";
9
8
  import { OVERLAY_NESTED_FLOATING_INSTANT_HIDE_CLASS as _ } from "../../../../lib/overlay/overlay-host.constants.js";
10
9
  import { useSuppressOptionClickForTextSelection as E } from "../hooks/useSuppressOptionClickForTextSelection.js";
11
- const R = ({
10
+ const G = ({
12
11
  parentOption: n,
13
12
  isMulti: u,
14
13
  isReadOnly: l,
@@ -106,5 +105,5 @@ const R = ({
106
105
  ] });
107
106
  };
108
107
  export {
109
- R as Submenu
108
+ G as Submenu
110
109
  };
@@ -1 +1 @@
1
- export default "# Install and configure Impact Nova\n\nUse these steps to add Impact Nova to an existing project. Run the commands in your project root and apply the code changes to your entry file and layout.\n\n## 0. Scaffold a new app (recommended)\n\n**`create-impact-nova@^1.4.7`** is on npm. Scaffold auto-detects dependency mode:\n\n| Where you run | `impact-nova` dependency |\n|---------------|--------------------------|\n| Published CLI / MCP (outside monorepo) | `impact-nova@^2.5.2` from npm (`latest` tag) |\n| Inside impact-nova monorepo | `file:` link to repo root |\n\n```bash\nnpx create-impact-nova my-dashboard\ncd my-dashboard\nnpm run dev\n```\n\nMCP: **`scaffold_impact_nova_app`** with `projectName` and optional `modules[]` from the user prompt.\n\n**Overrides:** CLI `--from-npm` · `--link-monorepo` · MCP `usePublishedPackages: true | false`\n\n```bash\nnpx create-impact-nova my-dashboard --from-npm\n```\n\nBase template is shell-only (Home + shared primitives). Feature pages come from recipes — see `create-impact-nova/recipes/README.md`.\n\n**Local link in an existing app** (manual):\n\n```bash\nnpm install impact-nova@file:../path-to-impact-nova-repo\n```\n\nRun `npm run build` in the impact-nova repo after design-system changes.\n\n## 1. Install the package and peer dependencies\n\n```bash\nnpm install impact-nova impact-nova-icons\nnpm install react@^19 react-dom@^19\n```\n\n**Required peers:** `react@^19`, `react-dom@^19`, `impact-nova-icons@^0.1.1`\n\n**Optional peers** (install when you use these features):\n\n| Package | Version | When needed |\n|---------|---------|-------------|\n| `ag-grid-community` | `36.0.1` | AG Grid types/API (pin with react + enterprise) |\n| `ag-grid-react` | `36.0.1` | DataTable / AG Grid |\n| `ag-grid-enterprise` | `36.0.1` | Enterprise grid features |\n| `highcharts` | `^12` | Chart component |\n| `highcharts-react-official` | `^3` | Chart component |\n| `highcharts-border-radius` | `^0.0.4` | Rounded chart corners |\n\nIf you use AG Grid or Highcharts in your app, also install:\n\n```bash\nnpm install ag-grid-community@36.0.1 ag-grid-react@36.0.1 ag-grid-enterprise@36.0.1\n# Optional, for charts:\nnpm install highcharts@^12 highcharts-react-official@^3 highcharts-border-radius@^0.0.4\n```\n\n## 2. Import styles in your root entry\n\nIn your app root (e.g. `main.tsx`, `App.tsx`, or `layout.tsx`), **import the CSS before your app component**:\n\n```tsx\nimport 'impact-nova/dist/impact-nova.css';\nimport App from './App';\n// ... rest of your bootstrap\n```\n\n## 3. Add Manrope font (recommended)\n\nIn your `index.html` or layout:\n\n```html\n<link href=\"https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap\" rel=\"stylesheet\" />\n```\n\nIn your global CSS or Tailwind base:\n\n```css\n@layer base {\n body {\n font-family: 'Manrope', sans-serif;\n }\n}\n```\n\n## 4. Wrap your app with providers (recommended)\n\nMount **`ImpactNovaProviders`** once at the app root. It bundles i18n (`ImpactNovaI18nProvider`) and `TooltipProvider` (required for tooltips since v2.0.8):\n\n```tsx\nimport { ImpactNovaProviders } from 'impact-nova/form';\n\nfunction Root() {\n return (\n <ImpactNovaProviders locale=\"en\">\n <App />\n </ImpactNovaProviders>\n );\n}\n```\n\nFor another locale, pass a locale pack:\n\n```tsx\nimport { ImpactNovaProviders } from 'impact-nova/form';\nimport { de } from 'impact-nova/locale/de';\n\n<ImpactNovaProviders locale=\"de\" messages={de}>\n <App />\n</ImpactNovaProviders>\n```\n\n**Barrel exception:** locale packs may use `import { de } from 'impact-nova'`. All UI components still use subpaths (see §5).\n\n## 5. Subpath imports (recommended)\n\nPrefer subpath imports in feature code for tree-shaking:\n\n```tsx\nimport { Button } from 'impact-nova/button';\nimport { Card, CardContent } from 'impact-nova/card';\nimport { DataTable, DataTableContent, useDataTable } from 'impact-nova/data-table';\nimport { CheckCircle } from 'impact-nova-icons';\n```\n\nThe barrel `import { Button } from 'impact-nova'` still works but pulls a larger module graph. **Use subpaths for all UI components**; reserve the barrel for locale packs at app root only. Use `ImpactNovaProviders` from `impact-nova/form` for app setup.\n\n## 6. Using Impact Nova with CSS or SCSS (no Tailwind)\n\nIf your app uses **plain CSS or SCSS** and does **not** use Tailwind, you can still use Impact Nova. Tailwind is optional. Impact Nova ships a single built CSS file (no SCSS source).\n\n- **Import the library CSS** in your app root (e.g. `main.tsx`, `App.tsx`):\n ```tsx\n import 'impact-nova/dist/impact-nova.css';\n ```\n **CSS split exports** (optional, for layered theming): `impact-nova/impact-nova-tokens.scss`, `impact-nova/impact-nova-base.scss`, `impact-nova/impact-nova-components.css`\n Or from your main stylesheet: `@import 'impact-nova/dist/impact-nova.css';` in your main.css or main.scss.\n- **Component styling** comes from Impact Nova's CSS. Use each component's `variant` and `size` props; no Tailwind classes are required.\n- **Your layout and spacing** stay in your CSS or SCSS (margins, padding, flexbox, grid). Use your usual class names; the design system does not require Tailwind utilities.\n- **Manrope font:** Add the font link in `index.html` and in your CSS/SCSS set `body { font-family: 'Manrope', sans-serif; }` (see section 3).\n- **Summary:** No Tailwind, no Tailwind config. Load `impact-nova.css` once; use components with their props; use your existing CSS/SCSS for the rest.\n\n## 6b. Theming in consumer apps\n\n| Surface | What ships |\n|---------|------------|\n| **npm / consumer apps** | **Impact Light** only — `import 'impact-nova/dist/impact-nova.css'` (from `src/theme/tokens/light.json`) |\n| **Storybook / dev** | 10 curated **theme presets** (Impact Dark, Midnight, Ocean, …) — preview switcher only |\n\n**Do not** copy Storybook preset JSON or `theme-presets.ts` into consumer apps. Presets are not in the published package.\n\n**Custom branding:** override CSS variables on `:root` or a scoped class (e.g. `.my-brand`). Use Storybook **Theme Builder** / **Token Catalog** to explore tokens, then export CSS/JSON for your overrides.\n\n## 7. Using Impact Nova with Webpack\n\nIf your app is built with **Webpack** (including Create React App, which uses Webpack):\n\n- **CSS import:** Webpack will bundle the library CSS as long as you have a rule for `.css`. Ensure your config includes something like:\n ```js\n module: {\n rules: [\n {\n test: /\\.css$/,\n use: ['style-loader', 'css-loader'],\n // or with MiniCssExtractPlugin:\n // use: [MiniCssExtractPlugin.loader, 'css-loader'],\n },\n // ... other rules (e.g. for .tsx, .js)\n ],\n },\n ```\n Then in your root component or entry:\n ```tsx\n import 'impact-nova/dist/impact-nova.css';\n ```\n- **Create React App (CRA):** No extra config. Add `import 'impact-nova/dist/impact-nova.css';` in `index.tsx` or `App.tsx`.\n- **Dedupe React / AG Grid:** If you see “multiple copies of React” or AG Grid issues, use Webpack’s `resolve.alias` so the app uses a single version:\n ```js\n resolve: {\n alias: {\n react: path.resolve(__dirname, 'node_modules/react'),\n 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'),\n // If using AG Grid:\n 'ag-grid-react': path.resolve(__dirname, 'node_modules/ag-grid-react'),\n 'ag-grid-community': path.resolve(__dirname, 'node_modules/ag-grid-community'),\n 'ag-grid-enterprise': path.resolve(__dirname, 'node_modules/ag-grid-enterprise'),\n },\n },\n ```\n- **Tailwind + Webpack:** If you use Tailwind, add the Impact Nova preset and include the package in `content` (see section 7 below).\n\n## 8. Optional: extend Tailwind with Impact Nova preset\n\nIf your project uses Tailwind and you want the same theme (colors, radius), extend your `tailwind.config.js` with the preset from the package:\n\n```js\n// tailwind.config.js\nimport impactNovaPreset from 'impact-nova/tailwind.config.js';\n// → dist/tailwind.config.js (bundled theme; no package src/ required)\n\nexport default {\n presets: [impactNovaPreset],\n content: [\n './index.html',\n './src/**/*.{js,ts,jsx,tsx}',\n './node_modules/impact-nova/dist/**/*.js',\n ],\n // ... rest of your config\n};\n```\n\n## Summary checklist\n\n- [ ] `npm install impact-nova impact-nova-icons` (and react, react-dom; optional: ag-grid, highcharts)\n- [ ] `import 'impact-nova/dist/impact-nova.css'` in root entry (or @import in main.css/main.scss if using CSS or SCSS without Tailwind; see §6)\n- [ ] Add Manrope font link and body font-family\n- [ ] Wrap app with `<ImpactNovaProviders locale=\"en\">` from `impact-nova/form`\n- [ ] Use subpath imports in feature code (see §5)\n- [ ] (Optional) Add Tailwind preset and content path for impact-nova\n- [ ] **Webpack:** Ensure a CSS rule (style-loader + css-loader) and, if needed, resolve.alias for React/AG Grid\n\nAfter this, import components via subpaths: `import { Button } from 'impact-nova/button';`\n\n## 9. Dashboard app shell (optional)\n\nTo scaffold a full dashboard (sidebar, header, breadcrumb, filters), read resource **`impact-nova://layout`** or call `get_real_world_patterns` with `topic: \"layout\"`. Use `Layout` from `impact-nova/layout` — not `DynamicLayout` (grid/flex utility only).\n";
1
+ export default "# Install and configure Impact Nova\n\nUse these steps to add Impact Nova to an existing project. Run the commands in your project root and apply the code changes to your entry file and layout.\n\n## 0. Scaffold a new app (recommended)\n\n**`create-impact-nova@^1.4.7`** is on npm. Scaffold auto-detects dependency mode:\n\n| Where you run | `impact-nova` dependency |\n|---------------|--------------------------|\n| Published CLI / MCP (outside monorepo) | `impact-nova@^2.5.3` from npm (`latest` tag) |\n| Inside impact-nova monorepo | `file:` link to repo root |\n\n```bash\nnpx create-impact-nova my-dashboard\ncd my-dashboard\nnpm run dev\n```\n\nMCP: **`scaffold_impact_nova_app`** with `projectName` and optional `modules[]` from the user prompt.\n\n**Overrides:** CLI `--from-npm` · `--link-monorepo` · MCP `usePublishedPackages: true | false`\n\n```bash\nnpx create-impact-nova my-dashboard --from-npm\n```\n\nBase template is shell-only (Home + shared primitives). Feature pages come from recipes — see `create-impact-nova/recipes/README.md`.\n\n**Local link in an existing app** (manual):\n\n```bash\nnpm install impact-nova@file:../path-to-impact-nova-repo\n```\n\nRun `npm run build` in the impact-nova repo after design-system changes.\n\n## 1. Install the package and peer dependencies\n\n```bash\nnpm install impact-nova impact-nova-icons\nnpm install react@^19 react-dom@^19\n```\n\n**Required peers:** `react@^19`, `react-dom@^19`, `impact-nova-icons@^0.1.1`\n\n**Optional peers** (install when you use these features):\n\n| Package | Version | When needed |\n|---------|---------|-------------|\n| `ag-grid-community` | `36.0.1` | AG Grid types/API (pin with react + enterprise) |\n| `ag-grid-react` | `36.0.1` | DataTable / AG Grid |\n| `ag-grid-enterprise` | `36.0.1` | Enterprise grid features |\n| `highcharts` | `^12` | Chart component |\n| `highcharts-react-official` | `^3` | Chart component |\n| `highcharts-border-radius` | `^0.0.4` | Rounded chart corners |\n\nIf you use AG Grid or Highcharts in your app, also install:\n\n```bash\nnpm install ag-grid-community@36.0.1 ag-grid-react@36.0.1 ag-grid-enterprise@36.0.1\n# Optional, for charts:\nnpm install highcharts@^12 highcharts-react-official@^3 highcharts-border-radius@^0.0.4\n```\n\n## 2. Import styles in your root entry\n\nIn your app root (e.g. `main.tsx`, `App.tsx`, or `layout.tsx`), **import the CSS before your app component**:\n\n```tsx\nimport 'impact-nova/dist/impact-nova.css';\nimport App from './App';\n// ... rest of your bootstrap\n```\n\n## 3. Add Manrope font (recommended)\n\nIn your `index.html` or layout:\n\n```html\n<link href=\"https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap\" rel=\"stylesheet\" />\n```\n\nIn your global CSS or Tailwind base:\n\n```css\n@layer base {\n body {\n font-family: 'Manrope', sans-serif;\n }\n}\n```\n\n## 4. Wrap your app with providers (recommended)\n\nMount **`ImpactNovaProviders`** once at the app root. It bundles i18n (`ImpactNovaI18nProvider`) and `TooltipProvider` (required for tooltips since v2.0.8):\n\n```tsx\nimport { ImpactNovaProviders } from 'impact-nova/form';\n\nfunction Root() {\n return (\n <ImpactNovaProviders locale=\"en\">\n <App />\n </ImpactNovaProviders>\n );\n}\n```\n\nFor another locale, pass a locale pack:\n\n```tsx\nimport { ImpactNovaProviders } from 'impact-nova/form';\nimport { de } from 'impact-nova/locale/de';\n\n<ImpactNovaProviders locale=\"de\" messages={de}>\n <App />\n</ImpactNovaProviders>\n```\n\n**Barrel exception:** locale packs may use `import { de } from 'impact-nova'`. All UI components still use subpaths (see §5).\n\n## 5. Subpath imports (recommended)\n\nPrefer subpath imports in feature code for tree-shaking:\n\n```tsx\nimport { Button } from 'impact-nova/button';\nimport { Card, CardContent } from 'impact-nova/card';\nimport { DataTable, DataTableContent, useDataTable } from 'impact-nova/data-table';\nimport { CheckCircle } from 'impact-nova-icons';\n```\n\nThe barrel `import { Button } from 'impact-nova'` still works but pulls a larger module graph. **Use subpaths for all UI components**; reserve the barrel for locale packs at app root only. Use `ImpactNovaProviders` from `impact-nova/form` for app setup.\n\n## 6. Using Impact Nova with CSS or SCSS (no Tailwind)\n\nIf your app uses **plain CSS or SCSS** and does **not** use Tailwind, you can still use Impact Nova. Tailwind is optional. Impact Nova ships a single built CSS file (no SCSS source).\n\n- **Import the library CSS** in your app root (e.g. `main.tsx`, `App.tsx`):\n ```tsx\n import 'impact-nova/dist/impact-nova.css';\n ```\n **CSS split exports** (optional, for layered theming): `impact-nova/impact-nova-tokens.scss`, `impact-nova/impact-nova-base.scss`, `impact-nova/impact-nova-components.css`\n Or from your main stylesheet: `@import 'impact-nova/dist/impact-nova.css';` in your main.css or main.scss.\n- **Component styling** comes from Impact Nova's CSS. Use each component's `variant` and `size` props; no Tailwind classes are required.\n- **Your layout and spacing** stay in your CSS or SCSS (margins, padding, flexbox, grid). Use your usual class names; the design system does not require Tailwind utilities.\n- **Manrope font:** Add the font link in `index.html` and in your CSS/SCSS set `body { font-family: 'Manrope', sans-serif; }` (see section 3).\n- **Summary:** No Tailwind, no Tailwind config. Load `impact-nova.css` once; use components with their props; use your existing CSS/SCSS for the rest.\n\n## 6b. Theming in consumer apps\n\n| Surface | What ships |\n|---------|------------|\n| **npm / consumer apps** | **Impact Light** only — `import 'impact-nova/dist/impact-nova.css'` (from `src/theme/tokens/light.json`) |\n| **Storybook / dev** | 10 curated **theme presets** (Impact Dark, Midnight, Ocean, …) — preview switcher only |\n\n**Do not** copy Storybook preset JSON or `theme-presets.ts` into consumer apps. Presets are not in the published package.\n\n**Custom branding:** override CSS variables on `:root` or a scoped class (e.g. `.my-brand`). Use Storybook **Theme Builder** / **Token Catalog** to explore tokens, then export CSS/JSON for your overrides.\n\n## 7. Using Impact Nova with Webpack\n\nIf your app is built with **Webpack** (including Create React App, which uses Webpack):\n\n- **CSS import:** Webpack will bundle the library CSS as long as you have a rule for `.css`. Ensure your config includes something like:\n ```js\n module: {\n rules: [\n {\n test: /\\.css$/,\n use: ['style-loader', 'css-loader'],\n // or with MiniCssExtractPlugin:\n // use: [MiniCssExtractPlugin.loader, 'css-loader'],\n },\n // ... other rules (e.g. for .tsx, .js)\n ],\n },\n ```\n Then in your root component or entry:\n ```tsx\n import 'impact-nova/dist/impact-nova.css';\n ```\n- **Create React App (CRA):** No extra config. Add `import 'impact-nova/dist/impact-nova.css';` in `index.tsx` or `App.tsx`.\n- **Dedupe React / AG Grid:** If you see “multiple copies of React” or AG Grid issues, use Webpack’s `resolve.alias` so the app uses a single version:\n ```js\n resolve: {\n alias: {\n react: path.resolve(__dirname, 'node_modules/react'),\n 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'),\n // If using AG Grid:\n 'ag-grid-react': path.resolve(__dirname, 'node_modules/ag-grid-react'),\n 'ag-grid-community': path.resolve(__dirname, 'node_modules/ag-grid-community'),\n 'ag-grid-enterprise': path.resolve(__dirname, 'node_modules/ag-grid-enterprise'),\n },\n },\n ```\n- **Tailwind + Webpack:** If you use Tailwind, add the Impact Nova preset and include the package in `content` (see section 7 below).\n\n## 8. Optional: extend Tailwind with Impact Nova preset\n\nIf your project uses Tailwind and you want the same theme (colors, radius), extend your `tailwind.config.js` with the preset from the package:\n\n```js\n// tailwind.config.js\nimport impactNovaPreset from 'impact-nova/tailwind.config.js';\n// → dist/tailwind.config.js (bundled theme; no package src/ required)\n\nexport default {\n presets: [impactNovaPreset],\n content: [\n './index.html',\n './src/**/*.{js,ts,jsx,tsx}',\n './node_modules/impact-nova/dist/**/*.js',\n ],\n // ... rest of your config\n};\n```\n\n## Summary checklist\n\n- [ ] `npm install impact-nova impact-nova-icons` (and react, react-dom; optional: ag-grid, highcharts)\n- [ ] `import 'impact-nova/dist/impact-nova.css'` in root entry (or @import in main.css/main.scss if using CSS or SCSS without Tailwind; see §6)\n- [ ] Add Manrope font link and body font-family\n- [ ] Wrap app with `<ImpactNovaProviders locale=\"en\">` from `impact-nova/form`\n- [ ] Use subpath imports in feature code (see §5)\n- [ ] (Optional) Add Tailwind preset and content path for impact-nova\n- [ ] **Webpack:** Ensure a CSS rule (style-loader + css-loader) and, if needed, resolve.alias for React/AG Grid\n\nAfter this, import components via subpaths: `import { Button } from 'impact-nova/button';`\n\n## 9. Dashboard app shell (optional)\n\nTo scaffold a full dashboard (sidebar, header, breadcrumb, filters), read resource **`impact-nova://layout`** or call `get_real_world_patterns` with `topic: \"layout\"`. Use `Layout` from `impact-nova/layout` — not `DynamicLayout` (grid/flex utility only).\n";
@@ -1 +1 @@
1
- export default "# Impact Nova — baseline\n\nUse **Impact Nova** design-system components and tokens. Prefer subpath imports (e.g. `impact-nova/button`) when you only need a few modules. For live component lists, specs, and codegen, use the **impact-nova-mcp** MCP server (see npm `impact-nova-mcp`). Browse **Storybook**: https://impact-nova.iaproducts.ai/\n\n## Peer dependency summary\n\n```json\n{\n \"impactNova\": {\n \"package\": \"impact-nova\",\n \"recommendedVersion\": \"2.5.2\",\n \"recommendedDistTag\": \"latest\",\n \"description\": \"Design system package — ESM with 90+ subpath exports. Install: npm install impact-nova@latest\"\n },\n \"createImpactNova\": {\n \"package\": \"create-impact-nova\",\n \"recommendedVersion\": \"^1.4.7\",\n \"description\": \"Vite + React scaffold with recipe-based modules\"\n },\n \"localDevelopment\": {\n \"defaultScaffoldDependency\": \"auto\",\n \"description\": \"create-impact-nova auto-detects: file: link when run inside the impact-nova monorepo; npm (impact-nova@^2.5.2) otherwise. CLI: --from-npm or --link-monorepo to override. Rebuild impact-nova (npm run build) after DS changes when using file: link.\",\n \"cliFlagForNpm\": \"--from-npm\",\n \"cliFlagForMonorepo\": \"--link-monorepo\",\n \"mcpScaffoldFlag\": \"usePublishedPackages: true | false (omit for auto-detect)\"\n },\n \"mandatoryRules\": {\n \"componentsOnly\": \"Use Impact Nova components only — never create new custom UI components\",\n \"tables\": \"Any table/grid/spreadsheet → DataTable from impact-nova/data-table (not HTML table, not raw ag-grid-react)\",\n \"validateBeforeDone\": \"Call validate_snippet on generated UI code\",\n \"resource\": \"impact-nova://design-system-mandate\"\n },\n \"requiredPeers\": [\n {\n \"package\": \"react\",\n \"recommendedVersion\": \"^19.0.0\",\n \"description\": \"React 19 required\"\n },\n {\n \"package\": \"react-dom\",\n \"recommendedVersion\": \"^19.0.0\",\n \"description\": \"React DOM 19 required\"\n },\n {\n \"package\": \"impact-nova-icons\",\n \"recommendedVersion\": \">=0.1.0\",\n \"description\": \"Icons peer — not bundled in impact-nova; 0.1.x and 0.2.x supported\"\n }\n ],\n \"optionalPeers\": [\n {\n \"package\": \"ag-grid-community\",\n \"recommendedVersion\": \"36.0.1\",\n \"description\": \"AG Grid community types/API; pin to the same version as ag-grid-react\"\n },\n {\n \"package\": \"ag-grid-react\",\n \"recommendedVersion\": \"36.0.1\",\n \"description\": \"For DataTable and grid components; use exact version to match Impact Nova\"\n },\n {\n \"package\": \"ag-grid-enterprise\",\n \"recommendedVersion\": \"36.0.1\",\n \"description\": \"Required if using ag-grid-react with enterprise features\"\n },\n {\n \"package\": \"highcharts\",\n \"recommendedVersion\": \"^12.0.0\",\n \"description\": \"For Chart component\"\n },\n {\n \"package\": \"highcharts-react-official\",\n \"recommendedVersion\": \"^3.0.0\",\n \"description\": \"For Chart component\"\n },\n {\n \"package\": \"highcharts-border-radius\",\n \"recommendedVersion\": \"^0.0.4\",\n \"description\": \"Optional Highcharts plugin for rounded corners\"\n }\n ]\n}\n```\n";
1
+ export default "# Impact Nova — baseline\n\nUse **Impact Nova** design-system components and tokens. Prefer subpath imports (e.g. `impact-nova/button`) when you only need a few modules. For live component lists, specs, and codegen, use the **impact-nova-mcp** MCP server (see npm `impact-nova-mcp`). Browse **Storybook**: https://impact-nova.iaproducts.ai/\n\n## Peer dependency summary\n\n```json\n{\n \"impactNova\": {\n \"package\": \"impact-nova\",\n \"recommendedVersion\": \"2.5.3\",\n \"recommendedDistTag\": \"latest\",\n \"description\": \"Design system package — ESM with 90+ subpath exports. Install: npm install impact-nova@latest\"\n },\n \"createImpactNova\": {\n \"package\": \"create-impact-nova\",\n \"recommendedVersion\": \"^1.4.7\",\n \"description\": \"Vite + React scaffold with recipe-based modules\"\n },\n \"localDevelopment\": {\n \"defaultScaffoldDependency\": \"auto\",\n \"description\": \"create-impact-nova auto-detects: file: link when run inside the impact-nova monorepo; npm (impact-nova@^2.5.3) otherwise. CLI: --from-npm or --link-monorepo to override. Rebuild impact-nova (npm run build) after DS changes when using file: link.\",\n \"cliFlagForNpm\": \"--from-npm\",\n \"cliFlagForMonorepo\": \"--link-monorepo\",\n \"mcpScaffoldFlag\": \"usePublishedPackages: true | false (omit for auto-detect)\"\n },\n \"mandatoryRules\": {\n \"componentsOnly\": \"Use Impact Nova components only — never create new custom UI components\",\n \"tables\": \"Any table/grid/spreadsheet → DataTable from impact-nova/data-table (not HTML table, not raw ag-grid-react)\",\n \"validateBeforeDone\": \"Call validate_snippet on generated UI code\",\n \"resource\": \"impact-nova://design-system-mandate\"\n },\n \"requiredPeers\": [\n {\n \"package\": \"react\",\n \"recommendedVersion\": \"^19.0.0\",\n \"description\": \"React 19 required\"\n },\n {\n \"package\": \"react-dom\",\n \"recommendedVersion\": \"^19.0.0\",\n \"description\": \"React DOM 19 required\"\n },\n {\n \"package\": \"impact-nova-icons\",\n \"recommendedVersion\": \">=0.1.0\",\n \"description\": \"Icons peer — not bundled in impact-nova; 0.1.x and 0.2.x supported\"\n }\n ],\n \"optionalPeers\": [\n {\n \"package\": \"ag-grid-community\",\n \"recommendedVersion\": \"36.0.1\",\n \"description\": \"AG Grid community types/API; pin to the same version as ag-grid-react\"\n },\n {\n \"package\": \"ag-grid-react\",\n \"recommendedVersion\": \"36.0.1\",\n \"description\": \"For DataTable and grid components; use exact version to match Impact Nova\"\n },\n {\n \"package\": \"ag-grid-enterprise\",\n \"recommendedVersion\": \"36.0.1\",\n \"description\": \"Required if using ag-grid-react with enterprise features\"\n },\n {\n \"package\": \"highcharts\",\n \"recommendedVersion\": \"^12.0.0\",\n \"description\": \"For Chart component\"\n },\n {\n \"package\": \"highcharts-react-official\",\n \"recommendedVersion\": \"^3.0.0\",\n \"description\": \"For Chart component\"\n },\n {\n \"package\": \"highcharts-border-radius\",\n \"recommendedVersion\": \"^0.0.4\",\n \"description\": \"Optional Highcharts plugin for rounded corners\"\n }\n ]\n}\n```\n";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "impact-nova",
3
- "version": "2.5.2",
3
+ "version": "2.5.3",
4
4
  "description": "Enterprise-grade React design system built with React 19, Vite, Tailwind CSS, and Radix UI. Built-in internationalization (i18n) and comprehensive UI component library for scalable, accessible, and performant applications.",
5
5
  "type": "module",
6
6
  "workspaces": [