@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,378 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Skeleton, loading-state placeholder. Supports eight variants:
|
|
3
|
+
* box Single large rectangle with a sweeping wave-glow,
|
|
4
|
+
* used as a hero placeholder during heavy content
|
|
5
|
+
* loads. Five glow colours.
|
|
6
|
+
* text Multi-line text shimmer.
|
|
7
|
+
* card Single card with title + two text lines.
|
|
8
|
+
* grid N×M card grid.
|
|
9
|
+
* list Avatar + two-line list rows.
|
|
10
|
+
* table Header + rows table shimmer.
|
|
11
|
+
* info-grid Label/value pairs in a grid with row separators.
|
|
12
|
+
* pricing-card A row of cards laid out like PricingCard.Grid, each
|
|
13
|
+
* with a header, description, feature list and action
|
|
14
|
+
* button.
|
|
15
|
+
*
|
|
16
|
+
* Every class is namespaced under .crewlet-skeleton, so the placeholder
|
|
17
|
+
* never matches an application's own class names (a page stylesheet is
|
|
18
|
+
* likely to declare its own .skeleton-line, for instance).
|
|
19
|
+
*
|
|
20
|
+
* All static blocks share a single pulse animation; the box variant
|
|
21
|
+
* uses a sweeping wave overlay instead.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/* ── Pulse animation, used by every static shimmer block ───────── */
|
|
25
|
+
@keyframes crewlet-skeleton-pulse {
|
|
26
|
+
0%, 100% { opacity: 1; }
|
|
27
|
+
50% { opacity: 0.5; }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.crewlet-skeleton .crewlet-skeleton__line,
|
|
31
|
+
.crewlet-skeleton .crewlet-skeleton__avatar,
|
|
32
|
+
.crewlet-skeleton .crewlet-skeleton__circle,
|
|
33
|
+
.crewlet-skeleton .crewlet-skeleton__button,
|
|
34
|
+
.crewlet-skeleton .crewlet-skeleton__card,
|
|
35
|
+
.crewlet-skeleton .crewlet-skeleton__list-item,
|
|
36
|
+
.crewlet-skeleton .crewlet-skeleton__info-item {
|
|
37
|
+
animation: crewlet-skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* ── Primitives: line, avatar, circle, button ───────────────────── */
|
|
41
|
+
.crewlet-skeleton__line {
|
|
42
|
+
height: 12px;
|
|
43
|
+
background: var(--color-surface-elevated, var(--color-surface-muted));
|
|
44
|
+
border-radius: 4px;
|
|
45
|
+
margin-bottom: 8px;
|
|
46
|
+
}
|
|
47
|
+
.crewlet-skeleton__line:last-child { margin-bottom: 0; }
|
|
48
|
+
|
|
49
|
+
.crewlet-skeleton__line--title { height: 16px; width: 60%; margin-bottom: 12px; }
|
|
50
|
+
.crewlet-skeleton__line--text { height: 12px; width: 100%; }
|
|
51
|
+
.crewlet-skeleton__line--short { width: 70%; }
|
|
52
|
+
.crewlet-skeleton__line--label { height: 13px; width: 40%; margin-bottom: 8px; }
|
|
53
|
+
.crewlet-skeleton__line--value { height: 14px; width: 80%; }
|
|
54
|
+
|
|
55
|
+
.crewlet-skeleton__avatar {
|
|
56
|
+
width: 40px;
|
|
57
|
+
height: 40px;
|
|
58
|
+
border-radius: 50%;
|
|
59
|
+
background: var(--color-surface-elevated, var(--color-surface-muted));
|
|
60
|
+
flex-shrink: 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.crewlet-skeleton__circle {
|
|
64
|
+
width: 24px;
|
|
65
|
+
height: 24px;
|
|
66
|
+
border-radius: 50%;
|
|
67
|
+
background: var(--color-surface-elevated, var(--color-surface-muted));
|
|
68
|
+
flex-shrink: 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.crewlet-skeleton__circle--small {
|
|
72
|
+
width: 16px;
|
|
73
|
+
height: 16px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.crewlet-skeleton__button {
|
|
77
|
+
width: 100%;
|
|
78
|
+
height: 36px;
|
|
79
|
+
background: var(--color-surface-elevated, var(--color-surface-muted));
|
|
80
|
+
border-radius: 8px;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* ── card / grid / list containers ──────────────────────────────── */
|
|
84
|
+
.crewlet-skeleton--card {
|
|
85
|
+
background: var(--color-surface-subtle);
|
|
86
|
+
border: 1px solid var(--color-border-default);
|
|
87
|
+
border-radius: 12px;
|
|
88
|
+
padding: 24px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/*
|
|
92
|
+
* grid and info-grid read their column count from
|
|
93
|
+
* --crewlet-skeleton-cols, set by the --cols-N modifier the component
|
|
94
|
+
* adds and lowered by the responsive rules at the end of this file.
|
|
95
|
+
*/
|
|
96
|
+
.crewlet-skeleton--cols-1 { --crewlet-skeleton-cols: 1; }
|
|
97
|
+
.crewlet-skeleton--cols-2 { --crewlet-skeleton-cols: 2; }
|
|
98
|
+
.crewlet-skeleton--cols-3 { --crewlet-skeleton-cols: 3; }
|
|
99
|
+
.crewlet-skeleton--cols-4 { --crewlet-skeleton-cols: 4; }
|
|
100
|
+
|
|
101
|
+
.crewlet-skeleton--grid {
|
|
102
|
+
display: grid;
|
|
103
|
+
grid-template-columns: repeat(var(--crewlet-skeleton-cols, 1), 1fr);
|
|
104
|
+
gap: 16px;
|
|
105
|
+
width: 100%;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.crewlet-skeleton__card {
|
|
109
|
+
background: var(--color-surface-subtle);
|
|
110
|
+
border: 1px solid var(--color-border-default);
|
|
111
|
+
border-radius: 12px;
|
|
112
|
+
padding: 20px;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.crewlet-skeleton--list { display: flex; flex-direction: column; gap: 12px; width: 100%; }
|
|
116
|
+
|
|
117
|
+
.crewlet-skeleton__list-item {
|
|
118
|
+
display: flex;
|
|
119
|
+
align-items: center;
|
|
120
|
+
gap: 16px;
|
|
121
|
+
padding: 12px;
|
|
122
|
+
background: var(--color-surface-subtle);
|
|
123
|
+
border: 1px solid var(--color-border-default);
|
|
124
|
+
border-radius: 8px;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.crewlet-skeleton__list-content { flex: 1; min-width: 0; }
|
|
128
|
+
|
|
129
|
+
/* ── table ──────────────────────────────────────────────────────── */
|
|
130
|
+
.crewlet-skeleton--table {
|
|
131
|
+
width: 100%;
|
|
132
|
+
position: relative;
|
|
133
|
+
overflow-x: auto;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.crewlet-skeleton__table {
|
|
137
|
+
width: 100%;
|
|
138
|
+
border-collapse: collapse;
|
|
139
|
+
background: transparent;
|
|
140
|
+
display: table;
|
|
141
|
+
table-layout: auto;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.crewlet-skeleton__table thead { border-bottom: 1px solid var(--color-border-default); display: table-header-group; }
|
|
145
|
+
.crewlet-skeleton__table tbody { display: table-row-group; }
|
|
146
|
+
.crewlet-skeleton__table tr { display: table-row; }
|
|
147
|
+
|
|
148
|
+
.crewlet-skeleton__th {
|
|
149
|
+
padding: 2px 16px;
|
|
150
|
+
text-align: left;
|
|
151
|
+
position: relative;
|
|
152
|
+
display: table-cell;
|
|
153
|
+
white-space: nowrap;
|
|
154
|
+
vertical-align: middle;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.crewlet-skeleton__th .crewlet-skeleton__line {
|
|
158
|
+
height: 14px;
|
|
159
|
+
width: 60%;
|
|
160
|
+
margin: 0;
|
|
161
|
+
display: inline-block;
|
|
162
|
+
transform: translateY(-4px);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.crewlet-skeleton__th:first-child .crewlet-skeleton__line { width: 70%; }
|
|
166
|
+
.crewlet-skeleton__th:last-child .crewlet-skeleton__line { width: 40%; }
|
|
167
|
+
|
|
168
|
+
.crewlet-skeleton__tr {
|
|
169
|
+
background: var(--color-surface-subtle);
|
|
170
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
171
|
+
transition: background-color 0.2s ease;
|
|
172
|
+
display: table-row;
|
|
173
|
+
}
|
|
174
|
+
.crewlet-skeleton__tr:hover { background: var(--color-surface-elevated, var(--color-surface-subtle)); }
|
|
175
|
+
|
|
176
|
+
.crewlet-skeleton__td {
|
|
177
|
+
padding: 12px 16px;
|
|
178
|
+
display: table-cell;
|
|
179
|
+
text-align: left;
|
|
180
|
+
vertical-align: middle;
|
|
181
|
+
white-space: nowrap;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.crewlet-skeleton__td .crewlet-skeleton__line {
|
|
185
|
+
height: 8px;
|
|
186
|
+
width: auto;
|
|
187
|
+
min-width: 80px;
|
|
188
|
+
margin: 0;
|
|
189
|
+
border-radius: 4px;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.crewlet-skeleton__td:first-child .crewlet-skeleton__line { min-width: 200px; }
|
|
193
|
+
.crewlet-skeleton__td:last-child .crewlet-skeleton__line { min-width: 60px; width: 60px; }
|
|
194
|
+
|
|
195
|
+
/* ── info-grid (label/value pairs with row separators) ──────────── */
|
|
196
|
+
.crewlet-skeleton--info-grid {
|
|
197
|
+
--crewlet-skeleton-row-gap: 32px;
|
|
198
|
+
--crewlet-skeleton-col-gap: 48px;
|
|
199
|
+
display: grid;
|
|
200
|
+
grid-template-columns: repeat(var(--crewlet-skeleton-cols, 1), 1fr);
|
|
201
|
+
gap: var(--crewlet-skeleton-row-gap) var(--crewlet-skeleton-col-gap);
|
|
202
|
+
width: 100%;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.crewlet-skeleton__info-item {
|
|
206
|
+
display: flex;
|
|
207
|
+
flex-direction: column;
|
|
208
|
+
gap: 8px;
|
|
209
|
+
position: relative;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* A separator centred in the row gap above the first item of every row
|
|
214
|
+
* after the first, drawn across the whole row: the item's own width
|
|
215
|
+
* times the column count, plus the column gaps between them. The
|
|
216
|
+
* row-start selectors are wrapped in :where() so every rule here shares
|
|
217
|
+
* one specificity and the responsive overrides win by source order.
|
|
218
|
+
*/
|
|
219
|
+
.crewlet-skeleton__info-item::before {
|
|
220
|
+
content: '';
|
|
221
|
+
position: absolute;
|
|
222
|
+
left: 0;
|
|
223
|
+
top: calc(var(--crewlet-skeleton-row-gap) / -2);
|
|
224
|
+
width: calc(100% * var(--crewlet-skeleton-cols, 1) + var(--crewlet-skeleton-col-gap) * (var(--crewlet-skeleton-cols, 1) - 1));
|
|
225
|
+
height: 1px;
|
|
226
|
+
background: var(--color-border-default);
|
|
227
|
+
display: none;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
:where(.crewlet-skeleton--cols-1) > .crewlet-skeleton__info-item:where(:nth-child(n+2))::before,
|
|
231
|
+
:where(.crewlet-skeleton--cols-2) > .crewlet-skeleton__info-item:where(:nth-child(2n+1):nth-child(n+3))::before,
|
|
232
|
+
:where(.crewlet-skeleton--cols-3) > .crewlet-skeleton__info-item:where(:nth-child(3n+1):nth-child(n+4))::before,
|
|
233
|
+
:where(.crewlet-skeleton--cols-4) > .crewlet-skeleton__info-item:where(:nth-child(4n+1):nth-child(n+5))::before {
|
|
234
|
+
display: block;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* ── pricing-card (mirrors PricingCard.Grid and the card surface) ── */
|
|
238
|
+
.crewlet-skeleton--pricing-card {
|
|
239
|
+
display: grid;
|
|
240
|
+
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
241
|
+
gap: 12px;
|
|
242
|
+
align-items: stretch;
|
|
243
|
+
width: 100%;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.crewlet-skeleton__pricing-card {
|
|
247
|
+
display: flex;
|
|
248
|
+
flex-direction: column;
|
|
249
|
+
gap: 12px;
|
|
250
|
+
min-width: 0;
|
|
251
|
+
padding: 14px;
|
|
252
|
+
background: var(--color-surface-subtle);
|
|
253
|
+
border: 1px solid var(--color-border-default);
|
|
254
|
+
border-radius: 12px;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.crewlet-skeleton__pricing-card-header {
|
|
258
|
+
display: flex;
|
|
259
|
+
align-items: center;
|
|
260
|
+
gap: 8px;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.crewlet-skeleton__pricing-card-description {
|
|
264
|
+
display: flex;
|
|
265
|
+
flex-direction: column;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.crewlet-skeleton__pricing-card-features {
|
|
269
|
+
display: flex;
|
|
270
|
+
flex-direction: column;
|
|
271
|
+
gap: 8px;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.crewlet-skeleton__pricing-card-feature {
|
|
275
|
+
display: flex;
|
|
276
|
+
align-items: center;
|
|
277
|
+
gap: 8px;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.crewlet-skeleton__line--heading { width: 80px; height: 16px; margin: 0; }
|
|
281
|
+
.crewlet-skeleton__line--wide { width: 90%; }
|
|
282
|
+
.crewlet-skeleton__line--three-quarter { width: 75%; }
|
|
283
|
+
.crewlet-skeleton__line--feature { width: 60px; height: 12px; margin: 0; }
|
|
284
|
+
|
|
285
|
+
/* ── responsive ─────────────────────────────────────────────────── */
|
|
286
|
+
@media (max-width: 1320px) {
|
|
287
|
+
.crewlet-skeleton--pricing-card { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
@media (max-width: 1200px) {
|
|
291
|
+
.crewlet-skeleton--grid.crewlet-skeleton--cols-4 { --crewlet-skeleton-cols: 2; }
|
|
292
|
+
|
|
293
|
+
.crewlet-skeleton--info-grid.crewlet-skeleton--cols-4 {
|
|
294
|
+
--crewlet-skeleton-cols: 2;
|
|
295
|
+
--crewlet-skeleton-row-gap: 24px;
|
|
296
|
+
--crewlet-skeleton-col-gap: 32px;
|
|
297
|
+
}
|
|
298
|
+
:where(.crewlet-skeleton--cols-4) > .crewlet-skeleton__info-item::before { display: none; }
|
|
299
|
+
:where(.crewlet-skeleton--cols-4) > .crewlet-skeleton__info-item:where(:nth-child(2n+1):nth-child(n+3))::before {
|
|
300
|
+
display: block;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@media (max-width: 768px) {
|
|
305
|
+
.crewlet-skeleton--grid.crewlet-skeleton--cols-2,
|
|
306
|
+
.crewlet-skeleton--grid.crewlet-skeleton--cols-3,
|
|
307
|
+
.crewlet-skeleton--grid.crewlet-skeleton--cols-4 { --crewlet-skeleton-cols: 1; }
|
|
308
|
+
|
|
309
|
+
.crewlet-skeleton--info-grid.crewlet-skeleton--cols-2,
|
|
310
|
+
.crewlet-skeleton--info-grid.crewlet-skeleton--cols-3,
|
|
311
|
+
.crewlet-skeleton--info-grid.crewlet-skeleton--cols-4 {
|
|
312
|
+
--crewlet-skeleton-cols: 1;
|
|
313
|
+
--crewlet-skeleton-row-gap: 20px;
|
|
314
|
+
}
|
|
315
|
+
.crewlet-skeleton__info-item::before { display: none; }
|
|
316
|
+
.crewlet-skeleton__info-item:where(:nth-child(n+2))::before { display: block; }
|
|
317
|
+
|
|
318
|
+
.crewlet-skeleton--card,
|
|
319
|
+
.crewlet-skeleton__card { padding: 16px; }
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
@media (max-width: 680px) {
|
|
323
|
+
.crewlet-skeleton--pricing-card { grid-template-columns: minmax(0, 1fr); }
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/* ── Box variant: wave-glow hero shimmer ────────────────────────── */
|
|
327
|
+
.crewlet-skeleton--box {
|
|
328
|
+
width: 100%;
|
|
329
|
+
padding: 0;
|
|
330
|
+
animation: crewlet-skeleton-fade-in 0.15s ease-in;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
@keyframes crewlet-skeleton-fade-in {
|
|
334
|
+
from { opacity: 0; } to { opacity: 1; }
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.crewlet-skeleton__glow-box {
|
|
338
|
+
width: 100%;
|
|
339
|
+
background: linear-gradient(
|
|
340
|
+
135deg,
|
|
341
|
+
rgba(255, 255, 255, 0.03) 0%,
|
|
342
|
+
rgba(255, 255, 255, 0.05) 50%,
|
|
343
|
+
rgba(255, 255, 255, 0.03) 100%
|
|
344
|
+
);
|
|
345
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
346
|
+
position: relative;
|
|
347
|
+
overflow: hidden;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.crewlet-skeleton__glow-wave {
|
|
351
|
+
position: absolute;
|
|
352
|
+
top: 0;
|
|
353
|
+
left: -100%;
|
|
354
|
+
width: 100%;
|
|
355
|
+
height: 100%;
|
|
356
|
+
animation: crewlet-skeleton-wave ease-in-out infinite;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
@keyframes crewlet-skeleton-wave {
|
|
360
|
+
0% { left: -100%; }
|
|
361
|
+
100% { left: 100%; }
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.crewlet-skeleton__glow-wave--blue {
|
|
365
|
+
background: linear-gradient(90deg, transparent 0%, rgba(147, 197, 253, 0.3) 20%, rgba(147, 197, 253, 0.5) 50%, rgba(147, 197, 253, 0.3) 80%, transparent 100%);
|
|
366
|
+
}
|
|
367
|
+
.crewlet-skeleton__glow-wave--green {
|
|
368
|
+
background: linear-gradient(90deg, transparent 0%, rgba(134, 239, 172, 0.3) 20%, rgba(134, 239, 172, 0.5) 50%, rgba(134, 239, 172, 0.3) 80%, transparent 100%);
|
|
369
|
+
}
|
|
370
|
+
.crewlet-skeleton__glow-wave--purple {
|
|
371
|
+
background: linear-gradient(90deg, transparent 0%, rgba(196, 181, 253, 0.3) 20%, rgba(196, 181, 253, 0.5) 50%, rgba(196, 181, 253, 0.3) 80%, transparent 100%);
|
|
372
|
+
}
|
|
373
|
+
.crewlet-skeleton__glow-wave--orange {
|
|
374
|
+
background: linear-gradient(90deg, transparent 0%, rgba(253, 186, 116, 0.3) 20%, rgba(253, 186, 116, 0.5) 50%, rgba(253, 186, 116, 0.3) 80%, transparent 100%);
|
|
375
|
+
}
|
|
376
|
+
.crewlet-skeleton__glow-wave--red {
|
|
377
|
+
background: linear-gradient(90deg, transparent 0%, rgba(252, 165, 165, 0.3) 20%, rgba(252, 165, 165, 0.5) 50%, rgba(252, 165, 165, 0.3) 80%, transparent 100%);
|
|
378
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* StatCard, key-metric tile. Shares the Card surface treatment so
|
|
3
|
+
* stat rows sit naturally next to Card-based sections.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.crewlet-statcard {
|
|
7
|
+
display: flex;
|
|
8
|
+
align-items: flex-start;
|
|
9
|
+
gap: 12px;
|
|
10
|
+
background-color: var(--color-surface-subtle);
|
|
11
|
+
border: 1px solid var(--color-border-default);
|
|
12
|
+
border-radius: 12px;
|
|
13
|
+
padding: 16px;
|
|
14
|
+
color: var(--color-text-primary);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.crewlet-statcard__icon {
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
margin-top: 2px;
|
|
20
|
+
color: var(--color-text-tertiary);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.crewlet-statcard__body { min-width: 0; }
|
|
24
|
+
|
|
25
|
+
.crewlet-statcard__value {
|
|
26
|
+
font-size: 22px;
|
|
27
|
+
font-weight: 600;
|
|
28
|
+
line-height: 1.2;
|
|
29
|
+
color: var(--color-text-primary);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.crewlet-statcard__placeholder { color: var(--color-text-muted); }
|
|
33
|
+
|
|
34
|
+
.crewlet-statcard__label {
|
|
35
|
+
font-size: 12px;
|
|
36
|
+
color: var(--color-text-secondary);
|
|
37
|
+
margin-top: 4px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.crewlet-statcard__sub {
|
|
41
|
+
font-size: 11.5px;
|
|
42
|
+
color: var(--color-text-tertiary);
|
|
43
|
+
margin-top: 2px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.crewlet-statcard--brand .crewlet-statcard__icon { color: var(--color-brand-primary); }
|
|
47
|
+
.crewlet-statcard--success .crewlet-statcard__icon { color: var(--color-feedback-success); }
|
|
48
|
+
.crewlet-statcard--warning .crewlet-statcard__icon { color: var(--color-feedback-warning); }
|
|
49
|
+
.crewlet-statcard--danger .crewlet-statcard__icon { color: var(--color-feedback-danger); }
|
|
50
|
+
.crewlet-statcard--info .crewlet-statcard__icon { color: var(--color-feedback-info); }
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* Table Component Styles */
|
|
2
|
+
.crewlet-table {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
flex: 1;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.crewlet-table__container {
|
|
9
|
+
border: 1px solid var(--color-border-default);
|
|
10
|
+
border-radius: 8px;
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
flex: 1;
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.crewlet-table__header {
|
|
18
|
+
display: grid;
|
|
19
|
+
padding: 12px 16px;
|
|
20
|
+
font-size: 14px;
|
|
21
|
+
font-weight: 500;
|
|
22
|
+
color: var(--color-text-secondary);
|
|
23
|
+
background: var(--color-surface-subtle);
|
|
24
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* The dark palette lays the header flush with the page background,
|
|
28
|
+
so the rows (on the subtle surface) read as lifted beneath it. */
|
|
29
|
+
body.theme-dark .crewlet-table__header {
|
|
30
|
+
background: var(--color-surface-background);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.crewlet-table__body {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: column;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.crewlet-table__row {
|
|
39
|
+
display: grid;
|
|
40
|
+
padding: 12px 16px;
|
|
41
|
+
font-size: 14px;
|
|
42
|
+
color: var(--color-text-primary);
|
|
43
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
44
|
+
transition: background 0.2s ease;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.crewlet-table__row:last-child {
|
|
48
|
+
border-bottom: none;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.crewlet-table__row:hover {
|
|
52
|
+
background: var(--color-surface-elevated);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.crewlet-table__empty {
|
|
56
|
+
padding: 32px 16px;
|
|
57
|
+
text-align: center;
|
|
58
|
+
color: var(--color-text-secondary);
|
|
59
|
+
font-size: 14px;
|
|
60
|
+
flex: 1;
|
|
61
|
+
display: flex;
|
|
62
|
+
align-items: center;
|
|
63
|
+
justify-content: center;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.crewlet-table__action-btn {
|
|
67
|
+
width: 100%;
|
|
68
|
+
padding: 12px 16px;
|
|
69
|
+
background: none;
|
|
70
|
+
border: none;
|
|
71
|
+
color: var(--color-brand-accent, #5469d4);
|
|
72
|
+
font-size: 14px;
|
|
73
|
+
font-weight: 600;
|
|
74
|
+
cursor: pointer;
|
|
75
|
+
text-align: center;
|
|
76
|
+
transition: all 0.2s ease;
|
|
77
|
+
margin-bottom: -20px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.crewlet-table__action-text {
|
|
81
|
+
display: inline-block;
|
|
82
|
+
padding: 6px 16px;
|
|
83
|
+
border-radius: 6px;
|
|
84
|
+
transition: background 0.2s ease;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.crewlet-table__action-btn:hover .crewlet-table__action-text {
|
|
88
|
+
background: var(--color-surface-elevated);
|
|
89
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tabs primitive.
|
|
3
|
+
*
|
|
4
|
+
* Two visual variants share the same item layout:
|
|
5
|
+
*
|
|
6
|
+
* - underline Flat strip on a baseline border with a sliding
|
|
7
|
+
* 2px accent bar under the active tab. The bar
|
|
8
|
+
* position + width come from CSS variables the
|
|
9
|
+
* primitive writes after measuring the active tab
|
|
10
|
+
* in a useLayoutEffect, so the bar animates between
|
|
11
|
+
* tabs as the selection moves.
|
|
12
|
+
* - pill Segmented control inside a tinted container, with
|
|
13
|
+
* a lifted active chip.
|
|
14
|
+
*
|
|
15
|
+
* Variant chrome is owned here so consumers do not need to ship a
|
|
16
|
+
* parallel stylesheet for each new tab strip they introduce.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
.crewlet-tabs {
|
|
20
|
+
display: inline-flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
font-family: inherit;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* ─── Underline (sliding accent bar) ──────────────────────────── */
|
|
26
|
+
.crewlet-tabs--underline {
|
|
27
|
+
display: flex;
|
|
28
|
+
gap: 0;
|
|
29
|
+
border-bottom: 1px solid var(--color-border-default, rgba(255, 255, 255, 0.1));
|
|
30
|
+
position: relative;
|
|
31
|
+
width: 100%;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.crewlet-tabs--underline::after {
|
|
35
|
+
/*
|
|
36
|
+
* Sliding accent bar. Positioned absolutely against the nav. The
|
|
37
|
+
* left + width come from inline CSS variables the primitive writes
|
|
38
|
+
* from a measurement pass against the .is-active tab. The default
|
|
39
|
+
* width of 0 keeps the bar invisible until the first measurement
|
|
40
|
+
* lands, no opacity toggle needed.
|
|
41
|
+
*/
|
|
42
|
+
content: '';
|
|
43
|
+
position: absolute;
|
|
44
|
+
bottom: -1px;
|
|
45
|
+
left: var(--crewlet-tabs-slider-left, 0);
|
|
46
|
+
width: var(--crewlet-tabs-slider-width, 0);
|
|
47
|
+
height: 2px;
|
|
48
|
+
background: var(--color-brand-accent, #5469d4);
|
|
49
|
+
transition:
|
|
50
|
+
left 0.15s cubic-bezier(0.4, 0, 0.2, 1),
|
|
51
|
+
width 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
52
|
+
pointer-events: none;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* ─── Pill (segmented control) ────────────────────────────────── */
|
|
56
|
+
.crewlet-tabs--pill {
|
|
57
|
+
gap: 4px;
|
|
58
|
+
padding: 4px;
|
|
59
|
+
background: var(--color-surface-subtle, #f4f4f5);
|
|
60
|
+
border: 1px solid var(--color-border-default, rgba(255, 255, 255, 0.1));
|
|
61
|
+
border-radius: 10px;
|
|
62
|
+
width: fit-content;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* ─── Tab item (shared) ───────────────────────────────────────── */
|
|
66
|
+
.crewlet-tabs__tab {
|
|
67
|
+
display: inline-flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: 6px;
|
|
70
|
+
background: transparent;
|
|
71
|
+
border: 0;
|
|
72
|
+
color: var(--color-text-secondary, #c9ced8);
|
|
73
|
+
font: inherit;
|
|
74
|
+
font-size: 13px;
|
|
75
|
+
font-weight: 500;
|
|
76
|
+
text-decoration: none;
|
|
77
|
+
cursor: pointer;
|
|
78
|
+
white-space: nowrap;
|
|
79
|
+
transition:
|
|
80
|
+
background-color 0.12s ease,
|
|
81
|
+
color 0.12s ease,
|
|
82
|
+
box-shadow 0.12s ease;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.crewlet-tabs--sm .crewlet-tabs__tab {
|
|
86
|
+
font-size: 12px;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Underline tab sizing. Sits flush against the baseline; the slider
|
|
90
|
+
provides the active indicator so no per-tab border is needed. */
|
|
91
|
+
.crewlet-tabs--underline .crewlet-tabs__tab {
|
|
92
|
+
padding: 12px 16px;
|
|
93
|
+
font-size: 14px;
|
|
94
|
+
position: relative;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.crewlet-tabs--underline.crewlet-tabs--sm .crewlet-tabs__tab {
|
|
98
|
+
padding: 10px 14px;
|
|
99
|
+
font-size: 13px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Pill tab sizing + rounded chip shape. */
|
|
103
|
+
.crewlet-tabs--pill .crewlet-tabs__tab {
|
|
104
|
+
padding: 6px 12px;
|
|
105
|
+
border-radius: 7px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.crewlet-tabs--pill.crewlet-tabs--sm .crewlet-tabs__tab {
|
|
109
|
+
padding: 5px 10px;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Hover. */
|
|
113
|
+
.crewlet-tabs__tab:hover:not(.is-disabled):not(.is-active) {
|
|
114
|
+
color: var(--color-text-primary, #fafafa);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.crewlet-tabs--pill .crewlet-tabs__tab:hover:not(.is-disabled):not(.is-active) {
|
|
118
|
+
background: var(--color-surface-elevated, rgba(255, 255, 255, 0.06));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* Active. Underline relies on the slider for the line; tab itself
|
|
122
|
+
just brightens its text color. Pill paints an elevated chip. */
|
|
123
|
+
.crewlet-tabs__tab.is-active {
|
|
124
|
+
color: var(--color-text-primary, #fafafa);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.crewlet-tabs--pill .crewlet-tabs__tab.is-active {
|
|
128
|
+
background: var(--color-surface-elevated, rgba(255, 255, 255, 0.08));
|
|
129
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.crewlet-tabs__tab:focus-visible {
|
|
133
|
+
outline: 2px solid var(--color-brand-accent, #5469d4);
|
|
134
|
+
outline-offset: 2px;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.crewlet-tabs__tab.is-disabled,
|
|
138
|
+
.crewlet-tabs__tab:disabled {
|
|
139
|
+
opacity: 0.55;
|
|
140
|
+
cursor: not-allowed;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.crewlet-tabs__icon {
|
|
144
|
+
font-size: 16px;
|
|
145
|
+
line-height: 1;
|
|
146
|
+
flex-shrink: 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.crewlet-tabs__label {
|
|
150
|
+
display: inline-flex;
|
|
151
|
+
align-items: center;
|
|
152
|
+
min-width: 0;
|
|
153
|
+
}
|