@visin/frontend-core 1.9.0 → 1.10.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.
Files changed (60) hide show
  1. package/dist/components/AppLayout/AppLayout.d.ts.map +1 -1
  2. package/dist/components/AppLayout/AppLayout.js +43 -44
  3. package/dist/components/AppLayout/AppLayout.js.map +1 -1
  4. package/dist/components/ColorMode/ColorModeSetting.d.ts +39 -0
  5. package/dist/components/ColorMode/ColorModeSetting.d.ts.map +1 -0
  6. package/dist/components/ColorMode/ColorModeSetting.js +52 -0
  7. package/dist/components/ColorMode/ColorModeSetting.js.map +1 -0
  8. package/dist/components/ColorMode/VisinThemeProvider.d.ts +16 -0
  9. package/dist/components/ColorMode/VisinThemeProvider.d.ts.map +1 -0
  10. package/dist/components/ColorMode/VisinThemeProvider.js +19 -0
  11. package/dist/components/ColorMode/VisinThemeProvider.js.map +1 -0
  12. package/dist/components/ColorMode/index.d.ts +7 -0
  13. package/dist/components/ColorMode/index.d.ts.map +1 -0
  14. package/dist/components/ColorMode/index.js +4 -0
  15. package/dist/components/ColorMode/index.js.map +1 -0
  16. package/dist/components/ColorMode/useChartColors.d.ts +15 -0
  17. package/dist/components/ColorMode/useChartColors.d.ts.map +1 -0
  18. package/dist/components/ColorMode/useChartColors.js +16 -0
  19. package/dist/components/ColorMode/useChartColors.js.map +1 -0
  20. package/dist/components/Page/EmptyState.js +2 -2
  21. package/dist/components/Page/EmptyState.js.map +1 -1
  22. package/dist/components/Page/ListRow.d.ts.map +1 -1
  23. package/dist/components/Page/ListRow.js +3 -2
  24. package/dist/components/Page/ListRow.js.map +1 -1
  25. package/dist/components/Page/PageHeader.d.ts.map +1 -1
  26. package/dist/components/Page/PageHeader.js +4 -2
  27. package/dist/components/Page/PageHeader.js.map +1 -1
  28. package/dist/components/Page/Panel.d.ts +4 -2
  29. package/dist/components/Page/Panel.d.ts.map +1 -1
  30. package/dist/components/Page/Panel.js +13 -3
  31. package/dist/components/Page/Panel.js.map +1 -1
  32. package/dist/index.d.ts +4 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/theme/chart.d.ts +19 -0
  37. package/dist/theme/chart.d.ts.map +1 -0
  38. package/dist/theme/chart.js +19 -0
  39. package/dist/theme/chart.js.map +1 -0
  40. package/dist/theme/createVisinTheme.d.ts +45 -0
  41. package/dist/theme/createVisinTheme.d.ts.map +1 -0
  42. package/dist/theme/createVisinTheme.js +261 -0
  43. package/dist/theme/createVisinTheme.js.map +1 -0
  44. package/dist/theme/index.d.ts +6 -0
  45. package/dist/theme/index.d.ts.map +1 -0
  46. package/dist/theme/index.js +5 -0
  47. package/dist/theme/index.js.map +1 -0
  48. package/dist/theme/livePalette.d.ts +11 -0
  49. package/dist/theme/livePalette.d.ts.map +1 -0
  50. package/dist/theme/livePalette.js +10 -0
  51. package/dist/theme/livePalette.js.map +1 -0
  52. package/dist/theme/tokens.d.ts +224 -0
  53. package/dist/theme/tokens.d.ts.map +1 -0
  54. package/dist/theme/tokens.js +205 -0
  55. package/dist/theme/tokens.js.map +1 -0
  56. package/package.json +1 -1
  57. package/dist/theme.d.ts +0 -27
  58. package/dist/theme.d.ts.map +0 -1
  59. package/dist/theme.js +0 -121
  60. package/dist/theme.js.map +0 -1
@@ -0,0 +1,224 @@
1
+ /**
2
+ * The colours Visin draws with, per colour scheme, in one place.
3
+ *
4
+ * Pages never read the raw values: they use `ink`, `surface`, `glass` and
5
+ * `chrome`, which point at CSS variables the theme writes for both schemes, so
6
+ * a page that says `color: ink.muted` follows the switch without knowing there
7
+ * is one. The raw values are here for the contrast tests and for the few places
8
+ * outside a React tree (`theme-color`, the manifest, the offline page).
9
+ *
10
+ * The dark scheme is slate with a little blue in it rather than neutral grey:
11
+ * it keeps the brand's cast, and pure grey behind charts reads as dead.
12
+ */
13
+ /** Primary, per scheme: what can be acted on. Walked lighter for dark, where the light blue fails AA. */
14
+ export declare const brand: {
15
+ readonly light: "#2563eb";
16
+ readonly dark: "#60a5fa";
17
+ };
18
+ export declare const schemes: {
19
+ readonly light: {
20
+ /** Text, darkest to lightest. Slate rather than grey, to sit under the blue. */
21
+ readonly ink: {
22
+ readonly strong: "#0f172a";
23
+ readonly body: "#475569";
24
+ readonly muted: "#5b6779";
25
+ /** Decorative only — under 3:1. Never put words a reader needs in this. */
26
+ readonly faint: "#94a3b8";
27
+ };
28
+ readonly surface: {
29
+ /** A faint blue glow at the top of the page, over `default`. */
30
+ readonly glow: "rgba(37,99,235,0.10)";
31
+ readonly default: "#f6f7fb";
32
+ readonly paper: "#ffffff";
33
+ /** Table heads, inset panels: one step back from `paper`. */
34
+ readonly sunken: "#f8fafc";
35
+ readonly divider: "#e2e8f0";
36
+ /** The edge of the frosted chrome: an opaque divider draws a hard rule across the blur. */
37
+ readonly chromeEdge: "rgba(15,23,42,0.08)";
38
+ /** Hover tint on neutral controls. */
39
+ readonly hover: "rgba(15,23,42,0.05)";
40
+ /** The veil over an image that text has to stay readable on. */
41
+ readonly scrim: "rgba(255,255,255,0.72)";
42
+ };
43
+ readonly glass: {
44
+ readonly background: "rgba(255,255,255,0.88)";
45
+ readonly border: "rgba(15,23,42,0.07)";
46
+ readonly shadow: "rgba(15,23,42,0.30)";
47
+ };
48
+ readonly chrome: {
49
+ readonly background: "rgba(255,255,255,0.72)";
50
+ readonly ink: "#0f172a";
51
+ readonly inkMuted: "#5b6779";
52
+ };
53
+ /** The main action's gradient, blue into indigo; white text clears AA on every stop. */
54
+ readonly accent: {
55
+ readonly start: "#2563eb";
56
+ readonly end: "#4f46e5";
57
+ readonly startHover: "#1d4ed8";
58
+ readonly endHover: "#4338ca";
59
+ };
60
+ /** The browser's own bar, `<meta name="theme-color">`. */
61
+ readonly themeColor: "#f6f7fb";
62
+ };
63
+ readonly dark: {
64
+ readonly ink: {
65
+ readonly strong: "#e6eaf2";
66
+ readonly body: "#b3bccb";
67
+ readonly muted: "#8f9aac";
68
+ readonly faint: "#5b6474";
69
+ };
70
+ readonly surface: {
71
+ readonly glow: "rgba(96,165,250,0.12)";
72
+ readonly default: "#0b0f17";
73
+ readonly paper: "#121826";
74
+ readonly sunken: "#182030";
75
+ readonly divider: "#232b3a";
76
+ readonly chromeEdge: "rgba(148,163,184,0.12)";
77
+ readonly hover: "rgba(255,255,255,0.06)";
78
+ readonly scrim: "rgba(11,15,23,0.72)";
79
+ };
80
+ readonly glass: {
81
+ readonly background: "rgba(18,24,38,0.86)";
82
+ readonly border: "rgba(255,255,255,0.07)";
83
+ readonly shadow: "rgba(0,0,0,0.65)";
84
+ };
85
+ readonly chrome: {
86
+ readonly background: "rgba(13,18,28,0.72)";
87
+ readonly ink: "#e6eaf2";
88
+ readonly inkMuted: "#8f9aac";
89
+ };
90
+ readonly accent: {
91
+ readonly start: "#60a5fa";
92
+ readonly end: "#818cf8";
93
+ readonly startHover: "#93c5fd";
94
+ readonly endHover: "#a5b4fc";
95
+ };
96
+ readonly themeColor: "#0b0f17";
97
+ };
98
+ };
99
+ export type ColorSchemeName = keyof typeof schemes;
100
+ /** One scheme as CSS custom properties. The theme writes these; nothing else should. */
101
+ export declare function schemeCssVars(name: ColorSchemeName): Record<string, string>;
102
+ /** Text, darkest to lightest. Follows light and dark. */
103
+ export declare const ink: {
104
+ readonly strong: string;
105
+ readonly body: string;
106
+ readonly muted: string;
107
+ readonly faint: string;
108
+ };
109
+ /** Page and panel backgrounds. Follows light and dark. */
110
+ export declare const surface: {
111
+ readonly glow: string;
112
+ readonly default: string;
113
+ readonly paper: string;
114
+ readonly sunken: string;
115
+ readonly divider: string;
116
+ readonly chromeEdge: string;
117
+ readonly hover: string;
118
+ readonly scrim: string;
119
+ };
120
+ /** The page behind everything: a glow at the top, fading into `default`. */
121
+ export declare const pageBackground: {
122
+ readonly backgroundColor: string;
123
+ readonly backgroundImage: `radial-gradient(1200px 520px at 50% -160px, ${string}, transparent 70%)`;
124
+ readonly backgroundRepeat: "no-repeat";
125
+ };
126
+ /**
127
+ * A frosted surface that floats over the page: menus, popovers, dialogs, the
128
+ * phone's bottom sheet, cards on the home page. Translucent on purpose, so what
129
+ * is under it shows through as colour rather than being cut out.
130
+ *
131
+ * Not for tables, lists and charts. Blur behind numbers costs legibility and
132
+ * scrolling; those stay on solid `Panel`s.
133
+ */
134
+ export declare const glass: {
135
+ readonly background: "var(--vi-glass-background)";
136
+ readonly backdropFilter: "blur(14px) saturate(160%)";
137
+ readonly WebkitBackdropFilter: "blur(14px) saturate(160%)";
138
+ readonly border: "1px solid var(--vi-glass-border)";
139
+ readonly boxShadow: "0 18px 40px -24px var(--vi-glass-shadow)";
140
+ };
141
+ /**
142
+ * The resting shadow of a solid surface (a `Panel`, a card): enough to lift it
143
+ * off the page, soft enough that a stack of them does not read as clutter.
144
+ */
145
+ export declare const raisedShadow = "0 12px 32px -28px rgba(15,23,42,0.45)";
146
+ /** A surface that rises toward the pointer. `accent` tints the edge and the lifted shadow. */
147
+ export declare const liftOnHover: (accent?: string) => {
148
+ readonly transition: "transform .2s ease, box-shadow .2s ease, border-color .2s ease";
149
+ readonly '&:hover': {
150
+ readonly transform: "translateY(-2px)";
151
+ readonly borderColor: `color-mix(in srgb, ${string} 35%, transparent)`;
152
+ readonly boxShadow: `0 22px 44px -26px color-mix(in srgb, ${string} 80%, transparent)`;
153
+ };
154
+ readonly '@media (prefers-reduced-motion: reduce)': {
155
+ readonly transition: "none";
156
+ readonly '&:hover': {
157
+ readonly transform: "none";
158
+ };
159
+ };
160
+ };
161
+ /** A glass card that responds to being pointed at. `accent` tints the lifted shadow. */
162
+ export declare const glassInteractive: (accent?: string) => {
163
+ readonly transition: "transform .2s ease, box-shadow .2s ease, border-color .2s ease";
164
+ readonly '&:hover': {
165
+ readonly transform: "translateY(-2px)";
166
+ readonly borderColor: `color-mix(in srgb, ${string} 35%, transparent)`;
167
+ readonly boxShadow: `0 22px 44px -26px color-mix(in srgb, ${string} 80%, transparent)`;
168
+ };
169
+ readonly '@media (prefers-reduced-motion: reduce)': {
170
+ readonly transition: "none";
171
+ readonly '&:hover': {
172
+ readonly transform: "none";
173
+ };
174
+ };
175
+ readonly background: "var(--vi-glass-background)";
176
+ readonly backdropFilter: "blur(14px) saturate(160%)";
177
+ readonly WebkitBackdropFilter: "blur(14px) saturate(160%)";
178
+ readonly border: "1px solid var(--vi-glass-border)";
179
+ readonly boxShadow: "0 18px 40px -24px var(--vi-glass-shadow)";
180
+ };
181
+ /**
182
+ * The one action a page is for, where a plain filled button undersells it: a
183
+ * blue-to-indigo gradient with a glow. At most one per page.
184
+ */
185
+ export declare const mainAction: {
186
+ readonly backgroundImage: `linear-gradient(135deg, ${string} 0%, ${string} 100%)`;
187
+ readonly color: "var(--mui-palette-primary-contrastText)";
188
+ readonly boxShadow: "0 10px 28px -12px color-mix(in srgb, var(--mui-palette-primary-main) 85%, transparent)";
189
+ readonly '&:hover': {
190
+ readonly backgroundImage: `linear-gradient(135deg, ${string} 0%, ${string} 100%)`;
191
+ readonly boxShadow: "0 12px 32px -12px color-mix(in srgb, var(--mui-palette-primary-main) 95%, transparent)";
192
+ };
193
+ };
194
+ /**
195
+ * The frosted chrome around the content: the navigation rail, the app bar and
196
+ * the phone's tab bar. One tint and one blur for all three, because they meet
197
+ * at a corner, and two slightly different tints show as a step there.
198
+ */
199
+ export declare const chrome: {
200
+ readonly background: string;
201
+ readonly ink: string;
202
+ readonly inkMuted: string;
203
+ readonly edge: string;
204
+ readonly surface: {
205
+ readonly background: string;
206
+ readonly backdropFilter: "blur(16px) saturate(165%)";
207
+ readonly WebkitBackdropFilter: "blur(16px) saturate(165%)";
208
+ };
209
+ };
210
+ /**
211
+ * Controls laid over a photo or a frame: a viewer's buttons, a caption chip.
212
+ * The same in both schemes, because the picture under them is.
213
+ */
214
+ export declare const onImage: {
215
+ /** Behind a frame being judged: dark and neutral, so the picture's own colours read true. */
216
+ readonly backdrop: "#0b0f19";
217
+ readonly ink: "#ffffff";
218
+ readonly scrim: "rgba(0,0,0,0.5)";
219
+ readonly scrimStrong: "rgba(0,0,0,0.7)";
220
+ readonly chip: "rgba(255,255,255,0.2)";
221
+ };
222
+ /** `color` at `opacity` (0–1). Unlike MUI's `alpha()`, works on a CSS variable as well as a hex. */
223
+ export declare const tint: (color: string, opacity: number) => string;
224
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/theme/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,yGAAyG;AACzG,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAEX,eAAO,MAAM,OAAO;;QAEhB,gFAAgF;;;;;YAK9E,2EAA2E;;;;YAI3E,gEAAgE;;;;YAIhE,6DAA6D;;;YAG7D,2FAA2F;;YAE3F,sCAAsC;;YAEtC,gEAAgE;;;;;;;;;;;;;QAelE,wFAAwF;;;;;;;QAOxF,0DAA0D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCpD,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,OAAO,CAAC;AAcnD,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS3E;AAED,yDAAyD;AACzD,eAAO,MAAM,GAAG;;;;;CAAiC,CAAC;AAElD,0DAA0D;AAC1D,eAAO,MAAM,OAAO;;;;;;;;;CAAyC,CAAC;AAK9D,4EAA4E;AAC5E,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK;;;;;;CAMR,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY,0CAA0C,CAAC;AAEpE,8FAA8F;AAC9F,eAAO,MAAM,WAAW,GAAI,eAA0C;;;;;;;;;;;;;CASzD,CAAC;AAEd,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM;;;;;;;;;;;;;;;;;;CAAoD,CAAC;AAErG;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,OAAO;IAClB,6FAA6F;;;;;;CAMrF,CAAC;AAEX,oGAAoG;AACpG,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,WACwB,CAAC"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * The colours Visin draws with, per colour scheme, in one place.
3
+ *
4
+ * Pages never read the raw values: they use `ink`, `surface`, `glass` and
5
+ * `chrome`, which point at CSS variables the theme writes for both schemes, so
6
+ * a page that says `color: ink.muted` follows the switch without knowing there
7
+ * is one. The raw values are here for the contrast tests and for the few places
8
+ * outside a React tree (`theme-color`, the manifest, the offline page).
9
+ *
10
+ * The dark scheme is slate with a little blue in it rather than neutral grey:
11
+ * it keeps the brand's cast, and pure grey behind charts reads as dead.
12
+ */
13
+ /** Primary, per scheme: what can be acted on. Walked lighter for dark, where the light blue fails AA. */
14
+ export const brand = {
15
+ light: '#2563eb',
16
+ dark: '#60a5fa'
17
+ };
18
+ export const schemes = {
19
+ light: {
20
+ /** Text, darkest to lightest. Slate rather than grey, to sit under the blue. */
21
+ ink: {
22
+ strong: '#0f172a',
23
+ body: '#475569',
24
+ muted: '#5b6779',
25
+ /** Decorative only — under 3:1. Never put words a reader needs in this. */
26
+ faint: '#94a3b8'
27
+ },
28
+ surface: {
29
+ /** A faint blue glow at the top of the page, over `default`. */
30
+ glow: 'rgba(37,99,235,0.10)',
31
+ default: '#f6f7fb',
32
+ paper: '#ffffff',
33
+ /** Table heads, inset panels: one step back from `paper`. */
34
+ sunken: '#f8fafc',
35
+ divider: '#e2e8f0',
36
+ /** The edge of the frosted chrome: an opaque divider draws a hard rule across the blur. */
37
+ chromeEdge: 'rgba(15,23,42,0.08)',
38
+ /** Hover tint on neutral controls. */
39
+ hover: 'rgba(15,23,42,0.05)',
40
+ /** The veil over an image that text has to stay readable on. */
41
+ scrim: 'rgba(255,255,255,0.72)'
42
+ },
43
+ // Opaque enough that a bright button under a menu reads as colour, not as
44
+ // a second button: 0.72 let one show through as a smear.
45
+ glass: {
46
+ background: 'rgba(255,255,255,0.88)',
47
+ border: 'rgba(15,23,42,0.07)',
48
+ shadow: 'rgba(15,23,42,0.30)'
49
+ },
50
+ chrome: {
51
+ background: 'rgba(255,255,255,0.72)',
52
+ ink: '#0f172a',
53
+ inkMuted: '#5b6779'
54
+ },
55
+ /** The main action's gradient, blue into indigo; white text clears AA on every stop. */
56
+ accent: {
57
+ start: '#2563eb',
58
+ end: '#4f46e5',
59
+ startHover: '#1d4ed8',
60
+ endHover: '#4338ca'
61
+ },
62
+ /** The browser's own bar, `<meta name="theme-color">`. */
63
+ themeColor: '#f6f7fb'
64
+ },
65
+ dark: {
66
+ ink: {
67
+ strong: '#e6eaf2',
68
+ body: '#b3bccb',
69
+ muted: '#8f9aac',
70
+ faint: '#5b6474'
71
+ },
72
+ surface: {
73
+ glow: 'rgba(96,165,250,0.12)',
74
+ default: '#0b0f17',
75
+ paper: '#121826',
76
+ // One step *forward* in dark: a darker head on a dark table disappears.
77
+ sunken: '#182030',
78
+ divider: '#232b3a',
79
+ chromeEdge: 'rgba(148,163,184,0.12)',
80
+ hover: 'rgba(255,255,255,0.06)',
81
+ scrim: 'rgba(11,15,23,0.72)'
82
+ },
83
+ glass: {
84
+ background: 'rgba(18,24,38,0.86)',
85
+ border: 'rgba(255,255,255,0.07)',
86
+ shadow: 'rgba(0,0,0,0.65)'
87
+ },
88
+ chrome: {
89
+ background: 'rgba(13,18,28,0.72)',
90
+ ink: '#e6eaf2',
91
+ inkMuted: '#8f9aac'
92
+ },
93
+ // Lighter stops for dark, under dark text; hover lightens rather than darkens.
94
+ accent: {
95
+ start: '#60a5fa',
96
+ end: '#818cf8',
97
+ startHover: '#93c5fd',
98
+ endHover: '#a5b4fc'
99
+ },
100
+ themeColor: '#0b0f17'
101
+ }
102
+ };
103
+ /** A token's CSS variable, e.g. `--vi-surface-chrome-edge`. */
104
+ const cssVar = (group, key) => `--vi-${group}-${key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`;
105
+ const refs = (group, values) => Object.fromEntries(Object.keys(values).map((key) => [key, `var(${cssVar(group, key)})`]));
106
+ const flatten = (group, values) => Object.entries(values).map(([key, value]) => [cssVar(group, key), value]);
107
+ /** One scheme as CSS custom properties. The theme writes these; nothing else should. */
108
+ export function schemeCssVars(name) {
109
+ const scheme = schemes[name];
110
+ return Object.fromEntries([
111
+ ...flatten('ink', scheme.ink),
112
+ ...flatten('surface', scheme.surface),
113
+ ...flatten('glass', scheme.glass),
114
+ ...flatten('chrome', scheme.chrome),
115
+ ...flatten('accent', scheme.accent)
116
+ ]);
117
+ }
118
+ /** Text, darkest to lightest. Follows light and dark. */
119
+ export const ink = refs('ink', schemes.light.ink);
120
+ /** Page and panel backgrounds. Follows light and dark. */
121
+ export const surface = refs('surface', schemes.light.surface);
122
+ const chromeVars = refs('chrome', schemes.light.chrome);
123
+ const accentVars = refs('accent', schemes.light.accent);
124
+ /** The page behind everything: a glow at the top, fading into `default`. */
125
+ export const pageBackground = {
126
+ backgroundColor: surface.default,
127
+ backgroundImage: `radial-gradient(1200px 520px at 50% -160px, ${surface.glow}, transparent 70%)`,
128
+ backgroundRepeat: 'no-repeat'
129
+ };
130
+ /**
131
+ * A frosted surface that floats over the page: menus, popovers, dialogs, the
132
+ * phone's bottom sheet, cards on the home page. Translucent on purpose, so what
133
+ * is under it shows through as colour rather than being cut out.
134
+ *
135
+ * Not for tables, lists and charts. Blur behind numbers costs legibility and
136
+ * scrolling; those stay on solid `Panel`s.
137
+ */
138
+ export const glass = {
139
+ background: 'var(--vi-glass-background)',
140
+ backdropFilter: 'blur(14px) saturate(160%)',
141
+ WebkitBackdropFilter: 'blur(14px) saturate(160%)',
142
+ border: '1px solid var(--vi-glass-border)',
143
+ boxShadow: '0 18px 40px -24px var(--vi-glass-shadow)'
144
+ };
145
+ /**
146
+ * The resting shadow of a solid surface (a `Panel`, a card): enough to lift it
147
+ * off the page, soft enough that a stack of them does not read as clutter.
148
+ */
149
+ export const raisedShadow = '0 12px 32px -28px rgba(15,23,42,0.45)';
150
+ /** A surface that rises toward the pointer. `accent` tints the edge and the lifted shadow. */
151
+ export const liftOnHover = (accent = 'var(--mui-palette-primary-main)') => ({
152
+ transition: 'transform .2s ease, box-shadow .2s ease, border-color .2s ease',
153
+ '&:hover': {
154
+ transform: 'translateY(-2px)',
155
+ borderColor: `color-mix(in srgb, ${accent} 35%, transparent)`,
156
+ boxShadow: `0 22px 44px -26px color-mix(in srgb, ${accent} 80%, transparent)`
157
+ },
158
+ '@media (prefers-reduced-motion: reduce)': { transition: 'none', '&:hover': { transform: 'none' } }
159
+ });
160
+ /** A glass card that responds to being pointed at. `accent` tints the lifted shadow. */
161
+ export const glassInteractive = (accent) => ({ ...glass, ...liftOnHover(accent) });
162
+ /**
163
+ * The one action a page is for, where a plain filled button undersells it: a
164
+ * blue-to-indigo gradient with a glow. At most one per page.
165
+ */
166
+ export const mainAction = {
167
+ backgroundImage: `linear-gradient(135deg, ${accentVars.start} 0%, ${accentVars.end} 100%)`,
168
+ color: 'var(--mui-palette-primary-contrastText)',
169
+ boxShadow: '0 10px 28px -12px color-mix(in srgb, var(--mui-palette-primary-main) 85%, transparent)',
170
+ '&:hover': {
171
+ backgroundImage: `linear-gradient(135deg, ${accentVars.startHover} 0%, ${accentVars.endHover} 100%)`,
172
+ boxShadow: '0 12px 32px -12px color-mix(in srgb, var(--mui-palette-primary-main) 95%, transparent)'
173
+ }
174
+ };
175
+ /**
176
+ * The frosted chrome around the content: the navigation rail, the app bar and
177
+ * the phone's tab bar. One tint and one blur for all three, because they meet
178
+ * at a corner, and two slightly different tints show as a step there.
179
+ */
180
+ export const chrome = {
181
+ background: chromeVars.background,
182
+ ink: chromeVars.ink,
183
+ inkMuted: chromeVars.inkMuted,
184
+ edge: surface.chromeEdge,
185
+ surface: {
186
+ background: chromeVars.background,
187
+ backdropFilter: 'blur(16px) saturate(165%)',
188
+ WebkitBackdropFilter: 'blur(16px) saturate(165%)'
189
+ }
190
+ };
191
+ /**
192
+ * Controls laid over a photo or a frame: a viewer's buttons, a caption chip.
193
+ * The same in both schemes, because the picture under them is.
194
+ */
195
+ export const onImage = {
196
+ /** Behind a frame being judged: dark and neutral, so the picture's own colours read true. */
197
+ backdrop: '#0b0f19',
198
+ ink: '#ffffff',
199
+ scrim: 'rgba(0,0,0,0.5)',
200
+ scrimStrong: 'rgba(0,0,0,0.7)',
201
+ chip: 'rgba(255,255,255,0.2)'
202
+ };
203
+ /** `color` at `opacity` (0–1). Unlike MUI's `alpha()`, works on a CSS variable as well as a hex. */
204
+ export const tint = (color, opacity) => `color-mix(in srgb, ${color} ${Math.round(opacity * 100)}%, transparent)`;
205
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/theme/tokens.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visin/frontend-core",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "description": "Shared frontend auth/API-client logic for Visin frontends",
5
5
  "author": "Toomas Tahves",
6
6
  "license": "MIT",
package/dist/theme.d.ts DELETED
@@ -1,27 +0,0 @@
1
- import { type Theme, type ThemeOptions } from '@mui/material/styles';
2
- /**
3
- * The colours of Visin's own chrome — the landing page's: dark ink behind the
4
- * navigation, one blue for what can be acted on. Exported for the places that
5
- * have to name a colour outside a theme: the browser's `theme-color`, the
6
- * manifest, the offline page.
7
- */
8
- export declare const VISIN_COLORS: {
9
- /** Primary: buttons, links, the selected state. */
10
- readonly brand: "#2563EB";
11
- /** The app bar across the top of every page (and the phone's status bar); the landing page's ink. */
12
- readonly appBar: "#111827";
13
- /** The desktop navigation rail beside the content. */
14
- readonly rail: "#111827";
15
- readonly background: "#F6F7FB";
16
- };
17
- /**
18
- * The one theme every Visin front renders with — shell, vision, label, account
19
- * and sign-in — so crossing apps inside the shell never changes the typeface,
20
- * the blue, or the shape of a button.
21
- *
22
- * `shape.borderRadius` stays MUI's 4px unit on purpose: pages across the apps
23
- * set radii as theme multiples (`borderRadius: 2`), and a larger unit turned
24
- * those into pills. Components get their rounder corners here instead.
25
- */
26
- export declare function createVisinTheme(overrides?: ThemeOptions): Theme;
27
- //# sourceMappingURL=theme.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAElF;;;;;GAKG;AACH,eAAO,MAAM,YAAY;IACvB,mDAAmD;;IAEnD,qGAAqG;;IAErG,sDAAsD;;;CAG9C,CAAC;AAOX;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,YAAiB,GAAG,KAAK,CA8FpE"}
package/dist/theme.js DELETED
@@ -1,121 +0,0 @@
1
- import { createTheme } from '@mui/material/styles';
2
- /**
3
- * The colours of Visin's own chrome — the landing page's: dark ink behind the
4
- * navigation, one blue for what can be acted on. Exported for the places that
5
- * have to name a colour outside a theme: the browser's `theme-color`, the
6
- * manifest, the offline page.
7
- */
8
- export const VISIN_COLORS = {
9
- /** Primary: buttons, links, the selected state. */
10
- brand: '#2563EB',
11
- /** The app bar across the top of every page (and the phone's status bar); the landing page's ink. */
12
- appBar: '#111827',
13
- /** The desktop navigation rail beside the content. */
14
- rail: '#111827',
15
- background: '#F6F7FB'
16
- };
17
- /** Below `md` — the compact (phone) layout, as `useCompactLayout` reads it. */
18
- const PHONE = '@media (max-width:899.95px)';
19
- const FONT_STACK = '"Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
20
- /**
21
- * The one theme every Visin front renders with — shell, vision, label, account
22
- * and sign-in — so crossing apps inside the shell never changes the typeface,
23
- * the blue, or the shape of a button.
24
- *
25
- * `shape.borderRadius` stays MUI's 4px unit on purpose: pages across the apps
26
- * set radii as theme multiples (`borderRadius: 2`), and a larger unit turned
27
- * those into pills. Components get their rounder corners here instead.
28
- */
29
- export function createVisinTheme(overrides = {}) {
30
- return createTheme({
31
- palette: {
32
- primary: { main: VISIN_COLORS.brand, light: '#60A5FA', dark: '#1D4ED8', contrastText: '#FFFFFF' },
33
- secondary: { main: '#64748B' },
34
- success: { main: '#16A34A' },
35
- warning: { main: '#D97706' },
36
- error: { main: '#DC2626' },
37
- info: { main: '#0284C7' },
38
- background: { default: VISIN_COLORS.background, paper: '#FFFFFF' },
39
- text: { primary: '#0F172A', secondary: '#475569' },
40
- divider: '#E2E8F0'
41
- },
42
- typography: {
43
- fontFamily: FONT_STACK,
44
- h1: { fontWeight: 700, letterSpacing: '-0.02em' },
45
- h2: { fontWeight: 700, letterSpacing: '-0.02em' },
46
- h3: { fontWeight: 700, letterSpacing: '-0.02em' },
47
- // Page titles: MUI's 2.125rem h4 filled a phone's width with two words.
48
- h4: { fontWeight: 700, letterSpacing: '-0.02em', fontSize: '1.75rem', [PHONE]: { fontSize: '1.375rem' } },
49
- h5: { fontWeight: 600, [PHONE]: { fontSize: '1.2rem' } },
50
- h6: { fontWeight: 600 },
51
- subtitle1: { fontWeight: 600 },
52
- subtitle2: { fontWeight: 600 },
53
- button: { textTransform: 'none', fontWeight: 600 }
54
- },
55
- shape: { borderRadius: 4 },
56
- components: {
57
- MuiCssBaseline: {
58
- styleOverrides: {
59
- body: { WebkitFontSmoothing: 'antialiased', MozOsxFontSmoothing: 'grayscale' }
60
- }
61
- },
62
- // AppLayout's content column already has the page gutters; a Container's
63
- // own added a second pair, which a phone paid for in width.
64
- MuiContainer: {
65
- defaultProps: { disableGutters: true }
66
- },
67
- MuiButton: {
68
- defaultProps: { disableElevation: true },
69
- styleOverrides: { root: { borderRadius: 10 } }
70
- },
71
- MuiFab: {
72
- styleOverrides: { root: { textTransform: 'none', fontWeight: 600 } }
73
- },
74
- MuiPaper: {
75
- styleOverrides: {
76
- rounded: { borderRadius: 12 },
77
- outlined: { borderColor: '#E2E8F0' }
78
- }
79
- },
80
- MuiCard: {
81
- defaultProps: { variant: 'outlined' },
82
- styleOverrides: { root: { borderRadius: 16 } }
83
- },
84
- MuiDialog: {
85
- styleOverrides: { paper: { borderRadius: 16 } }
86
- },
87
- MuiMenu: {
88
- styleOverrides: { paper: { borderRadius: 12 } }
89
- },
90
- MuiOutlinedInput: {
91
- styleOverrides: { root: { borderRadius: 10, backgroundColor: '#FFFFFF' } }
92
- },
93
- MuiAlert: {
94
- styleOverrides: { root: { borderRadius: 10 } }
95
- },
96
- MuiChip: {
97
- styleOverrides: { root: { fontWeight: 500 } }
98
- },
99
- MuiTab: {
100
- styleOverrides: { root: { textTransform: 'none', fontWeight: 600 } }
101
- },
102
- MuiTableCell: {
103
- styleOverrides: {
104
- root: { borderColor: '#E2E8F0' },
105
- head: {
106
- backgroundColor: '#F8FAFC',
107
- color: '#475569',
108
- fontSize: '0.75rem',
109
- fontWeight: 600,
110
- letterSpacing: '0.04em',
111
- textTransform: 'uppercase'
112
- }
113
- }
114
- },
115
- MuiLinearProgress: {
116
- styleOverrides: { root: { borderRadius: 999 }, bar: { borderRadius: 999 } }
117
- }
118
- }
119
- }, overrides);
120
- }
121
- //# sourceMappingURL=theme.js.map
package/dist/theme.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}