@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.
- package/README.md +129 -0
- package/components/Accordion/Accordion.css +186 -0
- package/components/Accordion/accordion-variants.js +17 -0
- package/components/Accordion/accordion.marko +264 -0
- package/components/AccordionGroup/AccordionGroup.css +35 -0
- package/components/AccordionGroup/accordion-group.marko +17 -0
- package/components/Alert/Alert.css +104 -0
- package/components/Alert/alert-variants.js +35 -0
- package/components/Alert/alert.marko +94 -0
- package/components/AttachmentList/AttachmentList.css +92 -0
- package/components/AttachmentList/attachment-list.marko +51 -0
- package/components/AttachmentList/attachment-row.marko +167 -0
- package/components/Avatar/Avatar.css +110 -0
- package/components/Avatar/avatar-variants.js +12 -0
- package/components/Avatar/avatar.marko +71 -0
- package/components/Badge/Badge.css +381 -0
- package/components/Badge/badge-dismissible.marko +143 -0
- package/components/Badge/badge-variants.js +35 -0
- package/components/Badge/badge.marko +134 -0
- package/components/BottomSheet/BottomSheet.css +300 -0
- package/components/BottomSheet/bottom-sheet.marko +340 -0
- package/components/BulkActionBar/BulkActionBar.css +88 -0
- package/components/BulkActionBar/bulk-action-bar.marko +186 -0
- package/components/Button/Button.css +340 -0
- package/components/Button/button-variants.js +25 -0
- package/components/Button/button.marko +139 -0
- package/components/Card/Card.css +391 -0
- package/components/Card/card-body.marko +5 -0
- package/components/Card/card-collapsible.marko +94 -0
- package/components/Card/card-footer.marko +12 -0
- package/components/Card/card-header.marko +30 -0
- package/components/Card/card-info-pair.marko +17 -0
- package/components/Card/card-info-row.marko +12 -0
- package/components/Card/card-section.marko +14 -0
- package/components/Card/card-variants.js +24 -0
- package/components/Card/card.marko +124 -0
- package/components/Checkbox/Checkbox.css +249 -0
- package/components/Checkbox/checkbox-variants.js +21 -0
- package/components/Checkbox/checkbox.marko +128 -0
- package/components/ColorPicker/ColorPicker.css +253 -0
- package/components/ColorPicker/color-maths.js +104 -0
- package/components/ColorPicker/color-picker.marko +474 -0
- package/components/DatePicker/DatePicker.css +429 -0
- package/components/DatePicker/date-logic.js +225 -0
- package/components/DatePicker/date-picker.marko +492 -0
- package/components/Drawer/Drawer.css +174 -0
- package/components/Drawer/drawer.marko +262 -0
- package/components/Floating/Floating.css +28 -0
- package/components/Floating/floating-position.js +251 -0
- package/components/Floating/floating.marko +291 -0
- package/components/Form/Form.css +15 -0
- package/components/Form/form-context.js +69 -0
- package/components/Form/form.marko +73 -0
- package/components/GradientPicker/GradientPicker.css +179 -0
- package/components/GradientPicker/gradient-picker.marko +398 -0
- package/components/Grid/Grid.css +161 -0
- package/components/Grid/col.marko +36 -0
- package/components/Grid/grid-variants.js +43 -0
- package/components/Grid/grid.marko +25 -0
- package/components/Header/Header.css +457 -0
- package/components/Header/header.marko +523 -0
- package/components/Icon/Icon.css +44 -0
- package/components/Icon/icon-colors.js +31 -0
- package/components/Icon/icon.marko +56 -0
- package/components/IconButton/IconButton.css +85 -0
- package/components/IconButton/icon-button-variants.js +18 -0
- package/components/IconButton/icon-button.marko +103 -0
- package/components/Incrementer/Incrementer.css +94 -0
- package/components/Incrementer/incrementer.marko +70 -0
- package/components/Input/Input.css +547 -0
- package/components/Input/input-countries.js +109 -0
- package/components/Input/input-masks.js +218 -0
- package/components/Input/input-types.js +194 -0
- package/components/Input/input.marko +530 -0
- package/components/Menu/Menu.css +651 -0
- package/components/Menu/menu-variants.js +89 -0
- package/components/Menu/menu.marko +560 -0
- package/components/Modal/Modal.css +160 -0
- package/components/Modal/modal.marko +296 -0
- package/components/Nav/Nav.css +298 -0
- package/components/Nav/nav-variants.js +23 -0
- package/components/Nav/nav.marko +164 -0
- package/components/Notification/Notification.css +78 -0
- package/components/Notification/notification-variants.js +30 -0
- package/components/Notification/notification.marko +55 -0
- package/components/Pagination/Pagination.css +78 -0
- package/components/Pagination/pagination-pages.js +66 -0
- package/components/Pagination/pagination.marko +141 -0
- package/components/Pill/Pill.css +193 -0
- package/components/Pill/pill-variants.js +16 -0
- package/components/Pill/pill.marko +165 -0
- package/components/Popover/Popover.css +121 -0
- package/components/Popover/popover.marko +96 -0
- package/components/Radio/Radio.css +230 -0
- package/components/Radio/radio-variants.js +16 -0
- package/components/Radio/radio.marko +93 -0
- package/components/RadioGroup/RadioGroup.css +32 -0
- package/components/RadioGroup/radio-group.marko +93 -0
- package/components/SearchBar/SearchBar.css +181 -0
- package/components/SearchBar/search-bar-variants.js +24 -0
- package/components/SearchBar/search-bar.marko +157 -0
- package/components/Select/Select.css +427 -0
- package/components/Select/select-options.js +163 -0
- package/components/Select/select.marko +449 -0
- package/components/Separator/Separator.css +22 -0
- package/components/Separator/separator.marko +14 -0
- package/components/Skeleton/Skeleton.css +100 -0
- package/components/Skeleton/skeleton-avatar.marko +28 -0
- package/components/Skeleton/skeleton-button.marko +22 -0
- package/components/Skeleton/skeleton-image.marko +20 -0
- package/components/Skeleton/skeleton-input.marko +22 -0
- package/components/Skeleton/skeleton-variants.js +16 -0
- package/components/Skeleton/skeleton.marko +53 -0
- package/components/Spinner/Spinner.css +173 -0
- package/components/Spinner/spinner-geometry.js +39 -0
- package/components/Spinner/spinner-overlay.marko +97 -0
- package/components/Spinner/spinner.marko +88 -0
- package/components/StatCard/StatCard.css +90 -0
- package/components/StatCard/stat-card-group.marko +5 -0
- package/components/StatCard/stat-card.marko +57 -0
- package/components/Switch/Switch.css +209 -0
- package/components/Switch/switch.marko +99 -0
- package/components/Table/Table.css +270 -0
- package/components/Table/table-cell.marko +28 -0
- package/components/Table/table-header.marko +27 -0
- package/components/Table/table-logic.js +129 -0
- package/components/Table/table.marko +372 -0
- package/components/Text/Text.css +79 -0
- package/components/Text/text-variants.js +25 -0
- package/components/Text/text.marko +48 -0
- package/components/TextEditor/TextEditor.css +78 -0
- package/components/TextEditor/safe-url.js +50 -0
- package/components/TextEditor/text-editor-commands.js +22 -0
- package/components/TextEditor/text-editor.marko +253 -0
- package/components/Toast/Toast.css +88 -0
- package/components/Toast/toast-api.js +19 -0
- package/components/Toast/toast-store.js +118 -0
- package/components/Toast/toast-variants.js +16 -0
- package/components/Toast/toast.marko +93 -0
- package/components/Toast/toaster.marko +70 -0
- package/components/Toggle/Toggle.css +169 -0
- package/components/Toggle/toggle.marko +93 -0
- package/components/Tooltip/Tooltip.css +115 -0
- package/components/Tooltip/tooltip.marko +77 -0
- package/components/Uploader/Uploader.css +180 -0
- package/components/Uploader/crop-geometry.js +161 -0
- package/components/Uploader/uploader.marko +269 -0
- package/foundations/Scrollbar/Scrollbar.css +26 -0
- package/foundations/attrs.js +27 -0
- package/foundations/breakpoints.js +27 -0
- package/foundations/contrast.js +74 -0
- package/foundations/custom-scheme.js +222 -0
- package/foundations/overlay.js +108 -0
- package/foundations/styles.css +284 -0
- package/foundations/text.js +22 -0
- package/foundations/theme-server.js +81 -0
- package/foundations/theme.js +42 -0
- package/foundations/tokens.css +1656 -0
- package/icons/custom/custom-video-horizontal-filled.marko +6 -0
- package/icons/custom/custom-video-horizontal-regular.marko +6 -0
- package/icons/custom/custom-video-tour-3d-filled.marko +7 -0
- package/icons/custom/custom-video-tour-3d-regular.marko +9 -0
- package/icons/custom/custom-video-vertical-filled.marko +6 -0
- package/icons/custom/custom-video-vertical-regular.marko +6 -0
- package/icons/generated/fluent-add-regular.marko +3 -0
- package/icons/generated/fluent-alert-regular.marko +3 -0
- package/icons/generated/fluent-apps-regular.marko +3 -0
- package/icons/generated/fluent-arrow-download-regular.marko +3 -0
- package/icons/generated/fluent-arrow-left-regular.marko +3 -0
- package/icons/generated/fluent-arrow-right-regular.marko +3 -0
- package/icons/generated/fluent-arrow-rotate-clockwise-regular.marko +3 -0
- package/icons/generated/fluent-arrow-rotate-counterclockwise-regular.marko +3 -0
- package/icons/generated/fluent-border-all-regular.marko +3 -0
- package/icons/generated/fluent-calendar-regular.marko +3 -0
- package/icons/generated/fluent-checkmark-circle-filled.marko +3 -0
- package/icons/generated/fluent-checkmark-regular.marko +3 -0
- package/icons/generated/fluent-chevron-down-regular.marko +3 -0
- package/icons/generated/fluent-chevron-left-regular.marko +3 -0
- package/icons/generated/fluent-chevron-right-regular.marko +3 -0
- package/icons/generated/fluent-chevron-up-regular.marko +3 -0
- package/icons/generated/fluent-circle-half-fill-regular.marko +3 -0
- package/icons/generated/fluent-clock-regular.marko +3 -0
- package/icons/generated/fluent-color-regular.marko +3 -0
- package/icons/generated/fluent-crop-regular.marko +3 -0
- package/icons/generated/fluent-dark-theme-regular.marko +3 -0
- package/icons/generated/fluent-delete-regular.marko +3 -0
- package/icons/generated/fluent-desktop-regular.marko +3 -0
- package/icons/generated/fluent-dismiss-circle-filled.marko +3 -0
- package/icons/generated/fluent-dismiss-regular.marko +3 -0
- package/icons/generated/fluent-document-pdf-regular.marko +3 -0
- package/icons/generated/fluent-document-regular.marko +3 -0
- package/icons/generated/fluent-eye-off-regular.marko +3 -0
- package/icons/generated/fluent-eye-regular.marko +3 -0
- package/icons/generated/fluent-eyedropper-regular.marko +3 -0
- package/icons/generated/fluent-grid-regular.marko +3 -0
- package/icons/generated/fluent-history-regular.marko +3 -0
- package/icons/generated/fluent-home-regular.marko +3 -0
- package/icons/generated/fluent-image-regular.marko +3 -0
- package/icons/generated/fluent-info-regular.marko +3 -0
- package/icons/generated/fluent-link-regular.marko +3 -0
- package/icons/generated/fluent-more-horizontal-regular.marko +3 -0
- package/icons/generated/fluent-navigation-regular.marko +3 -0
- package/icons/generated/fluent-paint-brush-regular.marko +3 -0
- package/icons/generated/fluent-question-circle-regular.marko +3 -0
- package/icons/generated/fluent-search-regular.marko +3 -0
- package/icons/generated/fluent-settings-regular.marko +3 -0
- package/icons/generated/fluent-square-hint-regular.marko +3 -0
- package/icons/generated/fluent-subtract-regular.marko +3 -0
- package/icons/generated/fluent-text-align-center-regular.marko +3 -0
- package/icons/generated/fluent-text-align-left-regular.marko +3 -0
- package/icons/generated/fluent-text-align-right-regular.marko +3 -0
- package/icons/generated/fluent-text-bold-regular.marko +3 -0
- package/icons/generated/fluent-text-bullet-list-regular.marko +3 -0
- package/icons/generated/fluent-text-font-regular.marko +3 -0
- package/icons/generated/fluent-text-font-size-regular.marko +3 -0
- package/icons/generated/fluent-text-italic-regular.marko +3 -0
- package/icons/generated/fluent-text-number-list-ltr-regular.marko +3 -0
- package/icons/generated/fluent-video-regular.marko +3 -0
- package/icons/generated/fluent-warning-filled.marko +3 -0
- package/icons/generated/fluent-weather-moon-regular.marko +3 -0
- package/icons/generated/fluent-weather-sunny-regular.marko +3 -0
- package/icons/generated/fluent-zoom-in-regular.marko +3 -0
- package/icons/generated/fluent-zoom-out-regular.marko +3 -0
- package/icons/manifest.json +61 -0
- package/icons/social/social-facebook-color.marko +7 -0
- package/icons/social/social-facebook.marko +6 -0
- package/icons/social/social-google-color.marko +20 -0
- package/icons/social/social-google.marko +6 -0
- package/icons/social/social-instagram-color.marko +16 -0
- package/icons/social/social-instagram.marko +6 -0
- package/icons/social/social-linkedin-color.marko +8 -0
- package/icons/social/social-linkedin.marko +8 -0
- package/icons/social/social-messenger-color.marko +15 -0
- package/icons/social/social-messenger.marko +6 -0
- package/icons/social/social-pinterest-color.marko +6 -0
- package/icons/social/social-pinterest.marko +6 -0
- package/icons/social/social-telegram-color.marko +7 -0
- package/icons/social/social-telegram.marko +6 -0
- package/icons/social/social-whatsapp-color.marko +8 -0
- package/icons/social/social-whatsapp.marko +7 -0
- package/icons/social/social-x-color.marko +7 -0
- package/icons/social/social-x.marko +6 -0
- package/icons/social/social-youtube-color.marko +7 -0
- package/icons/social/social-youtube.marko +6 -0
- package/marko.json +203 -0
- 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); }
|