@kenlo/sds-design-system 0.9.9

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 (246) hide show
  1. package/README.md +129 -0
  2. package/components/Accordion/Accordion.css +186 -0
  3. package/components/Accordion/accordion-variants.js +17 -0
  4. package/components/Accordion/accordion.marko +264 -0
  5. package/components/AccordionGroup/AccordionGroup.css +35 -0
  6. package/components/AccordionGroup/accordion-group.marko +17 -0
  7. package/components/Alert/Alert.css +104 -0
  8. package/components/Alert/alert-variants.js +35 -0
  9. package/components/Alert/alert.marko +94 -0
  10. package/components/AttachmentList/AttachmentList.css +92 -0
  11. package/components/AttachmentList/attachment-list.marko +51 -0
  12. package/components/AttachmentList/attachment-row.marko +167 -0
  13. package/components/Avatar/Avatar.css +110 -0
  14. package/components/Avatar/avatar-variants.js +12 -0
  15. package/components/Avatar/avatar.marko +71 -0
  16. package/components/Badge/Badge.css +381 -0
  17. package/components/Badge/badge-dismissible.marko +143 -0
  18. package/components/Badge/badge-variants.js +35 -0
  19. package/components/Badge/badge.marko +134 -0
  20. package/components/BottomSheet/BottomSheet.css +300 -0
  21. package/components/BottomSheet/bottom-sheet.marko +340 -0
  22. package/components/BulkActionBar/BulkActionBar.css +88 -0
  23. package/components/BulkActionBar/bulk-action-bar.marko +186 -0
  24. package/components/Button/Button.css +340 -0
  25. package/components/Button/button-variants.js +25 -0
  26. package/components/Button/button.marko +139 -0
  27. package/components/Card/Card.css +391 -0
  28. package/components/Card/card-body.marko +5 -0
  29. package/components/Card/card-collapsible.marko +94 -0
  30. package/components/Card/card-footer.marko +12 -0
  31. package/components/Card/card-header.marko +30 -0
  32. package/components/Card/card-info-pair.marko +17 -0
  33. package/components/Card/card-info-row.marko +12 -0
  34. package/components/Card/card-section.marko +14 -0
  35. package/components/Card/card-variants.js +24 -0
  36. package/components/Card/card.marko +124 -0
  37. package/components/Checkbox/Checkbox.css +249 -0
  38. package/components/Checkbox/checkbox-variants.js +21 -0
  39. package/components/Checkbox/checkbox.marko +128 -0
  40. package/components/ColorPicker/ColorPicker.css +253 -0
  41. package/components/ColorPicker/color-maths.js +104 -0
  42. package/components/ColorPicker/color-picker.marko +474 -0
  43. package/components/DatePicker/DatePicker.css +429 -0
  44. package/components/DatePicker/date-logic.js +225 -0
  45. package/components/DatePicker/date-picker.marko +492 -0
  46. package/components/Drawer/Drawer.css +174 -0
  47. package/components/Drawer/drawer.marko +262 -0
  48. package/components/Floating/Floating.css +28 -0
  49. package/components/Floating/floating-position.js +251 -0
  50. package/components/Floating/floating.marko +291 -0
  51. package/components/Form/Form.css +15 -0
  52. package/components/Form/form-context.js +69 -0
  53. package/components/Form/form.marko +73 -0
  54. package/components/GradientPicker/GradientPicker.css +179 -0
  55. package/components/GradientPicker/gradient-picker.marko +398 -0
  56. package/components/Grid/Grid.css +161 -0
  57. package/components/Grid/col.marko +36 -0
  58. package/components/Grid/grid-variants.js +43 -0
  59. package/components/Grid/grid.marko +25 -0
  60. package/components/Header/Header.css +457 -0
  61. package/components/Header/header.marko +523 -0
  62. package/components/Icon/Icon.css +44 -0
  63. package/components/Icon/icon-colors.js +31 -0
  64. package/components/Icon/icon.marko +56 -0
  65. package/components/IconButton/IconButton.css +85 -0
  66. package/components/IconButton/icon-button-variants.js +18 -0
  67. package/components/IconButton/icon-button.marko +103 -0
  68. package/components/Incrementer/Incrementer.css +94 -0
  69. package/components/Incrementer/incrementer.marko +70 -0
  70. package/components/Input/Input.css +547 -0
  71. package/components/Input/input-countries.js +109 -0
  72. package/components/Input/input-masks.js +218 -0
  73. package/components/Input/input-types.js +194 -0
  74. package/components/Input/input.marko +530 -0
  75. package/components/Menu/Menu.css +651 -0
  76. package/components/Menu/menu-variants.js +89 -0
  77. package/components/Menu/menu.marko +560 -0
  78. package/components/Modal/Modal.css +160 -0
  79. package/components/Modal/modal.marko +296 -0
  80. package/components/Nav/Nav.css +298 -0
  81. package/components/Nav/nav-variants.js +23 -0
  82. package/components/Nav/nav.marko +164 -0
  83. package/components/Notification/Notification.css +78 -0
  84. package/components/Notification/notification-variants.js +30 -0
  85. package/components/Notification/notification.marko +55 -0
  86. package/components/Pagination/Pagination.css +78 -0
  87. package/components/Pagination/pagination-pages.js +66 -0
  88. package/components/Pagination/pagination.marko +141 -0
  89. package/components/Pill/Pill.css +193 -0
  90. package/components/Pill/pill-variants.js +16 -0
  91. package/components/Pill/pill.marko +165 -0
  92. package/components/Popover/Popover.css +121 -0
  93. package/components/Popover/popover.marko +96 -0
  94. package/components/Radio/Radio.css +230 -0
  95. package/components/Radio/radio-variants.js +16 -0
  96. package/components/Radio/radio.marko +93 -0
  97. package/components/RadioGroup/RadioGroup.css +32 -0
  98. package/components/RadioGroup/radio-group.marko +93 -0
  99. package/components/SearchBar/SearchBar.css +181 -0
  100. package/components/SearchBar/search-bar-variants.js +24 -0
  101. package/components/SearchBar/search-bar.marko +157 -0
  102. package/components/Select/Select.css +427 -0
  103. package/components/Select/select-options.js +163 -0
  104. package/components/Select/select.marko +449 -0
  105. package/components/Separator/Separator.css +22 -0
  106. package/components/Separator/separator.marko +14 -0
  107. package/components/Skeleton/Skeleton.css +100 -0
  108. package/components/Skeleton/skeleton-avatar.marko +28 -0
  109. package/components/Skeleton/skeleton-button.marko +22 -0
  110. package/components/Skeleton/skeleton-image.marko +20 -0
  111. package/components/Skeleton/skeleton-input.marko +22 -0
  112. package/components/Skeleton/skeleton-variants.js +16 -0
  113. package/components/Skeleton/skeleton.marko +53 -0
  114. package/components/Spinner/Spinner.css +173 -0
  115. package/components/Spinner/spinner-geometry.js +39 -0
  116. package/components/Spinner/spinner-overlay.marko +97 -0
  117. package/components/Spinner/spinner.marko +88 -0
  118. package/components/StatCard/StatCard.css +90 -0
  119. package/components/StatCard/stat-card-group.marko +5 -0
  120. package/components/StatCard/stat-card.marko +57 -0
  121. package/components/Switch/Switch.css +209 -0
  122. package/components/Switch/switch.marko +99 -0
  123. package/components/Table/Table.css +270 -0
  124. package/components/Table/table-cell.marko +28 -0
  125. package/components/Table/table-header.marko +27 -0
  126. package/components/Table/table-logic.js +129 -0
  127. package/components/Table/table.marko +372 -0
  128. package/components/Text/Text.css +79 -0
  129. package/components/Text/text-variants.js +25 -0
  130. package/components/Text/text.marko +48 -0
  131. package/components/TextEditor/TextEditor.css +78 -0
  132. package/components/TextEditor/safe-url.js +50 -0
  133. package/components/TextEditor/text-editor-commands.js +22 -0
  134. package/components/TextEditor/text-editor.marko +253 -0
  135. package/components/Toast/Toast.css +88 -0
  136. package/components/Toast/toast-api.js +19 -0
  137. package/components/Toast/toast-store.js +118 -0
  138. package/components/Toast/toast-variants.js +16 -0
  139. package/components/Toast/toast.marko +93 -0
  140. package/components/Toast/toaster.marko +70 -0
  141. package/components/Toggle/Toggle.css +169 -0
  142. package/components/Toggle/toggle.marko +93 -0
  143. package/components/Tooltip/Tooltip.css +115 -0
  144. package/components/Tooltip/tooltip.marko +77 -0
  145. package/components/Uploader/Uploader.css +180 -0
  146. package/components/Uploader/crop-geometry.js +161 -0
  147. package/components/Uploader/uploader.marko +269 -0
  148. package/foundations/Scrollbar/Scrollbar.css +26 -0
  149. package/foundations/attrs.js +27 -0
  150. package/foundations/breakpoints.js +27 -0
  151. package/foundations/contrast.js +74 -0
  152. package/foundations/custom-scheme.js +222 -0
  153. package/foundations/overlay.js +108 -0
  154. package/foundations/styles.css +284 -0
  155. package/foundations/text.js +22 -0
  156. package/foundations/theme-server.js +81 -0
  157. package/foundations/theme.js +42 -0
  158. package/foundations/tokens.css +1656 -0
  159. package/icons/custom/custom-video-horizontal-filled.marko +6 -0
  160. package/icons/custom/custom-video-horizontal-regular.marko +6 -0
  161. package/icons/custom/custom-video-tour-3d-filled.marko +7 -0
  162. package/icons/custom/custom-video-tour-3d-regular.marko +9 -0
  163. package/icons/custom/custom-video-vertical-filled.marko +6 -0
  164. package/icons/custom/custom-video-vertical-regular.marko +6 -0
  165. package/icons/generated/fluent-add-regular.marko +3 -0
  166. package/icons/generated/fluent-alert-regular.marko +3 -0
  167. package/icons/generated/fluent-apps-regular.marko +3 -0
  168. package/icons/generated/fluent-arrow-download-regular.marko +3 -0
  169. package/icons/generated/fluent-arrow-left-regular.marko +3 -0
  170. package/icons/generated/fluent-arrow-right-regular.marko +3 -0
  171. package/icons/generated/fluent-arrow-rotate-clockwise-regular.marko +3 -0
  172. package/icons/generated/fluent-arrow-rotate-counterclockwise-regular.marko +3 -0
  173. package/icons/generated/fluent-border-all-regular.marko +3 -0
  174. package/icons/generated/fluent-calendar-regular.marko +3 -0
  175. package/icons/generated/fluent-checkmark-circle-filled.marko +3 -0
  176. package/icons/generated/fluent-checkmark-regular.marko +3 -0
  177. package/icons/generated/fluent-chevron-down-regular.marko +3 -0
  178. package/icons/generated/fluent-chevron-left-regular.marko +3 -0
  179. package/icons/generated/fluent-chevron-right-regular.marko +3 -0
  180. package/icons/generated/fluent-chevron-up-regular.marko +3 -0
  181. package/icons/generated/fluent-circle-half-fill-regular.marko +3 -0
  182. package/icons/generated/fluent-clock-regular.marko +3 -0
  183. package/icons/generated/fluent-color-regular.marko +3 -0
  184. package/icons/generated/fluent-crop-regular.marko +3 -0
  185. package/icons/generated/fluent-dark-theme-regular.marko +3 -0
  186. package/icons/generated/fluent-delete-regular.marko +3 -0
  187. package/icons/generated/fluent-desktop-regular.marko +3 -0
  188. package/icons/generated/fluent-dismiss-circle-filled.marko +3 -0
  189. package/icons/generated/fluent-dismiss-regular.marko +3 -0
  190. package/icons/generated/fluent-document-pdf-regular.marko +3 -0
  191. package/icons/generated/fluent-document-regular.marko +3 -0
  192. package/icons/generated/fluent-eye-off-regular.marko +3 -0
  193. package/icons/generated/fluent-eye-regular.marko +3 -0
  194. package/icons/generated/fluent-eyedropper-regular.marko +3 -0
  195. package/icons/generated/fluent-grid-regular.marko +3 -0
  196. package/icons/generated/fluent-history-regular.marko +3 -0
  197. package/icons/generated/fluent-home-regular.marko +3 -0
  198. package/icons/generated/fluent-image-regular.marko +3 -0
  199. package/icons/generated/fluent-info-regular.marko +3 -0
  200. package/icons/generated/fluent-link-regular.marko +3 -0
  201. package/icons/generated/fluent-more-horizontal-regular.marko +3 -0
  202. package/icons/generated/fluent-navigation-regular.marko +3 -0
  203. package/icons/generated/fluent-paint-brush-regular.marko +3 -0
  204. package/icons/generated/fluent-question-circle-regular.marko +3 -0
  205. package/icons/generated/fluent-search-regular.marko +3 -0
  206. package/icons/generated/fluent-settings-regular.marko +3 -0
  207. package/icons/generated/fluent-square-hint-regular.marko +3 -0
  208. package/icons/generated/fluent-subtract-regular.marko +3 -0
  209. package/icons/generated/fluent-text-align-center-regular.marko +3 -0
  210. package/icons/generated/fluent-text-align-left-regular.marko +3 -0
  211. package/icons/generated/fluent-text-align-right-regular.marko +3 -0
  212. package/icons/generated/fluent-text-bold-regular.marko +3 -0
  213. package/icons/generated/fluent-text-bullet-list-regular.marko +3 -0
  214. package/icons/generated/fluent-text-font-regular.marko +3 -0
  215. package/icons/generated/fluent-text-font-size-regular.marko +3 -0
  216. package/icons/generated/fluent-text-italic-regular.marko +3 -0
  217. package/icons/generated/fluent-text-number-list-ltr-regular.marko +3 -0
  218. package/icons/generated/fluent-video-regular.marko +3 -0
  219. package/icons/generated/fluent-warning-filled.marko +3 -0
  220. package/icons/generated/fluent-weather-moon-regular.marko +3 -0
  221. package/icons/generated/fluent-weather-sunny-regular.marko +3 -0
  222. package/icons/generated/fluent-zoom-in-regular.marko +3 -0
  223. package/icons/generated/fluent-zoom-out-regular.marko +3 -0
  224. package/icons/manifest.json +61 -0
  225. package/icons/social/social-facebook-color.marko +7 -0
  226. package/icons/social/social-facebook.marko +6 -0
  227. package/icons/social/social-google-color.marko +20 -0
  228. package/icons/social/social-google.marko +6 -0
  229. package/icons/social/social-instagram-color.marko +16 -0
  230. package/icons/social/social-instagram.marko +6 -0
  231. package/icons/social/social-linkedin-color.marko +8 -0
  232. package/icons/social/social-linkedin.marko +8 -0
  233. package/icons/social/social-messenger-color.marko +15 -0
  234. package/icons/social/social-messenger.marko +6 -0
  235. package/icons/social/social-pinterest-color.marko +6 -0
  236. package/icons/social/social-pinterest.marko +6 -0
  237. package/icons/social/social-telegram-color.marko +7 -0
  238. package/icons/social/social-telegram.marko +6 -0
  239. package/icons/social/social-whatsapp-color.marko +8 -0
  240. package/icons/social/social-whatsapp.marko +7 -0
  241. package/icons/social/social-x-color.marko +7 -0
  242. package/icons/social/social-x.marko +6 -0
  243. package/icons/social/social-youtube-color.marko +7 -0
  244. package/icons/social/social-youtube.marko +6 -0
  245. package/marko.json +203 -0
  246. package/package.json +55 -0
@@ -0,0 +1,457 @@
1
+ /* SDS Header.
2
+ Ported from kdls-design-system v2.5.1 (0f3edf8) components/Header/Header.css
3
+ by scripts/port-css.mjs. Divergences beyond the mechanical rename are noted inline.
4
+
5
+ Rules removed with the brand families they targeted:
6
+ [data-color-scheme="lya"] .sds-header__nav-badge
7
+ *//* ============================================================
8
+ SDS Header
9
+ Height: 56px | bg: neutral-00 (white) | border-bottom: neutral-20
10
+ Layout: logo | nav (gap 24px) | [spacer] | actions (gap 16px)
11
+ ============================================================ */
12
+
13
+ .sds-header {
14
+ display: flex;
15
+ align-items: center;
16
+ gap: 0;
17
+ height: 56px;
18
+ /* Figma: px-[32px] py-[8px] */
19
+ padding: 0 var(--spacing-6);
20
+ background: var(--component-bg-color);
21
+ border-bottom: 1px solid var(--border-static-color);
22
+ position: sticky;
23
+ top: 0;
24
+ z-index: var(--z-sticky);
25
+ width: 100%;
26
+ box-sizing: border-box;
27
+ }
28
+ /* Logo */
29
+ .sds-header__logo {
30
+ display: flex;
31
+ align-items: center;
32
+ margin-right: var(--spacing-6);
33
+ /* The slot holds whatever the consumer puts there, and on a 320px screen that can be
34
+ wider than the screen. It gives way before the header does: past the header's width
35
+ the page itself would scroll sideways over a logo, which is the consumer's content
36
+ winning an argument it should not be in.
37
+
38
+ `flex-shrink: 0` was here, which is what `min-width: 0` alone could not get past —
39
+ an item that refuses to shrink has no use for a floor. The actions keep theirs,
40
+ because a row of 32px buttons has nothing to give. */
41
+ flex-shrink: 1;
42
+ min-width: 0;
43
+ }
44
+ /* Context selector */
45
+ .sds-header__context {
46
+ margin-right: var(--spacing-4);
47
+ flex-shrink: 0;
48
+ }
49
+ /* Nav wrapper — flex:1 so the Nav fills space between logo and actions, centered */
50
+ .sds-header__nav {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ flex: 1;
55
+ height: 100%;
56
+ /* A flex item will not shrink past its content without this, so a nav with more items
57
+ than fit pushed the header — and the page — wider than the window instead of letting
58
+ the sds-nav inside it scroll. Measured with five groups in a 1018px window: 1025. */
59
+ min-width: 0;
60
+ }
61
+ /* "Novo" badge inside nav items */
62
+ .sds-header__nav-badge {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ height: 18px;
66
+ padding: 0 6px;
67
+ background: var(--color-primary-50);
68
+ color: var(--color-white);
69
+ border-radius: var(--radius-full);
70
+ font-size: 10px;
71
+ font-weight: var(--font-weight-bold);
72
+ letter-spacing: 0.2px;
73
+ }
74
+ @keyframes sds-dropdown-in {
75
+ from { opacity: 0; transform: translateY(-4px); }
76
+ to { opacity: 1; transform: translateY(0); }
77
+ }
78
+ /* Right actions — gap 16px (Figma: gap-[16px]) */
79
+ .sds-header__actions {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: var(--spacing-4);
83
+ flex-shrink: 0;
84
+ /* Pushes actions to the right edge on its own — the nav's flex:1 spacer already
85
+ does this on desktop, but nav doesn't render at all on mobile, so actions needs
86
+ its own way to reach the right side regardless of whether nav exists. */
87
+ margin-left: auto;
88
+ }
89
+ /* FAQs link button — Manrope Bold 16px / primary-50 (Figma: font-bold text-16) */
90
+ .sds-header__faqs {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ gap: 6px;
94
+ padding: var(--spacing-2) var(--spacing-3);
95
+ border: none;
96
+ background: transparent;
97
+ font-family: var(--font-family-base);
98
+ font-size: var(--font-size-body-md);
99
+ font-weight: var(--font-weight-bold);
100
+ letter-spacing: -0.4px;
101
+ color: var(--color-primary-50-solid);
102
+ cursor: pointer;
103
+ border-radius: var(--radius-sm);
104
+ transition: background 120ms ease;
105
+ white-space: nowrap;
106
+ }
107
+ .sds-header__faqs:hover { background: var(--color-primary-10); }
108
+ .sds-header__icon-btn {
109
+ position: relative;
110
+ display: inline-flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ width: 40px;
114
+ height: 40px;
115
+ border: none;
116
+ background: transparent;
117
+ border-radius: 11px; /* soft, the install default — schemes at the end */
118
+ color: var(--color-neutral-60);
119
+ cursor: pointer;
120
+ transition: background 120ms ease, color 120ms ease;
121
+ flex-shrink: 0;
122
+ }
123
+ .sds-header__icon-btn:hover {
124
+ background: var(--color-opacity-05);
125
+ color: var(--color-neutral-90);
126
+ }
127
+ .sds-header__icon-btn:active {
128
+ background: var(--color-opacity-10);
129
+ }
130
+ .sds-header__avatar-btn {
131
+ display: inline-flex;
132
+ align-items: center;
133
+ justify-content: center;
134
+ width: 48px;
135
+ height: 48px;
136
+ border: none;
137
+ background: transparent;
138
+ border-radius: var(--radius-sm);
139
+ cursor: pointer;
140
+ padding: var(--spacing-1);
141
+ transition: background 120ms ease;
142
+ flex-shrink: 0;
143
+ }
144
+ .sds-header__avatar-btn:hover { background: var(--color-opacity-05); }
145
+ .sds-header__avatar-btn:active { background: var(--color-opacity-10); }
146
+ .sds-header__action-wrapper {
147
+ position: relative;
148
+ }
149
+ /* Products panel — cross-product navigation */
150
+ .sds-header__products-panel {
151
+ position: absolute;
152
+ top: calc(100% + var(--spacing-2));
153
+ right: 0;
154
+ width: 240px;
155
+ max-height: 400px;
156
+ overflow-y: auto;
157
+ background: var(--component-bg-color);
158
+ border: 1px solid var(--border-static-color);
159
+ border-radius: var(--radius-sm);
160
+ box-shadow: var(--shadow-drop-md);
161
+ z-index: var(--z-floating);
162
+ padding: var(--spacing-2) 0;
163
+ animation: sds-dropdown-in 120ms ease;
164
+ }
165
+ .sds-header__products-item {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: var(--spacing-3);
169
+ height: 40px;
170
+ padding: 0 var(--spacing-4);
171
+ color: var(--color-neutral-80);
172
+ text-decoration: none;
173
+ cursor: pointer;
174
+ transition: background 120ms ease;
175
+ }
176
+ .sds-header__products-item:hover { background: var(--color-neutral-10); }
177
+ .sds-header__products-item--active { color: var(--color-neutral-90); font-weight: var(--font-weight-bold); }
178
+ /* Notifications panel */
179
+ .sds-header__notifications-panel {
180
+ position: absolute;
181
+ top: calc(100% + var(--spacing-2));
182
+ right: 0;
183
+ width: 360px;
184
+ max-height: 480px;
185
+ background: var(--component-bg-color);
186
+ border: 1px solid var(--border-static-color);
187
+ border-radius: var(--radius-sm);
188
+ box-shadow: var(--shadow-drop-md);
189
+ z-index: var(--z-floating);
190
+ display: flex;
191
+ flex-direction: column;
192
+ overflow: hidden;
193
+ animation: sds-dropdown-in 120ms ease;
194
+ }
195
+ .sds-header__notifications-header {
196
+ display: flex;
197
+ align-items: center;
198
+ justify-content: space-between;
199
+ padding: var(--spacing-4) var(--spacing-4) var(--spacing-3);
200
+ border-bottom: 1px solid var(--border-static-color);
201
+ flex-shrink: 0;
202
+ }
203
+ .sds-header__notifications-title {
204
+ font-family: var(--font-family-base);
205
+ font-size: 15px;
206
+ font-weight: var(--font-weight-bold);
207
+ color: var(--color-neutral-90);
208
+ }
209
+ .sds-header__notifications-clear {
210
+ border: none;
211
+ background: transparent;
212
+ font-family: var(--font-family-base);
213
+ font-size: 13px;
214
+ font-weight: var(--font-weight-medium);
215
+ color: var(--color-primary-50-solid);
216
+ cursor: pointer;
217
+ padding: 0;
218
+ }
219
+ .sds-header__notifications-clear:hover { text-decoration: underline; }
220
+ .sds-header__notifications-list {
221
+ flex: 1;
222
+ overflow-y: auto;
223
+ }
224
+ .sds-header__notifications-empty {
225
+ padding: var(--spacing-6) var(--spacing-4);
226
+ text-align: center;
227
+ }
228
+ .sds-header__notification-item {
229
+ display: flex;
230
+ gap: var(--spacing-3);
231
+ padding: var(--spacing-3) var(--spacing-4);
232
+ border-bottom: 1px solid var(--color-neutral-10);
233
+ transition: background 120ms ease;
234
+ cursor: pointer;
235
+ }
236
+ .sds-header__notification-item:hover { background: var(--color-neutral-10); }
237
+ .sds-header__notification-item--unread { background: var(--color-primary-10); }
238
+ .sds-header__notification-item--unread:hover { background: var(--color-primary-20); }
239
+ .sds-header__notification-content { flex: 1; min-width: 0; }
240
+ .sds-header__notification-title {
241
+ font-size: 13px;
242
+ font-weight: var(--font-weight-semibold);
243
+ color: var(--color-neutral-90);
244
+ margin-bottom: var(--spacing-0-5);
245
+ white-space: nowrap;
246
+ overflow: hidden;
247
+ text-overflow: ellipsis;
248
+ }
249
+ .sds-header__notification-desc {
250
+ display: -webkit-box;
251
+ -webkit-box-orient: vertical;
252
+ -webkit-line-clamp: 2;
253
+ overflow: hidden;
254
+ }
255
+ .sds-header__notification-time {
256
+ font-size: 11px;
257
+ color: var(--color-neutral-40);
258
+ white-space: nowrap;
259
+ flex-shrink: 0;
260
+ margin-top: var(--spacing-0-5);
261
+ }
262
+ /* Profile panel */
263
+ .sds-header__profile-panel {
264
+ position: absolute;
265
+ top: calc(100% + var(--spacing-2));
266
+ right: 0;
267
+ width: 240px;
268
+ background: var(--component-bg-color);
269
+ border: 1px solid var(--border-static-color);
270
+ border-radius: var(--radius-sm);
271
+ box-shadow: var(--shadow-drop-md);
272
+ z-index: var(--z-floating);
273
+ overflow: hidden;
274
+ animation: sds-dropdown-in 120ms ease;
275
+ }
276
+ .sds-header__profile-header {
277
+ display: flex;
278
+ align-items: center;
279
+ gap: var(--spacing-3);
280
+ padding: var(--spacing-4);
281
+ border-bottom: 1px solid var(--border-static-color);
282
+ }
283
+ .sds-header__profile-name {
284
+ font-size: 14px;
285
+ font-weight: var(--font-weight-bold);
286
+ color: var(--color-neutral-90);
287
+ }
288
+ .sds-header__profile-code {
289
+ font-size: 11px;
290
+ color: var(--color-neutral-50);
291
+ margin-top: 1px;
292
+ }
293
+ .sds-header__profile-company {
294
+ margin-top: var(--spacing-0-5);
295
+ }
296
+ .sds-header__profile-menu {
297
+ padding: 6px 0;
298
+ }
299
+ .sds-header__profile-item {
300
+ display: flex;
301
+ align-items: center;
302
+ width: 100%;
303
+ height: 48px;
304
+ padding: 0 16px;
305
+ border: none;
306
+ background: transparent;
307
+ font-family: var(--font-family-base);
308
+ font-size: var(--font-size-body-md); /* 16px */
309
+ font-weight: var(--font-weight-regular);
310
+ color: var(--color-neutral-80);
311
+ cursor: pointer;
312
+ text-align: left;
313
+ transition: background 120ms ease;
314
+ }
315
+ .sds-header__profile-item:hover { background: var(--color-neutral-10); }
316
+ .sds-header__profile-item--danger { color: var(--color-error-50); }
317
+ .sds-header__profile-item--danger:hover { background: var(--color-error-10); }
318
+ .sds-header__profile-divider {
319
+ border: none;
320
+ border-top: 1px solid var(--border-static-color);
321
+ margin: var(--spacing-1) 0;
322
+ }
323
+ /* ── Focus rings — all interactive buttons ── */
324
+ .sds-header__faqs,
325
+ .sds-header__icon-btn,
326
+ .sds-header__avatar-btn,
327
+ .sds-header__notifications-clear,
328
+ .sds-header__profile-item {
329
+ outline: none;
330
+ }
331
+ .sds-header__faqs:focus-visible,
332
+ .sds-header__icon-btn:focus-visible,
333
+ .sds-header__avatar-btn:focus-visible,
334
+ .sds-header__notifications-clear:focus-visible,
335
+ .sds-header__profile-item:focus-visible {
336
+ box-shadow: var(--focus-ring);
337
+ }
338
+ /* ── Dark mode ── */
339
+ [data-theme="dark"] .sds-header {
340
+ border-bottom-color: var(--border-interactive-color);
341
+ }
342
+ [data-theme="dark"] .sds-header__notifications-panel,
343
+ [data-theme="dark"] .sds-header__profile-panel,
344
+ [data-theme="dark"] .sds-header__products-panel {
345
+ background: var(--color-neutral-10);
346
+ border-color: var(--border-interactive-color);
347
+ }
348
+ /* ── Mobile collapsed bar — the nav's flexible spacer is gone below 800px, so the
349
+ context selector (hug-width by default) must be allowed to shrink instead of
350
+ forcing the whole header row (and the page) into horizontal overflow ── */
351
+ @media (max-width: 799px) {
352
+ .sds-header__context {
353
+ flex-shrink: 1;
354
+ min-width: 0;
355
+ overflow: hidden;
356
+ }
357
+ }
358
+ /* The way into the navigation when the row of links is not rendered. Only present on a
359
+ narrow header, and it keeps its size: a row of 32px buttons has nothing to give. */
360
+ .sds-header__nav-btn {
361
+ flex-shrink: 0;
362
+ }
363
+
364
+ /* ── Mobile fullscreen overlay — the shell for notifications, products and the avatar
365
+ menu once the header is narrow.
366
+
367
+ Not inside a media query, and not at 800px: the header measures its own width and
368
+ renders these instead of the dropdowns below OWN_WIDTH_MOBILE (680px). A header in a
369
+ narrow shell is narrow on a wide screen, which @media cannot see. ── */
370
+ .sds-header__mobile-overlay {
371
+ position: fixed;
372
+ inset: 0;
373
+ z-index: var(--z-modal);
374
+ background: var(--component-bg-color);
375
+ display: flex;
376
+ flex-direction: column;
377
+ }
378
+ .sds-header__mobile-overlay-dismiss {
379
+ flex-shrink: 0;
380
+ display: flex;
381
+ justify-content: flex-end;
382
+ padding: var(--spacing-4);
383
+ }
384
+ .sds-header__mobile-overlay-body {
385
+ flex: 1;
386
+ overflow-y: auto;
387
+ }
388
+ /* ── Mobile avatar menu — profile block, then one block per navItem, then FAQs ── */
389
+ .sds-header__mobile-menu {
390
+ display: flex;
391
+ flex-direction: column;
392
+ }
393
+ .sds-header__mobile-divider {
394
+ border: none;
395
+ border-top: 1px solid var(--color-neutral-10);
396
+ width: 100%;
397
+ margin: 0;
398
+ }
399
+ .sds-header__mobile-menu-title {
400
+ display: block;
401
+ padding: var(--spacing-3) var(--spacing-4) var(--spacing-1);
402
+ }
403
+ .sds-header__mobile-row {
404
+ display: flex;
405
+ align-items: center;
406
+ width: 100%;
407
+ height: 48px;
408
+ padding: 0 var(--spacing-4);
409
+ border: none;
410
+ background: transparent;
411
+ color: var(--color-neutral-80);
412
+ text-decoration: none;
413
+ cursor: pointer;
414
+ text-align: left;
415
+ transition: background 120ms ease;
416
+ }
417
+ .sds-header__mobile-row:hover { background: var(--color-neutral-10); }
418
+ .sds-header__mobile-row--danger .sds-text--bodyMd { color: var(--color-error-50); }
419
+ .sds-header__mobile-row--danger:hover { background: var(--color-error-10); }
420
+
421
+ /* ── Which navigation is shown, before and after the header measures itself ──────────
422
+ Until `data-measured` appears, both are in the DOM and the viewport decides. That is
423
+ the best guess available without JavaScript, and it is the whole answer on a page where
424
+ JavaScript never arrives — which used to be a phone stuck with the desktop row of links.
425
+
426
+ Once the header has measured its own width, `data-narrow` decides instead, and it wins
427
+ because it is more specific. That is what makes a header inside a 400px drawer narrow on
428
+ a 1600px screen, which no media query can see. */
429
+ @media (max-width: 680px) {
430
+ .sds-header:not([data-measured]) .sds-header__nav { display: none; }
431
+ }
432
+ @media (min-width: 681px) {
433
+ .sds-header:not([data-measured]) .sds-header__nav-btn { display: none; }
434
+ }
435
+ .sds-header[data-narrow="true"] .sds-header__nav { display: none; }
436
+ .sds-header[data-narrow="false"] .sds-header__nav-btn { display: none; }
437
+
438
+ /* ── Corner radius: the 40px family ───────────────────────────────────────────
439
+ A row in a menu, a select or a dropdown is 40px tall, which makes it the same control
440
+ as the Pill and the navButton — so it takes the same four values. Rafael, pointing at
441
+ the theme bar's own menu: these are reactive, but not in the right way; they should be
442
+ 40px like the navButton and have the radius resolved here.
443
+
444
+ height 40px flat 0 soft 11px medium 15px rounded 20px (a capsule)
445
+ as a fraction 0 0.275 0.375 0.5
446
+
447
+ `--radius-sm` was what they had, and it tops out at 16px — so `rounded` drew a rounded
448
+ rectangle where every other 40px control in the system drew a capsule. See Pill.css for
449
+ the arithmetic; the numbers are a fraction of the control's own height, which is what
450
+ keeps the family reading as one thing.
451
+
452
+ The bare value is `soft`'s, because an install that never picks a scheme has no
453
+ attribute at all and falls through to it. */
454
+ [data-radius="flat"] .sds-header__icon-btn { border-radius: 0; }
455
+ [data-radius="soft"] .sds-header__icon-btn { border-radius: 11px; }
456
+ [data-radius="medium"] .sds-header__icon-btn { border-radius: 15px; }
457
+ [data-radius="rounded"] .sds-header__icon-btn { border-radius: var(--radius-full); }