@syscore/ui-library 1.3.7 → 1.5.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/client/components/icons/ConceptIcons.tsx +2 -74
- package/client/components/ui/hero-section.tsx +45 -0
- package/client/components/ui/navigation.tsx +237 -76
- package/client/components/ui/page-header.tsx +145 -0
- package/client/components/ui/standard-table.tsx +554 -0
- package/client/global.css +198 -36
- package/client/lib/concept-colors.ts +115 -0
- package/client/lib/concept-icons.ts +45 -0
- package/client/lib/concepts-mock-data.ts +797 -0
- package/client/ui/Card.stories.tsx +2 -98
- package/client/ui/Hero.stories.tsx +72 -0
- package/client/ui/Navigation.stories.tsx +30 -21
- package/client/ui/PageHeader.stories.tsx +150 -0
- package/client/ui/Panel.stories.tsx +480 -0
- package/client/ui/StandardTable.stories.tsx +311 -0
- package/dist/img/half-sphere.png +0 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +46 -1
- package/dist/index.es.js +789 -265
- package/package.json +1 -1
package/client/global.css
CHANGED
|
@@ -758,49 +758,49 @@ layer(base);
|
|
|
758
758
|
* These variables are used by Tailwind CSS and should be expressed as HSL values.
|
|
759
759
|
*/
|
|
760
760
|
:root {
|
|
761
|
-
|
|
762
|
-
|
|
761
|
+
--background: 0 0% 100%;
|
|
762
|
+
--foreground: 230 15% 12%;
|
|
763
763
|
|
|
764
|
-
|
|
765
|
-
|
|
764
|
+
--card: 0 0% 100%;
|
|
765
|
+
--card-foreground: 230 15% 12%;
|
|
766
766
|
|
|
767
|
-
|
|
768
|
-
|
|
767
|
+
--popover: 0 0% 100%;
|
|
768
|
+
--popover-foreground: 230 15% 12%;
|
|
769
769
|
|
|
770
|
-
|
|
771
|
-
|
|
770
|
+
--primary: 190 84% 29%;
|
|
771
|
+
--primary-foreground: 210 40% 98%;
|
|
772
772
|
|
|
773
|
-
|
|
774
|
-
|
|
773
|
+
--secondary: 252 100% 97%;
|
|
774
|
+
--secondary-foreground: 255 35% 20%;
|
|
775
775
|
|
|
776
|
-
|
|
777
|
-
|
|
776
|
+
--muted: 240 33% 98%;
|
|
777
|
+
--muted-foreground: 230 12% 40%;
|
|
778
778
|
|
|
779
|
-
|
|
780
|
-
|
|
779
|
+
--accent: 255 85% 55%;
|
|
780
|
+
--accent-foreground: 210 40% 98%;
|
|
781
781
|
|
|
782
|
-
|
|
783
|
-
|
|
782
|
+
--destructive: 0 72% 51%;
|
|
783
|
+
--destructive-foreground: 210 40% 98%;
|
|
784
784
|
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
785
|
+
--border: 240 13% 92%;
|
|
786
|
+
--input: 240 13% 92%;
|
|
787
|
+
--ring: 255 85% 55%;
|
|
788
788
|
|
|
789
|
-
|
|
789
|
+
--radius: 0.625rem;
|
|
790
790
|
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
791
|
+
/* Utility colors */
|
|
792
|
+
--white: 0 0% 100%;
|
|
793
|
+
--black: 0 0% 0%;
|
|
794
|
+
--coolGrey-400: 225 7% 35%;
|
|
795
795
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
796
|
+
--sidebar-background: 0 0% 98%;
|
|
797
|
+
--sidebar-foreground: 240 5.3% 26.1%;
|
|
798
|
+
--sidebar-primary: 240 5.9% 10%;
|
|
799
|
+
--sidebar-primary-foreground: 0 0% 98%;
|
|
800
|
+
--sidebar-accent: 240 4.8% 95.9%;
|
|
801
|
+
--sidebar-accent-foreground: 240 5.9% 10%;
|
|
802
|
+
--sidebar-border: 220 13% 91%;
|
|
803
|
+
--sidebar-ring: 217.2 91.2% 59.8%;
|
|
804
804
|
}
|
|
805
805
|
|
|
806
806
|
.dark {
|
|
@@ -1287,7 +1287,9 @@ body {
|
|
|
1287
1287
|
background-color: var(--color-white, #fff);
|
|
1288
1288
|
padding: 1.5rem;
|
|
1289
1289
|
gap: 1.5rem;
|
|
1290
|
-
transition:
|
|
1290
|
+
transition:
|
|
1291
|
+
transform 200ms ease-in-out,
|
|
1292
|
+
border-color 200ms ease-in-out;
|
|
1291
1293
|
will-change: transform;
|
|
1292
1294
|
}
|
|
1293
1295
|
|
|
@@ -6054,7 +6056,7 @@ body {
|
|
|
6054
6056
|
}
|
|
6055
6057
|
|
|
6056
6058
|
.navigation-overlay[data-open="false"] {
|
|
6057
|
-
transform: translateY(calc(-100% +
|
|
6059
|
+
transform: translateY(calc(-100% + 64px));
|
|
6058
6060
|
background-color: rgba(0, 0, 0, 0.16);
|
|
6059
6061
|
}
|
|
6060
6062
|
|
|
@@ -6066,11 +6068,16 @@ body {
|
|
|
6066
6068
|
padding-left: 2rem;
|
|
6067
6069
|
padding-right: 2rem;
|
|
6068
6070
|
display: flex;
|
|
6069
|
-
height:
|
|
6071
|
+
height: 4rem;
|
|
6070
6072
|
align-items: center;
|
|
6071
6073
|
justify-content: space-between;
|
|
6072
6074
|
}
|
|
6073
6075
|
|
|
6076
|
+
.navigation--strategy {
|
|
6077
|
+
background-color: var(--color-gray-50, #f9f9fa);
|
|
6078
|
+
border-bottom: 1px solid var(--color-gray-100, #eff1f2);
|
|
6079
|
+
}
|
|
6080
|
+
|
|
6074
6081
|
.navigation-logo-container {
|
|
6075
6082
|
display: flex;
|
|
6076
6083
|
height: 100%;
|
|
@@ -6155,10 +6162,16 @@ body {
|
|
|
6155
6162
|
justify-content: center;
|
|
6156
6163
|
border-radius: 9999px;
|
|
6157
6164
|
transition: background-color 200ms;
|
|
6165
|
+
background-color: rgba(255, 255, 255, 0.12);
|
|
6166
|
+
}
|
|
6167
|
+
|
|
6168
|
+
.navigation-account-link--strategy {
|
|
6169
|
+
background-color: var(--color-white, #fff);
|
|
6170
|
+
border: 1px solid var(--color-gray-100, #eff1f2);
|
|
6158
6171
|
}
|
|
6159
6172
|
|
|
6160
6173
|
.navigation-account-link[data-open="false"] {
|
|
6161
|
-
background-color: rgba(
|
|
6174
|
+
background-color: rgba(255, 255, 255, 0.12);
|
|
6162
6175
|
}
|
|
6163
6176
|
|
|
6164
6177
|
.navigation-account-link[data-open="true"] {
|
|
@@ -6760,3 +6773,152 @@ body {
|
|
|
6760
6773
|
text-decoration-thickness: 0.75px;
|
|
6761
6774
|
text-underline-offset: 2px;
|
|
6762
6775
|
}
|
|
6776
|
+
|
|
6777
|
+
/* Standard Table Styles */
|
|
6778
|
+
.standard-table {
|
|
6779
|
+
border: 1px solid var(--color-blue-200, #cbe0f1);
|
|
6780
|
+
border-radius: var(--radius-lg, 12px);
|
|
6781
|
+
overflow: hidden;
|
|
6782
|
+
}
|
|
6783
|
+
|
|
6784
|
+
.standard-table-header {
|
|
6785
|
+
width: 100%;
|
|
6786
|
+
display: flex;
|
|
6787
|
+
align-items: center;
|
|
6788
|
+
justify-content: space-between;
|
|
6789
|
+
background-color: var(--color-blue-50, #fbfdfe);
|
|
6790
|
+
}
|
|
6791
|
+
|
|
6792
|
+
.standard-table-header__title {
|
|
6793
|
+
/* Uses body-large utility */
|
|
6794
|
+
color: var(--color-cyan-800, #0f748a);
|
|
6795
|
+
font-weight: 600;
|
|
6796
|
+
}
|
|
6797
|
+
|
|
6798
|
+
.standard-table-row {
|
|
6799
|
+
border-bottom: 1px solid var(--color-blue-200, #cbe0f1);
|
|
6800
|
+
}
|
|
6801
|
+
|
|
6802
|
+
.standard-table-row:last-child {
|
|
6803
|
+
border-bottom: 0;
|
|
6804
|
+
}
|
|
6805
|
+
|
|
6806
|
+
.standard-table-row-header {
|
|
6807
|
+
height: 5rem;
|
|
6808
|
+
width: 100%;
|
|
6809
|
+
display: flex;
|
|
6810
|
+
align-items: center;
|
|
6811
|
+
justify-content: space-between;
|
|
6812
|
+
gap: 1.5rem;
|
|
6813
|
+
padding: 1.5rem;
|
|
6814
|
+
background-color: var(--color-blue-50, #fbfdfe);
|
|
6815
|
+
transition: background-color 0.2s ease-in-out;
|
|
6816
|
+
cursor: pointer;
|
|
6817
|
+
}
|
|
6818
|
+
|
|
6819
|
+
.standard-table-row-header:hover {
|
|
6820
|
+
background-color: var(--color-gray-50, #f9f9fa);
|
|
6821
|
+
}
|
|
6822
|
+
|
|
6823
|
+
.standard-table-trigger {
|
|
6824
|
+
background-color: transparent;
|
|
6825
|
+
cursor: pointer;
|
|
6826
|
+
transition: background-color 0.2s ease-in-out;
|
|
6827
|
+
}
|
|
6828
|
+
|
|
6829
|
+
.standard-table-trigger:hover {
|
|
6830
|
+
background-color: rgba(214, 244, 251, 0.5); /* cyan-100/50 */
|
|
6831
|
+
}
|
|
6832
|
+
|
|
6833
|
+
.standard-table-content {
|
|
6834
|
+
overflow: hidden;
|
|
6835
|
+
background-color: var(--color-white, #fff);
|
|
6836
|
+
border-top: 1px solid var(--color-blue-200, #cbe0f1);
|
|
6837
|
+
}
|
|
6838
|
+
|
|
6839
|
+
.standard-table-content__inner {
|
|
6840
|
+
display: flex;
|
|
6841
|
+
flex-direction: column;
|
|
6842
|
+
}
|
|
6843
|
+
|
|
6844
|
+
.standard-table-content__inner > * {
|
|
6845
|
+
border-bottom: 1px solid var(--color-blue-200, #cbe0f1);
|
|
6846
|
+
}
|
|
6847
|
+
|
|
6848
|
+
.standard-table-content__inner > *:last-child {
|
|
6849
|
+
border-bottom: 0;
|
|
6850
|
+
}
|
|
6851
|
+
|
|
6852
|
+
.standard-table-list-row {
|
|
6853
|
+
height: 5rem;
|
|
6854
|
+
display: flex;
|
|
6855
|
+
align-items: center;
|
|
6856
|
+
gap: 1.5rem;
|
|
6857
|
+
padding: 1.5rem;
|
|
6858
|
+
transition: background-color 0.2s ease-in-out;
|
|
6859
|
+
cursor: pointer;
|
|
6860
|
+
}
|
|
6861
|
+
|
|
6862
|
+
.standard-table-list-row--default {
|
|
6863
|
+
background-color: var(--color-blue-50, #fbfdfe);
|
|
6864
|
+
}
|
|
6865
|
+
|
|
6866
|
+
.standard-table-list-row--default:hover {
|
|
6867
|
+
background-color: var(--color-gray-50, #f9f9fa);
|
|
6868
|
+
}
|
|
6869
|
+
|
|
6870
|
+
.standard-table-list-row--nested {
|
|
6871
|
+
background-color: var(--color-white, #fff);
|
|
6872
|
+
}
|
|
6873
|
+
|
|
6874
|
+
.standard-table-list-row--nested:hover {
|
|
6875
|
+
background-color: var(--color-gray-50, #f9f9fa);
|
|
6876
|
+
}
|
|
6877
|
+
|
|
6878
|
+
.standard-table-list-row__title {
|
|
6879
|
+
font-weight: 500;
|
|
6880
|
+
flex: 1;
|
|
6881
|
+
text-align: left;
|
|
6882
|
+
}
|
|
6883
|
+
|
|
6884
|
+
.standard-table-container {
|
|
6885
|
+
display: flex;
|
|
6886
|
+
flex-direction: column;
|
|
6887
|
+
gap: 1rem;
|
|
6888
|
+
}
|
|
6889
|
+
|
|
6890
|
+
/* PageHeader Styles */
|
|
6891
|
+
.page-header {
|
|
6892
|
+
margin-bottom: 1.5rem;
|
|
6893
|
+
}
|
|
6894
|
+
|
|
6895
|
+
.page-header-top-section {
|
|
6896
|
+
display: flex;
|
|
6897
|
+
align-items: center;
|
|
6898
|
+
justify-content: space-between;
|
|
6899
|
+
gap: 1rem;
|
|
6900
|
+
margin-bottom: 0.75rem;
|
|
6901
|
+
min-height: 52px;
|
|
6902
|
+
}
|
|
6903
|
+
|
|
6904
|
+
.page-header-left-content {
|
|
6905
|
+
display: flex;
|
|
6906
|
+
align-items: center;
|
|
6907
|
+
gap: 1.5rem;
|
|
6908
|
+
}
|
|
6909
|
+
|
|
6910
|
+
.page-header-title {
|
|
6911
|
+
display: flex;
|
|
6912
|
+
align-items: center;
|
|
6913
|
+
justify-content: start;
|
|
6914
|
+
min-height: 32px;
|
|
6915
|
+
}
|
|
6916
|
+
|
|
6917
|
+
.page-header-title:last-child {
|
|
6918
|
+
margin-bottom: 0;
|
|
6919
|
+
}
|
|
6920
|
+
|
|
6921
|
+
.page-header-description {
|
|
6922
|
+
/* Uses body-large utility */
|
|
6923
|
+
max-width: 680px;
|
|
6924
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
export interface ConceptColor {
|
|
2
|
+
solid: string;
|
|
3
|
+
light: string;
|
|
4
|
+
border: string;
|
|
5
|
+
prefix: string;
|
|
6
|
+
contrast?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Concept colors matching Figma design.
|
|
11
|
+
* Keys match URL slugs for direct lookup.
|
|
12
|
+
*/
|
|
13
|
+
export const conceptColors = {
|
|
14
|
+
mind: {
|
|
15
|
+
solid: "#0a5161",
|
|
16
|
+
light: "rgba(10,81,97,0.08)",
|
|
17
|
+
border: "rgba(10,81,97,0.16)",
|
|
18
|
+
prefix: "M",
|
|
19
|
+
},
|
|
20
|
+
community: {
|
|
21
|
+
solid: "#0f748a",
|
|
22
|
+
light: "rgba(15,116,138,0.12)",
|
|
23
|
+
border: "rgba(15,116,138,0.24)",
|
|
24
|
+
prefix: "C",
|
|
25
|
+
},
|
|
26
|
+
movement: {
|
|
27
|
+
solid: "#149ebd",
|
|
28
|
+
light: "rgba(20,158,189,0.12)",
|
|
29
|
+
border: "rgba(20,158,189,0.24)",
|
|
30
|
+
prefix: "V",
|
|
31
|
+
},
|
|
32
|
+
water: {
|
|
33
|
+
solid: "#39c9ea",
|
|
34
|
+
light: "rgba(57,201,234,0.12)",
|
|
35
|
+
border: "rgba(57,201,234,0.24)",
|
|
36
|
+
prefix: "W",
|
|
37
|
+
},
|
|
38
|
+
air: {
|
|
39
|
+
solid: "#87dff2",
|
|
40
|
+
light: "rgba(135,223,242,0.12)",
|
|
41
|
+
border: "rgba(135,223,242,0.24)",
|
|
42
|
+
prefix: "A",
|
|
43
|
+
contrast: "#7CCDDF",
|
|
44
|
+
},
|
|
45
|
+
light: {
|
|
46
|
+
solid: "#8aefdb",
|
|
47
|
+
light: "rgba(138,239,219,0.12)",
|
|
48
|
+
border: "rgba(138,239,219,0.24)",
|
|
49
|
+
prefix: "L",
|
|
50
|
+
contrast: "#7FDCC9",
|
|
51
|
+
},
|
|
52
|
+
"thermal-comfort": {
|
|
53
|
+
solid: "#3eddbf",
|
|
54
|
+
light: "rgba(62,221,191,0.12)",
|
|
55
|
+
border: "rgba(62,221,191,0.24)",
|
|
56
|
+
prefix: "T",
|
|
57
|
+
contrast: "#39CBB0",
|
|
58
|
+
},
|
|
59
|
+
nourishment: {
|
|
60
|
+
solid: "#17aa8d",
|
|
61
|
+
light: "rgba(23,170,141,0.12)",
|
|
62
|
+
border: "rgba(23,170,141,0.24)",
|
|
63
|
+
prefix: "N",
|
|
64
|
+
},
|
|
65
|
+
sound: {
|
|
66
|
+
solid: "#0c705c",
|
|
67
|
+
light: "rgba(12,112,92,0.12)",
|
|
68
|
+
border: "rgba(12,112,92,0.24)",
|
|
69
|
+
prefix: "S",
|
|
70
|
+
},
|
|
71
|
+
materials: {
|
|
72
|
+
solid: "#0a4f41",
|
|
73
|
+
light: "rgba(10,79,65,0.08)",
|
|
74
|
+
border: "rgba(10,79,65,0.16)",
|
|
75
|
+
prefix: "X",
|
|
76
|
+
},
|
|
77
|
+
innovation: {
|
|
78
|
+
solid: "#52545D",
|
|
79
|
+
light: "rgba(82,84,93,0.08)",
|
|
80
|
+
border: "rgba(82,84,93,0.16)",
|
|
81
|
+
prefix: "I",
|
|
82
|
+
},
|
|
83
|
+
} as const;
|
|
84
|
+
|
|
85
|
+
export type ConceptType = keyof typeof conceptColors;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get concept color by slug.
|
|
89
|
+
* @example getConceptColor("thermal-comfort") → { solid: "#3eddbf", ... }
|
|
90
|
+
*/
|
|
91
|
+
export function getConceptColor(slug: string): ConceptColor {
|
|
92
|
+
return conceptColors[slug as ConceptType] ?? conceptColors.mind;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get concept color from a strategy code (e.g. "C7.4" → community colors).
|
|
97
|
+
* @example getConceptColorsFromCode("C7.4") → { solid: "#0f748a", ... }
|
|
98
|
+
*/
|
|
99
|
+
export function getConceptColorsFromCode(code: string): ConceptColor {
|
|
100
|
+
const prefixMap: Record<string, ConceptType> = {
|
|
101
|
+
M: "mind",
|
|
102
|
+
C: "community",
|
|
103
|
+
V: "movement",
|
|
104
|
+
W: "water",
|
|
105
|
+
A: "air",
|
|
106
|
+
L: "light",
|
|
107
|
+
T: "thermal-comfort",
|
|
108
|
+
N: "nourishment",
|
|
109
|
+
S: "sound",
|
|
110
|
+
X: "materials",
|
|
111
|
+
I: "innovation",
|
|
112
|
+
};
|
|
113
|
+
const slug = prefixMap[code.charAt(0).toUpperCase()] || "community";
|
|
114
|
+
return conceptColors[slug];
|
|
115
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized concept icon mapping
|
|
3
|
+
*
|
|
4
|
+
* Maps concept slugs to their icon components.
|
|
5
|
+
* Used when fetching concept data from API - the API returns string IDs,
|
|
6
|
+
* and this map resolves them to actual React components.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
IconConceptMind,
|
|
11
|
+
IconConceptCommunity,
|
|
12
|
+
IconConceptMovement,
|
|
13
|
+
IconConceptWater,
|
|
14
|
+
IconConceptAir,
|
|
15
|
+
IconConceptLight,
|
|
16
|
+
IconConceptThermalComfort,
|
|
17
|
+
IconConceptNourishment,
|
|
18
|
+
IconConceptSound,
|
|
19
|
+
IconConceptMaterials,
|
|
20
|
+
IconConceptInnovation,
|
|
21
|
+
} from "@/components/icons/ConceptIcons";
|
|
22
|
+
import { type ConceptSlug } from "@/lib/mock-data/explore-data";
|
|
23
|
+
|
|
24
|
+
export interface ConceptIconProps {
|
|
25
|
+
className?: string;
|
|
26
|
+
active?: boolean;
|
|
27
|
+
outlined?: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const CONCEPT_ICONS: Record<
|
|
31
|
+
ConceptSlug,
|
|
32
|
+
React.ComponentType<ConceptIconProps>
|
|
33
|
+
> = {
|
|
34
|
+
air: IconConceptAir,
|
|
35
|
+
water: IconConceptWater,
|
|
36
|
+
nourishment: IconConceptNourishment,
|
|
37
|
+
light: IconConceptLight,
|
|
38
|
+
movement: IconConceptMovement,
|
|
39
|
+
"thermal-comfort": IconConceptThermalComfort,
|
|
40
|
+
sound: IconConceptSound,
|
|
41
|
+
materials: IconConceptMaterials,
|
|
42
|
+
community: IconConceptCommunity,
|
|
43
|
+
mind: IconConceptMind,
|
|
44
|
+
innovation: IconConceptInnovation,
|
|
45
|
+
};
|