impact-nova 3.0.0-alpha.7 → 3.0.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +1 -1
  2. package/dist/components/data/expandable-list-item/sku-picker-chrome.d.ts +4 -0
  3. package/dist/components/data/expandable-list-item/sku-picker-chrome.js +37 -42
  4. package/dist/components/data-display/stereo-scatter/index.d.ts +2 -0
  5. package/dist/components/data-display/stereo-scatter/index.js +10 -0
  6. package/dist/components/data-display/stereo-scatter/internals/stereo-engine-frame.d.ts +41 -0
  7. package/dist/components/data-display/stereo-scatter/internals/stereo-engine-frame.js +178 -0
  8. package/dist/components/data-display/stereo-scatter/internals/stereo-engine-theme.d.ts +14 -0
  9. package/dist/components/data-display/stereo-scatter/internals/stereo-engine-theme.js +29 -0
  10. package/dist/components/data-display/stereo-scatter/internals/stereo-engine-wedges.d.ts +23 -0
  11. package/dist/components/data-display/stereo-scatter/internals/stereo-engine-wedges.js +80 -0
  12. package/dist/components/data-display/stereo-scatter/internals/stereo-engine.d.ts +120 -0
  13. package/dist/components/data-display/stereo-scatter/internals/stereo-engine.js +519 -0
  14. package/dist/components/data-display/stereo-scatter/internals/stereo-math.d.ts +64 -0
  15. package/dist/components/data-display/stereo-scatter/internals/stereo-math.js +129 -0
  16. package/dist/components/data-display/stereo-scatter/internals/stereo-model.d.ts +37 -0
  17. package/dist/components/data-display/stereo-scatter/internals/stereo-model.js +71 -0
  18. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-context.d.ts +33 -0
  19. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-context.js +19 -0
  20. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-key.d.ts +4 -0
  21. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-key.js +19 -0
  22. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-legend.d.ts +2 -0
  23. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-legend.js +75 -0
  24. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-scene.d.ts +2 -0
  25. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-scene.js +149 -0
  26. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-toolbar.d.ts +13 -0
  27. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-toolbar.js +93 -0
  28. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-tooltip.d.ts +2 -0
  29. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-tooltip.js +62 -0
  30. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-viewport.d.ts +3 -0
  31. package/dist/components/data-display/stereo-scatter/internals/stereo-scatter-viewport.js +41 -0
  32. package/dist/components/data-display/stereo-scatter/stereo-scatter.d.ts +12 -0
  33. package/dist/components/data-display/stereo-scatter/stereo-scatter.js +107 -0
  34. package/dist/components/data-display/stereo-scatter/stereo-scatter.stories-data.d.ts +11 -0
  35. package/dist/components/data-display/stereo-scatter/stereo-scatter.types.d.ts +69 -0
  36. package/dist/components/data-display/stereo-scatter/stereo-scatter.variants.d.ts +13 -0
  37. package/dist/components/data-display/stereo-scatter/stereo-scatter.variants.js +42 -0
  38. package/dist/components/feedback/tooltip/button-icon-tooltip.d.ts +3 -1
  39. package/dist/components/feedback/tooltip/button-icon-tooltip.js +22 -19
  40. package/dist/components/flows/iris-chat/IrisChatComposerVoiceCapture.d.ts +5 -0
  41. package/dist/components/flows/iris-chat/IrisChatComposerVoiceCapture.js +73 -0
  42. package/dist/components/flows/iris-chat/IrisChatVoiceWaveform.d.ts +3 -0
  43. package/dist/components/flows/iris-chat/IrisChatVoiceWaveform.js +25 -0
  44. package/dist/components/flows/iris-chat/index.d.ts +3 -1
  45. package/dist/components/flows/iris-chat/index.js +58 -53
  46. package/dist/components/flows/iris-chat/iris-chat-chrome.d.ts +39 -0
  47. package/dist/components/flows/iris-chat/iris-chat-chrome.js +325 -0
  48. package/dist/components/flows/iris-chat/iris-chat-close-animation.d.ts +12 -0
  49. package/dist/components/flows/iris-chat/iris-chat-close-animation.js +21 -0
  50. package/dist/components/flows/iris-chat/iris-chat-composer.js +266 -238
  51. package/dist/components/flows/iris-chat/iris-chat-context.d.ts +13 -0
  52. package/dist/components/flows/iris-chat/iris-chat-context.js +14 -10
  53. package/dist/components/flows/iris-chat/iris-chat-copy-feedback.d.ts +4 -0
  54. package/dist/components/flows/iris-chat/iris-chat-copy-feedback.js +16 -0
  55. package/dist/components/flows/iris-chat/iris-chat-frame.d.ts +31 -0
  56. package/dist/components/flows/iris-chat/iris-chat-frame.js +79 -0
  57. package/dist/components/flows/iris-chat/iris-chat-icons.d.ts +1 -0
  58. package/dist/components/flows/iris-chat/iris-chat-icons.js +28 -15
  59. package/dist/components/flows/iris-chat/iris-chat-launch-animation.d.ts +11 -0
  60. package/dist/components/flows/iris-chat/iris-chat-launch-animation.js +35 -0
  61. package/dist/components/flows/iris-chat/iris-chat-markdown.js +70 -50
  62. package/dist/components/flows/iris-chat/iris-chat-menu.js +91 -86
  63. package/dist/components/flows/iris-chat/iris-chat-speech.d.ts +52 -0
  64. package/dist/components/flows/iris-chat/iris-chat-speech.js +121 -0
  65. package/dist/components/flows/iris-chat/iris-chat-thread.d.ts +3 -0
  66. package/dist/components/flows/iris-chat/iris-chat-thread.js +241 -190
  67. package/dist/components/flows/iris-chat/iris-chat-window-chrome.d.ts +30 -0
  68. package/dist/components/flows/iris-chat/iris-chat-window-chrome.js +34 -0
  69. package/dist/components/flows/iris-chat/iris-chat-window-geometry-context.d.ts +14 -0
  70. package/dist/components/flows/iris-chat/iris-chat-window-geometry-context.js +15 -0
  71. package/dist/components/flows/iris-chat/iris-chat-window-geometry.d.ts +12 -0
  72. package/dist/components/flows/iris-chat/iris-chat-window-geometry.js +113 -0
  73. package/dist/components/flows/iris-chat/iris-chat-window-handles.d.ts +6 -0
  74. package/dist/components/flows/iris-chat/iris-chat-window-handles.js +50 -0
  75. package/dist/components/flows/iris-chat/iris-chat-window-shell.d.ts +8 -0
  76. package/dist/components/flows/iris-chat/iris-chat-window-shell.js +37 -0
  77. package/dist/components/flows/iris-chat/iris-chat.d.ts +3 -39
  78. package/dist/components/flows/iris-chat/iris-chat.js +22 -330
  79. package/dist/components/flows/iris-chat/iris-chat.types.d.ts +18 -0
  80. package/dist/components/flows/iris-chat/iris-chat.variants.d.ts +3 -3
  81. package/dist/components/flows/iris-chat/iris-chat.variants.js +21 -16
  82. package/dist/components/flows/iris-chat/use-iris-chat-root.d.ts +26 -0
  83. package/dist/components/flows/iris-chat/use-iris-chat-root.js +140 -0
  84. package/dist/components/forms/choice-card/choice-card.d.ts +1 -0
  85. package/dist/components/forms/choice-card/choice-card.js +183 -186
  86. package/dist/components/layout/header/header.js +1 -0
  87. package/dist/form-react/Fields/SelectField.js +66 -57
  88. package/dist/form-react/Fields/VirtualizedListField.js +140 -96
  89. package/dist/form-react/index.d.ts +1 -1
  90. package/dist/form-react/types/fields.types.d.ts +27 -0
  91. package/dist/form-react/types/reactHookForm.types.d.ts +18 -1
  92. package/dist/i18n/defaultMessages.d.ts +37 -0
  93. package/dist/i18n/defaultMessages.js +54 -18
  94. package/dist/i18n/index.d.ts +1 -1
  95. package/dist/i18n/locales/de.js +36 -0
  96. package/dist/i18n/locales/es.js +36 -0
  97. package/dist/i18n/locales/hi.js +36 -0
  98. package/dist/i18n/locales/kn.js +36 -0
  99. package/dist/impact-nova-components.css +19 -0
  100. package/dist/impact-nova.css +1 -1
  101. package/dist/llms/rules/installation.js +1 -1
  102. package/dist/llms/rules/requirements.js +1 -1
  103. package/package.json +5 -1
@@ -0,0 +1,62 @@
1
+ import { jsxs as l, jsx as r } from "react/jsx-runtime";
2
+ import { createComponent as y } from "../../../../lib/primitives/create-component.js";
3
+ import { cn as v } from "../../../../lib/utils.js";
4
+ import { useImpactNovaI18n as I } from "../../../../i18n/use-impact-nova-i18n.js";
5
+ import { stereoScatterTooltipVariants as S } from "../stereo-scatter.variants.js";
6
+ import { useStereoScatterContext as C } from "./stereo-scatter-context.js";
7
+ const f = 12, c = 14, F = 290, M = 150;
8
+ function T(i, o) {
9
+ if (!Number.isFinite(o) || o === 0) return null;
10
+ const s = (i - o) / Math.abs(o) * 100;
11
+ return Math.abs(s) < 0.5 ? "±0%" : `${s > 0 ? "▲" : "▼"} ${Math.abs(s).toFixed(Math.abs(s) < 10 ? 1 : 0)}%`;
12
+ }
13
+ const D = y(
14
+ "StereoScatterTooltip",
15
+ ({ className: i, style: o, ...s }, h) => {
16
+ const { t: d } = I(), { hover: t, model: p, axes: u, focusedClusterId: g } = C();
17
+ if (!t) return null;
18
+ const n = t.target.type === "point" ? p.nodeById.get(t.target.id) : void 0, a = t.target.type === "cluster" ? p.clusterById.get(t.target.id) : n ? p.clusterById.get(n.point.clusterId) : void 0;
19
+ if (!a) return null;
20
+ const b = n ? n.point : a.mean, N = ["x", "y", "z"].map((e) => ({
21
+ axis: e,
22
+ label: u[e].label,
23
+ value: u[e].format(b[e]),
24
+ delta: n ? T(n.point[e], a.mean[e]) : null
25
+ })), m = t.x > t.viewportWidth - F, x = t.y > t.viewportHeight - M;
26
+ return /* @__PURE__ */ l(
27
+ "div",
28
+ {
29
+ ref: h,
30
+ role: "tooltip",
31
+ "data-component": "stereo-scatter-tooltip",
32
+ className: v(S(), i),
33
+ style: {
34
+ left: m ? t.x - c : Math.max(f, t.x + c),
35
+ top: x ? t.y - c : Math.max(f, t.y + c),
36
+ transform: `translate(${m ? "-100%" : "0"}, ${x ? "-100%" : "0"})`,
37
+ ...o
38
+ },
39
+ ...s,
40
+ children: [
41
+ /* @__PURE__ */ l("span", { className: "flex items-center gap-1.5", children: [
42
+ /* @__PURE__ */ r("span", { className: "size-2.5 shrink-0 rounded-full", style: { backgroundColor: a.color }, "aria-hidden": !0 }),
43
+ /* @__PURE__ */ r("span", { className: "truncate text-xs font-semibold leading-4 text-content", children: n ? n.point.label : a.cluster.label })
44
+ ] }),
45
+ /* @__PURE__ */ r("span", { className: "text-[11px] leading-4 text-content-muted", children: n ? a.cluster.label : `${d("stereoScatter.clusterAverage")} · ${d("stereoScatter.storeCount", { count: a.nodes.length })}` }),
46
+ /* @__PURE__ */ r("span", { className: "grid grid-cols-[auto_1fr_auto] items-baseline gap-x-2 gap-y-0.5 border-t border-stroke-hairline pt-1.5", children: N.map((e) => /* @__PURE__ */ l("span", { className: "contents", children: [
47
+ /* @__PURE__ */ r("span", { className: "text-[10px] font-bold uppercase leading-4 text-content-muted", children: e.axis }),
48
+ /* @__PURE__ */ r("span", { className: "truncate text-[11px] leading-4 text-content-secondary", children: e.label }),
49
+ /* @__PURE__ */ l("span", { className: "text-end text-[11px] font-semibold leading-4 tabular-nums text-content", children: [
50
+ e.value,
51
+ e.delta ? /* @__PURE__ */ r("span", { className: "ms-1.5 font-medium text-content-muted", children: e.delta }) : null
52
+ ] })
53
+ ] }, e.axis)) }),
54
+ !n && g !== a.cluster.id ? /* @__PURE__ */ r("span", { className: "text-[11px] font-medium leading-4 text-brand", children: d("stereoScatter.inspectCluster") }) : null
55
+ ]
56
+ }
57
+ );
58
+ }
59
+ );
60
+ export {
61
+ D as StereoScatterTooltip
62
+ };
@@ -0,0 +1,3 @@
1
+ import { StereoScatterViewportProps } from '../stereo-scatter.types';
2
+ export declare const STEREO_SCATTER_DEFAULT_HEIGHT = 440;
3
+ export declare const StereoScatterViewport: import('react').ForwardRefExoticComponent<StereoScatterViewportProps & import('react').RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,41 @@
1
+ import { jsxs as o, jsx as e } from "react/jsx-runtime";
2
+ import { createComponent as d } from "../../../../lib/primitives/create-component.js";
3
+ import { cn as u } from "../../../../lib/utils.js";
4
+ import { useImpactNovaI18n as f } from "../../../../i18n/use-impact-nova-i18n.js";
5
+ import { stereoScatterViewportVariants as T } from "../stereo-scatter.variants.js";
6
+ import { useStereoScatterContext as h } from "./stereo-scatter-context.js";
7
+ import { StereoScatterKey as v } from "./stereo-scatter-key.js";
8
+ import { StereoScatterScene as C } from "./stereo-scatter-scene.js";
9
+ import { StereoScatterTooltip as E } from "./stereo-scatter-tooltip.js";
10
+ const w = 440, R = d(
11
+ "StereoScatterViewport",
12
+ ({ className: s, height: a = w, style: c, children: i, ...m }, n) => {
13
+ const { t: l } = f(), { variant: r, model: p, hiddenClusterIds: S } = h();
14
+ return /* @__PURE__ */ o(
15
+ "div",
16
+ {
17
+ ref: n,
18
+ "data-component": "stereo-scatter-viewport",
19
+ "data-variant": r,
20
+ className: u(T({ variant: r }), s),
21
+ style: { height: a, ...c },
22
+ ...m,
23
+ children: [
24
+ /* @__PURE__ */ e(C, {}),
25
+ /* @__PURE__ */ e(v, {}),
26
+ /* @__PURE__ */ e(E, {}),
27
+ /* @__PURE__ */ e("ul", { className: "sr-only", children: p.clusters.filter((t) => !S.includes(t.cluster.id)).map((t) => /* @__PURE__ */ o("li", { "data-testid": "stereo-scatter-cluster-summary", children: [
28
+ t.cluster.label,
29
+ ": ",
30
+ l("stereoScatter.storeCount", { count: t.nodes.length })
31
+ ] }, t.cluster.id)) }),
32
+ i
33
+ ]
34
+ }
35
+ );
36
+ }
37
+ );
38
+ export {
39
+ w as STEREO_SCATTER_DEFAULT_HEIGHT,
40
+ R as StereoScatterViewport
41
+ };
@@ -0,0 +1,12 @@
1
+ import { StereoScatterProps } from './stereo-scatter.types';
2
+ import * as React from "react";
3
+ export type { StereoScatterAxis, StereoScatterCluster, StereoScatterHover, StereoScatterLegendProps, StereoScatterPoint, StereoScatterProps, StereoScatterTarget, StereoScatterTooltipProps, StereoScatterVariant, StereoScatterView, StereoScatterViewportProps, } from './stereo-scatter.types';
4
+ export { StereoScatterLegend } from './internals/stereo-scatter-legend';
5
+ export { StereoScatterViewport } from './internals/stereo-scatter-viewport';
6
+ export { StereoScatterTooltip } from './internals/stereo-scatter-tooltip';
7
+ /**
8
+ * Stereochemistry-inspired 3D cluster scatter: stores bond to their cluster centroid with
9
+ * wedge (toward the viewer) and hashed (away) bonds, rendered in WebGL.
10
+ */
11
+ declare const StereoScatter: React.ForwardRefExoticComponent<StereoScatterProps & React.RefAttributes<HTMLDivElement>>;
12
+ export { StereoScatter };
@@ -0,0 +1,107 @@
1
+ import { jsx as s, jsxs as Z, Fragment as q } from "react/jsx-runtime";
2
+ import * as t from "react";
3
+ import { useControllableState as h } from "@radix-ui/react-use-controllable-state";
4
+ import { createComponent as z } from "../../../lib/primitives/create-component.js";
5
+ import { cn as B } from "../../../lib/utils.js";
6
+ import { useImpactNovaI18n as G } from "../../../i18n/use-impact-nova-i18n.js";
7
+ import { stereoScatterRootVariants as J } from "./stereo-scatter.variants.js";
8
+ import { formatCompactNumber as K } from "./internals/stereo-math.js";
9
+ import { buildStereoModel as Q } from "./internals/stereo-model.js";
10
+ import { StereoScatterProvider as W } from "./internals/stereo-scatter-context.js";
11
+ import { StereoScatterLegend as $ } from "./internals/stereo-scatter-legend.js";
12
+ import { StereoScatterViewport as A } from "./internals/stereo-scatter-viewport.js";
13
+ const ee = [], te = [], I = [];
14
+ function m(o, l) {
15
+ return { label: o?.label ?? l, format: o?.formatValue ?? K };
16
+ }
17
+ const fe = z(
18
+ "StereoScatter",
19
+ ({
20
+ className: o,
21
+ children: l,
22
+ variant: n = "molecule",
23
+ points: d = ee,
24
+ clusters: u = te,
25
+ xAxis: i,
26
+ yAxis: f,
27
+ zAxis: p,
28
+ height: b,
29
+ hiddenClusterIds: g,
30
+ defaultHiddenClusterIds: v = I,
31
+ onHiddenClusterIdsChange: M,
32
+ focusedClusterId: P,
33
+ defaultFocusedClusterId: L = null,
34
+ onFocusedClusterIdChange: T,
35
+ autoRotate: E = !1,
36
+ defaultView: H = "iso",
37
+ onPointClick: N,
38
+ "aria-label": Y,
39
+ ...R
40
+ }, V) => {
41
+ const { t: _ } = G(), [j, S] = h({
42
+ prop: g,
43
+ defaultProp: v,
44
+ onChange: M
45
+ }), [a, c] = h({
46
+ prop: P,
47
+ defaultProp: L,
48
+ onChange: T
49
+ }), [x, F] = t.useState(null), [k, w] = t.useState(null), C = n === "molecule" || n === "crystal" ? "tight" : "nice", y = t.useMemo(
50
+ () => Q(d, u, C),
51
+ [d, u, C]
52
+ ), D = t.useMemo(
53
+ () => ({
54
+ x: m(i, "X"),
55
+ y: m(f, "Y"),
56
+ z: m(p, "Z")
57
+ }),
58
+ [i, f, p]
59
+ ), e = j ?? I, O = t.useCallback(
60
+ (r) => {
61
+ const U = e.includes(r) ? e.filter((X) => X !== r) : [...e, r];
62
+ S(U), a === r && c(null);
63
+ },
64
+ [a, e, c, S]
65
+ );
66
+ return /* @__PURE__ */ s(
67
+ W,
68
+ {
69
+ value: {
70
+ variant: n,
71
+ model: y,
72
+ axes: D,
73
+ hiddenClusterIds: e,
74
+ toggleCluster: O,
75
+ focusedClusterId: a ?? null,
76
+ setFocusedClusterId: c,
77
+ legendHoverClusterId: x,
78
+ setLegendHoverClusterId: F,
79
+ hover: k,
80
+ setHover: w,
81
+ autoRotate: E,
82
+ defaultView: H,
83
+ onPointClick: N,
84
+ chartLabel: Y ?? _("stereoScatter.chartLabel")
85
+ },
86
+ children: /* @__PURE__ */ s(
87
+ "div",
88
+ {
89
+ ref: V,
90
+ "data-component": "stereo-scatter",
91
+ className: B(J(), o),
92
+ ...R,
93
+ children: l ?? /* @__PURE__ */ Z(q, { children: [
94
+ /* @__PURE__ */ s(A, { height: b }),
95
+ /* @__PURE__ */ s($, {})
96
+ ] })
97
+ }
98
+ )
99
+ }
100
+ );
101
+ }
102
+ );
103
+ export {
104
+ fe as StereoScatter,
105
+ $ as StereoScatterLegend,
106
+ A as StereoScatterViewport
107
+ };
@@ -0,0 +1,11 @@
1
+ import { StereoScatterAxis, StereoScatterCluster, StereoScatterPoint } from './stereo-scatter.types';
2
+ export declare const PERFORMANCE_CLUSTERS: StereoScatterCluster[];
3
+ export declare const PERFORMANCE_POINTS: StereoScatterPoint[];
4
+ export declare const DENSE_CLUSTERS: StereoScatterCluster[];
5
+ export declare const DENSE_POINTS: StereoScatterPoint[];
6
+ export declare function formatCurrency(value: number): string;
7
+ export declare function formatRatio(value: number): string;
8
+ export declare const GROSS_MARGIN_AXIS: StereoScatterAxis;
9
+ export declare const REVENUE_AXIS: StereoScatterAxis;
10
+ export declare const GMROI_AXIS: StereoScatterAxis;
11
+ export declare const PERFORMANCE_INSIGHT = "BnM Auckland leads total scale at ~$439k GM across 15 stores, while Canterbury and BnM 1 out-earn it per store with the strongest GMROI. South Canterbury is the smallest molecule \u2014 keep it lean pending validation.";
@@ -0,0 +1,69 @@
1
+ import type * as React from "react";
2
+ /**
3
+ * Both variants draw the same axis frame (floor grid, back-wall gridlines, X/Y/Z rods with ticks).
4
+ * - `molecule` — ball-and-stick: each cluster is a molecule, stores bond to its centroid
5
+ * with wedge (toward you) / hash (away) bonds that flip as the camera orbits.
6
+ * - `crystal` — each cluster is a translucent convex volume, so overlap and separation read at a glance.
7
+ */
8
+ export type StereoScatterVariant = "molecule" | "crystal";
9
+ export type StereoScatterView = "iso" | "front" | "top" | "side";
10
+ export interface StereoScatterAxis {
11
+ label: string;
12
+ formatValue?: (value: number) => string;
13
+ }
14
+ export interface StereoScatterPoint {
15
+ id: string;
16
+ label: string;
17
+ clusterId: string;
18
+ x: number;
19
+ y: number;
20
+ z: number;
21
+ }
22
+ export interface StereoScatterCluster {
23
+ id: string;
24
+ label: string;
25
+ /** CSS color. Defaults to the chart palette slot for the cluster index. */
26
+ color?: string;
27
+ }
28
+ export type StereoScatterTarget = {
29
+ type: "point";
30
+ id: string;
31
+ } | {
32
+ type: "cluster";
33
+ id: string;
34
+ };
35
+ export interface StereoScatterHover {
36
+ target: StereoScatterTarget;
37
+ /** Pointer position relative to the viewport. */
38
+ x: number;
39
+ y: number;
40
+ viewportWidth: number;
41
+ viewportHeight: number;
42
+ }
43
+ export interface StereoScatterProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
44
+ variant?: StereoScatterVariant;
45
+ points?: StereoScatterPoint[];
46
+ clusters?: StereoScatterCluster[];
47
+ xAxis?: StereoScatterAxis;
48
+ yAxis?: StereoScatterAxis;
49
+ zAxis?: StereoScatterAxis;
50
+ /** Plot height in px. Width follows the container. */
51
+ height?: number;
52
+ hiddenClusterIds?: string[];
53
+ defaultHiddenClusterIds?: string[];
54
+ onHiddenClusterIdsChange?: (hiddenClusterIds: string[]) => void;
55
+ /** Cluster isolated by clicking its centroid or legend focus. `null` clears focus. */
56
+ focusedClusterId?: string | null;
57
+ defaultFocusedClusterId?: string | null;
58
+ onFocusedClusterIdChange?: (clusterId: string | null) => void;
59
+ /** Slow idle spin. Ignored with reduced motion. */
60
+ autoRotate?: boolean;
61
+ defaultView?: StereoScatterView;
62
+ onPointClick?: (point: StereoScatterPoint) => void;
63
+ "aria-label"?: string;
64
+ }
65
+ export interface StereoScatterViewportProps extends React.HTMLAttributes<HTMLDivElement> {
66
+ height?: number;
67
+ }
68
+ export type StereoScatterLegendProps = React.HTMLAttributes<HTMLDivElement>;
69
+ export type StereoScatterTooltipProps = React.HTMLAttributes<HTMLDivElement>;
@@ -0,0 +1,13 @@
1
+ export declare const stereoScatterRootVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
2
+ export declare const stereoScatterViewportVariants: (props?: ({
3
+ variant?: "molecule" | "crystal" | null | undefined;
4
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
5
+ export declare const stereoScatterLegendVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
6
+ export declare const stereoScatterLegendItemVariants: (props?: ({
7
+ hidden?: boolean | null | undefined;
8
+ dimmed?: boolean | null | undefined;
9
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
10
+ export declare const stereoScatterToolbarVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
11
+ export declare const stereoScatterToolbarButtonVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
12
+ export declare const stereoScatterKeyVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
13
+ export declare const stereoScatterTooltipVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
@@ -0,0 +1,42 @@
1
+ import { cva as e } from "class-variance-authority";
2
+ const o = e("flex w-full min-w-0 flex-col gap-3"), r = e(
3
+ "relative isolate w-full min-w-0 overflow-hidden rounded-lg border border-stroke-hairline select-none focus-within:outline-none",
4
+ {
5
+ variants: {
6
+ variant: {
7
+ molecule: "bg-[radial-gradient(120%_95%_at_50%_0%,var(--color-surface-elevated)_0%,var(--color-surface-elevated)_45%,var(--color-surface-muted)_100%)]",
8
+ crystal: "bg-[radial-gradient(110%_90%_at_50%_10%,var(--color-surface-elevated)_0%,var(--color-primary-soft)_100%)]"
9
+ }
10
+ },
11
+ defaultVariants: { variant: "molecule" }
12
+ }
13
+ ), a = e(
14
+ "flex max-h-[76px] w-full flex-wrap items-center justify-center gap-x-4 gap-y-1.5 overflow-y-auto px-1"
15
+ ), n = e(
16
+ "inline-flex items-center gap-1.5 rounded-sm text-xs font-medium leading-4 text-secondary-foreground transition-opacity focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring motion-reduce:transition-none",
17
+ {
18
+ variants: {
19
+ hidden: { true: "opacity-40 line-through", false: "opacity-100" },
20
+ dimmed: { true: "opacity-45", false: "" }
21
+ },
22
+ defaultVariants: { hidden: !1, dimmed: !1 }
23
+ }
24
+ ), i = e(
25
+ "absolute bottom-3 end-3 z-[2] flex h-9 items-center gap-0.5 rounded-full border border-stroke bg-canvas-elevated p-1 shadow-elevation-floating"
26
+ ), s = e(
27
+ "inline-flex h-7 min-w-7 items-center justify-center rounded-full px-1.5 text-xs font-semibold leading-4 text-secondary-foreground hover:bg-canvas-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring aria-pressed:bg-brand-tint aria-pressed:text-brand motion-reduce:transition-none"
28
+ ), l = e(
29
+ "pointer-events-none absolute start-3 top-3 z-[2] flex max-w-[60%] flex-col gap-1 rounded-lg border border-stroke-hairline bg-canvas-elevated px-2.5 py-2 text-[11px] font-medium leading-4 text-content-secondary shadow-elevation-card"
30
+ ), d = e(
31
+ "pointer-events-none absolute z-20 flex min-w-[200px] max-w-[260px] flex-col gap-1.5 rounded-lg border border-stroke bg-canvas-elevated px-3 py-2.5 shadow-elevation-card"
32
+ );
33
+ export {
34
+ l as stereoScatterKeyVariants,
35
+ n as stereoScatterLegendItemVariants,
36
+ a as stereoScatterLegendVariants,
37
+ o as stereoScatterRootVariants,
38
+ s as stereoScatterToolbarButtonVariants,
39
+ i as stereoScatterToolbarVariants,
40
+ d as stereoScatterTooltipVariants,
41
+ r as stereoScatterViewportVariants
42
+ };
@@ -9,9 +9,11 @@ export interface ButtonIconTooltipProps {
9
9
  variant?: TooltipContentProps["variant"];
10
10
  keybinding?: KeyBinding;
11
11
  disabled?: boolean;
12
+ open?: boolean;
13
+ onOpenChange?: (open: boolean) => void;
12
14
  }
13
15
  /**
14
16
  * Wraps icon buttons with tooltip + optional Kbd badge.
15
17
  * Use at app/feature layer — keeps Button free of feedback imports.
16
18
  */
17
- export declare function ButtonIconTooltip({ children, label, side, align, variant, keybinding, disabled, }: ButtonIconTooltipProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function ButtonIconTooltip({ children, label, side, align, variant, keybinding, disabled, open, onOpenChange, }: ButtonIconTooltipProps): import("react/jsx-runtime").JSX.Element;
@@ -1,25 +1,28 @@
1
- import { jsxs as i, jsx as t } from "react/jsx-runtime";
1
+ import { jsxs as i, jsx as o } from "react/jsx-runtime";
2
2
  import "react";
3
- import { Kbd as c } from "../../primitives/kbd/kbd.js";
4
- import { Tooltip as l, TooltipTrigger as a, TooltipContent as f } from "./tooltip.js";
5
- function h({
6
- children: o,
7
- label: r,
8
- side: n = "top",
9
- align: p = "center",
10
- variant: s = "tertiary",
11
- keybinding: e,
12
- disabled: m
3
+ import { Kbd as a } from "../../primitives/kbd/kbd.js";
4
+ import { Tooltip as d, TooltipTrigger as f, TooltipContent as u } from "./tooltip.js";
5
+ function j({
6
+ children: t,
7
+ label: n,
8
+ side: s = "top",
9
+ align: l = "center",
10
+ variant: p = "tertiary",
11
+ keybinding: r,
12
+ disabled: c,
13
+ open: e,
14
+ onOpenChange: m
13
15
  }) {
14
- return r ? /* @__PURE__ */ i(l, { children: [
15
- /* @__PURE__ */ t(a, { asChild: !0, children: m ? /* @__PURE__ */ t("span", { tabIndex: -1, className: "inline-block outline-none", children: o }) : o }),
16
- /* @__PURE__ */ t(f, { variant: s, side: n, align: p, children: e ? /* @__PURE__ */ i("span", { className: "flex items-center gap-2", children: [
17
- r,
16
+ return n ? /* @__PURE__ */ i(d, { ...e !== void 0 ? { open: e, onOpenChange: m ?? (() => {
17
+ }) } : {}, children: [
18
+ /* @__PURE__ */ o(f, { asChild: !0, children: c ? /* @__PURE__ */ o("span", { tabIndex: -1, className: "inline-block outline-none", children: t }) : t }),
19
+ /* @__PURE__ */ o(u, { variant: p, side: s, align: l, children: r ? /* @__PURE__ */ i("span", { className: "flex items-center gap-2", children: [
20
+ n,
18
21
  " ",
19
- /* @__PURE__ */ t(c, { keybinding: e, size: "sm" })
20
- ] }) : r })
21
- ] }) : o;
22
+ /* @__PURE__ */ o(a, { keybinding: r, size: "sm" })
23
+ ] }) : n })
24
+ ] }) : t;
22
25
  }
23
26
  export {
24
- h as ButtonIconTooltip
27
+ j as ButtonIconTooltip
25
28
  };
@@ -0,0 +1,5 @@
1
+ export declare function IrisChatComposerVoiceCapture(props: {
2
+ transcript: string;
3
+ onStop: () => void;
4
+ className?: string;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,73 @@
1
+ import { jsxs as a, jsx as e } from "react/jsx-runtime";
2
+ import { Button as n } from "../../primitives/button/button.js";
3
+ import { useImpactNovaI18n as o } from "../../../i18n/use-impact-nova-i18n.js";
4
+ import { cn as s } from "../../../lib/utils.js";
5
+ import { IrisChatStopIcon as c } from "./iris-chat-icons.js";
6
+ import { IrisChatVoiceWaveform as l } from "./IrisChatVoiceWaveform.js";
7
+ function x(i) {
8
+ const { t } = o(), r = i.transcript.trim();
9
+ return /* @__PURE__ */ a(
10
+ "div",
11
+ {
12
+ "data-component": "iris-chat-voice-capture",
13
+ "data-testid": "iris-chat-voice-capture",
14
+ className: s("flex w-full min-w-0 flex-col gap-3 py-1", i.className),
15
+ role: "region",
16
+ "aria-label": t("irisChat.listening"),
17
+ children: [
18
+ /* @__PURE__ */ a("div", { className: "flex min-w-0 items-center gap-2", children: [
19
+ /* @__PURE__ */ e(
20
+ "span",
21
+ {
22
+ className: "size-2.5 shrink-0 rounded-full bg-destructive motion-reduce:animate-none animate-pulse",
23
+ "aria-hidden": !0
24
+ }
25
+ ),
26
+ /* @__PURE__ */ e("p", { className: "min-w-0 flex-1 text-sm font-medium text-content", children: t("irisChat.speechRecordingTitle") }),
27
+ /* @__PURE__ */ e(
28
+ n,
29
+ {
30
+ type: "button",
31
+ variant: "default",
32
+ size: "icon",
33
+ className: "size-9 shrink-0 rounded-full bg-destructive text-destructive-foreground hover:bg-destructive-hover",
34
+ "data-testid": "iris-chat-stop-recording",
35
+ "aria-label": t("irisChat.speechStopRecording"),
36
+ onClick: i.onStop,
37
+ children: /* @__PURE__ */ e(c, { size: 16 })
38
+ }
39
+ )
40
+ ] }),
41
+ /* @__PURE__ */ e(l, { className: "w-full px-1" }),
42
+ /* @__PURE__ */ e("p", { className: "text-center text-xs text-content-secondary", children: t("irisChat.speechRecordingHint") }),
43
+ /* @__PURE__ */ e(
44
+ "p",
45
+ {
46
+ className: s(
47
+ "min-h-5 text-center text-sm text-content-secondary",
48
+ r.length > 0 && "font-medium text-content"
49
+ ),
50
+ role: "status",
51
+ "aria-live": "polite",
52
+ children: r.length > 0 ? r : t("irisChat.speechRecordingWaiting")
53
+ }
54
+ ),
55
+ /* @__PURE__ */ e(
56
+ n,
57
+ {
58
+ type: "button",
59
+ variant: "outline",
60
+ size: "sm",
61
+ className: "w-full",
62
+ "aria-label": t("irisChat.speechStopRecording"),
63
+ onClick: i.onStop,
64
+ children: t("irisChat.speechStopRecording")
65
+ }
66
+ )
67
+ ]
68
+ }
69
+ );
70
+ }
71
+ export {
72
+ x as IrisChatComposerVoiceCapture
73
+ };
@@ -0,0 +1,3 @@
1
+ export declare function IrisChatVoiceWaveform(props: {
2
+ className?: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { cn as o } from "../../../lib/utils.js";
3
+ const t = 7;
4
+ function c(r) {
5
+ return /* @__PURE__ */ a(
6
+ "div",
7
+ {
8
+ "data-component": "iris-chat-voice-waveform",
9
+ className: o("flex h-14 w-full items-end justify-center gap-1.5", r.className),
10
+ "aria-hidden": !0,
11
+ children: Array.from({ length: t }, (n, e) => /* @__PURE__ */ a(
12
+ "span",
13
+ {
14
+ "data-part": "bar",
15
+ className: "block h-10 w-2 max-w-[0.65rem] flex-1 rounded-full bg-brand motion-reduce:animate-none motion-reduce:opacity-80",
16
+ style: { animationDelay: `${e * 100}ms` }
17
+ },
18
+ e
19
+ ))
20
+ }
21
+ );
22
+ }
23
+ export {
24
+ c as IrisChatVoiceWaveform
25
+ };
@@ -1,5 +1,7 @@
1
1
  export { IrisChat, IrisChatBody, IrisChatDisclaimer, IrisChatFooter, IrisChatHeader, IrisChatHeaderBackButton, IrisChatHeaderCloseButton, IrisChatHeaderLeading, IrisChatHeaderMenuButton, IrisChatHeaderMinimizeButton, IrisChatHeaderNewChatButton, IrisChatHeaderTitle, IrisChatHeaderTrailing, IrisChatIconButton, IrisChatPanel, IrisChatTrigger, } from './iris-chat';
2
2
  export { IrisChatComposer } from './iris-chat-composer';
3
+ export { createCompactIrisChatFrame, createDefaultIrisChatFrame, clampIrisChatFrame, } from './iris-chat-frame';
4
+ export type { IrisChatFrame } from './iris-chat-frame';
3
5
  export { IrisChatActions, IrisChatAttachment, IrisChatChip, IrisChatDay, IrisChatError, IrisChatFollowUp, IrisChatFollowUps, IrisChatGreeting, IrisChatMessage, IrisChatSuggestion, IrisChatSuggestions, IrisChatThread, IrisChatWorkflow, IrisChatWorkflows, } from './iris-chat-thread';
4
6
  export { IrisChatCitations, IrisChatProcessSteps, IrisChatThinking, IrisChatThinkingStatus, } from './iris-chat-thinking';
5
7
  export { IrisChatMarkdown } from './iris-chat-markdown';
@@ -7,4 +9,4 @@ export { IrisChatPrompt } from './iris-chat-prompt';
7
9
  export { IrisChatArtifact, IrisChatScenario } from './iris-chat-artifact';
8
10
  export { IrisChatList, IrisChatListItem, IrisChatMenu, IrisChatMenuSection, } from './iris-chat-menu';
9
11
  export { useIrisChat } from './iris-chat-context';
10
- export type { IrisChatActionsProps, IrisChatArtifactColumn, IrisChatArtifactProps, IrisChatArtifactRow, IrisChatAttachmentKind, IrisChatAttachmentProps, IrisChatCitationGroup, IrisChatCitationTag, IrisChatCitationsProps, IrisChatErrorProps, IrisChatComposerProps, IrisChatDisclaimerProps, IrisChatFooterProps, IrisChatFeedback, IrisChatFeedbackReason, IrisChatFilterOption, IrisChatGreetingProps, IrisChatHeaderProps, IrisChatListItemAction, IrisChatListItemProps, IrisChatMarkdownProps, IrisChatMenuSectionId, IrisChatMessageProps, IrisChatModelOption, IrisChatPanelProps, IrisChatPlacement, IrisChatProcessStep, IrisChatProcessStepsProps, IrisChatPromptProps, IrisChatProps, IrisChatRole, IrisChatScenarioProps, } from './iris-chat.types';
12
+ export type { IrisChatActionsProps, IrisChatArtifactColumn, IrisChatArtifactProps, IrisChatArtifactRow, IrisChatAttachmentKind, IrisChatAttachmentProps, IrisChatCitationGroup, IrisChatCitationTag, IrisChatCitationsProps, IrisChatErrorProps, IrisChatComposerProps, IrisChatDisclaimerProps, IrisChatFooterProps, IrisChatFeedback, IrisChatFeedbackReason, IrisChatFilterOption, IrisChatGreetingProps, IrisChatHeaderProps, IrisChatListItemAction, IrisChatListItemProps, IrisChatMarkdownProps, IrisChatMenuSectionId, IrisChatMessageProps, IrisChatModelOption, IrisChatPanelProps, IrisChatPlacement, IrisChatProcessStep, IrisChatProcessStepsProps, IrisChatPromptProps, IrisChatProps, IrisChatRole, IrisChatScenarioProps, IrisChatSpeechNotice, } from './iris-chat.types';