@newco-ai-platform/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,221 @@
1
+ 'use strict';
2
+
3
+ // src/tokens/colors.ts
4
+ var colors = {
5
+ light: {
6
+ surface: "#f7f9ff",
7
+ surfaceCard: "#ffffff",
8
+ surfaceTint: "#edf4ff",
9
+ onSurface: "#0c1d2c",
10
+ onSurfaceMuted: "#5b6b7d",
11
+ onSurfaceDim: "#8893a3",
12
+ hairline: "rgba(91, 107, 125, 0.10)"
13
+ },
14
+ dark: {
15
+ surface: "#0F1219",
16
+ surfaceCard: "#161B26",
17
+ surfaceTint: "#1A2030",
18
+ onSurface: "#dce2f3",
19
+ onSurfaceMuted: "#8B92A1",
20
+ onSurfaceDim: "#5F6878",
21
+ hairline: "rgba(220, 226, 243, 0.08)"
22
+ },
23
+ state: {
24
+ /** Same hex as MERIDIAN accent — use ONLY for status, not as a product signal. */
25
+ ok: "#2E8A6B",
26
+ /** Same hex as CATALYST accent — same constraint. */
27
+ warn: "#C28A2E",
28
+ /** Reserved for true errors. Kill switches use the product accent, never red. */
29
+ err: "#BA1A1A"
30
+ }
31
+ };
32
+
33
+ // src/tokens/typography.ts
34
+ var fontFamilies = {
35
+ manrope: `'Manrope', system-ui, sans-serif`,
36
+ inter: `'Inter', system-ui, sans-serif`,
37
+ jetbrainsMono: `'JetBrains Mono', ui-monospace, monospace`
38
+ };
39
+ var typography = {
40
+ displayLg: {
41
+ fontFamily: fontFamilies.manrope,
42
+ fontSize: 64,
43
+ fontWeight: 700,
44
+ lineHeight: 1.05,
45
+ letterSpacing: "-0.025em",
46
+ tabularNums: true
47
+ },
48
+ displayMd: {
49
+ fontFamily: fontFamilies.manrope,
50
+ fontSize: 48,
51
+ fontWeight: 700,
52
+ lineHeight: 1.1,
53
+ letterSpacing: "-0.02em",
54
+ tabularNums: true
55
+ },
56
+ pageTitle: {
57
+ fontFamily: fontFamilies.manrope,
58
+ fontSize: 38,
59
+ fontWeight: 700,
60
+ lineHeight: 1.1,
61
+ letterSpacing: "-0.02em"
62
+ },
63
+ headlineMd: {
64
+ fontFamily: fontFamilies.manrope,
65
+ fontSize: 20,
66
+ fontWeight: 600,
67
+ lineHeight: 1.25
68
+ },
69
+ bodyMd: {
70
+ fontFamily: fontFamilies.inter,
71
+ fontSize: 16,
72
+ fontWeight: 400,
73
+ lineHeight: 1.5
74
+ },
75
+ bodySm: {
76
+ fontFamily: fontFamilies.inter,
77
+ fontSize: 14,
78
+ fontWeight: 400,
79
+ lineHeight: 1.5
80
+ },
81
+ labelSm: {
82
+ fontFamily: fontFamilies.inter,
83
+ fontSize: 12,
84
+ fontWeight: 600,
85
+ lineHeight: 1.2,
86
+ letterSpacing: "0.06em",
87
+ textTransform: "uppercase"
88
+ },
89
+ mono: {
90
+ fontFamily: fontFamilies.jetbrainsMono,
91
+ fontSize: 13,
92
+ fontWeight: 400,
93
+ lineHeight: 22 / 13,
94
+ tabularNums: true
95
+ },
96
+ monoSm: {
97
+ fontFamily: fontFamilies.jetbrainsMono,
98
+ fontSize: 12,
99
+ fontWeight: 400,
100
+ lineHeight: 18 / 12,
101
+ tabularNums: true
102
+ }
103
+ };
104
+
105
+ // src/tokens/spacing.ts
106
+ var spacing = {
107
+ unit: 8,
108
+ container: 1200,
109
+ gutter: 32,
110
+ containerPadding: 24,
111
+ rows: {
112
+ neuron: 22,
113
+ meridian: 28
114
+ }
115
+ };
116
+ var shadows = {
117
+ card: "0 1px 2px rgba(12, 29, 44, 0.04), 0 4px 16px rgba(12, 29, 44, 0.04)",
118
+ level2: "0 4px 16px rgba(12, 29, 44, 0.08)",
119
+ backdropBlur: "blur(12px)"
120
+ };
121
+
122
+ // src/tokens/motion.ts
123
+ var motion = {
124
+ durations: {
125
+ fast: 150,
126
+ base: 250,
127
+ slow: 400,
128
+ anchor: 1e4
129
+ },
130
+ easings: {
131
+ standard: "cubic-bezier(0.4, 0, 0.2, 1)",
132
+ decelerate: "cubic-bezier(0, 0, 0.2, 1)",
133
+ accelerate: "cubic-bezier(0.4, 0, 1, 1)"
134
+ },
135
+ reducedMotionQuery: "(prefers-reduced-motion: reduce)"
136
+ };
137
+ function prefersReducedMotion() {
138
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
139
+ return false;
140
+ }
141
+ return window.matchMedia(motion.reducedMotionQuery).matches;
142
+ }
143
+
144
+ // src/tokens/productAccents.ts
145
+ var productAccents = {
146
+ prism: {
147
+ key: "prism",
148
+ displayName: "PRISM",
149
+ hex: "#4F6BED",
150
+ tint: "rgba(79, 107, 237, 0.08)",
151
+ strong: "rgba(79, 107, 237, 0.18)",
152
+ hue: 230,
153
+ role: "Cool Blue \u2014 discovery, process mining, clarity"
154
+ },
155
+ neuron: {
156
+ key: "neuron",
157
+ displayName: "NEURON",
158
+ hex: "#7C4FE0",
159
+ tint: "rgba(124, 79, 224, 0.08)",
160
+ strong: "rgba(124, 79, 224, 0.18)",
161
+ hue: 260,
162
+ role: "Violet \u2014 orchestration, intelligence"
163
+ },
164
+ vault: {
165
+ key: "vault",
166
+ displayName: "VAULT",
167
+ hex: "#5B6B7D",
168
+ tint: "rgba(91, 107, 125, 0.08)",
169
+ strong: "rgba(91, 107, 125, 0.18)",
170
+ hue: 215,
171
+ role: "Slate \u2014 sovereignty, compliance (narrow saturation, quiet)"
172
+ },
173
+ catalyst: {
174
+ key: "catalyst",
175
+ displayName: "CATALYST",
176
+ hex: "#C28A2E",
177
+ tint: "rgba(194, 138, 46, 0.08)",
178
+ strong: "rgba(194, 138, 46, 0.18)",
179
+ hue: 36,
180
+ role: "Amber \u2014 reuse, acceleration (the only warm accent)"
181
+ },
182
+ meridian: {
183
+ key: "meridian",
184
+ displayName: "MERIDIAN",
185
+ hex: "#2E8A6B",
186
+ tint: "rgba(46, 138, 107, 0.08)",
187
+ strong: "rgba(46, 138, 107, 0.18)",
188
+ hue: 145,
189
+ role: "Emerald \u2014 outcome intelligence, EBITDA"
190
+ }
191
+ };
192
+ var productAccentList = [
193
+ productAccents.prism,
194
+ productAccents.neuron,
195
+ productAccents.vault,
196
+ productAccents.catalyst,
197
+ productAccents.meridian
198
+ ];
199
+
200
+ // src/tokens/dataViz.ts
201
+ var dataViz = {
202
+ positiveDelta: "#2E8A6B",
203
+ negativeDelta: "#BA1A1A",
204
+ neutralDelta: "#5b6b7d",
205
+ strokeWidth: 1.5,
206
+ axis: "rgba(91, 107, 125, 0.10)",
207
+ grid: "rgba(91, 107, 125, 0.05)"
208
+ };
209
+
210
+ exports.colors = colors;
211
+ exports.dataViz = dataViz;
212
+ exports.fontFamilies = fontFamilies;
213
+ exports.motion = motion;
214
+ exports.prefersReducedMotion = prefersReducedMotion;
215
+ exports.productAccentList = productAccentList;
216
+ exports.productAccents = productAccents;
217
+ exports.shadows = shadows;
218
+ exports.spacing = spacing;
219
+ exports.typography = typography;
220
+ //# sourceMappingURL=index.cjs.map
221
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/colors.ts","../src/tokens/typography.ts","../src/tokens/spacing.ts","../src/tokens/motion.ts","../src/tokens/productAccents.ts","../src/tokens/dataViz.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Color tokens — Luminous Multi-Signal\n *\n * Light is the suite-wide default. Dark is a per-user opt-in peer (DESIGN.md §\n * Dark-mode activation rule). No per-route or per-product auto-switching.\n *\n * The No-Line Rule is enforced via tonal lift, not borders — see `shadows` in\n * `./spacing.ts`. Use `hairline` only for row separation inside a single card.\n */\n\nexport interface ColorTheme {\n readonly surface: string;\n readonly surfaceCard: string;\n readonly surfaceTint: string;\n readonly onSurface: string;\n readonly onSurfaceMuted: string;\n readonly onSurfaceDim: string;\n readonly hairline: string;\n}\n\nexport interface ColorTokens {\n readonly light: ColorTheme;\n readonly dark: ColorTheme;\n /** Status colors — same value across themes. */\n readonly state: {\n readonly ok: string;\n readonly warn: string;\n readonly err: string;\n };\n}\n\nexport const colors: ColorTokens = {\n light: {\n surface: '#f7f9ff',\n surfaceCard: '#ffffff',\n surfaceTint: '#edf4ff',\n onSurface: '#0c1d2c',\n onSurfaceMuted: '#5b6b7d',\n onSurfaceDim: '#8893a3',\n hairline: 'rgba(91, 107, 125, 0.10)',\n },\n dark: {\n surface: '#0F1219',\n surfaceCard: '#161B26',\n surfaceTint: '#1A2030',\n onSurface: '#dce2f3',\n onSurfaceMuted: '#8B92A1',\n onSurfaceDim: '#5F6878',\n hairline: 'rgba(220, 226, 243, 0.08)',\n },\n state: {\n /** Same hex as MERIDIAN accent — use ONLY for status, not as a product signal. */\n ok: '#2E8A6B',\n /** Same hex as CATALYST accent — same constraint. */\n warn: '#C28A2E',\n /** Reserved for true errors. Kill switches use the product accent, never red. */\n err: '#BA1A1A',\n },\n};\n","/**\n * Typography tokens — Manrope (display/headlines), Inter (body/labels),\n * JetBrains Mono (data, hashes, timestamps).\n *\n * Hard rules from DESIGN.md:\n * - Body text never below 14px on interactive data surfaces.\n * - Display serifs (Cormorant Garamond et al.) are REFUSED — under-render at\n * the 13px data-table baseline.\n * - Mono is the \"signal\" font for audit-immutable content. If a value can be\n * hashed, copy-pasted, or appears in a chain — it's mono.\n */\n\nexport type FontFamily = 'manrope' | 'inter' | 'jetbrainsMono';\n\nexport const fontFamilies = {\n manrope: `'Manrope', system-ui, sans-serif`,\n inter: `'Inter', system-ui, sans-serif`,\n jetbrainsMono: `'JetBrains Mono', ui-monospace, monospace`,\n} as const;\n\nexport interface TypographyStyle {\n readonly fontFamily: string;\n /** px */\n readonly fontSize: number;\n /** CSS font-weight numeric */\n readonly fontWeight: number;\n /** unitless line-height multiplier */\n readonly lineHeight: number;\n /** CSS letter-spacing (em or px) */\n readonly letterSpacing?: string;\n readonly textTransform?: 'uppercase' | 'none';\n /** `true` enables `font-variant-numeric: tabular-nums` */\n readonly tabularNums?: boolean;\n}\n\nexport interface TypographyTokens {\n /** 64px Manrope 700 — hero KPI numbers (e.g. MERIDIAN +$1.2M). */\n readonly displayLg: TypographyStyle;\n /** 48px Manrope 700 — secondary display. */\n readonly displayMd: TypographyStyle;\n /** 38px Manrope 700 — h1 page titles only. */\n readonly pageTitle: TypographyStyle;\n /** 20px Manrope 600 — h2 section / card titles. */\n readonly headlineMd: TypographyStyle;\n /** 16px Inter 400 — primary body, narrative copy. */\n readonly bodyMd: TypographyStyle;\n /** 14px Inter 400 — secondary body, UI text. */\n readonly bodySm: TypographyStyle;\n /** 12px Inter 600 tracked caps — section labels, status pills, table headers. */\n readonly labelSm: TypographyStyle;\n /** 13px JetBrains Mono 400 — audit ledgers, run metadata, console body. */\n readonly mono: TypographyStyle;\n /** 12px JetBrains Mono 400 — mono labels, hash prefixes, timestamps. */\n readonly monoSm: TypographyStyle;\n}\n\nexport const typography: TypographyTokens = {\n displayLg: {\n fontFamily: fontFamilies.manrope,\n fontSize: 64,\n fontWeight: 700,\n lineHeight: 1.05,\n letterSpacing: '-0.025em',\n tabularNums: true,\n },\n displayMd: {\n fontFamily: fontFamilies.manrope,\n fontSize: 48,\n fontWeight: 700,\n lineHeight: 1.1,\n letterSpacing: '-0.02em',\n tabularNums: true,\n },\n pageTitle: {\n fontFamily: fontFamilies.manrope,\n fontSize: 38,\n fontWeight: 700,\n lineHeight: 1.1,\n letterSpacing: '-0.02em',\n },\n headlineMd: {\n fontFamily: fontFamilies.manrope,\n fontSize: 20,\n fontWeight: 600,\n lineHeight: 1.25,\n },\n bodyMd: {\n fontFamily: fontFamilies.inter,\n fontSize: 16,\n fontWeight: 400,\n lineHeight: 1.5,\n },\n bodySm: {\n fontFamily: fontFamilies.inter,\n fontSize: 14,\n fontWeight: 400,\n lineHeight: 1.5,\n },\n labelSm: {\n fontFamily: fontFamilies.inter,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.2,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n },\n mono: {\n fontFamily: fontFamilies.jetbrainsMono,\n fontSize: 13,\n fontWeight: 400,\n lineHeight: 22 / 13,\n tabularNums: true,\n },\n monoSm: {\n fontFamily: fontFamilies.jetbrainsMono,\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 18 / 12,\n tabularNums: true,\n },\n};\n","/**\n * Spacing + elevation tokens — 8px base grid.\n *\n * Per-product row density:\n * NEURON consoles + run-metadata tables → 22px rows (`rows.neuron`)\n * MERIDIAN ledgers + reviewer panels → 28px rows (`rows.meridian`)\n *\n * Shadows are the No-Line Rule's mechanism for sectioning — heavy drop\n * shadows are refused. Level 1 lift is ≤4% opacity. See DESIGN.md § No-Line.\n */\n\nexport interface SpacingTokens {\n /** 8 — base unit, all spacing is a multiple of this. */\n readonly unit: number;\n /** 1200 — max content container width (px). */\n readonly container: number;\n /** 32 — gutter between major regions (px). */\n readonly gutter: number;\n /** 24 — internal padding inside a page container (px). */\n readonly containerPadding: number;\n /** Per-product row heights (px). */\n readonly rows: {\n readonly neuron: 22;\n readonly meridian: 28;\n };\n}\n\nexport const spacing: SpacingTokens = {\n unit: 8,\n container: 1200,\n gutter: 32,\n containerPadding: 24,\n rows: {\n neuron: 22,\n meridian: 28,\n },\n};\n\nexport interface ShadowTokens {\n /** Level 1 — elevated cards. Tonal lift, NOT drop-shadow. */\n readonly card: string;\n /** Level 2 — temporary overlays (tooltips, dropdowns). */\n readonly level2: string;\n /** Backdrop blur for the luminous quality (used on Level 2). */\n readonly backdropBlur: string;\n}\n\nexport const shadows: ShadowTokens = {\n card: '0 1px 2px rgba(12, 29, 44, 0.04), 0 4px 16px rgba(12, 29, 44, 0.04)',\n level2: '0 4px 16px rgba(12, 29, 44, 0.08)',\n backdropBlur: 'blur(12px)',\n};\n","/**\n * Motion tokens — calm vigilance, not celebration.\n *\n * Hard rules from DESIGN.md § Motion principles:\n * - Convergent over divergent (5→1 compounding, not 1→5 fan-out).\n * - Pulse, blink, fade are acceptable; bursts/rotations/scale-zero are refused.\n * - `prefers-reduced-motion: reduce` is ALWAYS honored. Animations must\n * degrade to static states gracefully.\n */\n\nexport type Duration = 'fast' | 'base' | 'slow' | 'anchor';\nexport type Easing = 'standard' | 'decelerate' | 'accelerate';\n\nexport interface MotionTokens {\n /** Milliseconds. `anchor` is reserved for the marketing hero unlock cycle. */\n readonly durations: Record<Duration, number>;\n readonly easings: Record<Easing, string>;\n /** prefers-reduced-motion media query string. */\n readonly reducedMotionQuery: '(prefers-reduced-motion: reduce)';\n}\n\nexport const motion: MotionTokens = {\n durations: {\n fast: 150,\n base: 250,\n slow: 400,\n anchor: 10_000,\n },\n easings: {\n standard: 'cubic-bezier(0.4, 0, 0.2, 1)',\n decelerate: 'cubic-bezier(0, 0, 0.2, 1)',\n accelerate: 'cubic-bezier(0.4, 0, 1, 1)',\n },\n reducedMotionQuery: '(prefers-reduced-motion: reduce)',\n};\n\n/**\n * Runtime check — returns `true` if the user has requested reduced motion.\n * Safe to call from any consumer; returns `false` outside a browser context.\n */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia(motion.reducedMotionQuery).matches;\n}\n","/**\n * 5-signal palette — one accent per product, distributed at ~60° hue rotation\n * around a pristine cool-white base. Each product owns one signal; structure\n * (neutrals, typography, spacing, shape) is constant across all 5 products.\n *\n * The 5 accents appear together ONLY in MERIDIAN's cross-product Portfolio\n * chart. Inside a single product, only that product's accent is used.\n *\n * `tint` and `strong` are rgba surfaces derived from `hex`:\n * tint = hex @ 0.08 opacity → use for hover, focus, alt-row tints\n * strong = hex @ 0.18 opacity → use for outer rings on lit dots, focus halos\n */\n\nexport type ProductAccentKey =\n | 'prism'\n | 'neuron'\n | 'vault'\n | 'catalyst'\n | 'meridian';\n\nexport interface ProductAccent {\n readonly key: ProductAccentKey;\n readonly displayName: string;\n readonly hex: string;\n readonly tint: string;\n readonly strong: string;\n readonly hue: number;\n readonly role: string;\n}\n\nexport const productAccents: Record<ProductAccentKey, ProductAccent> = {\n prism: {\n key: 'prism',\n displayName: 'PRISM',\n hex: '#4F6BED',\n tint: 'rgba(79, 107, 237, 0.08)',\n strong: 'rgba(79, 107, 237, 0.18)',\n hue: 230,\n role: 'Cool Blue — discovery, process mining, clarity',\n },\n neuron: {\n key: 'neuron',\n displayName: 'NEURON',\n hex: '#7C4FE0',\n tint: 'rgba(124, 79, 224, 0.08)',\n strong: 'rgba(124, 79, 224, 0.18)',\n hue: 260,\n role: 'Violet — orchestration, intelligence',\n },\n vault: {\n key: 'vault',\n displayName: 'VAULT',\n hex: '#5B6B7D',\n tint: 'rgba(91, 107, 125, 0.08)',\n strong: 'rgba(91, 107, 125, 0.18)',\n hue: 215,\n role: 'Slate — sovereignty, compliance (narrow saturation, quiet)',\n },\n catalyst: {\n key: 'catalyst',\n displayName: 'CATALYST',\n hex: '#C28A2E',\n tint: 'rgba(194, 138, 46, 0.08)',\n strong: 'rgba(194, 138, 46, 0.18)',\n hue: 36,\n role: 'Amber — reuse, acceleration (the only warm accent)',\n },\n meridian: {\n key: 'meridian',\n displayName: 'MERIDIAN',\n hex: '#2E8A6B',\n tint: 'rgba(46, 138, 107, 0.08)',\n strong: 'rgba(46, 138, 107, 0.18)',\n hue: 145,\n role: 'Emerald — outcome intelligence, EBITDA',\n },\n};\n\n/** Iterable list of accents in customer-journey order: discover → orchestrate → secure → accelerate → measure. */\nexport const productAccentList: readonly ProductAccent[] = [\n productAccents.prism,\n productAccents.neuron,\n productAccents.vault,\n productAccents.catalyst,\n productAccents.meridian,\n];\n","/**\n * Data-viz palette — locked at Round 2 of Phase 1.\n *\n * Hard rule: the 5 product accents are used in charts ONLY in the cross-product\n * Portfolio chart (MERIDIAN `/engagements`). Inside a single product, charts use\n * the active product accent + the deltas/neutrals below.\n *\n * For 5-accent chart usage, import from `./productAccents.js`.\n */\n\nexport interface DataVizTokens {\n /** Up arrows, gains, attainment over baseline. Same hex as MERIDIAN. */\n readonly positiveDelta: string;\n /** Down arrows, losses, breach indicators. Same hex as `state.err`. */\n readonly negativeDelta: string;\n /** Zero deltas, \"no change\" series. Same hex as `onSurfaceMuted`. */\n readonly neutralDelta: string;\n /** Sparkline / primary series stroke width. */\n readonly strokeWidth: number;\n /** Axis lines — `hairline` value. */\n readonly axis: string;\n /** Grid lines — half-opacity of `axis`. */\n readonly grid: string;\n}\n\nexport const dataViz: DataVizTokens = {\n positiveDelta: '#2E8A6B',\n negativeDelta: '#BA1A1A',\n neutralDelta: '#5b6b7d',\n strokeWidth: 1.5,\n axis: 'rgba(91, 107, 125, 0.10)',\n grid: 'rgba(91, 107, 125, 0.05)',\n};\n"]}
@@ -0,0 +1 @@
1
+ export { ColorTheme, ColorTokens, DataVizTokens, Duration, Easing, FontFamily, MotionTokens, ProductAccent, ProductAccentKey, ShadowTokens, SpacingTokens, TypographyStyle, TypographyTokens, colors, dataViz, fontFamilies, motion, prefersReducedMotion, productAccentList, productAccents, shadows, spacing, typography } from './tokens/index.cjs';
@@ -0,0 +1 @@
1
+ export { ColorTheme, ColorTokens, DataVizTokens, Duration, Easing, FontFamily, MotionTokens, ProductAccent, ProductAccentKey, ShadowTokens, SpacingTokens, TypographyStyle, TypographyTokens, colors, dataViz, fontFamilies, motion, prefersReducedMotion, productAccentList, productAccents, shadows, spacing, typography } from './tokens/index.js';
package/dist/index.js ADDED
@@ -0,0 +1,210 @@
1
+ // src/tokens/colors.ts
2
+ var colors = {
3
+ light: {
4
+ surface: "#f7f9ff",
5
+ surfaceCard: "#ffffff",
6
+ surfaceTint: "#edf4ff",
7
+ onSurface: "#0c1d2c",
8
+ onSurfaceMuted: "#5b6b7d",
9
+ onSurfaceDim: "#8893a3",
10
+ hairline: "rgba(91, 107, 125, 0.10)"
11
+ },
12
+ dark: {
13
+ surface: "#0F1219",
14
+ surfaceCard: "#161B26",
15
+ surfaceTint: "#1A2030",
16
+ onSurface: "#dce2f3",
17
+ onSurfaceMuted: "#8B92A1",
18
+ onSurfaceDim: "#5F6878",
19
+ hairline: "rgba(220, 226, 243, 0.08)"
20
+ },
21
+ state: {
22
+ /** Same hex as MERIDIAN accent — use ONLY for status, not as a product signal. */
23
+ ok: "#2E8A6B",
24
+ /** Same hex as CATALYST accent — same constraint. */
25
+ warn: "#C28A2E",
26
+ /** Reserved for true errors. Kill switches use the product accent, never red. */
27
+ err: "#BA1A1A"
28
+ }
29
+ };
30
+
31
+ // src/tokens/typography.ts
32
+ var fontFamilies = {
33
+ manrope: `'Manrope', system-ui, sans-serif`,
34
+ inter: `'Inter', system-ui, sans-serif`,
35
+ jetbrainsMono: `'JetBrains Mono', ui-monospace, monospace`
36
+ };
37
+ var typography = {
38
+ displayLg: {
39
+ fontFamily: fontFamilies.manrope,
40
+ fontSize: 64,
41
+ fontWeight: 700,
42
+ lineHeight: 1.05,
43
+ letterSpacing: "-0.025em",
44
+ tabularNums: true
45
+ },
46
+ displayMd: {
47
+ fontFamily: fontFamilies.manrope,
48
+ fontSize: 48,
49
+ fontWeight: 700,
50
+ lineHeight: 1.1,
51
+ letterSpacing: "-0.02em",
52
+ tabularNums: true
53
+ },
54
+ pageTitle: {
55
+ fontFamily: fontFamilies.manrope,
56
+ fontSize: 38,
57
+ fontWeight: 700,
58
+ lineHeight: 1.1,
59
+ letterSpacing: "-0.02em"
60
+ },
61
+ headlineMd: {
62
+ fontFamily: fontFamilies.manrope,
63
+ fontSize: 20,
64
+ fontWeight: 600,
65
+ lineHeight: 1.25
66
+ },
67
+ bodyMd: {
68
+ fontFamily: fontFamilies.inter,
69
+ fontSize: 16,
70
+ fontWeight: 400,
71
+ lineHeight: 1.5
72
+ },
73
+ bodySm: {
74
+ fontFamily: fontFamilies.inter,
75
+ fontSize: 14,
76
+ fontWeight: 400,
77
+ lineHeight: 1.5
78
+ },
79
+ labelSm: {
80
+ fontFamily: fontFamilies.inter,
81
+ fontSize: 12,
82
+ fontWeight: 600,
83
+ lineHeight: 1.2,
84
+ letterSpacing: "0.06em",
85
+ textTransform: "uppercase"
86
+ },
87
+ mono: {
88
+ fontFamily: fontFamilies.jetbrainsMono,
89
+ fontSize: 13,
90
+ fontWeight: 400,
91
+ lineHeight: 22 / 13,
92
+ tabularNums: true
93
+ },
94
+ monoSm: {
95
+ fontFamily: fontFamilies.jetbrainsMono,
96
+ fontSize: 12,
97
+ fontWeight: 400,
98
+ lineHeight: 18 / 12,
99
+ tabularNums: true
100
+ }
101
+ };
102
+
103
+ // src/tokens/spacing.ts
104
+ var spacing = {
105
+ unit: 8,
106
+ container: 1200,
107
+ gutter: 32,
108
+ containerPadding: 24,
109
+ rows: {
110
+ neuron: 22,
111
+ meridian: 28
112
+ }
113
+ };
114
+ var shadows = {
115
+ card: "0 1px 2px rgba(12, 29, 44, 0.04), 0 4px 16px rgba(12, 29, 44, 0.04)",
116
+ level2: "0 4px 16px rgba(12, 29, 44, 0.08)",
117
+ backdropBlur: "blur(12px)"
118
+ };
119
+
120
+ // src/tokens/motion.ts
121
+ var motion = {
122
+ durations: {
123
+ fast: 150,
124
+ base: 250,
125
+ slow: 400,
126
+ anchor: 1e4
127
+ },
128
+ easings: {
129
+ standard: "cubic-bezier(0.4, 0, 0.2, 1)",
130
+ decelerate: "cubic-bezier(0, 0, 0.2, 1)",
131
+ accelerate: "cubic-bezier(0.4, 0, 1, 1)"
132
+ },
133
+ reducedMotionQuery: "(prefers-reduced-motion: reduce)"
134
+ };
135
+ function prefersReducedMotion() {
136
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
137
+ return false;
138
+ }
139
+ return window.matchMedia(motion.reducedMotionQuery).matches;
140
+ }
141
+
142
+ // src/tokens/productAccents.ts
143
+ var productAccents = {
144
+ prism: {
145
+ key: "prism",
146
+ displayName: "PRISM",
147
+ hex: "#4F6BED",
148
+ tint: "rgba(79, 107, 237, 0.08)",
149
+ strong: "rgba(79, 107, 237, 0.18)",
150
+ hue: 230,
151
+ role: "Cool Blue \u2014 discovery, process mining, clarity"
152
+ },
153
+ neuron: {
154
+ key: "neuron",
155
+ displayName: "NEURON",
156
+ hex: "#7C4FE0",
157
+ tint: "rgba(124, 79, 224, 0.08)",
158
+ strong: "rgba(124, 79, 224, 0.18)",
159
+ hue: 260,
160
+ role: "Violet \u2014 orchestration, intelligence"
161
+ },
162
+ vault: {
163
+ key: "vault",
164
+ displayName: "VAULT",
165
+ hex: "#5B6B7D",
166
+ tint: "rgba(91, 107, 125, 0.08)",
167
+ strong: "rgba(91, 107, 125, 0.18)",
168
+ hue: 215,
169
+ role: "Slate \u2014 sovereignty, compliance (narrow saturation, quiet)"
170
+ },
171
+ catalyst: {
172
+ key: "catalyst",
173
+ displayName: "CATALYST",
174
+ hex: "#C28A2E",
175
+ tint: "rgba(194, 138, 46, 0.08)",
176
+ strong: "rgba(194, 138, 46, 0.18)",
177
+ hue: 36,
178
+ role: "Amber \u2014 reuse, acceleration (the only warm accent)"
179
+ },
180
+ meridian: {
181
+ key: "meridian",
182
+ displayName: "MERIDIAN",
183
+ hex: "#2E8A6B",
184
+ tint: "rgba(46, 138, 107, 0.08)",
185
+ strong: "rgba(46, 138, 107, 0.18)",
186
+ hue: 145,
187
+ role: "Emerald \u2014 outcome intelligence, EBITDA"
188
+ }
189
+ };
190
+ var productAccentList = [
191
+ productAccents.prism,
192
+ productAccents.neuron,
193
+ productAccents.vault,
194
+ productAccents.catalyst,
195
+ productAccents.meridian
196
+ ];
197
+
198
+ // src/tokens/dataViz.ts
199
+ var dataViz = {
200
+ positiveDelta: "#2E8A6B",
201
+ negativeDelta: "#BA1A1A",
202
+ neutralDelta: "#5b6b7d",
203
+ strokeWidth: 1.5,
204
+ axis: "rgba(91, 107, 125, 0.10)",
205
+ grid: "rgba(91, 107, 125, 0.05)"
206
+ };
207
+
208
+ export { colors, dataViz, fontFamilies, motion, prefersReducedMotion, productAccentList, productAccents, shadows, spacing, typography };
209
+ //# sourceMappingURL=index.js.map
210
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/colors.ts","../src/tokens/typography.ts","../src/tokens/spacing.ts","../src/tokens/motion.ts","../src/tokens/productAccents.ts","../src/tokens/dataViz.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Color tokens — Luminous Multi-Signal\n *\n * Light is the suite-wide default. Dark is a per-user opt-in peer (DESIGN.md §\n * Dark-mode activation rule). No per-route or per-product auto-switching.\n *\n * The No-Line Rule is enforced via tonal lift, not borders — see `shadows` in\n * `./spacing.ts`. Use `hairline` only for row separation inside a single card.\n */\n\nexport interface ColorTheme {\n readonly surface: string;\n readonly surfaceCard: string;\n readonly surfaceTint: string;\n readonly onSurface: string;\n readonly onSurfaceMuted: string;\n readonly onSurfaceDim: string;\n readonly hairline: string;\n}\n\nexport interface ColorTokens {\n readonly light: ColorTheme;\n readonly dark: ColorTheme;\n /** Status colors — same value across themes. */\n readonly state: {\n readonly ok: string;\n readonly warn: string;\n readonly err: string;\n };\n}\n\nexport const colors: ColorTokens = {\n light: {\n surface: '#f7f9ff',\n surfaceCard: '#ffffff',\n surfaceTint: '#edf4ff',\n onSurface: '#0c1d2c',\n onSurfaceMuted: '#5b6b7d',\n onSurfaceDim: '#8893a3',\n hairline: 'rgba(91, 107, 125, 0.10)',\n },\n dark: {\n surface: '#0F1219',\n surfaceCard: '#161B26',\n surfaceTint: '#1A2030',\n onSurface: '#dce2f3',\n onSurfaceMuted: '#8B92A1',\n onSurfaceDim: '#5F6878',\n hairline: 'rgba(220, 226, 243, 0.08)',\n },\n state: {\n /** Same hex as MERIDIAN accent — use ONLY for status, not as a product signal. */\n ok: '#2E8A6B',\n /** Same hex as CATALYST accent — same constraint. */\n warn: '#C28A2E',\n /** Reserved for true errors. Kill switches use the product accent, never red. */\n err: '#BA1A1A',\n },\n};\n","/**\n * Typography tokens — Manrope (display/headlines), Inter (body/labels),\n * JetBrains Mono (data, hashes, timestamps).\n *\n * Hard rules from DESIGN.md:\n * - Body text never below 14px on interactive data surfaces.\n * - Display serifs (Cormorant Garamond et al.) are REFUSED — under-render at\n * the 13px data-table baseline.\n * - Mono is the \"signal\" font for audit-immutable content. If a value can be\n * hashed, copy-pasted, or appears in a chain — it's mono.\n */\n\nexport type FontFamily = 'manrope' | 'inter' | 'jetbrainsMono';\n\nexport const fontFamilies = {\n manrope: `'Manrope', system-ui, sans-serif`,\n inter: `'Inter', system-ui, sans-serif`,\n jetbrainsMono: `'JetBrains Mono', ui-monospace, monospace`,\n} as const;\n\nexport interface TypographyStyle {\n readonly fontFamily: string;\n /** px */\n readonly fontSize: number;\n /** CSS font-weight numeric */\n readonly fontWeight: number;\n /** unitless line-height multiplier */\n readonly lineHeight: number;\n /** CSS letter-spacing (em or px) */\n readonly letterSpacing?: string;\n readonly textTransform?: 'uppercase' | 'none';\n /** `true` enables `font-variant-numeric: tabular-nums` */\n readonly tabularNums?: boolean;\n}\n\nexport interface TypographyTokens {\n /** 64px Manrope 700 — hero KPI numbers (e.g. MERIDIAN +$1.2M). */\n readonly displayLg: TypographyStyle;\n /** 48px Manrope 700 — secondary display. */\n readonly displayMd: TypographyStyle;\n /** 38px Manrope 700 — h1 page titles only. */\n readonly pageTitle: TypographyStyle;\n /** 20px Manrope 600 — h2 section / card titles. */\n readonly headlineMd: TypographyStyle;\n /** 16px Inter 400 — primary body, narrative copy. */\n readonly bodyMd: TypographyStyle;\n /** 14px Inter 400 — secondary body, UI text. */\n readonly bodySm: TypographyStyle;\n /** 12px Inter 600 tracked caps — section labels, status pills, table headers. */\n readonly labelSm: TypographyStyle;\n /** 13px JetBrains Mono 400 — audit ledgers, run metadata, console body. */\n readonly mono: TypographyStyle;\n /** 12px JetBrains Mono 400 — mono labels, hash prefixes, timestamps. */\n readonly monoSm: TypographyStyle;\n}\n\nexport const typography: TypographyTokens = {\n displayLg: {\n fontFamily: fontFamilies.manrope,\n fontSize: 64,\n fontWeight: 700,\n lineHeight: 1.05,\n letterSpacing: '-0.025em',\n tabularNums: true,\n },\n displayMd: {\n fontFamily: fontFamilies.manrope,\n fontSize: 48,\n fontWeight: 700,\n lineHeight: 1.1,\n letterSpacing: '-0.02em',\n tabularNums: true,\n },\n pageTitle: {\n fontFamily: fontFamilies.manrope,\n fontSize: 38,\n fontWeight: 700,\n lineHeight: 1.1,\n letterSpacing: '-0.02em',\n },\n headlineMd: {\n fontFamily: fontFamilies.manrope,\n fontSize: 20,\n fontWeight: 600,\n lineHeight: 1.25,\n },\n bodyMd: {\n fontFamily: fontFamilies.inter,\n fontSize: 16,\n fontWeight: 400,\n lineHeight: 1.5,\n },\n bodySm: {\n fontFamily: fontFamilies.inter,\n fontSize: 14,\n fontWeight: 400,\n lineHeight: 1.5,\n },\n labelSm: {\n fontFamily: fontFamilies.inter,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.2,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n },\n mono: {\n fontFamily: fontFamilies.jetbrainsMono,\n fontSize: 13,\n fontWeight: 400,\n lineHeight: 22 / 13,\n tabularNums: true,\n },\n monoSm: {\n fontFamily: fontFamilies.jetbrainsMono,\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 18 / 12,\n tabularNums: true,\n },\n};\n","/**\n * Spacing + elevation tokens — 8px base grid.\n *\n * Per-product row density:\n * NEURON consoles + run-metadata tables → 22px rows (`rows.neuron`)\n * MERIDIAN ledgers + reviewer panels → 28px rows (`rows.meridian`)\n *\n * Shadows are the No-Line Rule's mechanism for sectioning — heavy drop\n * shadows are refused. Level 1 lift is ≤4% opacity. See DESIGN.md § No-Line.\n */\n\nexport interface SpacingTokens {\n /** 8 — base unit, all spacing is a multiple of this. */\n readonly unit: number;\n /** 1200 — max content container width (px). */\n readonly container: number;\n /** 32 — gutter between major regions (px). */\n readonly gutter: number;\n /** 24 — internal padding inside a page container (px). */\n readonly containerPadding: number;\n /** Per-product row heights (px). */\n readonly rows: {\n readonly neuron: 22;\n readonly meridian: 28;\n };\n}\n\nexport const spacing: SpacingTokens = {\n unit: 8,\n container: 1200,\n gutter: 32,\n containerPadding: 24,\n rows: {\n neuron: 22,\n meridian: 28,\n },\n};\n\nexport interface ShadowTokens {\n /** Level 1 — elevated cards. Tonal lift, NOT drop-shadow. */\n readonly card: string;\n /** Level 2 — temporary overlays (tooltips, dropdowns). */\n readonly level2: string;\n /** Backdrop blur for the luminous quality (used on Level 2). */\n readonly backdropBlur: string;\n}\n\nexport const shadows: ShadowTokens = {\n card: '0 1px 2px rgba(12, 29, 44, 0.04), 0 4px 16px rgba(12, 29, 44, 0.04)',\n level2: '0 4px 16px rgba(12, 29, 44, 0.08)',\n backdropBlur: 'blur(12px)',\n};\n","/**\n * Motion tokens — calm vigilance, not celebration.\n *\n * Hard rules from DESIGN.md § Motion principles:\n * - Convergent over divergent (5→1 compounding, not 1→5 fan-out).\n * - Pulse, blink, fade are acceptable; bursts/rotations/scale-zero are refused.\n * - `prefers-reduced-motion: reduce` is ALWAYS honored. Animations must\n * degrade to static states gracefully.\n */\n\nexport type Duration = 'fast' | 'base' | 'slow' | 'anchor';\nexport type Easing = 'standard' | 'decelerate' | 'accelerate';\n\nexport interface MotionTokens {\n /** Milliseconds. `anchor` is reserved for the marketing hero unlock cycle. */\n readonly durations: Record<Duration, number>;\n readonly easings: Record<Easing, string>;\n /** prefers-reduced-motion media query string. */\n readonly reducedMotionQuery: '(prefers-reduced-motion: reduce)';\n}\n\nexport const motion: MotionTokens = {\n durations: {\n fast: 150,\n base: 250,\n slow: 400,\n anchor: 10_000,\n },\n easings: {\n standard: 'cubic-bezier(0.4, 0, 0.2, 1)',\n decelerate: 'cubic-bezier(0, 0, 0.2, 1)',\n accelerate: 'cubic-bezier(0.4, 0, 1, 1)',\n },\n reducedMotionQuery: '(prefers-reduced-motion: reduce)',\n};\n\n/**\n * Runtime check — returns `true` if the user has requested reduced motion.\n * Safe to call from any consumer; returns `false` outside a browser context.\n */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia(motion.reducedMotionQuery).matches;\n}\n","/**\n * 5-signal palette — one accent per product, distributed at ~60° hue rotation\n * around a pristine cool-white base. Each product owns one signal; structure\n * (neutrals, typography, spacing, shape) is constant across all 5 products.\n *\n * The 5 accents appear together ONLY in MERIDIAN's cross-product Portfolio\n * chart. Inside a single product, only that product's accent is used.\n *\n * `tint` and `strong` are rgba surfaces derived from `hex`:\n * tint = hex @ 0.08 opacity → use for hover, focus, alt-row tints\n * strong = hex @ 0.18 opacity → use for outer rings on lit dots, focus halos\n */\n\nexport type ProductAccentKey =\n | 'prism'\n | 'neuron'\n | 'vault'\n | 'catalyst'\n | 'meridian';\n\nexport interface ProductAccent {\n readonly key: ProductAccentKey;\n readonly displayName: string;\n readonly hex: string;\n readonly tint: string;\n readonly strong: string;\n readonly hue: number;\n readonly role: string;\n}\n\nexport const productAccents: Record<ProductAccentKey, ProductAccent> = {\n prism: {\n key: 'prism',\n displayName: 'PRISM',\n hex: '#4F6BED',\n tint: 'rgba(79, 107, 237, 0.08)',\n strong: 'rgba(79, 107, 237, 0.18)',\n hue: 230,\n role: 'Cool Blue — discovery, process mining, clarity',\n },\n neuron: {\n key: 'neuron',\n displayName: 'NEURON',\n hex: '#7C4FE0',\n tint: 'rgba(124, 79, 224, 0.08)',\n strong: 'rgba(124, 79, 224, 0.18)',\n hue: 260,\n role: 'Violet — orchestration, intelligence',\n },\n vault: {\n key: 'vault',\n displayName: 'VAULT',\n hex: '#5B6B7D',\n tint: 'rgba(91, 107, 125, 0.08)',\n strong: 'rgba(91, 107, 125, 0.18)',\n hue: 215,\n role: 'Slate — sovereignty, compliance (narrow saturation, quiet)',\n },\n catalyst: {\n key: 'catalyst',\n displayName: 'CATALYST',\n hex: '#C28A2E',\n tint: 'rgba(194, 138, 46, 0.08)',\n strong: 'rgba(194, 138, 46, 0.18)',\n hue: 36,\n role: 'Amber — reuse, acceleration (the only warm accent)',\n },\n meridian: {\n key: 'meridian',\n displayName: 'MERIDIAN',\n hex: '#2E8A6B',\n tint: 'rgba(46, 138, 107, 0.08)',\n strong: 'rgba(46, 138, 107, 0.18)',\n hue: 145,\n role: 'Emerald — outcome intelligence, EBITDA',\n },\n};\n\n/** Iterable list of accents in customer-journey order: discover → orchestrate → secure → accelerate → measure. */\nexport const productAccentList: readonly ProductAccent[] = [\n productAccents.prism,\n productAccents.neuron,\n productAccents.vault,\n productAccents.catalyst,\n productAccents.meridian,\n];\n","/**\n * Data-viz palette — locked at Round 2 of Phase 1.\n *\n * Hard rule: the 5 product accents are used in charts ONLY in the cross-product\n * Portfolio chart (MERIDIAN `/engagements`). Inside a single product, charts use\n * the active product accent + the deltas/neutrals below.\n *\n * For 5-accent chart usage, import from `./productAccents.js`.\n */\n\nexport interface DataVizTokens {\n /** Up arrows, gains, attainment over baseline. Same hex as MERIDIAN. */\n readonly positiveDelta: string;\n /** Down arrows, losses, breach indicators. Same hex as `state.err`. */\n readonly negativeDelta: string;\n /** Zero deltas, \"no change\" series. Same hex as `onSurfaceMuted`. */\n readonly neutralDelta: string;\n /** Sparkline / primary series stroke width. */\n readonly strokeWidth: number;\n /** Axis lines — `hairline` value. */\n readonly axis: string;\n /** Grid lines — half-opacity of `axis`. */\n readonly grid: string;\n}\n\nexport const dataViz: DataVizTokens = {\n positiveDelta: '#2E8A6B',\n negativeDelta: '#BA1A1A',\n neutralDelta: '#5b6b7d',\n strokeWidth: 1.5,\n axis: 'rgba(91, 107, 125, 0.10)',\n grid: 'rgba(91, 107, 125, 0.05)',\n};\n"]}