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