@crewlethq/ui 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/Accordion-NIMJQIOI.css +88 -0
- package/dist/AppShell-ZW3NSFBP.css +51 -0
- package/dist/Avatar-V6NG6Q45.css +67 -0
- package/dist/Button-XGCTXXYP.css +174 -0
- package/dist/Callout-LEGDIMAM.css +52 -0
- package/dist/Card-BOZGBML7.css +86 -0
- package/dist/Checkbox-OCUICIIZ.css +58 -0
- package/dist/CodeBlock-IEMBNIQC.css +90 -0
- package/dist/Container-LTKBA2FW.css +21 -0
- package/dist/Copyable-IB57OTHZ.css +123 -0
- package/dist/DataTable-3GALZUW2.css +1593 -0
- package/dist/DateTimePicker-NMSSGVPK.css +312 -0
- package/dist/Eyebrow-AVBORAS2.css +30 -0
- package/dist/IconButton-GB4PJDG2.css +82 -0
- package/dist/ImageUpload-3HQDF2KC.css +158 -0
- package/dist/Input-ZHUTN7CU.css +210 -0
- package/dist/Kbd-Q77CDZY7.css +23 -0
- package/dist/Modal-FJVG66S4.css +138 -0
- package/dist/Popover-FUFULUE2.css +123 -0
- package/dist/PricingCard-NKYV3JHA.css +238 -0
- package/dist/Section-665ZIPG6.css +20 -0
- package/dist/Select-GPRF7PRB.css +294 -0
- package/dist/Skeleton-3WEFLRDN.css +378 -0
- package/dist/StatCard-RTJIVTRB.css +50 -0
- package/dist/Table-AR3TRY2E.css +89 -0
- package/dist/Tabs-XZ4JIH3E.css +153 -0
- package/dist/Tag-R5QDJLYJ.css +163 -0
- package/dist/TimeWindowPicker-L3G5Q7UT.css +629 -0
- package/dist/Toaster-2O65VOR4.css +264 -0
- package/dist/index.d.ts +1217 -0
- package/dist/index.js +4518 -0
- package/dist/styles.css +5842 -0
- package/package.json +58 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PricingCard, plan-tier card surface.
|
|
3
|
+
*
|
|
4
|
+
* The primitive owns the outer card surface (border / radius / padding /
|
|
5
|
+
* states), the header / name / tag, the price block (amount + cadence
|
|
6
|
+
* + price note), the grid container, and a body / footer slot for
|
|
7
|
+
* domain content (allowances, features, CTAs).
|
|
8
|
+
*
|
|
9
|
+
* Colours flow through the @crewlethq/tokens variables so the light,
|
|
10
|
+
* dark and system themes pick up the right palette. Hex fallbacks keep
|
|
11
|
+
* the dark defaults when the token stylesheet has not loaded.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/* ── Grid container ─────────────────────────────────────────────── */
|
|
15
|
+
.crewlet-pricing-card-grid {
|
|
16
|
+
display: grid;
|
|
17
|
+
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
18
|
+
gap: 12px;
|
|
19
|
+
align-items: stretch;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@media (max-width: 1320px) {
|
|
23
|
+
.crewlet-pricing-card-grid {
|
|
24
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@media (max-width: 680px) {
|
|
29
|
+
.crewlet-pricing-card-grid {
|
|
30
|
+
grid-template-columns: minmax(0, 1fr);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* ── Card root ──────────────────────────────────────────────────── */
|
|
35
|
+
.crewlet-pricing-card {
|
|
36
|
+
text-align: left;
|
|
37
|
+
background: rgba(255, 255, 255, 0.02);
|
|
38
|
+
border: 1px solid var(--color-border-default, rgba(255, 255, 255, 0.08));
|
|
39
|
+
border-radius: 12px;
|
|
40
|
+
padding: 14px;
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
gap: 12px;
|
|
44
|
+
font-family: inherit;
|
|
45
|
+
color: inherit;
|
|
46
|
+
min-width: 0;
|
|
47
|
+
container-type: inline-size;
|
|
48
|
+
transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.crewlet-pricing-card.is-interactive {
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.crewlet-pricing-card.is-interactive:hover:not(.is-disabled):not(.is-unavailable):not(:disabled) {
|
|
56
|
+
border-color: rgba(var(--color-brand-accent-rgb, 84, 105, 212), 0.4);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.crewlet-pricing-card.is-selected {
|
|
60
|
+
border-color: var(--color-brand-accent, #5469d4);
|
|
61
|
+
background: rgba(var(--color-brand-accent-rgb, 84, 105, 212), 0.08);
|
|
62
|
+
box-shadow: 0 0 0 1px var(--color-brand-accent, #5469d4);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.crewlet-pricing-card.is-disabled,
|
|
66
|
+
.crewlet-pricing-card:disabled {
|
|
67
|
+
opacity: 0.5;
|
|
68
|
+
cursor: not-allowed;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.crewlet-pricing-card.is-unavailable {
|
|
72
|
+
opacity: 0.65;
|
|
73
|
+
cursor: not-allowed;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.crewlet-pricing-card.is-selected:has(.crewlet-pricing-card__amount--discounted) {
|
|
77
|
+
box-shadow: 0 0 0 1px var(--color-brand-accent, #5469d4), 0 0 24px rgba(var(--color-brand-accent-rgb, 84, 105, 212), 0.18);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Compact a card's interior at small container widths so a 4-up grid
|
|
81
|
+
on a tablet doesn't render unreadably tight. */
|
|
82
|
+
@container (max-width: 320px) {
|
|
83
|
+
.crewlet-pricing-card {
|
|
84
|
+
padding: 12px;
|
|
85
|
+
gap: 10px;
|
|
86
|
+
}
|
|
87
|
+
.crewlet-pricing-card__amount { font-size: 1.4rem; }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@container (max-width: 240px) {
|
|
91
|
+
.crewlet-pricing-card {
|
|
92
|
+
padding: 10px;
|
|
93
|
+
}
|
|
94
|
+
.crewlet-pricing-card__amount { font-size: 1.25rem; }
|
|
95
|
+
.crewlet-pricing-card__name { font-size: 0.9rem; }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* ── Header (name + tags) ───────────────────────────────────────── */
|
|
99
|
+
.crewlet-pricing-card__header {
|
|
100
|
+
display: flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
gap: 8px;
|
|
103
|
+
flex-wrap: wrap;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.crewlet-pricing-card__name {
|
|
107
|
+
font-size: 1rem;
|
|
108
|
+
font-weight: 600;
|
|
109
|
+
color: var(--color-text-primary, #f5f5f7);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* ── Tags ───────────────────────────────────────────────────────── */
|
|
113
|
+
.crewlet-pricing-card__tag {
|
|
114
|
+
font-size: 0.7rem;
|
|
115
|
+
text-transform: uppercase;
|
|
116
|
+
letter-spacing: 0.05em;
|
|
117
|
+
padding: 2px 8px;
|
|
118
|
+
border-radius: 999px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.crewlet-pricing-card__tag--neutral {
|
|
122
|
+
background: rgba(255, 255, 255, 0.06);
|
|
123
|
+
color: var(--color-text-secondary, #a1a1aa);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.crewlet-pricing-card__tag--top {
|
|
127
|
+
background: var(--color-brand-accent, #5469d4);
|
|
128
|
+
color: #ffffff;
|
|
129
|
+
font-weight: 600;
|
|
130
|
+
font-size: 0.6rem;
|
|
131
|
+
padding: 1px 6px;
|
|
132
|
+
margin-left: auto;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.crewlet-pricing-card__tag--save {
|
|
136
|
+
background: rgba(34, 197, 94, 0.15);
|
|
137
|
+
color: #86efac;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* Pending tag, for a change that takes effect later. Muted amber. The tag is the only
|
|
142
|
+
* visual signal on the card (no border tint, no card background
|
|
143
|
+
* change) so the eye picks it up as a heads-up annotation rather
|
|
144
|
+
* than a status badge competing with the selection ring.
|
|
145
|
+
*/
|
|
146
|
+
.crewlet-pricing-card__tag--pending {
|
|
147
|
+
background: rgba(245, 158, 11, 0.08);
|
|
148
|
+
color: rgba(251, 191, 36, 0.75);
|
|
149
|
+
font-weight: 500;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* ── Price block ────────────────────────────────────────────────── */
|
|
153
|
+
.crewlet-pricing-card__price {
|
|
154
|
+
display: flex;
|
|
155
|
+
align-items: baseline;
|
|
156
|
+
flex-wrap: wrap;
|
|
157
|
+
gap: 6px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.crewlet-pricing-card__amount {
|
|
161
|
+
font-size: 1.7rem;
|
|
162
|
+
font-weight: 600;
|
|
163
|
+
color: var(--color-text-primary, #f5f5f7);
|
|
164
|
+
transition: color 0.2s ease;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.crewlet-pricing-card__amount--strike {
|
|
168
|
+
font-size: 1.1rem;
|
|
169
|
+
font-weight: 500;
|
|
170
|
+
color: var(--color-text-tertiary, #8c99ad);
|
|
171
|
+
text-decoration: line-through;
|
|
172
|
+
text-decoration-thickness: 1.5px;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.crewlet-pricing-card__amount--discounted {
|
|
176
|
+
color: var(--color-brand-accent, #5469d4);
|
|
177
|
+
animation: crewlet-pricing-card-discount-pop 480ms cubic-bezier(0.2, 0.7, 0.2, 1.2);
|
|
178
|
+
transform-origin: left center;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
@keyframes crewlet-pricing-card-discount-pop {
|
|
182
|
+
0% { transform: scale(0.92); opacity: 0; filter: blur(2px); }
|
|
183
|
+
60% { transform: scale(1.06); opacity: 1; filter: blur(0); }
|
|
184
|
+
100% { transform: scale(1); opacity: 1; filter: blur(0); }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.crewlet-pricing-card__cadence {
|
|
188
|
+
font-size: 0.8rem;
|
|
189
|
+
color: var(--color-text-secondary, #a1a1aa);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/*
|
|
193
|
+
* Price note, a short label below the price block, for example
|
|
194
|
+
* "Save $X (10% off)" beneath a discounted plan, or "Billed annually"
|
|
195
|
+
* and "Free forever" hints.
|
|
196
|
+
*/
|
|
197
|
+
.crewlet-pricing-card__price-note {
|
|
198
|
+
display: inline-flex;
|
|
199
|
+
align-items: center;
|
|
200
|
+
gap: 4px;
|
|
201
|
+
flex-basis: 100%;
|
|
202
|
+
margin-top: 2px;
|
|
203
|
+
padding: 4px 8px;
|
|
204
|
+
border-radius: 999px;
|
|
205
|
+
background: rgba(22, 163, 74, 0.12);
|
|
206
|
+
color: #4ade80;
|
|
207
|
+
border: 1px solid rgba(22, 163, 74, 0.35);
|
|
208
|
+
font-size: 0.72rem;
|
|
209
|
+
font-weight: 600;
|
|
210
|
+
letter-spacing: 0.01em;
|
|
211
|
+
width: max-content;
|
|
212
|
+
max-width: 100%;
|
|
213
|
+
animation: crewlet-pricing-card-price-note-enter 520ms cubic-bezier(0.2, 0.7, 0.2, 1.2);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.crewlet-pricing-card__price-note .material-symbols-outlined {
|
|
217
|
+
font-size: 14px;
|
|
218
|
+
line-height: 1;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@keyframes crewlet-pricing-card-price-note-enter {
|
|
222
|
+
0% { transform: translateY(-4px); opacity: 0; }
|
|
223
|
+
100% { transform: translateY(0); opacity: 1; }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* ── Body + Footer slots ────────────────────────────────────────── */
|
|
227
|
+
.crewlet-pricing-card__body {
|
|
228
|
+
display: flex;
|
|
229
|
+
flex-direction: column;
|
|
230
|
+
gap: 12px;
|
|
231
|
+
min-width: 0;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.crewlet-pricing-card__footer {
|
|
235
|
+
margin-top: auto;
|
|
236
|
+
display: flex;
|
|
237
|
+
gap: 8px;
|
|
238
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Section, the vertical rhythm band. One spacing scale keeps the cadence
|
|
3
|
+
* between page sections consistent, and collapses gracefully on small
|
|
4
|
+
* viewports.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
.crewlet-section {
|
|
8
|
+
position: relative;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.crewlet-section--none { padding-block: 0; }
|
|
12
|
+
.crewlet-section--sm { padding-block: var(--spacing-9); }
|
|
13
|
+
.crewlet-section--md { padding-block: var(--spacing-11); }
|
|
14
|
+
.crewlet-section--lg { padding-block: 120px; }
|
|
15
|
+
|
|
16
|
+
@media (max-width: 768px) {
|
|
17
|
+
.crewlet-section--sm { padding-block: var(--spacing-7); }
|
|
18
|
+
.crewlet-section--md { padding-block: var(--spacing-9); }
|
|
19
|
+
.crewlet-section--lg { padding-block: var(--spacing-10); }
|
|
20
|
+
}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/* Unified custom dropdown. Colours come from the canonical
|
|
2
|
+
@crewlethq/tokens variables (--color-surface-*, --color-border-*,
|
|
3
|
+
--color-text-*, --color-brand-accent), so the same component
|
|
4
|
+
follows whichever palette the host application loads without
|
|
5
|
+
per-surface overrides.
|
|
6
|
+
|
|
7
|
+
The accent is read from --color-brand-accent and
|
|
8
|
+
--color-brand-accent-rgb on the trigger and on the menu. An app that
|
|
9
|
+
rebinds those two tokens retints the focus, highlight and selected
|
|
10
|
+
colours; the menu is portaled to <body>, so the override has to be
|
|
11
|
+
declared on <body> or <html> (or on the menu itself) to reach it. */
|
|
12
|
+
|
|
13
|
+
.crewlet-select {
|
|
14
|
+
position: relative;
|
|
15
|
+
display: inline-block;
|
|
16
|
+
width: 100%;
|
|
17
|
+
--crewlet-select-accent: var(--color-brand-accent, #5469d4);
|
|
18
|
+
--crewlet-select-accent-rgb: var(--color-brand-accent-rgb, 84, 105, 212);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.crewlet-select.is-disabled {
|
|
22
|
+
opacity: 0.55;
|
|
23
|
+
pointer-events: none;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.crewlet-select__trigger {
|
|
27
|
+
width: 100%;
|
|
28
|
+
display: flex;
|
|
29
|
+
align-items: center;
|
|
30
|
+
justify-content: space-between;
|
|
31
|
+
gap: 8px;
|
|
32
|
+
padding: 8px 10px 8px 12px;
|
|
33
|
+
background: var(--color-surface-elevated, #1f2128);
|
|
34
|
+
border: 1px solid var(--color-border-default, rgba(255, 255, 255, 0.1));
|
|
35
|
+
border-radius: 8px;
|
|
36
|
+
color: var(--color-text-primary, #f5f5f7);
|
|
37
|
+
font-size: 13px;
|
|
38
|
+
font-family: inherit;
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
text-align: left;
|
|
41
|
+
transition:
|
|
42
|
+
border-color 0.15s ease,
|
|
43
|
+
box-shadow 0.15s ease,
|
|
44
|
+
background 0.15s ease;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.crewlet-select--sm .crewlet-select__trigger {
|
|
48
|
+
padding: 6px 8px 6px 10px;
|
|
49
|
+
font-size: 12px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.crewlet-select__trigger:hover:not(:disabled) {
|
|
53
|
+
border-color: var(--color-border-strong, rgba(255, 255, 255, 0.18));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.crewlet-select__trigger:focus,
|
|
57
|
+
.crewlet-select.is-open > .crewlet-select__trigger {
|
|
58
|
+
outline: none;
|
|
59
|
+
border-color: var(--crewlet-select-accent);
|
|
60
|
+
box-shadow: 0 0 0 3px rgba(var(--crewlet-select-accent-rgb), 0.15);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.crewlet-select__label {
|
|
64
|
+
flex: 1;
|
|
65
|
+
min-width: 0;
|
|
66
|
+
white-space: nowrap;
|
|
67
|
+
overflow: hidden;
|
|
68
|
+
text-overflow: ellipsis;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.crewlet-select__label.is-placeholder {
|
|
72
|
+
color: var(--color-text-tertiary, rgba(245, 245, 247, 0.5));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.crewlet-select__chevron {
|
|
76
|
+
font-size: 18px;
|
|
77
|
+
color: var(--color-text-tertiary, rgba(245, 245, 247, 0.6));
|
|
78
|
+
flex-shrink: 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.crewlet-select.is-open .crewlet-select__chevron {
|
|
82
|
+
color: var(--crewlet-select-accent);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Floating menu. Portaled to <body> so it never gets clipped by
|
|
86
|
+
an ancestor's overflow rule (popovers, table cards, modal
|
|
87
|
+
bodies). Position is set inline from getBoundingClientRect on
|
|
88
|
+
the trigger; this rule only sets the visual chrome and the
|
|
89
|
+
z-index. The accent token is set on the wrapper, but because
|
|
90
|
+
the menu lives outside the wrapper after portalling, we mirror
|
|
91
|
+
the same fallback chain here so colours stay consistent. */
|
|
92
|
+
.crewlet-select__menu {
|
|
93
|
+
/* The popover layer sits above the modal layer because a Select is
|
|
94
|
+
routinely opened inside a Modal: the trigger lives in the dialog,
|
|
95
|
+
but the panel portals to <body> as a sibling of the backdrop.
|
|
96
|
+
Below the modal layer the panel renders but is covered by the
|
|
97
|
+
backdrop, which both hides it and swallows clicks, so the menu
|
|
98
|
+
looks like it will not open. Toasts stay above it. */
|
|
99
|
+
z-index: var(--z-index-popover, 10000);
|
|
100
|
+
background: var(--color-surface-subtle, #15171c);
|
|
101
|
+
border: 1px solid var(--color-border-default, rgba(255, 255, 255, 0.1));
|
|
102
|
+
border-radius: 10px;
|
|
103
|
+
box-shadow:
|
|
104
|
+
0 12px 32px rgba(0, 0, 0, 0.45),
|
|
105
|
+
0 0 0 1px rgba(var(--crewlet-select-accent-rgb, 84, 105, 212), 0.18);
|
|
106
|
+
max-height: 320px;
|
|
107
|
+
display: flex;
|
|
108
|
+
flex-direction: column;
|
|
109
|
+
outline: none;
|
|
110
|
+
overflow: hidden;
|
|
111
|
+
animation: crewlet-select-pop 120ms ease-out;
|
|
112
|
+
--crewlet-select-accent: var(--color-brand-accent, #5469d4);
|
|
113
|
+
--crewlet-select-accent-rgb: var(--color-brand-accent-rgb, 84, 105, 212);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* Inner option list. Scrolls when the option count exceeds the
|
|
117
|
+
menu's max height, while the optional search header stays
|
|
118
|
+
pinned at the top of the menu. */
|
|
119
|
+
.crewlet-select__list {
|
|
120
|
+
margin: 0;
|
|
121
|
+
padding: 6px;
|
|
122
|
+
list-style: none;
|
|
123
|
+
flex: 1;
|
|
124
|
+
min-height: 0;
|
|
125
|
+
overflow-y: auto;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Search header. Same visual register as the toolbar search
|
|
129
|
+
field so the operator recognises it instantly. */
|
|
130
|
+
.crewlet-select__search {
|
|
131
|
+
display: flex;
|
|
132
|
+
align-items: center;
|
|
133
|
+
gap: 6px;
|
|
134
|
+
padding: 8px 10px;
|
|
135
|
+
border-bottom: 1px solid var(--color-border-default, rgba(255, 255, 255, 0.08));
|
|
136
|
+
flex-shrink: 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.crewlet-select__search .material-symbols-outlined {
|
|
140
|
+
font-size: 16px;
|
|
141
|
+
color: var(--color-text-tertiary, rgba(245, 245, 247, 0.55));
|
|
142
|
+
flex-shrink: 0;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.crewlet-select__search-input {
|
|
146
|
+
flex: 1;
|
|
147
|
+
min-width: 0;
|
|
148
|
+
background: transparent;
|
|
149
|
+
border: none;
|
|
150
|
+
outline: none;
|
|
151
|
+
color: var(--color-text-primary, #f5f5f7);
|
|
152
|
+
font-size: 13px;
|
|
153
|
+
font-family: inherit;
|
|
154
|
+
padding: 0;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.crewlet-select__search-input::placeholder {
|
|
158
|
+
color: var(--color-text-tertiary, rgba(245, 245, 247, 0.55));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* "No matches" row when search filters everything out. */
|
|
162
|
+
.crewlet-select__empty {
|
|
163
|
+
padding: 14px 10px;
|
|
164
|
+
text-align: center;
|
|
165
|
+
font-size: 12px;
|
|
166
|
+
color: var(--color-text-tertiary, rgba(245, 245, 247, 0.55));
|
|
167
|
+
list-style: none;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.crewlet-select__menu--top {
|
|
171
|
+
transform-origin: bottom left;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.crewlet-select__menu--bottom {
|
|
175
|
+
transform-origin: top left;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@keyframes crewlet-select-pop {
|
|
179
|
+
from { opacity: 0; transform: translateY(-4px); }
|
|
180
|
+
to { opacity: 1; transform: translateY(0); }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.crewlet-select__option {
|
|
184
|
+
padding: 8px 10px;
|
|
185
|
+
border-radius: 6px;
|
|
186
|
+
cursor: pointer;
|
|
187
|
+
display: block;
|
|
188
|
+
color: var(--color-text-primary, #f5f5f7);
|
|
189
|
+
font-size: 13px;
|
|
190
|
+
line-height: 1.4;
|
|
191
|
+
user-select: none;
|
|
192
|
+
transition: background 0.1s ease, color 0.1s ease;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/*
|
|
196
|
+
* Compact menu (size="sm") shrinks the inner list padding plus each
|
|
197
|
+
* option's padding + font so a sm Select dropdown reads as a tight
|
|
198
|
+
* companion to its sm trigger (e.g. the Local time zone / UTC
|
|
199
|
+
* selector inside the TimeWindowPicker header).
|
|
200
|
+
*/
|
|
201
|
+
.crewlet-select__menu--sm .crewlet-select__list {
|
|
202
|
+
padding: 4px;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.crewlet-select__menu--sm .crewlet-select__option {
|
|
206
|
+
padding: 5px 8px;
|
|
207
|
+
font-size: 12px;
|
|
208
|
+
line-height: 1.3;
|
|
209
|
+
border-radius: 4px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.crewlet-select__menu--sm .crewlet-select__option-check {
|
|
213
|
+
font-size: 14px;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.crewlet-select__option + .crewlet-select__option {
|
|
217
|
+
margin-top: 1px;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.crewlet-select__option.is-disabled {
|
|
221
|
+
opacity: 0.5;
|
|
222
|
+
cursor: not-allowed;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.crewlet-select__option.is-highlight {
|
|
226
|
+
background: rgba(var(--crewlet-select-accent-rgb), 0.14);
|
|
227
|
+
color: var(--crewlet-select-accent);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.crewlet-select__option.is-selected:not(.is-highlight) {
|
|
231
|
+
color: var(--crewlet-select-accent);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.crewlet-select__option-row {
|
|
235
|
+
display: flex;
|
|
236
|
+
align-items: center;
|
|
237
|
+
justify-content: space-between;
|
|
238
|
+
gap: 8px;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.crewlet-select__option-label {
|
|
242
|
+
flex: 1;
|
|
243
|
+
min-width: 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.crewlet-select__option-check {
|
|
247
|
+
font-size: 16px;
|
|
248
|
+
color: var(--crewlet-select-accent);
|
|
249
|
+
flex-shrink: 0;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/*
|
|
253
|
+
* Multi-select checkbox affordance painted on the leading edge of
|
|
254
|
+
* each option row. Uses the same accent token as the single-select
|
|
255
|
+
* check icon so every palette stays consistent.
|
|
256
|
+
* Empty state is a hollow box with the border tinted; checked state
|
|
257
|
+
* fills the box and centres the check glyph.
|
|
258
|
+
*/
|
|
259
|
+
.crewlet-select__option--multi .crewlet-select__option-row {
|
|
260
|
+
align-items: center;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.crewlet-select__option-checkbox {
|
|
264
|
+
flex-shrink: 0;
|
|
265
|
+
width: 16px;
|
|
266
|
+
height: 16px;
|
|
267
|
+
border: 1.5px solid var(--color-border-strong, rgba(255, 255, 255, 0.25));
|
|
268
|
+
border-radius: 4px;
|
|
269
|
+
display: inline-flex;
|
|
270
|
+
align-items: center;
|
|
271
|
+
justify-content: center;
|
|
272
|
+
background: transparent;
|
|
273
|
+
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
|
|
274
|
+
color: transparent;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.crewlet-select__option-checkbox.is-checked {
|
|
278
|
+
background: var(--crewlet-select-accent);
|
|
279
|
+
border-color: var(--crewlet-select-accent);
|
|
280
|
+
color: #ffffff;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.crewlet-select__option-checkbox .material-symbols-outlined {
|
|
284
|
+
font-size: 12px;
|
|
285
|
+
font-weight: 700;
|
|
286
|
+
line-height: 1;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.crewlet-select__option-desc {
|
|
290
|
+
margin-top: 2px;
|
|
291
|
+
font-size: 12px;
|
|
292
|
+
color: var(--color-text-secondary, rgba(245, 245, 247, 0.7));
|
|
293
|
+
line-height: 1.4;
|
|
294
|
+
}
|