@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/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
- --background: 0 0% 100%;
762
- --foreground: 230 15% 12%;
761
+ --background: 0 0% 100%;
762
+ --foreground: 230 15% 12%;
763
763
 
764
- --card: 0 0% 100%;
765
- --card-foreground: 230 15% 12%;
764
+ --card: 0 0% 100%;
765
+ --card-foreground: 230 15% 12%;
766
766
 
767
- --popover: 0 0% 100%;
768
- --popover-foreground: 230 15% 12%;
767
+ --popover: 0 0% 100%;
768
+ --popover-foreground: 230 15% 12%;
769
769
 
770
- --primary: 190 84% 29%;
771
- --primary-foreground: 210 40% 98%;
770
+ --primary: 190 84% 29%;
771
+ --primary-foreground: 210 40% 98%;
772
772
 
773
- --secondary: 252 100% 97%;
774
- --secondary-foreground: 255 35% 20%;
773
+ --secondary: 252 100% 97%;
774
+ --secondary-foreground: 255 35% 20%;
775
775
 
776
- --muted: 240 33% 98%;
777
- --muted-foreground: 230 12% 40%;
776
+ --muted: 240 33% 98%;
777
+ --muted-foreground: 230 12% 40%;
778
778
 
779
- --accent: 255 85% 55%;
780
- --accent-foreground: 210 40% 98%;
779
+ --accent: 255 85% 55%;
780
+ --accent-foreground: 210 40% 98%;
781
781
 
782
- --destructive: 0 72% 51%;
783
- --destructive-foreground: 210 40% 98%;
782
+ --destructive: 0 72% 51%;
783
+ --destructive-foreground: 210 40% 98%;
784
784
 
785
- --border: 240 13% 92%;
786
- --input: 240 13% 92%;
787
- --ring: 255 85% 55%;
785
+ --border: 240 13% 92%;
786
+ --input: 240 13% 92%;
787
+ --ring: 255 85% 55%;
788
788
 
789
- --radius: 0.625rem;
789
+ --radius: 0.625rem;
790
790
 
791
- /* Utility colors */
792
- --white: 0 0% 100%;
793
- --black: 0 0% 0%;
794
- --coolGrey-400: 225 7% 35%;
791
+ /* Utility colors */
792
+ --white: 0 0% 100%;
793
+ --black: 0 0% 0%;
794
+ --coolGrey-400: 225 7% 35%;
795
795
 
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%;
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: transform 200ms ease-in-out, border-color 200ms ease-in-out;
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% + 56px));
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: 3.5rem;
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(0, 0, 0, 0.08);
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
+ };