@tcn/ui 0.3.2 → 0.4.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 (207) hide show
  1. package/dist/Color-6BZIO3FS-CWWwv-fq.js +1004 -0
  2. package/dist/Color-6BZIO3FS-CWWwv-fq.js.map +1 -0
  3. package/dist/{WithTooltip-IO6J4KBT-B1oq93K5.js → WithTooltip-65CFNBJE-DvcUZizH.js} +4 -4
  4. package/dist/WithTooltip-65CFNBJE-DvcUZizH.js.map +1 -0
  5. package/dist/actions/__docs__/components/showcase.d.ts.map +1 -1
  6. package/dist/actions/__docs__/components/showcase.js +1 -1
  7. package/dist/actions/button/base_button/base_button.d.ts +2 -4
  8. package/dist/actions/button/base_button/base_button.d.ts.map +1 -1
  9. package/dist/actions/button/base_button/base_button.js +35 -35
  10. package/dist/actions/button/base_button/base_button.js.map +1 -1
  11. package/dist/actions/button/button/button.d.ts +7 -1
  12. package/dist/actions/button/button/button.d.ts.map +1 -1
  13. package/dist/actions/button/button/button.js +9 -7
  14. package/dist/actions/button/button/button.js.map +1 -1
  15. package/dist/actions/button/slim_button/slim_button.d.ts +6 -1
  16. package/dist/actions/button/slim_button/slim_button.d.ts.map +1 -1
  17. package/dist/actions/button/slim_button/slim_button.js +13 -14
  18. package/dist/actions/button/slim_button/slim_button.js.map +1 -1
  19. package/dist/actions/toggle/toggle.d.ts +9 -0
  20. package/dist/actions/toggle/toggle.d.ts.map +1 -0
  21. package/dist/actions/toggle/toggle.js +21 -0
  22. package/dist/actions/toggle/toggle.js.map +1 -0
  23. package/dist/date_picker_time_selector.css +1 -1
  24. package/dist/feedback/lazy/lazy.js +3 -3
  25. package/dist/form/field/common/field_error.js +16 -9
  26. package/dist/form/field/common/field_error.js.map +1 -1
  27. package/dist/formatter-EIJCOSYU-D6nmx63h.js +6 -0
  28. package/dist/formatter-EIJCOSYU-D6nmx63h.js.map +1 -0
  29. package/dist/input.css +1 -1
  30. package/dist/inputs/mask_input/mask.d.ts.map +1 -1
  31. package/dist/inputs/mask_input/mask.js.map +1 -1
  32. package/dist/inputs/multiselect/multiselect_inline_values.js +3 -2
  33. package/dist/inputs/multiselect/multiselect_inline_values.js.map +1 -1
  34. package/dist/inputs/multiselect/multiselect_values.js +3 -2
  35. package/dist/inputs/multiselect/multiselect_values.js.map +1 -1
  36. package/dist/layouts/index.d.ts +2 -1
  37. package/dist/layouts/index.d.ts.map +1 -1
  38. package/dist/layouts/index.js +20 -18
  39. package/dist/layouts/index.js.map +1 -1
  40. package/dist/layouts/row/row.d.ts +4 -0
  41. package/dist/layouts/row/row.d.ts.map +1 -0
  42. package/dist/layouts/row/row.js +11 -0
  43. package/dist/layouts/row/row.js.map +1 -0
  44. package/dist/layouts/section/heading.d.ts +7 -0
  45. package/dist/layouts/section/heading.d.ts.map +1 -0
  46. package/dist/layouts/section/heading.js +9 -0
  47. package/dist/layouts/section/heading.js.map +1 -0
  48. package/dist/layouts/section/section.d.ts +4 -0
  49. package/dist/layouts/section/section.d.ts.map +1 -0
  50. package/dist/layouts/section/section.js +22 -0
  51. package/dist/layouts/section/section.js.map +1 -0
  52. package/dist/navigation/index.d.ts +7 -0
  53. package/dist/navigation/index.d.ts.map +1 -0
  54. package/dist/navigation/index.js +17 -0
  55. package/dist/navigation/index.js.map +1 -0
  56. package/dist/navigation/tabs/primitives/tabs_bar.d.ts +7 -0
  57. package/dist/navigation/tabs/primitives/tabs_bar.d.ts.map +1 -0
  58. package/dist/navigation/tabs/primitives/tabs_bar.js +21 -0
  59. package/dist/navigation/tabs/primitives/tabs_bar.js.map +1 -0
  60. package/dist/navigation/tabs/primitives/tabs_list.d.ts +10 -0
  61. package/dist/navigation/tabs/primitives/tabs_list.d.ts.map +1 -0
  62. package/dist/navigation/tabs/primitives/tabs_list.js +29 -0
  63. package/dist/navigation/tabs/primitives/tabs_list.js.map +1 -0
  64. package/dist/navigation/tabs/state/context.d.ts +21 -0
  65. package/dist/navigation/tabs/state/context.d.ts.map +1 -0
  66. package/dist/navigation/tabs/state/context.js +34 -0
  67. package/dist/navigation/tabs/state/context.js.map +1 -0
  68. package/dist/navigation/tabs/state/link/tab_link.d.ts +9 -0
  69. package/dist/navigation/tabs/state/link/tab_link.d.ts.map +1 -0
  70. package/dist/navigation/tabs/state/link/tab_link.js +36 -0
  71. package/dist/navigation/tabs/state/link/tab_link.js.map +1 -0
  72. package/dist/navigation/tabs/state/link/use_tab_link.d.ts +5 -0
  73. package/dist/navigation/tabs/state/link/use_tab_link.d.ts.map +1 -0
  74. package/dist/navigation/tabs/state/link/use_tab_link.js +13 -0
  75. package/dist/navigation/tabs/state/link/use_tab_link.js.map +1 -0
  76. package/dist/navigation/tabs/state/nav_bar.d.ts +5 -0
  77. package/dist/navigation/tabs/state/nav_bar.d.ts.map +1 -0
  78. package/dist/navigation/tabs/state/nav_bar.js +36 -0
  79. package/dist/navigation/tabs/state/nav_bar.js.map +1 -0
  80. package/dist/navigation/tabs/state/tab.d.ts +6 -0
  81. package/dist/navigation/tabs/state/tab.d.ts.map +1 -0
  82. package/dist/navigation/tabs/state/tab.js +6 -0
  83. package/dist/navigation/tabs/state/tab.js.map +1 -0
  84. package/dist/overlay/carrot/base_carrot.d.ts +8 -0
  85. package/dist/overlay/carrot/base_carrot.d.ts.map +1 -0
  86. package/dist/overlay/carrot/base_carrot.js +21 -0
  87. package/dist/overlay/carrot/base_carrot.js.map +1 -0
  88. package/dist/overlay/portal/portal_platform.d.ts.map +1 -1
  89. package/dist/overlay/portal/portal_platform.js +3 -3
  90. package/dist/overlay/portal/portal_platform.js.map +1 -1
  91. package/dist/row.css +1 -0
  92. package/dist/section.css +1 -0
  93. package/dist/section.module-0wyGkhDg.js +5 -0
  94. package/dist/section.module-0wyGkhDg.js.map +1 -0
  95. package/dist/{showcase-WfP6kBEb.js → showcase-DK557szS.js} +18018 -16269
  96. package/dist/showcase-DK557szS.js.map +1 -0
  97. package/dist/surfaces/pop_confirm/pop_confirm.js +4 -3
  98. package/dist/surfaces/pop_confirm/pop_confirm.js.map +1 -1
  99. package/dist/{syntaxhighlighter-IQDEPFLK-BX_eF8__.js → syntaxhighlighter-ED5Y7EFY-DaMS-2cF.js} +54 -54
  100. package/dist/syntaxhighlighter-ED5Y7EFY-DaMS-2cF.js.map +1 -0
  101. package/dist/tabs_bar.css +1 -0
  102. package/dist/textarea.css +1 -1
  103. package/dist/theme_provider.css +1 -0
  104. package/dist/theme_provider.module-ChZQ5Xsk.js +5 -0
  105. package/dist/theme_provider.module-ChZQ5Xsk.js.map +1 -0
  106. package/dist/themes/stylesheets/reset.css +1 -1
  107. package/dist/themes/stylesheets/reset.js +1 -0
  108. package/dist/themes/stylesheets/reset.js.map +1 -1
  109. package/dist/themes/theme.d.ts +3 -2
  110. package/dist/themes/theme.d.ts.map +1 -1
  111. package/dist/themes/theme.js +20 -10
  112. package/dist/themes/theme.js.map +1 -1
  113. package/dist/themes/themes/ergo/ergo_theme.css +1 -1
  114. package/dist/themes/themes/ergo/ergo_theme.d.ts.map +1 -1
  115. package/dist/themes/themes/ergo/ergo_theme.js +488 -238
  116. package/dist/themes/themes/ergo/ergo_theme.js.map +1 -1
  117. package/dist/themes/themes/windows_98/windows_98.css +1 -1
  118. package/dist/themes/themes/windows_98/windows_98_theme.js +149 -4
  119. package/dist/themes/themes/windows_98/windows_98_theme.js.map +1 -1
  120. package/dist/tokens/bubble/bubble.js +31 -24
  121. package/dist/tokens/bubble/bubble.js.map +1 -1
  122. package/dist/tokens/chip/chip.js +15 -8
  123. package/dist/tokens/chip/chip.js.map +1 -1
  124. package/dist/tokens/index.d.ts +2 -0
  125. package/dist/tokens/index.d.ts.map +1 -1
  126. package/dist/tokens/index.js +5 -1
  127. package/dist/tokens/index.js.map +1 -1
  128. package/dist/tokens/key/key.d.ts +3 -0
  129. package/dist/tokens/key/key.d.ts.map +1 -0
  130. package/dist/tokens/key/key.js +8 -0
  131. package/dist/tokens/key/key.js.map +1 -0
  132. package/dist/tokens/value/value.d.ts +3 -0
  133. package/dist/tokens/value/value.d.ts.map +1 -0
  134. package/dist/tokens/value/value.js +8 -0
  135. package/dist/tokens/value/value.js.map +1 -0
  136. package/dist/utils/css_utils.d.ts +9 -0
  137. package/dist/utils/css_utils.d.ts.map +1 -0
  138. package/dist/utils/css_utils.js +45 -0
  139. package/dist/utils/css_utils.js.map +1 -0
  140. package/package.json +8 -1
  141. package/src/actions/__docs__/actions.mdx +159 -34
  142. package/src/actions/__docs__/actions.stories.tsx +416 -101
  143. package/src/actions/__docs__/components/showcase.tsx +10 -6
  144. package/src/actions/button/__stories__/button.stories.tsx +10 -0
  145. package/src/actions/button/__stories__/toggle.stories.tsx +177 -0
  146. package/src/actions/button/base_button/base_button.tsx +8 -10
  147. package/src/actions/button/button/button.tsx +11 -2
  148. package/src/actions/button/slim_button/slim_button.tsx +20 -13
  149. package/src/actions/toggle/toggle.tsx +26 -0
  150. package/src/inputs/date_picker/date_picker_time_selector.module.css +0 -1
  151. package/src/inputs/input/input.module.css +0 -1
  152. package/src/inputs/mask_input/mask.ts +7 -1
  153. package/src/inputs/textarea/textarea.module.css +0 -1
  154. package/src/layouts/index.ts +3 -2
  155. package/src/layouts/row/row.module.css +5 -0
  156. package/src/layouts/row/row.tsx +15 -0
  157. package/src/layouts/section/__stories__/section.stories.module.css +6 -0
  158. package/src/layouts/section/__stories__/section.stories.tsx +152 -0
  159. package/src/layouts/section/heading.tsx +16 -0
  160. package/src/layouts/section/section.module.css +41 -0
  161. package/src/layouts/section/section.tsx +21 -0
  162. package/src/navigation/index.ts +18 -0
  163. package/src/navigation/tabs/__stories__/state.stories.tsx +136 -0
  164. package/src/navigation/tabs/__stories__/tabs.stories.tsx +40 -0
  165. package/src/navigation/tabs/primitives/tabs_bar.module.css +13 -0
  166. package/src/navigation/tabs/primitives/tabs_bar.tsx +25 -0
  167. package/src/navigation/tabs/primitives/tabs_list.tsx +41 -0
  168. package/src/navigation/tabs/state/context.tsx +61 -0
  169. package/src/navigation/tabs/state/link/tab_link.tsx +45 -0
  170. package/src/navigation/tabs/state/link/use_tab_link.ts +17 -0
  171. package/src/navigation/tabs/state/nav_bar.tsx +37 -0
  172. package/src/navigation/tabs/state/tab.tsx +12 -0
  173. package/src/overlay/carrot/base_carrot.tsx +24 -0
  174. package/src/overlay/carrot/carrot.stories.tsx +54 -0
  175. package/src/overlay/portal/portal_platform.tsx +1 -0
  176. package/src/surfaces/card/card.stories.tsx +14 -14
  177. package/src/surfaces/modal/__stories__/modal.stories.tsx +19 -8
  178. package/src/surfaces/window/window.stories.tsx +16 -10
  179. package/src/themes/stylesheets/reset.css +1 -0
  180. package/src/themes/theme.tsx +13 -4
  181. package/src/themes/theme_provider.module.css +6 -0
  182. package/src/themes/themes/ergo/__stories__/components/material_picker/sb_inverted_materials.module.css +4 -4
  183. package/src/themes/themes/ergo/__stories__/components/tone_picker/sb_tone_picker.module.css +3 -0
  184. package/src/themes/themes/ergo/__stories__/components/tone_picker/sb_tone_picker.tsx +5 -2
  185. package/src/themes/themes/ergo/__stories__/material.stories.tsx +2 -2
  186. package/src/themes/themes/ergo/__stories__/sb_materials.module.css +31 -26
  187. package/src/themes/themes/ergo/ergo_theme.css +484 -235
  188. package/src/themes/themes/ergo/ergo_theme.ts +1 -0
  189. package/src/themes/themes/windows_98/windows_98.css +149 -4
  190. package/src/tokens/index.ts +2 -0
  191. package/src/tokens/key/key.tsx +10 -0
  192. package/src/tokens/value/value.tsx +10 -0
  193. package/src/utils/css_utils.ts +64 -0
  194. package/tsconfig.json +6 -0
  195. package/dist/Color-ASIRERSW-B4GaVKuQ.js +0 -990
  196. package/dist/Color-ASIRERSW-B4GaVKuQ.js.map +0 -1
  197. package/dist/WithTooltip-IO6J4KBT-B1oq93K5.js.map +0 -1
  198. package/dist/formatter-QJ4M4OGQ-DaIl2Wi_.js +0 -6
  199. package/dist/formatter-QJ4M4OGQ-DaIl2Wi_.js.map +0 -1
  200. package/dist/layouts/list/section_header.d.ts +0 -6
  201. package/dist/layouts/list/section_header.d.ts.map +0 -1
  202. package/dist/layouts/list/section_header.js +0 -22
  203. package/dist/layouts/list/section_header.js.map +0 -1
  204. package/dist/showcase-WfP6kBEb.js.map +0 -1
  205. package/dist/syntaxhighlighter-IQDEPFLK-BX_eF8__.js.map +0 -1
  206. package/src/layouts/list/section_header.module.css +0 -20
  207. package/src/layouts/list/section_header.tsx +0 -21
@@ -8,11 +8,44 @@
8
8
  @layer tcn-theme {
9
9
  /* ===== CSS VARIABLES ===== */
10
10
  :root {
11
+ /* ========== Ergo Brand Palette ========== */
12
+ --ergo-primary: #ce6b2b;
13
+ --ergo-secondary: #669eb4;
14
+ --ergo-secondary-light: #ecf4fb;
15
+ --ergo-secondary-dark: #497485;
16
+ --ergo-tertiary: #dfd7cd;
17
+ --ergo-white: #ffffff;
18
+
19
+ --ergo-accent-blue: #395578;
20
+ --ergo-accent-green: #97bba3;
21
+ --ergo-accent-yellow: #dbc97e;
22
+ --ergo-accent-green: #97bba3;
23
+
24
+ --ergo-grey: #aaaaaa;
25
+ --ergo-grey-light: #d3d3d3;
26
+ --ergo-grey-dark: #808080;
27
+
28
+ --ergo-status-red: #ff6565;
29
+ --ergo-status-red-dark: #c24848;
30
+
31
+ --ergo-status-yellow: #ffd439;
32
+ --ergo-status-yellow-dark: #dbb735;
33
+
34
+ --ergo-status-blue: var(--ergo-secondary);
35
+ --ergo-status-blue-dark: var(--ergo-secondary-dark);
36
+
37
+ --ergo-status-green: #3fbc6a;
38
+ --ergo-status-green-dark: #2d904f;
39
+
40
+ --ergo-ink-primary: var(--ergo-accent-blue);
41
+ --ergo-ink-inverse: var(--ergo-white);
42
+
43
+ /* ========== Blackcat System Tokens ========== */
11
44
  --scalar: 1;
12
- --accent-color: #cd6b2c;
45
+ --accent-color: var(--ergo-primary);
13
46
 
14
47
  /* Typography */
15
- --font-color: #395578;
48
+ --font-color: var(--ergo-ink-primary);
16
49
  --font-family: "Lato", sans-serif;
17
50
  --font-size: 12px;
18
51
 
@@ -26,16 +59,22 @@
26
59
  --padding-large: 16px;
27
60
 
28
61
  /* Status Colors */
29
- --status-color-disabled: #7f7f7f;
30
- --status-color-info: #008cff;
31
- --status-color-warning: #ffff00;
32
- --status-color-positive: #00ff00;
33
- --status-color-error: #ff0000;
34
-
35
- --async-color-initial: #c0c0c0;
36
- --async-color-pending: #008cff;
37
- --async-color-success: #00ff00;
38
- --async-color-failed: #ff0000;
62
+ --status-color-disabled: var(--ergo-grey-light);
63
+ --status-color-info: var(--ergo-status-blue);
64
+ --status-color-warning: var(--ergo-status-yellow);
65
+ --status-color-positive: var(--ergo-status-green);
66
+ --status-color-error: var(--ergo-status-red);
67
+
68
+ --async-color-initial: var(--ergo-grey-main);
69
+ --async-color-pending: var(--ergo-status-blue);
70
+ --async-color-success: var(--ergo-status-green);
71
+ --async-color-failed: var(--ergo-status-red);
72
+
73
+ --action-severity-dangerous: var(--ergo-status-red);
74
+ --action-severity-cautious: var(--ergo-status-yellow);
75
+ --action-severity-neutral: var(--ergo-primary);
76
+ --action-severity-suggested: var(--ergo-status-blue);
77
+ --action-severity-encouraged: var(--ergo-status-green);
39
78
 
40
79
  /* Shape */
41
80
  --shape-radius-small: 2px;
@@ -69,22 +108,26 @@
69
108
  --foreground-color-tertiary: #222222;
70
109
  --foreground-color-quaternary: #222222;
71
110
 
72
- --material-disabled: #d3d3d3;
73
- --material-secondary-dark: 197 29.1% 40.4%;
74
- --material-tan: 33, 22%, 84%;
111
+ --material-disabled: var(--ergo-grey-light);
112
+ --on-material-disabled: var(--ergo-ink-inverse);
113
+ --ink-disabled: var(--ergo-grey-light);
114
+
115
+ --material-line: var(--ergo-grey);
75
116
 
76
117
  /* Default Material */
77
- --action: 23, 65%, 49%;
78
- --on-action: 0, 0%, 100%;
79
- --material: 0, 0%, 100%;
80
- --on-material: 213, 35.6%, 34.7%;
118
+ --action: var(--ergo-primary);
119
+ --on-action: var(--ergo-white);
120
+ --material: var(--ergo-white);
121
+ --on-material: var(--ergo-accent-blue);
122
+ }
81
123
 
82
- --action-dangerous: 0, 90%, 50%;
83
- --action-cautious: 53, 90%, 60%;
84
- --on-action-cautious: 213, 35.6%, 34.7%;
85
- --action-neutral: var(--action);
86
- --action-suggested: 202, 90%, 40%;
87
- --action-encouraged: 120, 90%, 40%;
124
+ .tcn-theme-root {
125
+ font-family: var(--font-family);
126
+ color: var(--font-color);
127
+ --action: var(--ergo-primary);
128
+ --on-action: var(--ergo-white);
129
+ --material: var(--ergo-white);
130
+ --on-material: var(--ergo-accent-blue);
88
131
  }
89
132
 
90
133
  /* ===== Actions ===== */
@@ -97,191 +140,206 @@
97
140
  background 0.1s,
98
141
  color 0.1s;
99
142
 
100
- --act: hsl(var(--tcn-interactive-color, var(--action)));
101
- --on-act: hsl(var(--on-action));
102
- /* Could use hsl here if we made three color variables for each of the hsl values */
103
- --act-down: color-mix(in srgb, var(--act), black 8%);
104
- --act-raised: color-mix(in srgb, var(--act), white 8%);
105
- --act-faint: hsla(var(--action), 0.2);
106
- --on-mat: hsl(var(--on-material));
107
- --on-mat-faint: hsla(var(--on-material), 0.2);
108
- --mat: hsl(var(--material));
109
- --mat-down: color-mix(in srgb, var(--mat), black 8%);
110
- --mat-raised: color-mix(in srgb, var(--mat), white 8%);
111
- }
112
-
113
- .tcn-interactive[data-is-disabled="true"] {
114
- pointer-events: none;
115
- cursor: not-allowed;
116
- }
117
-
118
- .tcn-interactive[data-hierarchy="primary"] {
119
- background: var(--act);
120
- color: var(--on-act);
121
- border: 1px solid var(--act);
122
- }
123
-
124
- .tcn-interactive[data-hierarchy="primary"]:focus-visible {
125
- outline: 2px dashed var(--act);
126
- }
143
+ --ink: var(--on-material);
144
+ --act: var(--action);
145
+ --mat: var(--material);
127
146
 
128
- .tcn-interactive[data-hierarchy="primary"][data-is-disabled="true"] {
129
- background: var(--material-disabled);
130
- color: white;
131
- border: 1px solid var(--material-disabled);
132
- }
147
+ --act-down: color-mix(in srgb, var(--mat), black 12%);
148
+ --act-raised: color-mix(in srgb, var(--mat), var(--act) 12%);
149
+ --act-focus: color-mix(in srgb, var(--mat), var(--act) 16%);
150
+ --act-drag: color-mix(in srgb, var(--mat), var(--act) 24%);
133
151
 
134
- .tcn-interactive[data-hierarchy="primary"]:hover {
135
- background: var(--act-raised);
136
- }
137
-
138
- .tcn-interactive[data-hierarchy="primary"]:active {
139
- background: var(--act-down);
140
- }
152
+ background: var(--mat);
153
+ color: var(--ink);
154
+ transition:
155
+ background 0.1s,
156
+ color 0.1s;
141
157
 
142
- .tcn-interactive[data-hierarchy="secondary"] {
143
- background: transparent;
144
- color: var(--on-mat);
145
- border: 1px solid var(--on-mat);
146
- }
158
+ &:focus-visible,
159
+ &[data-focus-visible] {
160
+ background: var(--act-focus);
161
+ outline: 2px solid var(--ergo-primary);
162
+ outline-offset: 2px;
163
+ }
147
164
 
148
- .tcn-interactive[data-hierarchy="secondary"]:focus-visible {
149
- outline: 2px dashed var(--on-mat);
150
- }
165
+ &:hover,
166
+ &[data-hover] {
167
+ background: var(--act-raised);
168
+ }
151
169
 
152
- .tcn-interactive[data-hierarchy="secondary"][data-is-disabled="true"] {
153
- color: var(--material-disabled);
154
- border: 1px solid var(--material-disabled);
155
- }
170
+ &:active,
171
+ &[data-active] {
172
+ background: var(--act-down);
173
+ }
156
174
 
157
- .tcn-interactive[data-hierarchy="secondary"]:hover {
158
- background: var(--on-mat-faint);
175
+ &[data-is-disabled="true"] {
176
+ pointer-events: none;
177
+ }
159
178
  }
160
179
 
161
- .tcn-interactive[data-hierarchy="secondary"]:active {
162
- background: var(--mat-down);
163
- }
180
+ /* ===== Base Button =====
181
+ * Shared between Button and Toggle.
182
+ * Primarily manages button dimensions and sizing ratios.
183
+ */
184
+ .tcn-base-button {
185
+ /* TODO: btn size should look for "--tcn-action-size" variable before defaulting. */
186
+ --btn-size-base: 26px;
187
+ --btn-pad-base: 12px;
164
188
 
165
- .tcn-interactive[data-hierarchy="tertiary"] {
166
- background: transparent;
167
- color: var(--on-mat);
168
- border: 1px solid transparent;
169
- }
189
+ --btn-pad-delta: 4px;
190
+ --btn-size-delta: 4px;
191
+ --btn-step: 1;
170
192
 
171
- .tcn-interactive[data-hierarchy="tertiary"]:focus-visible {
172
- outline: 2px dashed var(--on-mat);
173
- }
193
+ /* Increase size and pad by 4px for each size "step" from medium */
194
+ --btn-pad: calc(var(--btn-pad-base) + var(--btn-pad-delta) * var(--btn-step));
195
+ --btn-size: calc(var(--btn-size-base) + var(--btn-size-delta) * var(--btn-step));
174
196
 
175
- .tcn-interactive[data-hierarchy="tertiary"][data-is-disabled="true"] {
176
- color: var(--material-disabled);
177
- }
197
+ border-radius: var(--shape-radius-medium);
198
+ min-height: var(--btn-size);
199
+ padding: var(--padding-small) var(--btn-pad);
178
200
 
179
- .tcn-interactive[data-hierarchy="tertiary"]:hover {
180
- text-decoration: underline;
181
- text-decoration-color: var(--on-mat);
182
- text-decoration-thickness: 1px;
183
- text-underline-offset: 4px;
184
- color: var(--on-mat);
185
- background: var(--on-mat-faint);
186
- }
201
+ &[data-size="sm"] {
202
+ --btn-step: -1;
203
+ }
204
+ &[data-size="md"] {
205
+ --btn-step: 0;
206
+ }
207
+ &[data-size="lg"] {
208
+ --btn-step: 1;
209
+ }
187
210
 
188
- .tcn-interactive[data-hierarchy="tertiary"]:active {
189
- background: var(--mat-down);
190
- }
211
+ &[data-is-utility="true"] {
212
+ height: auto;
213
+ width: auto;
214
+ min-width: var(--btn-size);
215
+ padding: 0;
191
216
 
192
- /* Button */
217
+ /* Icon is 75% of the button size but minimum of 2px to account for border and 1px offset */
218
+ --util-ratio: 0.75;
219
+ --btn-size-base: 18px;
193
220
 
194
- .tcn-base-button {
195
- --action: var(var(--button-color), var(--action));
221
+ .tcn-icon {
222
+ min-height: min(2px, calc(var(--btn-size) * var(--util-ratio)));
223
+ min-width: min(2px, calc(var(--btn-size) * var(--util-ratio)));
224
+ }
225
+ }
196
226
  }
197
227
 
198
- .tcn-base-button[data-severity="dangerous"] {
199
- --action: var(--action-dangerous);
200
- --on-material: var(--action-dangerous);
201
- }
228
+ /* ===== Button =====
229
+ * Manages Hierarchy and Severity.
230
+ */
231
+ .tcn-button {
232
+ --btn-primary: var(--action);
233
+ --btn-on-primary: var(--on-action);
234
+ --btn-variant: var(--on-material);
202
235
 
203
- .tcn-base-button[data-severity="cautious"] {
204
- --action: var(--action-cautious);
205
- --on-action: var(--on-action-cautious);
206
- --on-material: var(--action-cautious);
207
- }
236
+ &[data-severity="dangerous"] {
237
+ --btn-primary: var(--action-severity-dangerous);
238
+ --btn-variant: var(--ergo-status-red-dark);
239
+ }
240
+ &[data-severity="cautious"] {
241
+ --btn-primary: var(--action-severity-cautious);
242
+ --btn-on-primary: var(--ergo-accent-blue);
243
+ --btn-variant: var(--ergo-status-yellow-dark);
244
+ }
245
+ &[data-severity="suggested"] {
246
+ --btn-primary: var(--action-severity-suggested);
247
+ --btn-variant: var(--ergo-status-blue-dark);
248
+ }
249
+ &[data-severity="encouraged"] {
250
+ --btn-primary: var(--action-severity-encouraged);
251
+ --btn-variant: var(--ergo-status-green-dark);
252
+ }
208
253
 
209
- /* .tcn-base-button[data-severity="neutral"] {
210
- --action: var(--action-neutral);
211
- } */
254
+ &[data-hierarchy="primary"] {
255
+ --act: var(--ergo-white);
256
+ --ink: var(--tcn-button-text-color, var(--btn-on-primary));
257
+ --mat: var(--tcn-button-color, var(--btn-primary));
258
+ &[data-is-disabled="true"] {
259
+ --ink: var(--ergo-white);
260
+ --mat: var(--ergo-grey-light);
261
+ }
262
+ }
212
263
 
213
- .tcn-base-button[data-severity="suggested"] {
214
- --action: var(--action-suggested);
215
- --on-material: var(--action-suggested);
216
- }
264
+ &[data-hierarchy="secondary"],
265
+ &[data-hierarchy="tertiary"] {
266
+ --act: var(--tcn-button-color, var(--btn-variant));
267
+ --ink: var(--tcn-button-color, var(--btn-variant));
268
+ &[data-is-disabled="true"] {
269
+ --ink: var(--ergo-grey-light);
270
+ }
271
+ }
217
272
 
218
- .tcn-base-button[data-severity="encouraged"] {
219
- --action: var(--action-encouraged);
220
- --on-material: var(--action-encouraged);
221
- }
273
+ /* Decorations */
274
+ &[data-hierarchy="tertiary"]:hover {
275
+ text-decoration: underline;
276
+ text-decoration-color: var(--ink);
277
+ text-decoration-thickness: 1px;
278
+ text-underline-offset: 4px;
279
+ }
222
280
 
223
- .tcn-button {
224
- border-radius: 4px;
225
- }
281
+ &[data-hierarchy="tertiary"] {
282
+ border: 1px solid transparent;
283
+ }
226
284
 
227
- .tcn-button[data-size="sm"] {
228
- padding: 0px 8px;
229
- min-height: 22px;
230
- }
285
+ &[data-hierarchy="secondary"] {
286
+ border: 1px solid var(--ink);
287
+ }
231
288
 
232
- .tcn-button[data-size="md"] {
233
- padding: 0px 12px;
234
- min-height: 26px;
235
- }
289
+ &[data-hierarchy="primary"] {
290
+ border: 1px solid var(--mat);
291
+ }
236
292
 
237
- .tcn-button[data-size="lg"] {
238
- padding: 0px 16px;
239
- min-height: 32px;
240
- }
293
+ transition:
294
+ box-shadow 0.1s,
295
+ transform 0.1s;
241
296
 
242
- .tcn-button:hover {
243
- transform: translateY(-1px);
244
- box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.1);
245
- }
297
+ &:hover,
298
+ &[data-hover] {
299
+ transform: translateY(-1px);
300
+ box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.12);
301
+ }
246
302
 
247
- .tcn-button:active {
248
- transform: translateY(1px);
249
- box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.1);
303
+ &:active,
304
+ &[data-active] {
305
+ transform: translateY(1px);
306
+ box-shadow: inset 0 2px 2px 0 rgba(0, 0, 0, 0.12);
307
+ }
250
308
  }
251
309
 
310
+ /* @deprecated - use Button with utility prop instead */
252
311
  .tcn-slim-button {
253
312
  height: auto;
254
313
  width: auto;
255
314
  padding: 0;
256
- }
257
315
 
258
- .tcn-slim-button[data-size="sm"] {
259
- min-height: 12px;
260
- min-width: 12px;
261
- padding: 0;
262
- .tcn-icon {
263
- min-height: 10px;
264
- min-width: 10px;
316
+ &[data-size="sm"] {
317
+ min-height: 12px;
318
+ min-width: 12px;
319
+ padding: 0;
320
+ .tcn-icon {
321
+ min-height: 10px;
322
+ min-width: 10px;
323
+ }
265
324
  }
266
- }
267
-
268
- .tcn-slim-button[data-size="md"] {
269
- min-height: 18px;
270
- min-width: 18px;
271
- padding: 0;
272
- .tcn-icon {
273
- min-height: 14px;
274
- min-width: 14px;
325
+ &[data-size="md"] {
326
+ min-height: 18px;
327
+ min-width: 18px;
328
+ padding: 0;
329
+ .tcn-icon {
330
+ min-height: 14px;
331
+ min-width: 14px;
332
+ }
275
333
  }
276
- }
277
334
 
278
- .tcn-slim-button[data-size="lg"] {
279
- min-height: 24px;
280
- min-width: 24px;
281
- padding: 0;
282
- .tcn-icon {
283
- min-height: 20px;
284
- min-width: 20px;
335
+ &[data-size="lg"] {
336
+ min-height: 24px;
337
+ min-width: 24px;
338
+ padding: 0;
339
+ .tcn-icon {
340
+ min-height: 20px;
341
+ min-width: 20px;
342
+ }
285
343
  }
286
344
  }
287
345
 
@@ -289,6 +347,28 @@
289
347
  padding-inline-end: 26px;
290
348
  }
291
349
 
350
+ /* Toggle */
351
+ .tcn-toggle {
352
+ --tgl-false: var(--ergo-accent-blue);
353
+ --tgl-true: var(--ergo-accent-blue);
354
+ --on-tgl-true: var(--ergo-white);
355
+
356
+ --ink: var(--tcn-button-color, var(--tgl-false));
357
+ --act: var(--tcn-button-color, var(--tgl-false));
358
+ &[data-is-disabled="true"] {
359
+ --ink: var(--ergo-grey-light);
360
+ }
361
+ &[data-is-selected="true"] {
362
+ --mat: var(--tcn-button-color, var(--tgl-true));
363
+ --ink: var(--tcn-button-text-color, var(--ergo-white));
364
+ --act: var(--ergo-white);
365
+ &[data-is-disabled="true"] {
366
+ --ink: var(--ergo-white);
367
+ --mat: var(--ergo-grey-light);
368
+ }
369
+ }
370
+ }
371
+
292
372
  .tcn-button-group {
293
373
  .tcn-button-group-button:hover,
294
374
  .tcn-button-group-button:active {
@@ -324,7 +404,6 @@
324
404
  }
325
405
 
326
406
  .tcn-select-group {
327
- --action: var(--action-neutral);
328
407
  .tcn-select-group-option:hover,
329
408
  .tcn-select-group-option:active {
330
409
  transform: none;
@@ -368,9 +447,107 @@
368
447
  }
369
448
  }
370
449
 
450
+ /* ===== Tabs ===== */
451
+ .tcn-tabs-bar {
452
+ .tcn-tabs-list {
453
+ .tcn-tab-item {
454
+ min-height: 24px;
455
+ padding: 0px var(--padding-medium);
456
+ text-decoration: none;
457
+ text-overflow: ellipsis;
458
+ overflow: hidden;
459
+ white-space: nowrap;
460
+ }
461
+ }
462
+ }
463
+
464
+ /* Default */
465
+ .tcn-tabs-bar[data-variant="default"] {
466
+ .tcn-tabs-list {
467
+ .tcn-tab-item {
468
+ box-sizing: border-box;
469
+ border: none;
470
+ padding: 0px var(--padding-medium);
471
+ border-radius: 0;
472
+ }
473
+ .tcn-tab-item[data-is-selected="true"] {
474
+ --mat: var(--tcn-button-color, var(--material));
475
+ --ink: var(--tcn-button-text-color, var(--ergo-primary));
476
+ --act: var(--ergo-primary);
477
+ }
478
+
479
+ /* Hover Indicator */
480
+ .tcn-tab-item[data-is-selected="false"]:hover::after {
481
+ content: "";
482
+ display: block;
483
+ position: absolute;
484
+ left: 0;
485
+ right: 0;
486
+ bottom: 0px;
487
+ height: 1px;
488
+ background: var(--ergo-accent-blue);
489
+ pointer-events: none;
490
+ width: 100%;
491
+ z-index: 3;
492
+ }
493
+
494
+ /* Indicator */
495
+ &::after {
496
+ content: "";
497
+ position: absolute;
498
+ bottom: -1px;
499
+ left: 0;
500
+ min-height: 2px;
501
+ transform: translateX(var(--tabs-active-rectangle-position-x, 0));
502
+ width: var(--tabs-active-rectangle-width, 0);
503
+ background: var(--ergo-primary);
504
+ pointer-events: none;
505
+ border-bottom-left-radius: 2px;
506
+ border-bottom-right-radius: 2px;
507
+ transition:
508
+ transform 300ms ease-in-out,
509
+ width 300ms ease-in-out;
510
+ will-change: transform, width;
511
+ z-index: 2;
512
+ }
513
+ }
514
+
515
+ /* Rail */
516
+ &::before {
517
+ content: "";
518
+ position: absolute;
519
+ bottom: 0px;
520
+ left: 0;
521
+ width: 100%;
522
+ height: 1px;
523
+ background: var(--material-line);
524
+ pointer-events: none;
525
+ z-index: 1;
526
+ }
527
+ }
528
+
529
+ /* Inline */
530
+ .tcn-tabs-bar[data-variant="inline"] {
531
+ min-width: min-content;
532
+ width: auto;
533
+ flex-grow: 0;
534
+ border-radius: var(--shape-radius-medium);
535
+ border: 1px solid var(--on-material);
536
+
537
+ .tcn-tabs-list {
538
+ gap: var(--gap-small);
539
+ padding: var(--padding-small);
540
+ .tcn-tab-item {
541
+ border-radius: var(--shape-radius-medium);
542
+ }
543
+ }
544
+ }
545
+
546
+ /* ===== MATERIAL ===== */
547
+
371
548
  .material {
372
- background-color: hsl(var(--material));
373
- color: hsl(var(--on-material));
549
+ background-color: var(--material);
550
+ color: var(--on-material);
374
551
  }
375
552
 
376
553
  /* ===== SURFACES ===== */
@@ -462,26 +639,17 @@
462
639
  border: 1px solid var(--foreground-color-primary);
463
640
  }
464
641
 
465
- :where(.tcn-typography) {
466
- color: inherit;
467
- }
468
-
469
642
  :where(.tcn-header) {
470
- --material: var(--material-secondary-dark);
471
- --on-material: 0, 0%, 100%;
472
- --action: var(--material-tan);
473
- --on-action: 0, 0%, 100%;
474
- background-color: hsl(var(--material));
475
- color: hsl(var(--on-material));
476
- }
643
+ --material: var(--ergo-secondary-dark);
644
+ --on-material: var(--ergo-white);
645
+ --action: var(--ergo-tertiary);
646
+ --on-action: var(--ergo-secondary-dark);
477
647
 
478
- :where(.tcn-utility-bar) {
479
- --material: var(--material-secondary-dark);
480
- --on-material: 0, 0%, 100%;
481
- --action: var(--material-tan);
482
- --on-action: 0, 0%, 100%;
483
- background-color: hsl(var(--material));
484
- color: hsl(var(--on-material));
648
+ background-color: var(--material);
649
+ color: var(--on-material);
650
+ :where(.tcn-typography) {
651
+ color: inherit;
652
+ }
485
653
  }
486
654
  }
487
655
 
@@ -497,26 +665,17 @@
497
665
  border: 2px solid white;
498
666
  }
499
667
 
500
- :where(.tcn-typography) {
501
- color: inherit;
502
- }
503
-
504
668
  :where(.tcn-header) {
505
- --material: var(--material-secondary-dark);
506
- --on-material: 0, 0%, 100%;
507
- --action: var(--material-tan);
508
- --on-action: 0, 0%, 100%;
509
- background-color: hsl(var(--material));
510
- color: hsl(var(--on-material));
511
- }
669
+ --material: var(--ergo-secondary-dark);
670
+ --on-material: var(--ergo-white);
671
+ --action: var(--ergo-tertiary);
672
+ --on-action: var(--ergo-secondary-dark);
512
673
 
513
- :where(.tcn-utility-bar) {
514
- --material: var(--material-secondary-dark);
515
- --on-material: 0, 0%, 100%;
516
- --action: var(--material-tan);
517
- --on-action: 0, 0%, 100%;
518
- background-color: hsl(var(--material));
519
- color: hsl(var(--on-material));
674
+ background-color: var(--material);
675
+ color: var(--on-material);
676
+ :where(.tcn-typography) {
677
+ color: inherit;
678
+ }
520
679
  }
521
680
  }
522
681
 
@@ -531,27 +690,19 @@
531
690
  overflow: hidden;
532
691
  }
533
692
 
534
- :where(.tcn-typography) {
535
- color: inherit;
536
- }
537
-
538
693
  :where(.tcn-header) {
539
694
  min-height: 32px;
540
- --material: var(--material-secondary-dark);
541
- --on-material: 0, 0%, 100%;
542
- --action: var(--material-tan);
543
- --on-action: 0, 0%, 100%;
544
- background-color: hsl(var(--material));
545
- color: hsl(var(--on-material));
546
- }
547
695
 
548
- :where(.tcn-utility-bar) {
549
- --material: var(--material-secondary-dark);
550
- --on-material: 0, 0%, 100%;
551
- --action: var(--material-tan);
552
- --on-action: 0, 0%, 100%;
553
- background-color: hsl(var(--material));
554
- color: hsl(var(--on-material));
696
+ --material: var(--ergo-secondary-dark);
697
+ --on-material: var(--ergo-white);
698
+ --action: var(--ergo-tertiary);
699
+ --on-action: var(--ergo-secondary-dark);
700
+
701
+ background-color: var(--material);
702
+ color: var(--on-material);
703
+ :where(.tcn-typography) {
704
+ color: inherit;
705
+ }
555
706
  }
556
707
  }
557
708
 
@@ -575,13 +726,111 @@
575
726
  overflow: hidden;
576
727
 
577
728
  :where(.tcn-header) {
578
- /* TODO: This should be a variable */
579
- background-color: #ecf4fb;
729
+ min-height: 32px;
730
+
731
+ --material: var(--ergo-secondary-light);
732
+ --on-material: var(--ergo-accent-blue);
733
+ --action: var(--ergo-secondary);
734
+ --on-action: var(--ergo-white);
735
+
736
+ background-color: var(--material);
737
+ color: var(--on-material);
738
+ :where(.tcn-typography) {
739
+ color: inherit;
740
+ }
580
741
  }
742
+ }
581
743
 
582
- :where(.tcn-utility-bar) {
583
- /* TODO: This should be a variable */
584
- background-color: #ecf4fb;
744
+ /* SECTION */
745
+ .tcn-heading {
746
+ background-color: #f1f1f1;
747
+ padding-inline-start: 8px;
748
+ height: 30px;
749
+ z-index: 5;
750
+ }
751
+
752
+ .tcn-section > .tcn-heading {
753
+ background-color: #f2f4f6;
754
+ padding-inline-start: 8px;
755
+ color: rgb(51, 51, 51);
756
+ z-index: 4;
757
+ }
758
+
759
+ .tcn-section > .tcn-section > .tcn-heading {
760
+ background-color: #fff7f0;
761
+ padding-inline-start: 12px;
762
+ color: #395578;
763
+ z-index: 3;
764
+ }
765
+
766
+ .tcn-section > .tcn-section > .tcn-section > .tcn-heading {
767
+ background-color: #eef8ef;
768
+ padding-inline-start: 16px;
769
+ color: #395578;
770
+ z-index: 2;
771
+ }
772
+
773
+ .tcn-section > .tcn-section > .tcn-section > .tcn-section .tcn-heading {
774
+ background-color: #ecf4fb;
775
+ padding-inline-start: 20px;
776
+ color: #395578;
777
+ z-index: 1;
778
+ }
779
+
780
+ .tcn-section > :not(.tcn-heading, .tcn-section) {
781
+ padding-inline-start: 8px;
782
+ }
783
+
784
+ .tcn-section > .tcn-section > :not(.tcn-heading, .tcn-section) {
785
+ padding-inline-start: 12px;
786
+ }
787
+
788
+ .tcn-section > .tcn-section > .tcn-section > :not(.tcn-heading, .tcn-section) {
789
+ padding-inline-start: 16px;
790
+ }
791
+
792
+ .tcn-section
793
+ > .tcn-section
794
+ > .tcn-section
795
+ > .tcn-section
796
+ > :not(.tcn-heading, .tcn-section) {
797
+ padding-inline-start: 20px;
798
+ }
799
+
800
+ .tcn-base-carrot {
801
+ --carrot-size: 12px;
802
+ --carrot-triangle-height: calc(var(--carrot-size) / 2);
803
+ --carrot-triangle-width: var(--carrot-size);
804
+ --carrot-triangle-base: var(--carrot-triangle-height) solid transparent;
805
+ --carrot-triangle-peak: var(--carrot-triangle-width) solid var(--material);
806
+
807
+ width: 0;
808
+ height: 0;
809
+ flex-grow: 0;
810
+ display: inline-block;
811
+
812
+ &[data-direction="top"] {
813
+ border-bottom: var(--carrot-triangle-peak);
814
+ border-left: var(--carrot-triangle-base);
815
+ border-right: var(--carrot-triangle-base);
816
+ }
817
+
818
+ &[data-direction="bottom"] {
819
+ border-top: var(--carrot-triangle-peak);
820
+ border-left: var(--carrot-triangle-base);
821
+ border-right: var(--carrot-triangle-base);
822
+ }
823
+
824
+ &[data-direction="start"] {
825
+ border-right: var(--carrot-triangle-peak);
826
+ border-top: var(--carrot-triangle-base);
827
+ border-bottom: var(--carrot-triangle-base);
828
+ }
829
+
830
+ &[data-direction="end"] {
831
+ border-left: var(--carrot-triangle-peak);
832
+ border-top: var(--carrot-triangle-base);
833
+ border-bottom: var(--carrot-triangle-base);
585
834
  }
586
835
  }
587
836
  }