pi-kiosk-shared 2.2.32 → 2.2.35

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 (45) hide show
  1. package/README.md +78 -78
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +2 -1
  4. package/dist/api.js.map +1 -1
  5. package/dist/auditEventCodes.d.ts +1 -1
  6. package/dist/auditEventCodes.d.ts.map +1 -1
  7. package/dist/auditEventCodes.js +10 -0
  8. package/dist/auditEventCodes.js.map +1 -1
  9. package/dist/auditEventDescriptions.d.ts.map +1 -1
  10. package/dist/auditEventDescriptions.js +40 -0
  11. package/dist/auditEventDescriptions.js.map +1 -1
  12. package/dist/auditEventLabels.d.ts.map +1 -1
  13. package/dist/auditEventLabels.js +40 -0
  14. package/dist/auditEventLabels.js.map +1 -1
  15. package/dist/auditMetadataDisplayFields.d.ts.map +1 -1
  16. package/dist/auditMetadataDisplayFields.js +28 -0
  17. package/dist/auditMetadataDisplayFields.js.map +1 -1
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/permissions/canonicalCapabilityIds.d.ts +15 -0
  23. package/dist/permissions/canonicalCapabilityIds.d.ts.map +1 -0
  24. package/dist/permissions/canonicalCapabilityIds.js +15 -0
  25. package/dist/permissions/canonicalCapabilityIds.js.map +1 -0
  26. package/dist/permissions/capabilityBridgeRules.d.ts.map +1 -1
  27. package/dist/permissions/capabilityBridgeRules.js +5 -1
  28. package/dist/permissions/capabilityBridgeRules.js.map +1 -1
  29. package/dist/sentry/correlationTagBridge.d.ts +16 -0
  30. package/dist/sentry/correlationTagBridge.d.ts.map +1 -0
  31. package/dist/sentry/correlationTagBridge.js +20 -0
  32. package/dist/sentry/correlationTagBridge.js.map +1 -0
  33. package/dist/sentry/initSentry.d.ts +1 -5
  34. package/dist/sentry/initSentry.d.ts.map +1 -1
  35. package/dist/sentry/initSentry.js +5 -10
  36. package/dist/sentry/initSentry.js.map +1 -1
  37. package/package.json +313 -291
  38. package/patches/jsdom+27.4.0.patch +13 -13
  39. package/scripts/applyMonorepoPatches.mjs +24 -24
  40. package/src/tokens/__tests__/theme-exports.test.mjs +27 -27
  41. package/src/tokens/__tests__/theme-light-override.test.mjs +21 -21
  42. package/src/tokens/admin-theme.css +158 -158
  43. package/src/tokens/brand-bridge.css +49 -49
  44. package/src/tokens/responsive.css +85 -85
  45. package/src/tokens/theme.css +137 -137
@@ -1,24 +1,24 @@
1
- import { existsSync } from 'node:fs';
2
- import { dirname, join, resolve } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { spawnSync } from 'node:child_process';
5
-
6
- const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
7
- const patchDir = resolve(packageRoot, 'patches');
8
-
9
- if (!existsSync(patchDir)) {
10
- process.exit(0);
11
- }
12
-
13
- const patchPackageEntry = join(packageRoot, 'node_modules', 'patch-package', 'index.js');
14
- if (!existsSync(patchPackageEntry)) {
15
- process.exit(0);
16
- }
17
-
18
- const result = spawnSync(
19
- process.execPath,
20
- [patchPackageEntry, '--patch-dir', 'patches'],
21
- { cwd: packageRoot, stdio: 'inherit' },
22
- );
23
-
24
- process.exit(result.status ?? 1);
1
+ import { existsSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { spawnSync } from 'node:child_process';
5
+
6
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
7
+ const patchDir = resolve(packageRoot, 'patches');
8
+
9
+ if (!existsSync(patchDir)) {
10
+ process.exit(0);
11
+ }
12
+
13
+ const patchPackageEntry = join(packageRoot, 'node_modules', 'patch-package', 'index.js');
14
+ if (!existsSync(patchPackageEntry)) {
15
+ process.exit(0);
16
+ }
17
+
18
+ const result = spawnSync(
19
+ process.execPath,
20
+ [patchPackageEntry, '--patch-dir', 'patches'],
21
+ { cwd: packageRoot, stdio: 'inherit' },
22
+ );
23
+
24
+ process.exit(result.status ?? 1);
@@ -1,27 +1,27 @@
1
- import { readFileSync, existsSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { test } from 'node:test';
5
- import assert from 'node:assert/strict';
6
-
7
- const tokensDir = join(dirname(fileURLToPath(import.meta.url)), '..');
8
-
9
- test('theme.css and admin-theme.css exist and export @theme tokens', () => {
10
- const theme = readFileSync(join(tokensDir, 'theme.css'), 'utf8');
11
- const admin = readFileSync(join(tokensDir, 'admin-theme.css'), 'utf8');
12
- assert.match(theme, /@theme/);
13
- assert.match(theme, /--color-surface/);
14
- assert.match(theme, /\.light/);
15
- assert.match(admin, /--color-an-bg/);
16
- assert.match(admin, /--color-rail-sidebar-bg/);
17
- assert.match(admin, /\.light/);
18
- assert.match(admin, /\.dark/);
19
- });
20
-
21
- test('package.json exports token CSS paths', () => {
22
- const pkgPath = join(tokensDir, '..', '..', 'package.json');
23
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
24
- assert.ok(pkg.exports['./theme.css']);
25
- assert.ok(pkg.exports['./admin-theme.css']);
26
- assert.ok(existsSync(join(tokensDir, 'theme.css')));
27
- });
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { test } from 'node:test';
5
+ import assert from 'node:assert/strict';
6
+
7
+ const tokensDir = join(dirname(fileURLToPath(import.meta.url)), '..');
8
+
9
+ test('theme.css and admin-theme.css exist and export @theme tokens', () => {
10
+ const theme = readFileSync(join(tokensDir, 'theme.css'), 'utf8');
11
+ const admin = readFileSync(join(tokensDir, 'admin-theme.css'), 'utf8');
12
+ assert.match(theme, /@theme/);
13
+ assert.match(theme, /--color-surface/);
14
+ assert.match(theme, /\.light/);
15
+ assert.match(admin, /--color-an-bg/);
16
+ assert.match(admin, /--color-rail-sidebar-bg/);
17
+ assert.match(admin, /\.light/);
18
+ assert.match(admin, /\.dark/);
19
+ });
20
+
21
+ test('package.json exports token CSS paths', () => {
22
+ const pkgPath = join(tokensDir, '..', '..', 'package.json');
23
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
24
+ assert.ok(pkg.exports['./theme.css']);
25
+ assert.ok(pkg.exports['./admin-theme.css']);
26
+ assert.ok(existsSync(join(tokensDir, 'theme.css')));
27
+ });
@@ -1,21 +1,21 @@
1
- import { readFileSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { test } from 'node:test';
5
- import assert from 'node:assert/strict';
6
-
7
- const tokensDir = join(dirname(fileURLToPath(import.meta.url)), '..');
8
-
9
- test('theme.css defines explicit .light override block', () => {
10
- const theme = readFileSync(join(tokensDir, 'theme.css'), 'utf8');
11
- assert.match(theme, /\.light\s*\{/);
12
- assert.match(theme, /\.light[\s\S]*--color-surface:\s*#ffffff/);
13
- });
14
-
15
- test('admin-theme.css defines explicit .light override with rail-violet dark neutrals', () => {
16
- const admin = readFileSync(join(tokensDir, 'admin-theme.css'), 'utf8');
17
- assert.match(admin, /\.light\s*\{/);
18
- assert.match(admin, /\.light[\s\S]*--color-an-surface:\s*#ffffff/);
19
- assert.match(admin, /\.dark[\s\S]*--color-an-bg:\s*#12102a/);
20
- assert.match(admin, /\.dark[\s\S]*--color-an-surface:\s*#1e1b4b/);
21
- });
1
+ import { readFileSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { test } from 'node:test';
5
+ import assert from 'node:assert/strict';
6
+
7
+ const tokensDir = join(dirname(fileURLToPath(import.meta.url)), '..');
8
+
9
+ test('theme.css defines explicit .light override block', () => {
10
+ const theme = readFileSync(join(tokensDir, 'theme.css'), 'utf8');
11
+ assert.match(theme, /\.light\s*\{/);
12
+ assert.match(theme, /\.light[\s\S]*--color-surface:\s*#ffffff/);
13
+ });
14
+
15
+ test('admin-theme.css defines explicit .light override with rail-violet dark neutrals', () => {
16
+ const admin = readFileSync(join(tokensDir, 'admin-theme.css'), 'utf8');
17
+ assert.match(admin, /\.light\s*\{/);
18
+ assert.match(admin, /\.light[\s\S]*--color-an-surface:\s*#ffffff/);
19
+ assert.match(admin, /\.dark[\s\S]*--color-an-bg:\s*#12102a/);
20
+ assert.match(admin, /\.dark[\s\S]*--color-an-surface:\s*#1e1b4b/);
21
+ });
@@ -1,158 +1,158 @@
1
- /**
2
- * Admin analytics / shell design tokens — import from pi-kiosk-shared/admin-theme.css
3
- * Apps: @import "pi-kiosk-shared/admin-theme.css" in admin tailwind entry.
4
- *
5
- * MFE-v3-S-01: brand-bridge.css + design-tokens.css supply legacy/admin semantics.
6
- * MFE-v3-S-2: DECISION-2 C-Hybrid — focus/hover/disabled/elevated + dark via media + `.dark`.
7
- * Light/dark neutrals: admin dark is violet/indigo kin to the rail sidebar
8
- * (`#1e1b4b`); light stays slate neutrals. Primary / rail accents stay brand-scoped.
9
- */
10
- @import './brand-bridge.css';
11
-
12
- @theme {
13
- --color-an-bg: #f8fafc;
14
- --color-an-bg-elevated: #ffffff;
15
- --color-an-surface: #ffffff;
16
- --color-an-surface-muted: #f8fafc;
17
- --color-an-surface-hover: #f1f5f9;
18
- --color-an-surface-disabled: #f1f5f9;
19
- --color-an-text: #0f172a;
20
- --color-an-text-muted: #475569;
21
- --color-an-text-disabled: #94a3b8;
22
- --color-an-border: #e2e8f0;
23
- --color-an-border-hover: #cbd5e1;
24
- --color-an-primary: var(--color-primary);
25
- --color-an-primary-hover: #4f46e5;
26
- --color-an-primary-soft: var(--color-primary-light);
27
- --color-an-focus-ring: var(--brand-admin-primary);
28
- --color-an-danger: var(--color-error);
29
- --color-an-success: var(--color-success);
30
- --color-an-warn: var(--color-warning);
31
- --color-an-info: var(--color-info);
32
- --color-an-disabled-opacity: 0.55;
33
- --color-an-chart-1: var(--brand-admin-primary);
34
- --color-an-chart-2: #14b8a6;
35
- --color-an-chart-3: #f59e0b;
36
- --color-an-chart-4: #ef4444;
37
- --color-an-chart-5: #8b5cf6;
38
- --color-an-chart-6: #06b6d4;
39
- --color-shell-bg: var(--color-an-bg);
40
- --color-shell-surface: var(--color-an-surface);
41
- --color-shell-border: var(--color-an-border);
42
- --color-shell-text: var(--color-an-text);
43
- --color-rail-sidebar-bg: var(--brand-rail-sidebar-bg);
44
- --color-rail-sidebar-text: var(--brand-rail-sidebar-text);
45
- --color-rail-sidebar-muted: var(--brand-rail-sidebar-muted);
46
- --color-rail-sidebar-active: var(--brand-rail-sidebar-active);
47
- --color-rail-sidebar-hover: var(--brand-rail-sidebar-hover);
48
- --color-rail-page-bg: #f1f5f9;
49
- --color-rail-card-border: #e2e8f0;
50
- --color-rail-kpi-up: var(--brand-rail-kpi-up);
51
- --color-rail-kpi-down: var(--brand-rail-kpi-down);
52
- }
53
-
54
- @media (prefers-color-scheme: dark) {
55
- :root {
56
- /* Violet dark — kin to rail sidebar #1e1b4b (not consumer sailor blue) */
57
- --color-an-bg: #12102a;
58
- --color-an-bg-elevated: #1e1b4b;
59
- --color-an-surface: #1e1b4b;
60
- --color-an-surface-muted: #17153a;
61
- --color-an-surface-hover: #2a2660;
62
- --color-an-surface-disabled: #2a2660;
63
- --color-an-text: #e0e7ff;
64
- --color-an-text-muted: #a5b4fc;
65
- --color-an-text-disabled: #818cf8;
66
- --color-an-border: #2f2b55;
67
- --color-an-border-hover: #3d3870;
68
- --color-an-primary: #a78bfa;
69
- --color-an-primary-hover: #c4b5fd;
70
- --color-an-primary-soft: rgba(124, 58, 237, 0.22);
71
- --color-an-focus-ring: #a78bfa;
72
- --color-an-disabled-opacity: 0.5;
73
- --color-an-chart-1: #a78bfa;
74
- --color-an-chart-2: #2dd4bf;
75
- --color-an-chart-3: #fbbf24;
76
- --color-an-chart-4: #f87171;
77
- --color-an-chart-5: #c4b5fd;
78
- --color-an-chart-6: #22d3ee;
79
- --color-shell-bg: #12102a;
80
- --color-shell-surface: #1e1b4b;
81
- --color-shell-border: #2f2b55;
82
- --color-shell-text: #e0e7ff;
83
- --color-rail-page-bg: #12102a;
84
- --color-rail-card-border: #2f2b55;
85
- }
86
- }
87
-
88
- /**
89
- * C-Hybrid user override — violet dark kin to `--brand-rail-sidebar-bg` (#1e1b4b).
90
- * Admin `applyInitialTheme()` / ThemeProvider toggles `.dark` on documentElement.
91
- */
92
- .dark {
93
- color-scheme: dark;
94
- --color-an-bg: #12102a;
95
- --color-an-bg-elevated: #1e1b4b;
96
- --color-an-surface: #1e1b4b;
97
- --color-an-surface-muted: #17153a;
98
- --color-an-surface-hover: #2a2660;
99
- --color-an-surface-disabled: #2a2660;
100
- --color-an-text: #e0e7ff;
101
- --color-an-text-muted: #a5b4fc;
102
- --color-an-text-disabled: #818cf8;
103
- --color-an-border: #2f2b55;
104
- --color-an-border-hover: #3d3870;
105
- --color-an-primary: #a78bfa;
106
- --color-an-primary-hover: #c4b5fd;
107
- --color-an-primary-soft: rgba(124, 58, 237, 0.22);
108
- --color-an-focus-ring: #a78bfa;
109
- --color-an-disabled-opacity: 0.5;
110
- --color-an-chart-1: #a78bfa;
111
- --color-an-chart-2: #2dd4bf;
112
- --color-an-chart-3: #fbbf24;
113
- --color-an-chart-4: #f87171;
114
- --color-an-chart-5: #c4b5fd;
115
- --color-an-chart-6: #22d3ee;
116
- --color-shell-bg: #12102a;
117
- --color-shell-surface: #1e1b4b;
118
- --color-shell-border: #2f2b55;
119
- --color-shell-text: #e0e7ff;
120
- --color-rail-page-bg: #12102a;
121
- --color-rail-card-border: #2f2b55;
122
- }
123
-
124
- /**
125
- * Explicit light override — wins over `@media (prefers-color-scheme: dark)` when
126
- * user selects Light while OS is dark (same contract as consumer `theme.css`).
127
- */
128
- .light {
129
- color-scheme: light;
130
- --color-an-bg: #f8fafc;
131
- --color-an-bg-elevated: #ffffff;
132
- --color-an-surface: #ffffff;
133
- --color-an-surface-muted: #f8fafc;
134
- --color-an-surface-hover: #f1f5f9;
135
- --color-an-surface-disabled: #f1f5f9;
136
- --color-an-text: #0f172a;
137
- --color-an-text-muted: #475569;
138
- --color-an-text-disabled: #94a3b8;
139
- --color-an-border: #e2e8f0;
140
- --color-an-border-hover: #cbd5e1;
141
- --color-an-primary: var(--color-primary);
142
- --color-an-primary-hover: #4f46e5;
143
- --color-an-primary-soft: var(--color-primary-light);
144
- --color-an-focus-ring: var(--brand-admin-primary);
145
- --color-an-disabled-opacity: 0.55;
146
- --color-an-chart-1: var(--brand-admin-primary);
147
- --color-an-chart-2: #14b8a6;
148
- --color-an-chart-3: #f59e0b;
149
- --color-an-chart-4: #ef4444;
150
- --color-an-chart-5: #8b5cf6;
151
- --color-an-chart-6: #06b6d4;
152
- --color-shell-bg: #f8fafc;
153
- --color-shell-surface: #ffffff;
154
- --color-shell-border: #e2e8f0;
155
- --color-shell-text: #0f172a;
156
- --color-rail-page-bg: #f1f5f9;
157
- --color-rail-card-border: #e2e8f0;
158
- }
1
+ /**
2
+ * Admin analytics / shell design tokens — import from pi-kiosk-shared/admin-theme.css
3
+ * Apps: @import "pi-kiosk-shared/admin-theme.css" in admin tailwind entry.
4
+ *
5
+ * MFE-v3-S-01: brand-bridge.css + design-tokens.css supply legacy/admin semantics.
6
+ * MFE-v3-S-2: DECISION-2 C-Hybrid — focus/hover/disabled/elevated + dark via media + `.dark`.
7
+ * Light/dark neutrals: admin dark is violet/indigo kin to the rail sidebar
8
+ * (`#1e1b4b`); light stays slate neutrals. Primary / rail accents stay brand-scoped.
9
+ */
10
+ @import './brand-bridge.css';
11
+
12
+ @theme {
13
+ --color-an-bg: #f8fafc;
14
+ --color-an-bg-elevated: #ffffff;
15
+ --color-an-surface: #ffffff;
16
+ --color-an-surface-muted: #f8fafc;
17
+ --color-an-surface-hover: #f1f5f9;
18
+ --color-an-surface-disabled: #f1f5f9;
19
+ --color-an-text: #0f172a;
20
+ --color-an-text-muted: #475569;
21
+ --color-an-text-disabled: #94a3b8;
22
+ --color-an-border: #e2e8f0;
23
+ --color-an-border-hover: #cbd5e1;
24
+ --color-an-primary: var(--color-primary);
25
+ --color-an-primary-hover: #4f46e5;
26
+ --color-an-primary-soft: var(--color-primary-light);
27
+ --color-an-focus-ring: var(--brand-admin-primary);
28
+ --color-an-danger: var(--color-error);
29
+ --color-an-success: var(--color-success);
30
+ --color-an-warn: var(--color-warning);
31
+ --color-an-info: var(--color-info);
32
+ --color-an-disabled-opacity: 0.55;
33
+ --color-an-chart-1: var(--brand-admin-primary);
34
+ --color-an-chart-2: #14b8a6;
35
+ --color-an-chart-3: #f59e0b;
36
+ --color-an-chart-4: #ef4444;
37
+ --color-an-chart-5: #8b5cf6;
38
+ --color-an-chart-6: #06b6d4;
39
+ --color-shell-bg: var(--color-an-bg);
40
+ --color-shell-surface: var(--color-an-surface);
41
+ --color-shell-border: var(--color-an-border);
42
+ --color-shell-text: var(--color-an-text);
43
+ --color-rail-sidebar-bg: var(--brand-rail-sidebar-bg);
44
+ --color-rail-sidebar-text: var(--brand-rail-sidebar-text);
45
+ --color-rail-sidebar-muted: var(--brand-rail-sidebar-muted);
46
+ --color-rail-sidebar-active: var(--brand-rail-sidebar-active);
47
+ --color-rail-sidebar-hover: var(--brand-rail-sidebar-hover);
48
+ --color-rail-page-bg: #f1f5f9;
49
+ --color-rail-card-border: #e2e8f0;
50
+ --color-rail-kpi-up: var(--brand-rail-kpi-up);
51
+ --color-rail-kpi-down: var(--brand-rail-kpi-down);
52
+ }
53
+
54
+ @media (prefers-color-scheme: dark) {
55
+ :root {
56
+ /* Violet dark — kin to rail sidebar #1e1b4b (not consumer sailor blue) */
57
+ --color-an-bg: #12102a;
58
+ --color-an-bg-elevated: #1e1b4b;
59
+ --color-an-surface: #1e1b4b;
60
+ --color-an-surface-muted: #17153a;
61
+ --color-an-surface-hover: #2a2660;
62
+ --color-an-surface-disabled: #2a2660;
63
+ --color-an-text: #e0e7ff;
64
+ --color-an-text-muted: #a5b4fc;
65
+ --color-an-text-disabled: #818cf8;
66
+ --color-an-border: #2f2b55;
67
+ --color-an-border-hover: #3d3870;
68
+ --color-an-primary: #a78bfa;
69
+ --color-an-primary-hover: #c4b5fd;
70
+ --color-an-primary-soft: rgba(124, 58, 237, 0.22);
71
+ --color-an-focus-ring: #a78bfa;
72
+ --color-an-disabled-opacity: 0.5;
73
+ --color-an-chart-1: #a78bfa;
74
+ --color-an-chart-2: #2dd4bf;
75
+ --color-an-chart-3: #fbbf24;
76
+ --color-an-chart-4: #f87171;
77
+ --color-an-chart-5: #c4b5fd;
78
+ --color-an-chart-6: #22d3ee;
79
+ --color-shell-bg: #12102a;
80
+ --color-shell-surface: #1e1b4b;
81
+ --color-shell-border: #2f2b55;
82
+ --color-shell-text: #e0e7ff;
83
+ --color-rail-page-bg: #12102a;
84
+ --color-rail-card-border: #2f2b55;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * C-Hybrid user override — violet dark kin to `--brand-rail-sidebar-bg` (#1e1b4b).
90
+ * Admin `applyInitialTheme()` / ThemeProvider toggles `.dark` on documentElement.
91
+ */
92
+ .dark {
93
+ color-scheme: dark;
94
+ --color-an-bg: #12102a;
95
+ --color-an-bg-elevated: #1e1b4b;
96
+ --color-an-surface: #1e1b4b;
97
+ --color-an-surface-muted: #17153a;
98
+ --color-an-surface-hover: #2a2660;
99
+ --color-an-surface-disabled: #2a2660;
100
+ --color-an-text: #e0e7ff;
101
+ --color-an-text-muted: #a5b4fc;
102
+ --color-an-text-disabled: #818cf8;
103
+ --color-an-border: #2f2b55;
104
+ --color-an-border-hover: #3d3870;
105
+ --color-an-primary: #a78bfa;
106
+ --color-an-primary-hover: #c4b5fd;
107
+ --color-an-primary-soft: rgba(124, 58, 237, 0.22);
108
+ --color-an-focus-ring: #a78bfa;
109
+ --color-an-disabled-opacity: 0.5;
110
+ --color-an-chart-1: #a78bfa;
111
+ --color-an-chart-2: #2dd4bf;
112
+ --color-an-chart-3: #fbbf24;
113
+ --color-an-chart-4: #f87171;
114
+ --color-an-chart-5: #c4b5fd;
115
+ --color-an-chart-6: #22d3ee;
116
+ --color-shell-bg: #12102a;
117
+ --color-shell-surface: #1e1b4b;
118
+ --color-shell-border: #2f2b55;
119
+ --color-shell-text: #e0e7ff;
120
+ --color-rail-page-bg: #12102a;
121
+ --color-rail-card-border: #2f2b55;
122
+ }
123
+
124
+ /**
125
+ * Explicit light override — wins over `@media (prefers-color-scheme: dark)` when
126
+ * user selects Light while OS is dark (same contract as consumer `theme.css`).
127
+ */
128
+ .light {
129
+ color-scheme: light;
130
+ --color-an-bg: #f8fafc;
131
+ --color-an-bg-elevated: #ffffff;
132
+ --color-an-surface: #ffffff;
133
+ --color-an-surface-muted: #f8fafc;
134
+ --color-an-surface-hover: #f1f5f9;
135
+ --color-an-surface-disabled: #f1f5f9;
136
+ --color-an-text: #0f172a;
137
+ --color-an-text-muted: #475569;
138
+ --color-an-text-disabled: #94a3b8;
139
+ --color-an-border: #e2e8f0;
140
+ --color-an-border-hover: #cbd5e1;
141
+ --color-an-primary: var(--color-primary);
142
+ --color-an-primary-hover: #4f46e5;
143
+ --color-an-primary-soft: var(--color-primary-light);
144
+ --color-an-focus-ring: var(--brand-admin-primary);
145
+ --color-an-disabled-opacity: 0.55;
146
+ --color-an-chart-1: var(--brand-admin-primary);
147
+ --color-an-chart-2: #14b8a6;
148
+ --color-an-chart-3: #f59e0b;
149
+ --color-an-chart-4: #ef4444;
150
+ --color-an-chart-5: #8b5cf6;
151
+ --color-an-chart-6: #06b6d4;
152
+ --color-shell-bg: #f8fafc;
153
+ --color-shell-surface: #ffffff;
154
+ --color-shell-border: #e2e8f0;
155
+ --color-shell-text: #0f172a;
156
+ --color-rail-page-bg: #f1f5f9;
157
+ --color-rail-card-border: #e2e8f0;
158
+ }
@@ -1,49 +1,49 @@
1
- /**
2
- * Brand bridge — Canva Up Above SSOT → theme.css / admin-theme.css consumers
3
- *
4
- * DECISION-1 Option C: --brand-consumer-accent (Canva) + --brand-admin-accent (PO mockups)
5
- * Import before theme.css or admin-theme.css once MFE-v3-S-01 wires consumers.
6
- *
7
- * @see rpappp/up-backend/docs/FRONTEND/brand-palette.md
8
- * @source https://www.canva.com/colors/color-palettes/up-above/
9
- */
10
- :root {
11
- /* ── Canva Up Above (provisional — pending PO hex confirmation) ── */
12
- --brand-canva-sailor-blue: #00203f;
13
- --brand-canva-mint: #adefd1;
14
-
15
- /* ── Semantic brand accents (DECISION-1 Option C) ── */
16
- --brand-consumer-accent: var(--brand-canva-sailor-blue);
17
- --brand-consumer-accent-soft: var(--brand-canva-mint);
18
- --brand-consumer-accent-foreground: #ffffff;
19
- --brand-admin-accent: #7c3aed;
20
- --brand-admin-primary: #6365f0;
21
-
22
- /* ── Admin rail palette (MOCKUP_VISUAL_SPEC_CACHE harmonization) ── */
23
- --brand-rail-sidebar-bg: #1e1b4b;
24
- --brand-rail-sidebar-bg-deep: #0f172a;
25
- --brand-rail-sidebar-text: #e0e7ff;
26
- --brand-rail-sidebar-muted: #a5b4fc;
27
- --brand-rail-sidebar-active: var(--brand-admin-accent);
28
- --brand-rail-sidebar-hover: rgba(124, 58, 237, 0.2);
29
- --brand-rail-page-bg: #f1f5f9;
30
- --brand-rail-card-border: #e2e8f0;
31
- --brand-rail-kpi-up: #05805a;
32
- --brand-rail-kpi-down: #da2325;
33
-
34
- /* ── Bridge → theme.css (consumer / kiosk / pickup) — wired in MFE-v3-S-01 ── */
35
- --color-accent: var(--brand-consumer-accent);
36
- --color-focus-ring: var(--brand-consumer-accent);
37
-
38
- /* ── Bridge → admin-theme.css — wired in MFE-v3-S-01 ── */
39
- --color-rail-sidebar-bg: var(--brand-rail-sidebar-bg);
40
- --color-rail-sidebar-text: var(--brand-rail-sidebar-text);
41
- --color-rail-sidebar-muted: var(--brand-rail-sidebar-muted);
42
- --color-rail-sidebar-active: var(--brand-rail-sidebar-active);
43
- --color-rail-sidebar-hover: var(--brand-rail-sidebar-hover);
44
- --color-rail-page-bg: var(--brand-rail-page-bg);
45
- --color-rail-card-border: var(--brand-rail-card-border);
46
- --color-rail-kpi-up: var(--brand-rail-kpi-up);
47
- --color-rail-kpi-down: var(--brand-rail-kpi-down);
48
- --color-an-chart-1: var(--brand-admin-primary);
49
- }
1
+ /**
2
+ * Brand bridge — Canva Up Above SSOT → theme.css / admin-theme.css consumers
3
+ *
4
+ * DECISION-1 Option C: --brand-consumer-accent (Canva) + --brand-admin-accent (PO mockups)
5
+ * Import before theme.css or admin-theme.css once MFE-v3-S-01 wires consumers.
6
+ *
7
+ * @see rpappp/up-backend/docs/FRONTEND/brand-palette.md
8
+ * @source https://www.canva.com/colors/color-palettes/up-above/
9
+ */
10
+ :root {
11
+ /* ── Canva Up Above (provisional — pending PO hex confirmation) ── */
12
+ --brand-canva-sailor-blue: #00203f;
13
+ --brand-canva-mint: #adefd1;
14
+
15
+ /* ── Semantic brand accents (DECISION-1 Option C) ── */
16
+ --brand-consumer-accent: var(--brand-canva-sailor-blue);
17
+ --brand-consumer-accent-soft: var(--brand-canva-mint);
18
+ --brand-consumer-accent-foreground: #ffffff;
19
+ --brand-admin-accent: #7c3aed;
20
+ --brand-admin-primary: #6365f0;
21
+
22
+ /* ── Admin rail palette (MOCKUP_VISUAL_SPEC_CACHE harmonization) ── */
23
+ --brand-rail-sidebar-bg: #1e1b4b;
24
+ --brand-rail-sidebar-bg-deep: #0f172a;
25
+ --brand-rail-sidebar-text: #e0e7ff;
26
+ --brand-rail-sidebar-muted: #a5b4fc;
27
+ --brand-rail-sidebar-active: var(--brand-admin-accent);
28
+ --brand-rail-sidebar-hover: rgba(124, 58, 237, 0.2);
29
+ --brand-rail-page-bg: #f1f5f9;
30
+ --brand-rail-card-border: #e2e8f0;
31
+ --brand-rail-kpi-up: #05805a;
32
+ --brand-rail-kpi-down: #da2325;
33
+
34
+ /* ── Bridge → theme.css (consumer / kiosk / pickup) — wired in MFE-v3-S-01 ── */
35
+ --color-accent: var(--brand-consumer-accent);
36
+ --color-focus-ring: var(--brand-consumer-accent);
37
+
38
+ /* ── Bridge → admin-theme.css — wired in MFE-v3-S-01 ── */
39
+ --color-rail-sidebar-bg: var(--brand-rail-sidebar-bg);
40
+ --color-rail-sidebar-text: var(--brand-rail-sidebar-text);
41
+ --color-rail-sidebar-muted: var(--brand-rail-sidebar-muted);
42
+ --color-rail-sidebar-active: var(--brand-rail-sidebar-active);
43
+ --color-rail-sidebar-hover: var(--brand-rail-sidebar-hover);
44
+ --color-rail-page-bg: var(--brand-rail-page-bg);
45
+ --color-rail-card-border: var(--brand-rail-card-border);
46
+ --color-rail-kpi-up: var(--brand-rail-kpi-up);
47
+ --color-rail-kpi-down: var(--brand-rail-kpi-down);
48
+ --color-an-chart-1: var(--brand-admin-primary);
49
+ }