@boxa-devops/depo-shared 1.0.4 → 1.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/README.md +13 -11
- package/dist/api.d.ts +273 -0
- package/dist/api.d.ts.map +1 -1
- package/error_codes.json +8 -0
- package/openapi.json +425 -0
- package/package.json +6 -2
- package/src/api.ts +273 -0
- package/tokens-kiosk.css +179 -0
package/src/api.ts
CHANGED
|
@@ -963,6 +963,57 @@ export interface paths {
|
|
|
963
963
|
patch?: never;
|
|
964
964
|
trace?: never;
|
|
965
965
|
};
|
|
966
|
+
"/api/v1/admin/refs/loco-series/{code}/positions": {
|
|
967
|
+
parameters: {
|
|
968
|
+
query?: never;
|
|
969
|
+
header?: never;
|
|
970
|
+
path?: never;
|
|
971
|
+
cookie?: never;
|
|
972
|
+
};
|
|
973
|
+
/**
|
|
974
|
+
* List Series Positions
|
|
975
|
+
* @description Every type bound to this series, with the list it carries there.
|
|
976
|
+
*
|
|
977
|
+
* Types with no binding are deliberately absent rather than listed with their
|
|
978
|
+
* global list: the visualization has to be able to tell «this series says so»
|
|
979
|
+
* from «the type says so», and a merged view cannot.
|
|
980
|
+
*/
|
|
981
|
+
get: operations["list_series_positions_api_v1_admin_refs_loco_series__code__positions_get"];
|
|
982
|
+
put?: never;
|
|
983
|
+
post?: never;
|
|
984
|
+
delete?: never;
|
|
985
|
+
options?: never;
|
|
986
|
+
head?: never;
|
|
987
|
+
patch?: never;
|
|
988
|
+
trace?: never;
|
|
989
|
+
};
|
|
990
|
+
"/api/v1/admin/refs/loco-series/{code}/positions/{nomenclature_id}": {
|
|
991
|
+
parameters: {
|
|
992
|
+
query?: never;
|
|
993
|
+
header?: never;
|
|
994
|
+
path?: never;
|
|
995
|
+
cookie?: never;
|
|
996
|
+
};
|
|
997
|
+
get?: never;
|
|
998
|
+
/**
|
|
999
|
+
* Bind Series Positions
|
|
1000
|
+
* @description Create or replace the binding. Idempotent by (series, type).
|
|
1001
|
+
*/
|
|
1002
|
+
put: operations["bind_series_positions_api_v1_admin_refs_loco_series__code__positions__nomenclature_id__put"];
|
|
1003
|
+
post?: never;
|
|
1004
|
+
/**
|
|
1005
|
+
* Unbind Series Positions
|
|
1006
|
+
* @description Drop the binding: the type falls back to its global positions list.
|
|
1007
|
+
*
|
|
1008
|
+
* Absent binding is not an error — the operator's intent («this series has no
|
|
1009
|
+
* list of its own») already holds.
|
|
1010
|
+
*/
|
|
1011
|
+
delete: operations["unbind_series_positions_api_v1_admin_refs_loco_series__code__positions__nomenclature_id__delete"];
|
|
1012
|
+
options?: never;
|
|
1013
|
+
head?: never;
|
|
1014
|
+
patch?: never;
|
|
1015
|
+
trace?: never;
|
|
1016
|
+
};
|
|
966
1017
|
"/api/v1/admin/refs/{entity}": {
|
|
967
1018
|
parameters: {
|
|
968
1019
|
query?: never;
|
|
@@ -2876,6 +2927,30 @@ export interface paths {
|
|
|
2876
2927
|
patch?: never;
|
|
2877
2928
|
trace?: never;
|
|
2878
2929
|
};
|
|
2930
|
+
"/api/v1/refs/loco-series-positions": {
|
|
2931
|
+
parameters: {
|
|
2932
|
+
query?: never;
|
|
2933
|
+
header?: never;
|
|
2934
|
+
path?: never;
|
|
2935
|
+
cookie?: never;
|
|
2936
|
+
};
|
|
2937
|
+
/**
|
|
2938
|
+
* Loco Series Positions
|
|
2939
|
+
* @description Per-series mount positions, for the terminal's chips.
|
|
2940
|
+
*
|
|
2941
|
+
* A small dictionary by design: only the types whose positions differ from
|
|
2942
|
+
* the global `nomenclature.positions` have a row. The client applies it as an
|
|
2943
|
+
* override — series row first, global list otherwise.
|
|
2944
|
+
*/
|
|
2945
|
+
get: operations["loco_series_positions_api_v1_refs_loco_series_positions_get"];
|
|
2946
|
+
put?: never;
|
|
2947
|
+
post?: never;
|
|
2948
|
+
delete?: never;
|
|
2949
|
+
options?: never;
|
|
2950
|
+
head?: never;
|
|
2951
|
+
patch?: never;
|
|
2952
|
+
trace?: never;
|
|
2953
|
+
};
|
|
2879
2954
|
"/api/v1/refs/nomenclature": {
|
|
2880
2955
|
parameters: {
|
|
2881
2956
|
query?: never;
|
|
@@ -7478,6 +7553,61 @@ export interface components {
|
|
|
7478
7553
|
/** Photo Key */
|
|
7479
7554
|
photo_key: string | null;
|
|
7480
7555
|
};
|
|
7556
|
+
/**
|
|
7557
|
+
* LocoSeriesPositionIn
|
|
7558
|
+
* @description Bind a part type to a series with that machine's own position list.
|
|
7559
|
+
*
|
|
7560
|
+
* Normalised by the same validator as nomenclature.positions, so a list means
|
|
7561
|
+
* the same thing wherever it was typed. An empty list is rejected: «no
|
|
7562
|
+
* per-series list» is expressed by DELETEing the binding, which falls the
|
|
7563
|
+
* type back to its global list, not by saving emptiness that would read as
|
|
7564
|
+
* «this series has no positions».
|
|
7565
|
+
*/
|
|
7566
|
+
LocoSeriesPositionIn: {
|
|
7567
|
+
/** Positions */
|
|
7568
|
+
positions: string[];
|
|
7569
|
+
};
|
|
7570
|
+
/**
|
|
7571
|
+
* LocoSeriesPositionOut
|
|
7572
|
+
* @description One binding as the admin visualization draws it.
|
|
7573
|
+
*/
|
|
7574
|
+
LocoSeriesPositionOut: {
|
|
7575
|
+
/** Loco Series */
|
|
7576
|
+
loco_series: string;
|
|
7577
|
+
/**
|
|
7578
|
+
* Nomenclature Id
|
|
7579
|
+
* Format: uuid
|
|
7580
|
+
*/
|
|
7581
|
+
nomenclature_id: string;
|
|
7582
|
+
/** Code */
|
|
7583
|
+
code: string;
|
|
7584
|
+
/** Name */
|
|
7585
|
+
name: string;
|
|
7586
|
+
/** Positions */
|
|
7587
|
+
positions: string[];
|
|
7588
|
+
};
|
|
7589
|
+
/**
|
|
7590
|
+
* LocoSeriesPositionRef
|
|
7591
|
+
* @description One binding: what positions a part type has on ONE series.
|
|
7592
|
+
*
|
|
7593
|
+
* Overrides NomenclatureRef.positions for that series only. A type with no
|
|
7594
|
+
* row here keeps the global list, so this dictionary is usually short and a
|
|
7595
|
+
* depot that never needs per-series lists syncs an empty one.
|
|
7596
|
+
*/
|
|
7597
|
+
LocoSeriesPositionRef: {
|
|
7598
|
+
/** Loco Series */
|
|
7599
|
+
loco_series: string;
|
|
7600
|
+
/**
|
|
7601
|
+
* Nomenclature Id
|
|
7602
|
+
* Format: uuid
|
|
7603
|
+
*/
|
|
7604
|
+
nomenclature_id: string;
|
|
7605
|
+
/**
|
|
7606
|
+
* Positions
|
|
7607
|
+
* @default []
|
|
7608
|
+
*/
|
|
7609
|
+
positions: string[];
|
|
7610
|
+
};
|
|
7481
7611
|
/**
|
|
7482
7612
|
* LocoUnitCard
|
|
7483
7613
|
* @description Machine card header = the registry row plus the card-only honesty bits.
|
|
@@ -13608,6 +13738,115 @@ export interface operations {
|
|
|
13608
13738
|
};
|
|
13609
13739
|
};
|
|
13610
13740
|
};
|
|
13741
|
+
list_series_positions_api_v1_admin_refs_loco_series__code__positions_get: {
|
|
13742
|
+
parameters: {
|
|
13743
|
+
query?: never;
|
|
13744
|
+
header?: {
|
|
13745
|
+
"x-debug-person-id"?: string | null;
|
|
13746
|
+
};
|
|
13747
|
+
path: {
|
|
13748
|
+
code: string;
|
|
13749
|
+
};
|
|
13750
|
+
cookie?: {
|
|
13751
|
+
depo_admin_session?: string | null;
|
|
13752
|
+
};
|
|
13753
|
+
};
|
|
13754
|
+
requestBody?: never;
|
|
13755
|
+
responses: {
|
|
13756
|
+
/** @description Successful Response */
|
|
13757
|
+
200: {
|
|
13758
|
+
headers: {
|
|
13759
|
+
[name: string]: unknown;
|
|
13760
|
+
};
|
|
13761
|
+
content: {
|
|
13762
|
+
"application/json": components["schemas"]["LocoSeriesPositionOut"][];
|
|
13763
|
+
};
|
|
13764
|
+
};
|
|
13765
|
+
/** @description Validation Error */
|
|
13766
|
+
422: {
|
|
13767
|
+
headers: {
|
|
13768
|
+
[name: string]: unknown;
|
|
13769
|
+
};
|
|
13770
|
+
content: {
|
|
13771
|
+
"application/json": components["schemas"]["HTTPValidationError"];
|
|
13772
|
+
};
|
|
13773
|
+
};
|
|
13774
|
+
};
|
|
13775
|
+
};
|
|
13776
|
+
bind_series_positions_api_v1_admin_refs_loco_series__code__positions__nomenclature_id__put: {
|
|
13777
|
+
parameters: {
|
|
13778
|
+
query?: never;
|
|
13779
|
+
header?: {
|
|
13780
|
+
"x-debug-person-id"?: string | null;
|
|
13781
|
+
};
|
|
13782
|
+
path: {
|
|
13783
|
+
code: string;
|
|
13784
|
+
nomenclature_id: string;
|
|
13785
|
+
};
|
|
13786
|
+
cookie?: {
|
|
13787
|
+
depo_admin_session?: string | null;
|
|
13788
|
+
};
|
|
13789
|
+
};
|
|
13790
|
+
requestBody: {
|
|
13791
|
+
content: {
|
|
13792
|
+
"application/json": components["schemas"]["LocoSeriesPositionIn"];
|
|
13793
|
+
};
|
|
13794
|
+
};
|
|
13795
|
+
responses: {
|
|
13796
|
+
/** @description Successful Response */
|
|
13797
|
+
200: {
|
|
13798
|
+
headers: {
|
|
13799
|
+
[name: string]: unknown;
|
|
13800
|
+
};
|
|
13801
|
+
content: {
|
|
13802
|
+
"application/json": components["schemas"]["LocoSeriesPositionOut"];
|
|
13803
|
+
};
|
|
13804
|
+
};
|
|
13805
|
+
/** @description Validation Error */
|
|
13806
|
+
422: {
|
|
13807
|
+
headers: {
|
|
13808
|
+
[name: string]: unknown;
|
|
13809
|
+
};
|
|
13810
|
+
content: {
|
|
13811
|
+
"application/json": components["schemas"]["HTTPValidationError"];
|
|
13812
|
+
};
|
|
13813
|
+
};
|
|
13814
|
+
};
|
|
13815
|
+
};
|
|
13816
|
+
unbind_series_positions_api_v1_admin_refs_loco_series__code__positions__nomenclature_id__delete: {
|
|
13817
|
+
parameters: {
|
|
13818
|
+
query?: never;
|
|
13819
|
+
header?: {
|
|
13820
|
+
"x-debug-person-id"?: string | null;
|
|
13821
|
+
};
|
|
13822
|
+
path: {
|
|
13823
|
+
code: string;
|
|
13824
|
+
nomenclature_id: string;
|
|
13825
|
+
};
|
|
13826
|
+
cookie?: {
|
|
13827
|
+
depo_admin_session?: string | null;
|
|
13828
|
+
};
|
|
13829
|
+
};
|
|
13830
|
+
requestBody?: never;
|
|
13831
|
+
responses: {
|
|
13832
|
+
/** @description Successful Response */
|
|
13833
|
+
204: {
|
|
13834
|
+
headers: {
|
|
13835
|
+
[name: string]: unknown;
|
|
13836
|
+
};
|
|
13837
|
+
content?: never;
|
|
13838
|
+
};
|
|
13839
|
+
/** @description Validation Error */
|
|
13840
|
+
422: {
|
|
13841
|
+
headers: {
|
|
13842
|
+
[name: string]: unknown;
|
|
13843
|
+
};
|
|
13844
|
+
content: {
|
|
13845
|
+
"application/json": components["schemas"]["HTTPValidationError"];
|
|
13846
|
+
};
|
|
13847
|
+
};
|
|
13848
|
+
};
|
|
13849
|
+
};
|
|
13611
13850
|
list_entity_api_v1_admin_refs__entity__get: {
|
|
13612
13851
|
parameters: {
|
|
13613
13852
|
query?: never;
|
|
@@ -17419,6 +17658,40 @@ export interface operations {
|
|
|
17419
17658
|
};
|
|
17420
17659
|
};
|
|
17421
17660
|
};
|
|
17661
|
+
loco_series_positions_api_v1_refs_loco_series_positions_get: {
|
|
17662
|
+
parameters: {
|
|
17663
|
+
query?: never;
|
|
17664
|
+
header?: {
|
|
17665
|
+
authorization?: string | null;
|
|
17666
|
+
"x-debug-person-id"?: string | null;
|
|
17667
|
+
};
|
|
17668
|
+
path?: never;
|
|
17669
|
+
cookie?: {
|
|
17670
|
+
depo_admin_session?: string | null;
|
|
17671
|
+
};
|
|
17672
|
+
};
|
|
17673
|
+
requestBody?: never;
|
|
17674
|
+
responses: {
|
|
17675
|
+
/** @description Successful Response */
|
|
17676
|
+
200: {
|
|
17677
|
+
headers: {
|
|
17678
|
+
[name: string]: unknown;
|
|
17679
|
+
};
|
|
17680
|
+
content: {
|
|
17681
|
+
"application/json": components["schemas"]["LocoSeriesPositionRef"][];
|
|
17682
|
+
};
|
|
17683
|
+
};
|
|
17684
|
+
/** @description Validation Error */
|
|
17685
|
+
422: {
|
|
17686
|
+
headers: {
|
|
17687
|
+
[name: string]: unknown;
|
|
17688
|
+
};
|
|
17689
|
+
content: {
|
|
17690
|
+
"application/json": components["schemas"]["HTTPValidationError"];
|
|
17691
|
+
};
|
|
17692
|
+
};
|
|
17693
|
+
};
|
|
17694
|
+
};
|
|
17422
17695
|
nomenclature_api_v1_refs_nomenclature_get: {
|
|
17423
17696
|
parameters: {
|
|
17424
17697
|
query?: {
|
package/tokens-kiosk.css
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Kiosk theme — «тёмное стекло» for depo-terminal.
|
|
3
|
+
|
|
4
|
+
OPT-IN OVERLAY on top of tokens.css. Import order matters:
|
|
5
|
+
|
|
6
|
+
@import "@boxa-devops/depo-shared/tokens.css";
|
|
7
|
+
@import "@boxa-devops/depo-shared/tokens-kiosk.css";
|
|
8
|
+
|
|
9
|
+
depo-admin imports only the first file and keeps the light «технический
|
|
10
|
+
формуляр» look. Everything here re-binds EXISTING token names, so the
|
|
11
|
+
consumers' bg-paper / text-ink / rounded-md utilities flip theme without
|
|
12
|
+
touching a single component. Only the handful of tokens at the end are new.
|
|
13
|
+
|
|
14
|
+
Semantics are preserved, not reused loosely: a *-ink token is still the
|
|
15
|
+
readable text color of its tint, it is simply light now instead of dark.
|
|
16
|
+
|
|
17
|
+
WCAG AA contrast (computed; normal text needs >= 4.5). Translucent values
|
|
18
|
+
are composited over the app background #070A0F first, and text on glass is
|
|
19
|
+
measured against the composited glass surface:
|
|
20
|
+
ink #F5F8FF on glass = 16.24 on app bg = 18.65
|
|
21
|
+
ink-2 rgba(255,255,255,.72) on glass = 9.40
|
|
22
|
+
ink-3 rgba(255,255,255,.52) on glass = 5.51 on app bg = 5.69
|
|
23
|
+
accent-lt #A8C4FF on glass = 9.87
|
|
24
|
+
white on accent #1D4ED8 = 6.70
|
|
25
|
+
white on accent-2 #3B6BF5 = 4.56
|
|
26
|
+
on-light #0A0E14 on a white control = 19.34
|
|
27
|
+
warn-ink #FEDF89 on warn-tint = 11.77
|
|
28
|
+
ok-ink #BBF7D0 on ok-tint = 12.62
|
|
29
|
+
danger-ink #FFC9C9 on danger-tint = 11.62
|
|
30
|
+
white on danger #D92D20 = 4.83
|
|
31
|
+
on-light on warn #FDB022 = 10.51
|
|
32
|
+
on-light on ok #32D583 = 10.11
|
|
33
|
+
========================================================================= */
|
|
34
|
+
|
|
35
|
+
/* --- Self-hosted fonts (depot may live without internet: no CDN, ever) -----
|
|
36
|
+
Barlow and Space Grotesk ship latin-only here: Uzbek Latin needs nothing
|
|
37
|
+
beyond it (oʻ / gʻ use U+02BB, which is inside the latin subset). Russian
|
|
38
|
+
is served by the Inter Cyrillic faces already declared in tokens.css — the
|
|
39
|
+
unicode-range split below hands Cyrillic runs to Inter automatically, so RU
|
|
40
|
+
text stays typographically correct instead of falling back to a system
|
|
41
|
+
font. Neither family has Cyrillic glyphs at all, so this is not optional. */
|
|
42
|
+
@font-face {
|
|
43
|
+
font-family: "Barlow";
|
|
44
|
+
font-style: normal;
|
|
45
|
+
font-weight: 400;
|
|
46
|
+
font-display: swap;
|
|
47
|
+
src: url("/fonts/barlow-latin-400.woff2") format("woff2");
|
|
48
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
49
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
|
|
50
|
+
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
51
|
+
}
|
|
52
|
+
@font-face {
|
|
53
|
+
font-family: "Barlow";
|
|
54
|
+
font-style: normal;
|
|
55
|
+
font-weight: 500;
|
|
56
|
+
font-display: swap;
|
|
57
|
+
src: url("/fonts/barlow-latin-500.woff2") format("woff2");
|
|
58
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
59
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
|
|
60
|
+
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
61
|
+
}
|
|
62
|
+
@font-face {
|
|
63
|
+
font-family: "Barlow";
|
|
64
|
+
font-style: normal;
|
|
65
|
+
font-weight: 600;
|
|
66
|
+
font-display: swap;
|
|
67
|
+
src: url("/fonts/barlow-latin-600.woff2") format("woff2");
|
|
68
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
69
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
|
|
70
|
+
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
71
|
+
}
|
|
72
|
+
@font-face {
|
|
73
|
+
font-family: "Barlow";
|
|
74
|
+
font-style: normal;
|
|
75
|
+
font-weight: 700;
|
|
76
|
+
font-display: swap;
|
|
77
|
+
src: url("/fonts/barlow-latin-700.woff2") format("woff2");
|
|
78
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
79
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
|
|
80
|
+
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
81
|
+
}
|
|
82
|
+
@font-face {
|
|
83
|
+
font-family: "Space Grotesk";
|
|
84
|
+
font-style: normal;
|
|
85
|
+
font-weight: 300 700;
|
|
86
|
+
font-display: swap;
|
|
87
|
+
src: url("/fonts/space-grotesk-latin-wght.woff2") format("woff2-variations");
|
|
88
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
89
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
|
|
90
|
+
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@theme {
|
|
94
|
+
/* --- Neutrals: near-black room, translucent glass surfaces ------------- */
|
|
95
|
+
--color-steel: #070a0f; /* app background — the dark room */
|
|
96
|
+
--color-paper: rgb(255 255 255 / 0.07); /* glass surface: cards, header */
|
|
97
|
+
--color-ink: #f5f8ff; /* primary text */
|
|
98
|
+
--color-ink-2: rgb(255 255 255 / 0.72); /* secondary text */
|
|
99
|
+
--color-ink-3: rgb(255 255 255 / 0.52); /* muted text, placeholders */
|
|
100
|
+
--color-line: rgb(255 255 255 / 0.14); /* glass hairline */
|
|
101
|
+
--color-line-strong: rgb(255 255 255 / 0.3); /* emphasized rule */
|
|
102
|
+
--color-hover: rgb(255 255 255 / 0.12); /* glass lifted one step */
|
|
103
|
+
|
|
104
|
+
/* --- Accent: the design's electric blue -------------------------------- */
|
|
105
|
+
--color-accent: #1d4ed8;
|
|
106
|
+
--color-accent-2: #3b6bf5; /* hover of primary, gradient top stop */
|
|
107
|
+
--color-accent-tint: rgb(41 98 255 / 0.18); /* selected chip fill */
|
|
108
|
+
--color-accent-lt: #a8c4ff; /* links and accented text on glass */
|
|
109
|
+
|
|
110
|
+
/* --- Signals — still reserved for statuses & alarms --------------------- */
|
|
111
|
+
--color-danger: #d92d20;
|
|
112
|
+
--color-danger-ink: #ffc9c9;
|
|
113
|
+
--color-danger-tint: rgb(229 72 77 / 0.18);
|
|
114
|
+
--color-warn: #fdb022;
|
|
115
|
+
--color-warn-ink: #fedf89;
|
|
116
|
+
--color-warn-tint: rgb(247 144 9 / 0.18);
|
|
117
|
+
--color-ok: #32d583;
|
|
118
|
+
--color-ok-ink: #bbf7d0;
|
|
119
|
+
--color-ok-tint: rgb(50 213 131 / 0.16);
|
|
120
|
+
|
|
121
|
+
/* --- Status hues: same hue per status as the light theme, lifted so they
|
|
122
|
+
read as dots on a dark room instead of turning to mud. ------------ */
|
|
123
|
+
--color-st-blue: #60a5fa; /* IN_STOCK_NEW */
|
|
124
|
+
--color-st-green: #4ade80; /* IN_STOCK_OK */
|
|
125
|
+
--color-st-teal: #2dd4bf; /* INSTALLED */
|
|
126
|
+
--color-st-slate: #94a3b8; /* REMOVED, neutral/unknown */
|
|
127
|
+
--color-st-sky: #38bdf8; /* IN_TRANSIT, ACCEPTED */
|
|
128
|
+
--color-st-amber: #fdb022; /* IN_STOCK_DEFECT, IN_REPAIR, IN_PROGRESS */
|
|
129
|
+
--color-st-purple: #c084fc; /* AWAITING_QC */
|
|
130
|
+
--color-st-orange: #fb923c; /* AWAITING_DISPOSITION */
|
|
131
|
+
--color-st-indigo: #818cf8; /* PLANT_REPAIR, OPEN orders */
|
|
132
|
+
--color-st-violet: #a78bfa; /* ON_HOLD */
|
|
133
|
+
--color-st-red: #f87171; /* SCRAPPED, RETURNED */
|
|
134
|
+
--color-st-red-dark: #dc2626; /* LOST */
|
|
135
|
+
--color-st-stone: #bfa094; /* REPLACED */
|
|
136
|
+
--color-st-cyan: #22d3ee; /* repair event group on the history ribbon */
|
|
137
|
+
|
|
138
|
+
/* --- Type: Barlow for UI, Space Grotesk for identifiers and headings.
|
|
139
|
+
Inter stays in both stacks as the Cyrillic face. ------------------ */
|
|
140
|
+
--font-sans: "Barlow", "Inter", system-ui, -apple-system, "Segoe UI",
|
|
141
|
+
sans-serif;
|
|
142
|
+
--font-display: "Space Grotesk", "Inter", system-ui, sans-serif;
|
|
143
|
+
--font-mono: "JetBrains Mono", ui-monospace, "Cascadia Mono", Consolas,
|
|
144
|
+
monospace;
|
|
145
|
+
|
|
146
|
+
/* --- Radius: the formulyar's single 6px does not exist here. Controls are
|
|
147
|
+
pills (rounded-full), surfaces are soft rectangles. --------------- */
|
|
148
|
+
--radius-sm: 12px;
|
|
149
|
+
--radius-md: 18px;
|
|
150
|
+
--radius-lg: 24px;
|
|
151
|
+
--radius-xl: 30px;
|
|
152
|
+
|
|
153
|
+
/* --- Shadows: glass needs the inset top highlight, or it reads as flat
|
|
154
|
+
grey rather than lit glass. --------------------------------------- */
|
|
155
|
+
--shadow-rest: 0 1px 0 rgb(255 255 255 / 0.18) inset,
|
|
156
|
+
0 8px 24px rgb(0 0 0 / 0.38);
|
|
157
|
+
--shadow-raise: 0 1px 0 rgb(255 255 255 / 0.28) inset,
|
|
158
|
+
0 24px 56px rgb(0 0 0 / 0.5);
|
|
159
|
+
|
|
160
|
+
/* --- New here: no light-theme counterpart exists ----------------------- */
|
|
161
|
+
|
|
162
|
+
/* Text placed ON a light control (the active pill / tab is near-white). */
|
|
163
|
+
--color-on-light: #0a0e14;
|
|
164
|
+
/* Glass one step brighter — active pill, hovered card. */
|
|
165
|
+
--color-glass-2: rgb(255 255 255 / 0.12);
|
|
166
|
+
/* Near-white control fill: active tab, active series chip. */
|
|
167
|
+
--color-control: rgb(255 255 255 / 0.95);
|
|
168
|
+
/* Photo well behind a locomotive image before it loads. */
|
|
169
|
+
--color-well: #1a2230;
|
|
170
|
+
|
|
171
|
+
/* Room glows: three fixed radial washes behind everything. Decor only —
|
|
172
|
+
never a signal, so they are deliberately not the signal colors. */
|
|
173
|
+
--color-glow-blue: rgb(41 98 255 / 0.2);
|
|
174
|
+
--color-glow-teal: rgb(0 190 164 / 0.12);
|
|
175
|
+
--color-glow-amber: rgb(247 144 9 / 0.1);
|
|
176
|
+
|
|
177
|
+
/* Glass blur, one knob so every surface agrees. */
|
|
178
|
+
--blur-glass: 44px;
|
|
179
|
+
}
|