impact-nova 2.5.6 → 2.5.7

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 (63) hide show
  1. package/dist/components/data-display/calendar/calendar-apply-validation.js +45 -33
  2. package/dist/components/data-display/calendar/calendar-day-picker-components.js +62 -54
  3. package/dist/components/data-display/calendar/calendar-day-picker-view.d.ts +1 -1
  4. package/dist/components/data-display/calendar/calendar-day-picker-view.js +88 -85
  5. package/dist/components/data-display/calendar/calendar-week-utils.js +23 -22
  6. package/dist/components/data-display/calendar/use-calendar-state.d.ts +1 -1
  7. package/dist/components/data-display/calendar/use-calendar-state.js +47 -47
  8. package/dist/components/flows/guidance/guidance-error-boundary.js +22 -14
  9. package/dist/components/flows/guidance/guidance-layer.js +34 -32
  10. package/dist/components/flows/guidance/help-center/assets/whats-new-guide-icon.svg.js +4 -0
  11. package/dist/components/flows/guidance/help-center/filter-help-center-guides.js +10 -7
  12. package/dist/components/flows/guidance/help-center/guide-catalog-section.d.ts +7 -0
  13. package/dist/components/flows/guidance/help-center/guide-catalog-section.js +24 -0
  14. package/dist/components/flows/guidance/help-center/guide-catalog-utils.d.ts +3 -0
  15. package/dist/components/flows/guidance/help-center/guide-catalog-utils.js +19 -0
  16. package/dist/components/flows/guidance/help-center/guide-catalog.d.ts +1 -1
  17. package/dist/components/flows/guidance/help-center/guide-catalog.js +89 -79
  18. package/dist/components/flows/guidance/help-center/help-center-guide-labels.d.ts +6 -0
  19. package/dist/components/flows/guidance/help-center/help-center-guide-labels.js +33 -0
  20. package/dist/components/flows/guidance/help-center/help-center-guide-row.d.ts +12 -0
  21. package/dist/components/flows/guidance/help-center/help-center-guide-row.js +57 -0
  22. package/dist/components/flows/guidance/help-center/help-center-guide-type-icons.d.ts +9 -0
  23. package/dist/components/flows/guidance/help-center/help-center-guide-type-icons.js +114 -0
  24. package/dist/components/flows/guidance/help-center/help-center-header.d.ts +1 -1
  25. package/dist/components/flows/guidance/help-center/help-center-header.js +20 -16
  26. package/dist/components/flows/guidance/help-center/help-center.constants.d.ts +1 -1
  27. package/dist/components/flows/guidance/help-center/help-center.constants.js +1 -1
  28. package/dist/components/flows/guidance/help-center/help-center.d.ts +3 -1
  29. package/dist/components/flows/guidance/help-center/help-center.js +74 -51
  30. package/dist/components/flows/guidance/help-center/help-center.types.d.ts +9 -1
  31. package/dist/components/flows/guidance/help-center/renderHelpCenterGuideTypeIcon.d.ts +4 -0
  32. package/dist/components/flows/guidance/help-center/renderHelpCenterGuideTypeIcon.js +18 -0
  33. package/dist/components/flows/guidance/help-center.d.ts +4 -2
  34. package/dist/components/flows/guidance/help-center.js +23 -14
  35. package/dist/components/flows/guidance/hooks/useGuidanceOverlayGeometry.js +19 -17
  36. package/dist/components/flows/guidance/index.d.ts +1 -1
  37. package/dist/components/flows/guidance/renderers/announcement-renderer.d.ts +1 -1
  38. package/dist/components/flows/guidance/renderers/announcement-renderer.js +20 -12
  39. package/dist/components/flows/guidance/renderers/guidance-card-shared.d.ts +9 -11
  40. package/dist/components/flows/guidance/renderers/guidance-card-shared.js +124 -177
  41. package/dist/components/flows/guidance/renderers/guidance-renderer-shared.d.ts +1 -1
  42. package/dist/components/flows/guidance/renderers/guidance-renderer-shared.js +57 -72
  43. package/dist/components/flows/guidance/renderers/guidance-tour-overlay.js +23 -23
  44. package/dist/components/flows/wizard/wizard.js +41 -38
  45. package/dist/components/layout/horizontal-scroller/horizontal-scroller.js +35 -53
  46. package/dist/form-react/registry/defaultFieldRegistrations.js +36 -28
  47. package/dist/form-react/types/fields.types.d.ts +3 -3
  48. package/dist/form-react/utils/date.utils.d.ts +3 -1
  49. package/dist/form-react/utils/date.utils.js +84 -55
  50. package/dist/i18n/defaultMessages.d.ts +10 -0
  51. package/dist/i18n/defaultMessages.js +17 -7
  52. package/dist/i18n/locales/de.js +13 -3
  53. package/dist/i18n/locales/es.js +13 -3
  54. package/dist/i18n/locales/hi.js +13 -3
  55. package/dist/i18n/locales/kn.js +13 -3
  56. package/dist/impact-nova.css +1 -1
  57. package/dist/lib/guidance/engine/guidance-engine.d.ts +7 -5
  58. package/dist/lib/guidance/engine/guidance-engine.js +115 -47
  59. package/dist/lib/guidance/triggers/trigger-registry.js +6 -6
  60. package/dist/lib/guidance/types/guidance.types.d.ts +11 -1
  61. package/dist/llms/rules/installation.js +1 -1
  62. package/dist/llms/rules/requirements.js +1 -1
  63. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { GuidanceEngineConfig, GuidanceError, GuidanceEventHandler, GuidanceEventName, GuidanceSessionState, GuideManifest, RenderInstruction, Unsubscribe } from '../types/guidance.types';
1
+ import { GuidanceEngineConfig, GuidanceError, GuidanceEventHandler, GuidanceEventName, GuidanceGuideReplayOptions, GuidanceGuideStartOptions, GuidanceSessionState, GuideManifest, RenderInstruction, Unsubscribe } from '../types/guidance.types';
2
2
  import { GuideRegistry } from './guide-registry';
3
3
  import { TriggerPluginRegistry } from '../triggers/trigger-registry';
4
4
  import { TargetResolver } from '../targets/target-resolver';
@@ -42,13 +42,13 @@ export declare class GuidanceEngine {
42
42
  emitCustomEvent(eventName: string): void;
43
43
  grantConsent(): void;
44
44
  setPreviewMode(enabled: boolean): void;
45
- start(guideId: string, options?: {
46
- manual?: boolean;
47
- }): Promise<void>;
48
- replay(guideId: string): Promise<void>;
45
+ start(guideId: string, options?: GuidanceGuideStartOptions): Promise<void>;
46
+ replay(guideId: string, options?: GuidanceGuideReplayOptions): Promise<void>;
47
+ private resolveGuideStartStepIndex;
49
48
  dismiss(dismissMode?: 'session' | 'forever' | 'snoozed'): Promise<void>;
50
49
  snooze(guideId?: string): Promise<void>;
51
50
  advanceStep(): Promise<void>;
51
+ retryCurrentStep(): Promise<void>;
52
52
  skipStep(): Promise<void>;
53
53
  getRenderInstruction(): RenderInstruction | null;
54
54
  private syncRenderInstructionCache;
@@ -64,6 +64,8 @@ export declare class GuidanceEngine {
64
64
  private saveSessionStats;
65
65
  private hydrateVisitCounts;
66
66
  private incrementVisitCount;
67
+ private log;
68
+ private clearPersistedLastStep;
67
69
  private scheduleEvaluation;
68
70
  private setSession;
69
71
  private notify;
@@ -1,17 +1,17 @@
1
- import { GuideRegistry as h } from "./guide-registry.js";
2
- import { getNextStepId as l, getStepIndex as p, getStepById as f, resolveLocalizedStepContent as S } from "./step-navigation.js";
1
+ import { GuideRegistry as l } from "./guide-registry.js";
2
+ import { getStepIndex as u, getNextStepId as p, getStepById as S, resolveLocalizedStepContent as f } from "./step-navigation.js";
3
3
  import { TriggerPluginRegistry as v } from "../triggers/trigger-registry.js";
4
- import { registerBuiltInTriggerPlugins as m } from "../triggers/built-in-triggers.js";
5
- import { TargetResolver as w, resolveTargetSynchronously as y, waitForTargetResolved as R } from "../targets/target-resolver.js";
6
- import { GuidanceTargetRefRegistry as I } from "../targets/ref-registry.js";
7
- import { buildGuidanceStorageKey as a, buildSessionStatsKey as u, createDefaultSessionStats as G } from "../storage/storage-keys.js";
8
- class P {
4
+ import { registerBuiltInTriggerPlugins as w } from "../triggers/built-in-triggers.js";
5
+ import { TargetResolver as m, resolveTargetSynchronously as y, waitForTargetResolved as I } from "../targets/target-resolver.js";
6
+ import { GuidanceTargetRefRegistry as R } from "../targets/ref-registry.js";
7
+ import { buildGuidanceStorageKey as a, buildSessionStatsKey as g, createDefaultSessionStats as G } from "../storage/storage-keys.js";
8
+ class _ {
9
9
  sessionState = { status: "idle" };
10
10
  listeners = /* @__PURE__ */ new Set();
11
11
  eventHandlers = /* @__PURE__ */ new Map();
12
- guideRegistry = new h();
12
+ guideRegistry = new l();
13
13
  triggerRegistry = new v();
14
- targetRefRegistry = new I();
14
+ targetRefRegistry = new R();
15
15
  targetResolver;
16
16
  guideQueue = [];
17
17
  previewMode = !1;
@@ -26,7 +26,7 @@ class P {
26
26
  cachedRenderInstruction = null;
27
27
  config;
28
28
  constructor(t) {
29
- this.config = t, this.targetResolver = new w(this.targetRefRegistry), m(this.triggerRegistry), this.consentGranted = !t.consentRequired;
29
+ this.config = t, this.targetResolver = new m(this.targetRefRegistry), w(this.triggerRegistry), this.consentGranted = !t.consentRequired;
30
30
  }
31
31
  get state() {
32
32
  return this.sessionState;
@@ -105,10 +105,23 @@ class P {
105
105
  }
106
106
  return;
107
107
  }
108
- await this.canStartGuide(t, e?.manual ?? !1) && await this.activateGuide(s, 0);
108
+ if (!await this.canStartGuide(t, e?.manual ?? !1))
109
+ return;
110
+ const n = this.resolveGuideStartStepIndex(s, e?.stepId);
111
+ await this.activateGuide(s, n);
112
+ }
113
+ async replay(t, e) {
114
+ this.previewMode = !0, this.sessionState.guideId === t && this.sessionState.status !== "idle" && (this.log("replay.reset-session", {
115
+ guideId: t,
116
+ previousStatus: this.sessionState.status,
117
+ previousStepId: this.sessionState.stepId
118
+ }), this.emitEvent("guideEnd", { guideId: t, reason: "dismissed" }), await this.clearPersistedLastStep(t), this.setSession({ status: "idle" })), await this.start(t, { manual: !0, stepId: e?.stepId });
109
119
  }
110
- async replay(t) {
111
- this.previewMode = !0, await this.start(t, { manual: !0 });
120
+ resolveGuideStartStepIndex(t, e) {
121
+ if (!e)
122
+ return 0;
123
+ const s = u(t, e);
124
+ return s >= 0 ? s : 0;
112
125
  }
113
126
  async dismiss(t = "session") {
114
127
  const e = this.sessionState.guideId;
@@ -122,7 +135,7 @@ class P {
122
135
  const s = await this.loadSessionStats();
123
136
  s.snoozedUntil[e] = Date.now() + 1440 * 60 * 1e3, await this.saveSessionStats(s);
124
137
  }
125
- this.emitEvent("guideEnd", { guideId: e, reason: "dismissed" }), this.track("guide.dismissed", { guideId: e, dismissMode: t }), this.setSession({ status: "dismissed", guideId: e, dismissMode: t }), await this.dequeueNextGuide();
138
+ this.emitEvent("guideEnd", { guideId: e, reason: "dismissed" }), this.track("guide.dismissed", { guideId: e, dismissMode: t }), this.log("dismiss", { guideId: e, dismissMode: t, stepId: this.sessionState.stepId }), this.setSession({ status: "dismissed", guideId: e, dismissMode: t }), this.clearPersistedLastStep(e), await this.dequeueNextGuide();
126
139
  }
127
140
  }
128
141
  async snooze(t) {
@@ -136,7 +149,7 @@ class P {
136
149
  if (!s)
137
150
  return;
138
151
  this.track("step.completed", { guideId: t, stepId: e });
139
- const i = await l(
152
+ const i = await p(
140
153
  s,
141
154
  e,
142
155
  (r) => this.triggerRegistry.evaluateExpression(r, this.buildTriggerContext())
@@ -145,9 +158,19 @@ class P {
145
158
  await this.completeGuide(t);
146
159
  return;
147
160
  }
148
- const n = p(s, i);
161
+ const n = u(s, i);
149
162
  await this.activateGuide(s, n);
150
163
  }
164
+ async retryCurrentStep() {
165
+ const t = this.sessionState.guideId, e = this.sessionState.stepId;
166
+ if (!t || !e || this.sessionState.status !== "blocked" && this.sessionState.status !== "evaluating")
167
+ return;
168
+ const s = this.guideRegistry.get(t);
169
+ if (!s)
170
+ return;
171
+ const i = u(s, e);
172
+ i < 0 || await this.activateGuide(s, i);
173
+ }
151
174
  async skipStep() {
152
175
  const t = this.sessionState.guideId, e = this.sessionState.stepId;
153
176
  !t || !e || (this.track("step.skipped", { guideId: t, stepId: e }), await this.advanceStep());
@@ -160,7 +183,7 @@ class P {
160
183
  this.cachedRenderInstruction = null;
161
184
  return;
162
185
  }
163
- const t = this.guideRegistry.get(this.sessionState.guideId), e = t ? f(t, this.sessionState.stepId) : void 0;
186
+ const t = this.guideRegistry.get(this.sessionState.guideId), e = t ? S(t, this.sessionState.stepId) : void 0;
164
187
  if (!t || !e) {
165
188
  this.cachedRenderInstruction = null;
166
189
  return;
@@ -171,7 +194,7 @@ class P {
171
194
  stepIndex: this.sessionState.stepIndex,
172
195
  totalSteps: t.steps.length,
173
196
  renderer: e.renderer,
174
- content: S(t, e, this.config.locale),
197
+ content: f(t, e, this.config.locale),
175
198
  target: this.sessionState.resolvedTarget ?? null,
176
199
  skippable: e.skippable,
177
200
  advanceOn: e.advanceOn
@@ -193,7 +216,10 @@ class P {
193
216
  if (!n.length)
194
217
  return;
195
218
  const r = n[0];
196
- this.track("guide.triggered", { guideId: r.id }), await this.start(r.id);
219
+ this.log("evaluateTriggers.start", {
220
+ guideId: r.id,
221
+ routePath: this.routePath
222
+ }), this.track("guide.triggered", { guideId: r.id }), await this.start(r.id);
197
223
  }
198
224
  async activateGuide(t, e) {
199
225
  const s = t.steps[e];
@@ -201,43 +227,71 @@ class P {
201
227
  await this.completeGuide(t.id);
202
228
  return;
203
229
  }
204
- let i = y(
205
- this.targetResolver,
206
- s.target
207
- );
208
- if (i?.element || (this.setSession({
209
- status: "evaluating",
210
- guideId: t.id,
211
- stepIndex: e,
212
- stepId: s.id
213
- }), i = await R(
214
- this.targetResolver,
215
- s.target,
216
- s.timeout ?? 5e3
217
- )), !i?.element) {
218
- this.setSession({
230
+ let i = null;
231
+ if (s.target) {
232
+ if (i = y(
233
+ this.targetResolver,
234
+ s.target
235
+ ), i?.element || (this.setSession({
236
+ status: "evaluating",
237
+ guideId: t.id,
238
+ stepIndex: e,
239
+ stepId: s.id
240
+ }), i = await I(
241
+ this.targetResolver,
242
+ s.target,
243
+ s.timeout ?? 5e3
244
+ )), !i?.element) {
245
+ this.log("activateGuide.blocked", {
246
+ guideId: t.id,
247
+ stepId: s.id,
248
+ stepIndex: e,
249
+ reason: i ? "target_not_visible" : "target_not_found",
250
+ targetId: s.target?.targetId
251
+ }), this.setSession({
252
+ status: "blocked",
253
+ guideId: t.id,
254
+ stepIndex: e,
255
+ stepId: s.id,
256
+ reason: i ? "target_not_visible" : "target_not_found"
257
+ });
258
+ return;
259
+ }
260
+ } else if (s.renderer !== "announcement") {
261
+ this.log("activateGuide.blocked", {
262
+ guideId: t.id,
263
+ stepId: s.id,
264
+ stepIndex: e,
265
+ reason: "target_not_found"
266
+ }), this.setSession({
219
267
  status: "blocked",
220
268
  guideId: t.id,
221
269
  stepIndex: e,
222
270
  stepId: s.id,
223
- reason: i ? "target_not_visible" : "target_not_found"
271
+ reason: "target_not_found"
224
272
  });
225
273
  return;
226
274
  }
227
- if (e === 0) {
228
- this.emitEvent("guideStart", { guideId: t.id, stepId: s.id }), this.track("guide.started", { guideId: t.id });
229
- const n = await this.loadSessionStats();
230
- n.guidesShownThisSession += 1, await this.saveSessionStats(n), await this.incrementVisitCount(t.id);
275
+ const n = this.sessionState;
276
+ if (n.status === "idle" || n.guideId !== t.id) {
277
+ this.log("guideStart", { guideId: t.id, stepId: s.id }), this.emitEvent("guideStart", { guideId: t.id, stepId: s.id }), this.track("guide.started", { guideId: t.id });
278
+ const o = await this.loadSessionStats();
279
+ o.guidesShownThisSession += 1, await this.saveSessionStats(o), await this.incrementVisitCount(t.id);
231
280
  }
232
- this.emitEvent("stepChange", { guideId: t.id, stepId: s.id }), this.track("step.viewed", { guideId: t.id, stepId: s.id }), this.setSession({
281
+ this.emitEvent("stepChange", { guideId: t.id, stepId: s.id }), this.track("step.viewed", { guideId: t.id, stepId: s.id }), this.log("step.active", {
282
+ guideId: t.id,
283
+ stepId: s.id,
284
+ stepIndex: e,
285
+ hasTarget: !!s.target
286
+ }), this.setSession({
233
287
  status: "active",
234
288
  guideId: t.id,
235
289
  stepIndex: e,
236
290
  stepId: s.id,
237
- resolvedTarget: {
291
+ resolvedTarget: i?.element ? {
238
292
  ...i,
239
293
  rect: i.element.getBoundingClientRect()
240
- }
294
+ } : void 0
241
295
  }), t.persistence.resumeOnRefresh && await this.config.storage.set({
242
296
  [a(this.config.tenantId, t.id, "lastStep")]: {
243
297
  stepId: s.id,
@@ -278,8 +332,8 @@ class P {
278
332
  if (r && Date.now() < r || (e.dismissedCounts[t.id] ?? 0) >= 3 && t.persistence.mode === "showOnce")
279
333
  return !1;
280
334
  if (t.persistence.schedule) {
281
- const d = Date.now(), c = Date.parse(t.persistence.schedule.start), g = Date.parse(t.persistence.schedule.end);
282
- if (d < c || d > g)
335
+ const d = Date.now(), c = Date.parse(t.persistence.schedule.start), h = Date.parse(t.persistence.schedule.end);
336
+ if (d < c || d > h)
283
337
  return !1;
284
338
  }
285
339
  return this.triggerRegistry.evaluateAll(
@@ -317,12 +371,12 @@ class P {
317
371
  await this.start(t);
318
372
  }
319
373
  async loadSessionStats() {
320
- const t = u(this.config.tenantId);
374
+ const t = g(this.config.tenantId);
321
375
  return (await this.config.storage.get([t]))[t] ?? G();
322
376
  }
323
377
  async saveSessionStats(t) {
324
378
  await this.config.storage.set({
325
- [u(this.config.tenantId)]: t
379
+ [g(this.config.tenantId)]: t
326
380
  });
327
381
  }
328
382
  async hydrateVisitCounts(t) {
@@ -348,6 +402,20 @@ class P {
348
402
  ), n = ((await this.config.storage.get([e]))[e] ?? 0) + 1;
349
403
  this.visitCounts[t] = n, await this.config.storage.set({ [e]: n });
350
404
  }
405
+ log(t, e) {
406
+ if (this.config.debug) {
407
+ if (e) {
408
+ console.info(`[guidance] ${t}`, e);
409
+ return;
410
+ }
411
+ console.info(`[guidance] ${t}`);
412
+ }
413
+ }
414
+ async clearPersistedLastStep(t) {
415
+ await this.config.storage.delete([
416
+ a(this.config.tenantId, t, "lastStep")
417
+ ]);
418
+ }
351
419
  scheduleEvaluation() {
352
420
  typeof window > "u" || (this.evaluationFrame !== null && cancelAnimationFrame(this.evaluationFrame), this.evaluationFrame = requestAnimationFrame(() => {
353
421
  this.evaluationFrame = null, this.evaluateTriggers(this.routePath);
@@ -380,5 +448,5 @@ class P {
380
448
  }
381
449
  }
382
450
  export {
383
- P as GuidanceEngine
451
+ _ as GuidanceEngine
384
452
  };
@@ -1,4 +1,4 @@
1
- class r {
1
+ class s {
2
2
  plugins = /* @__PURE__ */ new Map();
3
3
  register(t) {
4
4
  this.plugins.set(t.type, t);
@@ -22,11 +22,11 @@ class r {
22
22
  );
23
23
  return t.op === "and" ? a.every(Boolean) : a.some(Boolean);
24
24
  }
25
- const n = this.plugins.get(t.plugin);
26
- if (!n?.evaluate)
25
+ const l = this.plugins.get(t.plugin);
26
+ if (!l?.evaluate)
27
27
  return !1;
28
28
  try {
29
- return !!await n.evaluate(e, t.config ?? {});
29
+ return !!await l.evaluate(e, t.config ?? {});
30
30
  } catch {
31
31
  return !1;
32
32
  }
@@ -36,9 +36,9 @@ class r {
36
36
  t.map(
37
37
  (a) => this.evaluateExpression(a, e)
38
38
  )
39
- )).every(Boolean) : !0;
39
+ )).every(Boolean) : !1;
40
40
  }
41
41
  }
42
42
  export {
43
- r as TriggerPluginRegistry
43
+ s as TriggerPluginRegistry
44
44
  };
@@ -5,6 +5,13 @@ export type EndReason = 'completed' | 'dismissed' | 'error' | 'skipped';
5
5
  export type BlockReason = 'target_not_found' | 'target_not_visible' | 'timeout';
6
6
  export type PersistenceMode = 'showOnce' | 'replayable' | 'dismissForever' | 'scheduled';
7
7
  export type AdvanceCondition = 'click-next' | 'click-target' | 'auto' | 'custom-event';
8
+ export interface GuidanceGuideStartOptions {
9
+ manual?: boolean;
10
+ stepId?: string;
11
+ }
12
+ export interface GuidanceGuideReplayOptions {
13
+ stepId?: string;
14
+ }
8
15
  export type MediaType = 'image' | 'video' | 'lottie';
9
16
  export interface StepAction {
10
17
  label: string;
@@ -29,7 +36,7 @@ export interface TargetDescriptor {
29
36
  }
30
37
  export interface Step {
31
38
  id: string;
32
- target: TargetDescriptor;
39
+ target?: TargetDescriptor;
33
40
  renderer: string;
34
41
  content: StepContent;
35
42
  advanceOn: AdvanceCondition;
@@ -49,6 +56,7 @@ export interface PersistenceConfig {
49
56
  end: string;
50
57
  };
51
58
  }
59
+ export type GuideType = 'tour' | 'whats-new' | 'how-to' | 'tip';
52
60
  export interface GuideMetadata {
53
61
  createdAt: string;
54
62
  updatedAt: string;
@@ -56,6 +64,8 @@ export interface GuideMetadata {
56
64
  title?: string;
57
65
  description?: string;
58
66
  category?: string;
67
+ /** Semantic content type for Help Center labeling and launch CTAs. */
68
+ guideType?: GuideType;
59
69
  }
60
70
  export interface GuideManifest {
61
71
  schemaVersion: GuidanceSchemaVersion;
@@ -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.5` 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.7` 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.5\",\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.5) 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.7\",\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.7) 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.6",
3
+ "version": "2.5.7",
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": [