@dybo-ai/design 1.1.0 → 1.3.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/theme.css CHANGED
@@ -13,6 +13,40 @@
13
13
  --dybo-color-brand-dark-orb: #141927;
14
14
  --dybo-color-brand-cultured: #f3f6fa;
15
15
  --dybo-color-brand-gainsboro: #dbdfe5;
16
+ --dybo-color-brand-dandelion: #e9d72f;
17
+
18
+ /* ---- Portal (ticket-management / client portal) ---- */
19
+ --dybo-portal-surface-operator: #e4e4e4;
20
+ --dybo-portal-surface-card-high: rgba(240, 241, 244, 0.92);
21
+ --dybo-portal-surface-card-high-dark: rgba(18, 26, 45, 0.92);
22
+ --dybo-portal-shadow-level-1: 0px 4px 8px #1419271f;
23
+ --dybo-portal-shadow-level-2: 0px 8px 28px #14192729;
24
+ --dybo-portal-drawer-backdrop: rgba(10, 15, 25, 0.3);
25
+ --dybo-portal-feedback-success-light: #90eabd;
26
+ --dybo-portal-feedback-success-bg: #d6f0e3;
27
+ --dybo-portal-feedback-warning: #cc6600;
28
+ --dybo-portal-feedback-warning-bg: #fff2e5;
29
+ --dybo-portal-feedback-destructive: #fa3848;
30
+ --dybo-portal-feedback-info-bg: #d9e3f0;
31
+ --dybo-portal-priority-urgent-bg: rgba(250, 56, 72, 0.12);
32
+ --dybo-portal-priority-urgent-fg: #c81e2c;
33
+ --dybo-portal-priority-high-bg: rgba(255, 128, 0, 0.15);
34
+ --dybo-portal-priority-high-fg: #a85400;
35
+ --dybo-portal-priority-medium-bg: rgba(242, 185, 13, 0.2);
36
+ --dybo-portal-priority-medium-fg: #9d6607;
37
+ --dybo-portal-priority-low-bg: rgba(151, 163, 180, 0.24);
38
+ --dybo-portal-priority-low-fg: #50627c;
39
+ --dybo-portal-priority-none-bg: rgba(192, 198, 206, 0.35);
40
+ --dybo-portal-priority-none-fg: #677283;
41
+ --dybo-portal-ticket-open-bg: #d9e3f2;
42
+ --dybo-portal-ticket-open-fg: #2e5b9e;
43
+ --dybo-portal-ticket-pending-bg: #e9dff6;
44
+ --dybo-portal-ticket-pending-fg: #7146aa;
45
+ --dybo-portal-ticket-snoozed-bg: #d7dde5;
46
+ --dybo-portal-ticket-snoozed-fg: #58687e;
47
+ --dybo-portal-ticket-resolved-bg: #d6f0e3;
48
+ --dybo-portal-ticket-resolved-fg: #1a6640;
49
+ --dybo-icon-rail-width: 80px;
16
50
 
17
51
  /* ---- Text ---- */
18
52
  --dybo-color-text-primary: #0a1323;
@@ -95,6 +129,8 @@
95
129
  --dybo-opacity-light: 0.16;
96
130
  --dybo-opacity-medium: 0.32;
97
131
  --dybo-opacity-intense: 0.64;
132
+ --dybo-opacity-semi-opaque: 0.4;
133
+ --dybo-opacity-semi-transparent: 0.08;
98
134
 
99
135
  /* ---- Border ---- */
100
136
  --dybo-border-sm: 1px;
@@ -140,6 +176,8 @@
140
176
  --color-dybo-info: #0399ae;
141
177
  --color-dybo-info-bg: #d3f7fc;
142
178
  --color-dybo-sidebar: #1d2433;
179
+ --color-dybo-dandelion: #e9d72f;
180
+ --color-dybo-operator-page: #e4e4e4;
143
181
 
144
182
  /* Border radius */
145
183
  --radius-dybo-sm: 12px;
@@ -151,6 +189,8 @@
151
189
  --shadow-dybo-card:
152
190
  0 8px 24px rgba(10, 19, 35, 0.1), 0 2px 8px rgba(170, 180, 192, 0.35);
153
191
  --shadow-dybo-drop: 0 4px 4px rgba(10, 19, 35, 0.1);
192
+ --shadow-dybo-portal-1: 0px 4px 8px #1419271f;
193
+ --shadow-dybo-portal-2: 0px 8px 28px #14192729;
154
194
 
155
195
  /* Backdrop blur */
156
196
  --blur-dybo: 4px;
@@ -728,3 +768,337 @@ body {
728
768
  justify-content: flex-end;
729
769
  flex-shrink: 0;
730
770
  }
771
+
772
+ .dybo-modal .dybo-input,
773
+ .dybo-modal .dybo-select,
774
+ .dybo-drawer-panel .dybo-input,
775
+ .dybo-drawer-panel .dybo-select {
776
+ background: hsl(var(--popover));
777
+ }
778
+
779
+ /* ---- Drawer (ticket-management Debbie panel pattern) ---- */
780
+ .dybo-drawer-backdrop {
781
+ position: fixed;
782
+ inset: 0;
783
+ z-index: 1000;
784
+ background: var(--dybo-portal-drawer-backdrop);
785
+ }
786
+ .dybo-drawer-panel {
787
+ position: fixed;
788
+ top: 0;
789
+ height: 100%;
790
+ width: min(380px, 90vw);
791
+ max-width: 100%;
792
+ background: hsl(var(--card));
793
+ color: hsl(var(--card-foreground));
794
+ border-color: hsl(var(--border));
795
+ box-shadow: var(--dybo-portal-shadow-level-2);
796
+ display: flex;
797
+ flex-direction: column;
798
+ z-index: 1001;
799
+ overflow: hidden;
800
+ }
801
+ .dybo-drawer-panel--right {
802
+ right: 0;
803
+ border-left: var(--dybo-border-sm) solid hsl(var(--border));
804
+ }
805
+ .dybo-drawer-panel--left {
806
+ left: 0;
807
+ border-right: var(--dybo-border-sm) solid hsl(var(--border));
808
+ }
809
+ .dybo-drawer-panel__header {
810
+ display: flex;
811
+ align-items: center;
812
+ justify-content: space-between;
813
+ flex-shrink: 0;
814
+ padding: 16px 20px;
815
+ border-bottom: 1px solid hsl(var(--border));
816
+ }
817
+ .dybo-drawer-panel__title {
818
+ font-size: var(--dybo-font-size-lg);
819
+ font-weight: var(--dybo-font-weight-semibold);
820
+ color: var(--dybo-color-text-primary);
821
+ margin: 0;
822
+ }
823
+ .dybo-drawer-panel__close {
824
+ background: transparent;
825
+ border: none;
826
+ cursor: pointer;
827
+ color: var(--dybo-color-text-muted);
828
+ padding: 4px;
829
+ border-radius: 6px;
830
+ display: flex;
831
+ align-items: center;
832
+ justify-content: center;
833
+ transition:
834
+ background 0.15s,
835
+ color 0.15s;
836
+ }
837
+ .dybo-drawer-panel__close:hover {
838
+ background: rgba(194, 199, 207, 0.3);
839
+ color: var(--dybo-color-text-primary);
840
+ }
841
+ .dybo-drawer-panel__body {
842
+ flex: 1;
843
+ min-height: 0;
844
+ overflow-y: auto;
845
+ padding: 20px;
846
+ }
847
+ .dybo-drawer-panel__body--flush {
848
+ padding: 0;
849
+ display: flex;
850
+ flex-direction: column;
851
+ }
852
+ .dybo-drawer-panel__footer {
853
+ flex-shrink: 0;
854
+ padding: 16px 20px;
855
+ border-top: 1px solid hsl(var(--border));
856
+ display: flex;
857
+ gap: 12px;
858
+ justify-content: flex-end;
859
+ }
860
+
861
+ /* =========================================================================
862
+ Portal / Ticket Management patterns
863
+ ========================================================================= */
864
+
865
+ .dybo-surface-operator {
866
+ background: var(--dybo-portal-surface-operator);
867
+ }
868
+
869
+ .dybo-shadow-level-1 {
870
+ box-shadow: var(--dybo-portal-shadow-level-1);
871
+ }
872
+ .dybo-shadow-level-2 {
873
+ box-shadow: var(--dybo-portal-shadow-level-2);
874
+ }
875
+
876
+ /* Nav tabs — uppercase pill tabs */
877
+ .dybo-navtabs {
878
+ display: flex;
879
+ flex-wrap: wrap;
880
+ gap: 4px;
881
+ }
882
+ .dybo-navtab {
883
+ display: inline-flex;
884
+ align-items: center;
885
+ justify-content: center;
886
+ height: 26px;
887
+ padding: 0 12px;
888
+ border-radius: var(--dybo-radius-md);
889
+ font-size: var(--dybo-font-size-xs);
890
+ font-weight: var(--dybo-font-weight-medium);
891
+ letter-spacing: 1px;
892
+ text-transform: uppercase;
893
+ color: var(--dybo-color-text-primary);
894
+ opacity: var(--dybo-opacity-intense);
895
+ border: 1px solid transparent;
896
+ background: transparent;
897
+ backdrop-filter: blur(2px);
898
+ -webkit-backdrop-filter: blur(2px);
899
+ transition: all 0.2s;
900
+ white-space: nowrap;
901
+ cursor: pointer;
902
+ font-family: inherit;
903
+ }
904
+ .dybo-navtab:hover {
905
+ opacity: 1;
906
+ }
907
+ .dybo-navtab--active {
908
+ opacity: 1;
909
+ background: rgba(244, 244, 246, 0.7);
910
+ border-color: var(--dybo-line-stroke);
911
+ }
912
+
913
+ /* Priority badges */
914
+ .dybo-priority {
915
+ display: inline-flex;
916
+ align-items: center;
917
+ gap: 5px;
918
+ padding: 2px 10px;
919
+ border-radius: var(--dybo-radius-full);
920
+ font-size: var(--dybo-font-size-xs);
921
+ font-weight: var(--dybo-font-weight-semibold);
922
+ line-height: 1.4;
923
+ white-space: nowrap;
924
+ }
925
+ .dybo-priority::before {
926
+ content: "";
927
+ width: 6px;
928
+ height: 6px;
929
+ border-radius: var(--dybo-radius-full);
930
+ background: currentColor;
931
+ flex-shrink: 0;
932
+ }
933
+ .dybo-priority--urgent {
934
+ background: var(--dybo-portal-priority-urgent-bg);
935
+ color: var(--dybo-portal-priority-urgent-fg);
936
+ }
937
+ .dybo-priority--high {
938
+ background: var(--dybo-portal-priority-high-bg);
939
+ color: var(--dybo-portal-priority-high-fg);
940
+ }
941
+ .dybo-priority--medium {
942
+ background: var(--dybo-portal-priority-medium-bg);
943
+ color: var(--dybo-portal-priority-medium-fg);
944
+ }
945
+ .dybo-priority--low {
946
+ background: var(--dybo-portal-priority-low-bg);
947
+ color: var(--dybo-portal-priority-low-fg);
948
+ }
949
+ .dybo-priority--none {
950
+ background: var(--dybo-portal-priority-none-bg);
951
+ color: var(--dybo-portal-priority-none-fg);
952
+ }
953
+ .dybo-priority--none::before {
954
+ opacity: 0.45;
955
+ }
956
+
957
+ /* Ticket status badges (ChatWoot) */
958
+ .dybo-ticket-status {
959
+ display: inline-flex;
960
+ align-items: center;
961
+ padding: 2px 10px;
962
+ border-radius: var(--dybo-radius-full);
963
+ font-size: var(--dybo-font-size-xs);
964
+ font-weight: var(--dybo-font-weight-semibold);
965
+ line-height: 1.4;
966
+ white-space: nowrap;
967
+ }
968
+ .dybo-ticket-status--open {
969
+ background: var(--dybo-portal-ticket-open-bg);
970
+ color: var(--dybo-portal-ticket-open-fg);
971
+ }
972
+ .dybo-ticket-status--pending {
973
+ background: var(--dybo-portal-ticket-pending-bg);
974
+ color: var(--dybo-portal-ticket-pending-fg);
975
+ }
976
+ .dybo-ticket-status--snoozed {
977
+ background: var(--dybo-portal-ticket-snoozed-bg);
978
+ color: var(--dybo-portal-ticket-snoozed-fg);
979
+ }
980
+ .dybo-ticket-status--resolved {
981
+ background: var(--dybo-portal-ticket-resolved-bg);
982
+ color: var(--dybo-portal-ticket-resolved-fg);
983
+ }
984
+
985
+ /* Scope tabs — Unassigned / Mine / All */
986
+ .dybo-scope {
987
+ display: inline-flex;
988
+ align-items: center;
989
+ gap: 4px;
990
+ border: 1px solid var(--dybo-color-grayish-blue-300);
991
+ background: rgba(244, 244, 246, 0.7);
992
+ border-radius: var(--dybo-radius-sm);
993
+ padding: 4px;
994
+ }
995
+ .dybo-scope-tab {
996
+ display: inline-flex;
997
+ align-items: center;
998
+ gap: 8px;
999
+ height: 44px;
1000
+ padding: 0 14px;
1001
+ border-radius: 10px;
1002
+ font-size: 13px;
1003
+ font-weight: var(--dybo-font-weight-semibold);
1004
+ color: var(--dybo-color-text-primary);
1005
+ opacity: var(--dybo-opacity-intense);
1006
+ background: transparent;
1007
+ border: 0;
1008
+ cursor: pointer;
1009
+ white-space: nowrap;
1010
+ transition: all 0.2s;
1011
+ font-family: inherit;
1012
+ }
1013
+ .dybo-scope-tab:hover {
1014
+ opacity: 1;
1015
+ }
1016
+ .dybo-scope-tab--active {
1017
+ opacity: 1;
1018
+ background: var(--dybo-color-text-primary);
1019
+ color: var(--dybo-color-white);
1020
+ }
1021
+ .dybo-scope-tab:focus-visible {
1022
+ outline: 2px solid var(--dybo-color-brand-logo);
1023
+ outline-offset: 2px;
1024
+ }
1025
+ .dybo-scope-count {
1026
+ display: inline-flex;
1027
+ align-items: center;
1028
+ justify-content: center;
1029
+ min-width: 22px;
1030
+ height: 20px;
1031
+ padding: 0 6px;
1032
+ border-radius: var(--dybo-radius-full);
1033
+ font-size: 11px;
1034
+ font-weight: var(--dybo-font-weight-bold);
1035
+ background: rgba(10, 19, 35, 0.1);
1036
+ }
1037
+ .dybo-scope-tab--active .dybo-scope-count {
1038
+ background: rgba(255, 255, 255, 0.24);
1039
+ }
1040
+
1041
+ /* Icon rail sidebar */
1042
+ .dybo-icon-rail {
1043
+ display: none;
1044
+ height: 100%;
1045
+ width: var(--dybo-icon-rail-width);
1046
+ flex-shrink: 0;
1047
+ flex-direction: column;
1048
+ align-items: center;
1049
+ background: var(--dybo-surface-page);
1050
+ padding: 16px 0;
1051
+ }
1052
+ @media (min-width: 768px) {
1053
+ .dybo-icon-rail {
1054
+ display: flex;
1055
+ }
1056
+ }
1057
+ .dybo-icon-rail__brand {
1058
+ margin-bottom: 24px;
1059
+ }
1060
+ .dybo-icon-rail__nav {
1061
+ display: flex;
1062
+ flex: 1;
1063
+ width: 100%;
1064
+ align-items: center;
1065
+ justify-content: center;
1066
+ }
1067
+ .dybo-icon-rail__pill {
1068
+ border-radius: 13px;
1069
+ border: 1px solid var(--dybo-line-stroke);
1070
+ background: var(--dybo-surface-card);
1071
+ padding: 6px;
1072
+ box-shadow: var(--dybo-portal-shadow-level-1);
1073
+ backdrop-filter: blur(4px);
1074
+ -webkit-backdrop-filter: blur(4px);
1075
+ }
1076
+ .dybo-icon-rail__items {
1077
+ display: flex;
1078
+ flex-direction: column;
1079
+ align-items: center;
1080
+ gap: 0;
1081
+ }
1082
+ .dybo-icon-rail__item {
1083
+ display: flex;
1084
+ align-items: center;
1085
+ justify-content: center;
1086
+ padding: 12px;
1087
+ height: 48px;
1088
+ width: 40px;
1089
+ border-radius: 11px;
1090
+ color: var(--dybo-color-brand-logo);
1091
+ opacity: var(--dybo-opacity-intense);
1092
+ text-decoration: none;
1093
+ transition: all 0.2s;
1094
+ }
1095
+ .dybo-icon-rail__item:hover {
1096
+ opacity: 1;
1097
+ }
1098
+ .dybo-icon-rail__item--active {
1099
+ height: 40px;
1100
+ border-radius: 13px;
1101
+ background: rgba(20, 25, 39, 0.1);
1102
+ opacity: 1;
1103
+ color: var(--dybo-color-brand-dark-orb);
1104
+ }
package/tokens.cjs CHANGED
@@ -1,9 +1,33 @@
1
1
  // DYBO design tokens (CommonJS mirror of tokens.mjs).
2
2
  const color = {
3
- brand: { logo: "#1d335c", blue: "#5878a7", darkOrb: "#141927", cultured: "#f3f6fa", gainsboro: "#dbdfe5" },
4
- text: { primary: "#0a1323", secondary: "#f4f4f6", muted: "#545f74", gray: "#868686" },
5
- neutral: { black: "#000000", white: "#ffffff", grayishBlue50: "#f4f4f6", grayishBlue300: "#c2c7cf", midnightSky300: "#e6e7f7", midnightSky700: "#48495d" },
6
- surface: { page: "#e6eaf0", card: "rgba(240,241,244,0.70)", cardSolid: "rgba(240,241,244,0.90)", input: "rgba(244,244,246,0.70)" },
3
+ brand: {
4
+ logo: "#1d335c",
5
+ blue: "#5878a7",
6
+ darkOrb: "#141927",
7
+ cultured: "#f3f6fa",
8
+ gainsboro: "#dbdfe5",
9
+ dandelion: "#e9d72f",
10
+ },
11
+ text: {
12
+ primary: "#0a1323",
13
+ secondary: "#f4f4f6",
14
+ muted: "#545f74",
15
+ gray: "#868686",
16
+ },
17
+ neutral: {
18
+ black: "#000000",
19
+ white: "#ffffff",
20
+ grayishBlue50: "#f4f4f6",
21
+ grayishBlue300: "#c2c7cf",
22
+ midnightSky300: "#e6e7f7",
23
+ midnightSky700: "#48495d",
24
+ },
25
+ surface: {
26
+ page: "#e6eaf0",
27
+ card: "rgba(240,241,244,0.70)",
28
+ cardSolid: "rgba(240,241,244,0.90)",
29
+ input: "rgba(244,244,246,0.70)",
30
+ },
7
31
  line: { stroke: "#ffffff" },
8
32
  semantic: {
9
33
  success: { solid: "#20a156", bright: "#28ca6b", bg: "#eafbf1" },
@@ -17,15 +41,116 @@ const color = {
17
41
  brand: { fg: "#0a1323", bg: "#d0d3fe" },
18
42
  },
19
43
  };
20
- const font = { family: "Urbanist, sans-serif", weight: { regular: 400, medium: 500, semibold: 600, bold: 700 } };
44
+ const portal = {
45
+ surface: {
46
+ operatorPage: "#e4e4e4",
47
+ cardHighOpacity: "rgba(240,241,244,0.92)",
48
+ cardHighOpacityDark: "rgba(18,26,45,0.92)",
49
+ drawerBackdrop: "rgba(10,15,25,0.3)",
50
+ },
51
+ shadow: {
52
+ level1: "0px 4px 8px #1419271f",
53
+ level2: "0px 8px 28px #14192729",
54
+ },
55
+ feedback: {
56
+ successLight: "#90eabd",
57
+ successBackground: "#d6f0e3",
58
+ warningSolid: "#cc6600",
59
+ warningBackground: "#fff2e5",
60
+ destructiveBright: "#fa3848",
61
+ infoBackground: "#d9e3f0",
62
+ },
63
+ priority: {
64
+ urgent: {
65
+ bg: "rgba(250,56,72,0.12)",
66
+ fg: "#c81e2c",
67
+ darkBg: "rgba(230,57,57,0.22)",
68
+ darkFg: "#f9a0a0",
69
+ },
70
+ high: {
71
+ bg: "rgba(255,128,0,0.15)",
72
+ fg: "#a85400",
73
+ darkBg: "rgba(230,115,0,0.22)",
74
+ darkFg: "#ffb366",
75
+ },
76
+ medium: {
77
+ bg: "rgba(242,185,13,0.20)",
78
+ fg: "#9d6607",
79
+ darkBg: "rgba(242,185,13,0.16)",
80
+ darkFg: "#f5d56a",
81
+ },
82
+ low: {
83
+ bg: "rgba(151,163,180,0.24)",
84
+ fg: "#50627c",
85
+ darkBg: "rgba(140,155,175,0.20)",
86
+ darkFg: "#b8c4d4",
87
+ },
88
+ none: {
89
+ bg: "rgba(192,198,206,0.35)",
90
+ fg: "#677283",
91
+ darkBg: "rgba(115,125,140,0.25)",
92
+ darkFg: "#b0b8c4",
93
+ },
94
+ },
95
+ ticketStatus: {
96
+ open: {
97
+ bg: "#d9e3f2",
98
+ fg: "#2e5b9e",
99
+ darkBg: "#2a3d52",
100
+ darkFg: "#a8c4e8",
101
+ },
102
+ pending: {
103
+ bg: "#e9dff6",
104
+ fg: "#7146aa",
105
+ darkBg: "#3d2f4d",
106
+ darkFg: "#d4b8f0",
107
+ },
108
+ snoozed: {
109
+ bg: "#d7dde5",
110
+ fg: "#58687e",
111
+ darkBg: "#3a424c",
112
+ darkFg: "#b8c4d4",
113
+ },
114
+ resolved: {
115
+ bg: "#d6f0e3",
116
+ fg: "#1a6640",
117
+ darkBg: "#1f4a32",
118
+ darkFg: "#a8e0c0",
119
+ },
120
+ },
121
+ };
122
+ const font = {
123
+ family: "Urbanist, sans-serif",
124
+ weight: { regular: 400, medium: 500, semibold: 600, bold: 700 },
125
+ };
21
126
  const fontSize = { xs: 12, sm: 14, md: 16, lg: 18, xl: 24 };
22
127
  const space = { 0: 0, 50: 4, 100: 8, 150: 12, 200: 16, 250: 20, 400: 32 };
23
128
  const radius = { small: 12, alt: 16, medium: 20, full: 999 };
24
- const opacity = { light: 0.16, medium: 0.32, intense: 0.64 };
129
+ const opacity = {
130
+ light: 0.16,
131
+ medium: 0.32,
132
+ intense: 0.64,
133
+ semiOpaque: 0.4,
134
+ semiTransparent: 0.08,
135
+ };
25
136
  const shadow = {
26
137
  card: "0 8px 24px rgba(10,19,35,0.10), 0 2px 8px rgba(170,180,192,0.35)",
27
138
  drop: "0 4px 4px rgba(10,19,35,0.10)",
139
+ portalLevel1: "0px 4px 8px #1419271f",
140
+ portalLevel2: "0px 8px 28px #14192729",
28
141
  };
29
142
  const effect = { glassBlur: 4 };
30
- const tokens = { color, font, fontSize, space, radius, opacity, shadow, effect };
31
- module.exports = { tokens, color, font, fontSize, space, radius, opacity, shadow, effect, default: tokens };
143
+ const tokens = { color, portal, font, fontSize, space, radius, opacity, shadow, effect };
144
+ module.exports = {
145
+ tokens,
146
+ color,
147
+ portal,
148
+ font,
149
+ fontSize,
150
+ space,
151
+ radius,
152
+ opacity,
153
+ shadow,
154
+ effect,
155
+ default: tokens,
156
+ };
package/tokens.json CHANGED
@@ -15,7 +15,8 @@
15
15
  "blueYonder": { "value": "#5878a7", "figmaName": "Brand Colors/Blue Yonder", "desc": "Primary blue accent" },
16
16
  "darkOrb": { "value": "#141927", "figmaName": "Brand Colors/Dark Orb", "desc": "Near-black brand shade" },
17
17
  "cultured": { "value": "#f3f6fa", "figmaName": "Brand Colors/Cultured", "desc": "Lightest brand tint" },
18
- "gainsboro": { "value": "#dbdfe5", "figmaName": "Brand Colors/Gainsboro", "desc": "Light neutral brand tint" }
18
+ "gainsboro": { "value": "#dbdfe5", "figmaName": "Brand Colors/Gainsboro", "desc": "Light neutral brand tint" },
19
+ "dandelion": { "value": "#e9d72f", "figmaName": "Brand Colors/Dandelion (portal)", "desc": "Yellow accent — client portal / ticket prototype" }
19
20
  },
20
21
  "text": {
21
22
  "primary": { "value": "#0a1323", "figmaName": "Primary Color / Title / Brand - DYBO", "desc": "Primary text & headings (navy near-black)" },
@@ -106,7 +107,79 @@
106
107
  "opacity": {
107
108
  "light": { "value": 0.16, "figmaName": "Appearance/Opacity Level/Light" },
108
109
  "medium": { "value": 0.32, "figmaName": "Appearance/Opacity Level/Medium" },
109
- "intense": { "value": 0.64, "figmaName": "Appearance/Opacity Level/Intense" }
110
+ "intense": { "value": 0.64, "figmaName": "Appearance/Opacity Level/Intense" },
111
+ "semiOpaque": { "value": 0.40, "figmaName": "Portal — disabled state" },
112
+ "semiTransparent": { "value": 0.08, "figmaName": "Portal — subtle overlay" }
113
+ },
114
+
115
+ "portal": {
116
+ "$source": "ticket-management-export/client/tokens.css + operator/index.html badge CSS",
117
+ "surface": {
118
+ "operatorPage": { "value": "#e4e4e4", "desc": "Operator screens background override" },
119
+ "cardHighOpacity": { "value": "rgba(240,241,244,0.92)", "desc": "Upload zones, dense panels" },
120
+ "cardHighOpacityDark": { "value": "rgba(18,26,45,0.92)", "desc": "Dark mode dense panel" },
121
+ "drawerBackdrop": { "value": "rgba(10,15,25,0.3)", "desc": "Drawer/sheet scrim — ticket-management Debbie panel" }
122
+ },
123
+ "shadow": {
124
+ "level1": { "value": "0px 4px 8px #1419271f", "desc": "Cards, sidebar pill" },
125
+ "level2": { "value": "0px 8px 28px #14192729", "desc": "Modals, toasts" }
126
+ },
127
+ "feedback": {
128
+ "successLight": { "value": "#90eabd", "desc": "Portal success tint (lighter than semantic.success)" },
129
+ "successBackground": { "value": "#d6f0e3", "desc": "hsl(151 45% 89%)" },
130
+ "warningSolid": { "value": "#cc6600", "desc": "Portal warning/error — Figma Feedback/Error orange" },
131
+ "warningBackground": { "value": "#fff2e5", "desc": "hsl(30 100% 95%)" },
132
+ "destructiveBright": { "value": "#fa3848", "desc": "Portal destructive — bright red for UI actions" },
133
+ "infoBackground": { "value": "#d9e3f0", "desc": "hsl(216 31% 89%)" }
134
+ },
135
+ "priority": {
136
+ "urgent": { "bg": "rgba(250,56,72,0.12)", "fg": "#c81e2c", "darkBg": "rgba(230,57,57,0.22)", "darkFg": "#f9a0a0" },
137
+ "high": { "bg": "rgba(255,128,0,0.15)", "fg": "#a85400", "darkBg": "rgba(230,115,0,0.22)", "darkFg": "#ffb366" },
138
+ "medium": { "bg": "rgba(242,185,13,0.20)", "fg": "#9d6607", "darkBg": "rgba(242,185,13,0.16)", "darkFg": "#f5d56a" },
139
+ "low": { "bg": "rgba(151,163,180,0.24)","fg": "#50627c", "darkBg": "rgba(140,155,175,0.20)","darkFg": "#b8c4d4" },
140
+ "none": { "bg": "rgba(192,198,206,0.35)","fg": "#677283", "darkBg": "rgba(115,125,140,0.25)","darkFg": "#b0b8c4" }
141
+ },
142
+ "ticketStatus": {
143
+ "open": { "bg": "#d9e3f2", "fg": "#2e5b9e", "darkBg": "#2a3d52", "darkFg": "#a8c4e8" },
144
+ "pending": { "bg": "#e9dff6", "fg": "#7146aa", "darkBg": "#3d2f4d", "darkFg": "#d4b8f0" },
145
+ "snoozed": { "bg": "#d7dde5", "fg": "#58687e", "darkBg": "#3a424c", "darkFg": "#b8c4d4" },
146
+ "resolved": { "bg": "#d6f0e3", "fg": "#1a6640", "darkBg": "#1f4a32", "darkFg": "#a8e0c0" }
147
+ },
148
+ "hsl": {
149
+ "$note": "Shadcn-style HSL components for portal-tokens.css drop-in. Format: 'H S% L%' (no hsl() wrapper).",
150
+ "light": {
151
+ "background": "216 25% 92%", "foreground": "218 56% 9%",
152
+ "card": "214 41% 97%", "cardForeground": "218 56% 9%",
153
+ "popover": "0 0% 100%", "popoverForeground": "218 56% 9%",
154
+ "primary": "218 56% 9%", "primaryForeground": "0 0% 100%",
155
+ "secondary": "0 0% 100%", "secondaryForeground": "218 56% 9%",
156
+ "muted": "216 16% 88%", "mutedForeground": "216 31% 50%",
157
+ "accent": "219 52% 24%", "accentForeground": "214 41% 97%",
158
+ "destructive": "355 95% 60%", "destructiveForeground": "0 0% 100%",
159
+ "border": "0 0% 100%", "input": "240 14% 96%", "ring": "219 52% 24%",
160
+ "success": "150 68% 74%", "successForeground": "218 56% 9%", "successBackground": "151 45% 89%",
161
+ "warning": "30 100% 40%", "warningForeground": "218 56% 9%", "warningBackground": "30 100% 95%",
162
+ "error": "30 100% 40%", "errorForeground": "0 0% 100%", "errorBackground": "30 100% 95%",
163
+ "info": "216 31% 50%", "infoForeground": "218 56% 9%", "infoBackground": "216 31% 89%",
164
+ "brandDarkOrb": "224 32% 12%", "brandIndigo": "219 52% 24%", "brandBlueYonder": "216 31% 50%",
165
+ "brandGainsboro": "216 16% 88%", "brandCultured": "214 41% 97%", "brandDandelion": "54 81% 55%",
166
+ "brandBlack": "0 0% 0%", "brandWhite": "0 0% 100%",
167
+ "operatorBackground": "0 0% 89.4%"
168
+ },
169
+ "dark": {
170
+ "background": "218 56% 9%", "foreground": "244 20% 96%",
171
+ "card": "218 35% 13%", "cardForeground": "244 20% 96%",
172
+ "popover": "218 15% 12%", "popoverForeground": "244 20% 96%",
173
+ "primary": "244 20% 96%", "primaryForeground": "218 56% 9%",
174
+ "secondary": "218 35% 13%", "secondaryForeground": "244 20% 96%",
175
+ "muted": "210 15% 30%", "mutedForeground": "244 20% 80%",
176
+ "accent": "216 31% 50%", "accentForeground": "244 20% 96%",
177
+ "destructive": "0 78% 55%", "destructiveForeground": "244 20% 96%",
178
+ "border": "210 15% 30%", "input": "218 35% 13%", "ring": "244 20% 96%",
179
+ "successBackground": "150 68% 26%", "warningBackground": "30 100% 22%",
180
+ "errorBackground": "30 100% 22%", "infoBackground": "216 31% 28%"
181
+ }
182
+ }
110
183
  },
111
184
 
112
185
  "border": {