@kupola/kupola 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1403,6 +1403,42 @@
1403
1403
  border-radius: 50%;
1404
1404
  }
1405
1405
 
1406
+ /* IMP-009: Skeleton size variants */
1407
+ .ds-skeleton--text {
1408
+ height: 14px;
1409
+ margin-bottom: var(--spacer-8);
1410
+ }
1411
+
1412
+ .ds-skeleton--heading {
1413
+ height: 24px;
1414
+ width: 40%;
1415
+ margin-bottom: var(--spacer-12);
1416
+ }
1417
+
1418
+ .ds-skeleton--block {
1419
+ height: 200px;
1420
+ }
1421
+
1422
+ .ds-skeleton--avatar {
1423
+ width: 40px;
1424
+ height: 40px;
1425
+ }
1426
+
1427
+ .ds-skeleton--button {
1428
+ height: 28px;
1429
+ width: 80px;
1430
+ }
1431
+
1432
+ .ds-skeleton--input {
1433
+ height: 28px;
1434
+ width: 100%;
1435
+ }
1436
+
1437
+ .ds-skeleton--table {
1438
+ height: 200px;
1439
+ width: 100%;
1440
+ }
1441
+
1406
1442
  @keyframes ds-skeleton-pulse {
1407
1443
  0%, 100% { opacity: 1; }
1408
1444
  50% { opacity: 0.5; }
@@ -2661,6 +2697,17 @@
2661
2697
  right: 2px;
2662
2698
  }
2663
2699
 
2700
+ /* IMP-006: Badge info variant */
2701
+ .ds-badge--info {
2702
+ background: var(--status-info-surface-l1);
2703
+ color: var(--status-info-default);
2704
+ }
2705
+
2706
+ .ds-badge--neutral {
2707
+ background: var(--bg-overlay-l2);
2708
+ color: var(--text-tertiary);
2709
+ }
2710
+
2664
2711
  /* ── Tooltip ──────────────────────────────────────────────── */
2665
2712
  [data-tooltip] {
2666
2713
  position: relative;
@@ -4162,4 +4209,114 @@
4162
4209
 
4163
4210
  .ds-virtual-list--horizontal .ds-virtual-list__item:last-child {
4164
4211
  border-right: none;
4212
+ }
4213
+
4214
+ /* ── Tree (IMP-008) ──────────────────────────────────────── */
4215
+ .ds-tree {
4216
+ list-style: none;
4217
+ padding: 0;
4218
+ margin: 0;
4219
+ font-size: var(--body-sm-font-size, 13px);
4220
+ }
4221
+
4222
+ .ds-tree ul {
4223
+ list-style: none;
4224
+ padding: 0;
4225
+ margin: 0;
4226
+ }
4227
+
4228
+ .ds-tree__item {
4229
+ display: flex;
4230
+ align-items: center;
4231
+ gap: var(--spacer-6);
4232
+ padding: var(--spacer-4) var(--spacer-8);
4233
+ border-radius: var(--radius-4);
4234
+ cursor: default;
4235
+ transition: background-color 0.12s ease;
4236
+ user-select: none;
4237
+ }
4238
+
4239
+ .ds-tree__item:hover {
4240
+ background-color: var(--bg-overlay-l1);
4241
+ }
4242
+
4243
+ .ds-tree__item.is-selected {
4244
+ background-color: var(--bg-brand-popup);
4245
+ }
4246
+
4247
+ .ds-tree__toggle {
4248
+ display: inline-flex;
4249
+ align-items: center;
4250
+ justify-content: center;
4251
+ width: 16px;
4252
+ height: 16px;
4253
+ flex-shrink: 0;
4254
+ cursor: pointer;
4255
+ color: var(--icon-secondary);
4256
+ transition: transform 0.15s ease;
4257
+ background: none;
4258
+ border: none;
4259
+ padding: 0;
4260
+ }
4261
+
4262
+ .ds-tree__toggle::before {
4263
+ content: '';
4264
+ display: block;
4265
+ width: 0;
4266
+ height: 0;
4267
+ border-left: 5px solid currentColor;
4268
+ border-top: 3.5px solid transparent;
4269
+ border-bottom: 3.5px solid transparent;
4270
+ }
4271
+
4272
+ .ds-tree__toggle.is-open {
4273
+ transform: rotate(90deg);
4274
+ }
4275
+
4276
+ .ds-tree__toggle.is-leaf {
4277
+ visibility: hidden;
4278
+ }
4279
+
4280
+ .ds-tree__checkbox {
4281
+ width: 14px;
4282
+ height: 14px;
4283
+ flex-shrink: 0;
4284
+ accent-color: var(--bg-brand);
4285
+ cursor: pointer;
4286
+ }
4287
+
4288
+ .ds-tree__icon {
4289
+ width: 16px;
4290
+ height: 16px;
4291
+ flex-shrink: 0;
4292
+ color: var(--icon-secondary);
4293
+ }
4294
+
4295
+ .ds-tree__label {
4296
+ flex: 1;
4297
+ color: var(--text-default);
4298
+ overflow: hidden;
4299
+ text-overflow: ellipsis;
4300
+ white-space: nowrap;
4301
+ }
4302
+
4303
+ .ds-tree__badge {
4304
+ font-size: var(--body-xs-font-size, 10px);
4305
+ color: var(--text-tertiary);
4306
+ margin-left: auto;
4307
+ }
4308
+
4309
+ .ds-tree__children {
4310
+ padding-left: var(--spacer-20);
4311
+ border-left: 1px solid var(--border-neutral-l1);
4312
+ margin-left: 7px;
4313
+ }
4314
+
4315
+ /* Tree line guides */
4316
+ .ds-tree--lined .ds-tree__children {
4317
+ border-left-color: var(--border-neutral-l1);
4318
+ }
4319
+
4320
+ .ds-tree--compact .ds-tree__item {
4321
+ padding: var(--spacer-2) var(--spacer-8);
4165
4322
  }
@@ -540,6 +540,24 @@
540
540
  .ds-input.is-error { border-color: var(--bg-error-default); }
541
541
  .ds-input.is-success { border-color: var(--bg-success-default); }
542
542
 
543
+ /* BUG-003 fix: ensure <select class="ds-input"> matches <input> height/padding */
544
+ select.ds-input,
545
+ .ds-input select {
546
+ height: 28px;
547
+ padding: 0 var(--spacer-24) 0 var(--spacer-12);
548
+ appearance: none;
549
+ -webkit-appearance: none;
550
+ -moz-appearance: none;
551
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239599A6' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'></polyline></svg>");
552
+ background-repeat: no-repeat;
553
+ background-position: right 8px center;
554
+ background-size: 12px;
555
+ cursor: pointer;
556
+ font: inherit;
557
+ color: var(--text-default);
558
+ }
559
+ select.ds-input::-ms-expand { display: none; }
560
+
543
561
  .ds-input__status-icon {
544
562
  position: absolute;
545
563
  right: 12px;
@@ -980,6 +998,18 @@
980
998
  }
981
999
  .ds-table__pagination { display: flex; align-items: center; gap: var(--spacer-8); }
982
1000
 
1001
+ /* Table variants (IMP-001) */
1002
+ .ds-table--striped tbody tr:nth-child(even) { background: var(--bg-base-secondary); }
1003
+ .ds-table--hover tbody tr:hover { background: var(--bg-overlay-l1); cursor: default; }
1004
+ .ds-table--compact th,
1005
+ .ds-table--compact td { padding: var(--spacer-6) var(--spacer-8); font-size: var(--body-xs-font-size); }
1006
+
1007
+ /* Table cell utilities */
1008
+ .ds-td--strong { font-weight: 500; color: var(--text-default); }
1009
+ .ds-td--actions { display: flex; gap: var(--spacer-4); align-items: center; }
1010
+ .ds-td--mono { font-family: var(--code-editor-font-family); font-variant-numeric: tabular-nums; }
1011
+ .ds-td--truncate { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1012
+
983
1013
  /* ── Tabs ──────────────────────────────────────────────────── */
984
1014
  /* ===== Tabs ===== */
985
1015
  .ds-tabs { display: flex; gap: var(--spacer-24); border-bottom: 1px solid var(--border-neutral-l1); }
@@ -1311,6 +1341,45 @@
1311
1341
  margin-top: var(--spacer-16);
1312
1342
  }
1313
1343
 
1344
+ /* IMP-004: Flat aliases — use these without BEM __ nesting */
1345
+ .ds-form-group {
1346
+ display: flex;
1347
+ flex-direction: column;
1348
+ gap: var(--spacer-6);
1349
+ margin-bottom: var(--spacer-12);
1350
+ }
1351
+
1352
+ .ds-form-label {
1353
+ display: block;
1354
+ font-size: var(--body-sm-font-size);
1355
+ font-weight: var(--font-weight-medium);
1356
+ color: var(--text-default);
1357
+ margin-bottom: var(--spacer-4);
1358
+ }
1359
+
1360
+ .ds-form-row {
1361
+ display: grid;
1362
+ grid-template-columns: repeat(2, 1fr);
1363
+ gap: var(--spacer-12);
1364
+ }
1365
+
1366
+ .ds-form-row--3 {
1367
+ grid-template-columns: repeat(3, 1fr);
1368
+ }
1369
+
1370
+ .ds-form-actions {
1371
+ display: flex;
1372
+ justify-content: flex-end;
1373
+ gap: var(--spacer-8);
1374
+ margin-top: var(--spacer-16);
1375
+ }
1376
+
1377
+ .ds-form-hint {
1378
+ font-size: var(--body-xs-font-size);
1379
+ color: var(--text-tertiary);
1380
+ margin-top: var(--spacer-2);
1381
+ }
1382
+
1314
1383
  .ds-radio-group {
1315
1384
  display: flex;
1316
1385
  gap: var(--spacer-16);
@@ -18,11 +18,11 @@
18
18
  --text-default: #D1D3DB;
19
19
  --text-default-hover: #FFFFFF;
20
20
  --text-default-active: #FFFFFF;
21
- --text-secondary: #9599A6;
21
+ --text-secondary: #A0A5B2;
22
22
  --text-secondary-hover: #D1D3DB;
23
23
  --text-secondary-active: #D1D3DB;
24
- --text-tertiary: #6B7280;
25
- --text-disabled: #6F7482;
24
+ --text-tertiary: #7D8493;
25
+ --text-disabled: #7D8493;
26
26
  --text-onbrand: #FFFFFF;
27
27
  --text-onaccent: #FFFFFF;
28
28
 
@@ -32,8 +32,8 @@
32
32
  --icon-secondary: #9599A6;
33
33
  --icon-secondary-hover: #D1D3DB;
34
34
  --icon-secondary-active: #D1D3DB;
35
- --icon-tertiary: #6B7280;
36
- --icon-disabled: #6F7482;
35
+ --icon-tertiary: #7D8493;
36
+ --icon-disabled: #7D8493;
37
37
  --icon-onbrand: #FFFFFF;
38
38
  --icon-onaccent: #FFFFFF;
39
39
 
package/css/utilities.css CHANGED
@@ -168,4 +168,122 @@
168
168
  @keyframes pulse {
169
169
  0%, 100% { opacity: 1; }
170
170
  50% { opacity: 0.5; }
171
- }
171
+ }
172
+
173
+ /* ===== ds- prefixed utility classes (IMP-002) =====
174
+ * Canonical ds-* aliases for all utility classes.
175
+ * Both prefixed and unprefixed versions are supported.
176
+ */
177
+
178
+ /* Flexbox */
179
+ .ds-flex { display: flex; }
180
+ .ds-flex-col { display: flex; flex-direction: column; }
181
+ .ds-flex--col { flex-direction: column; }
182
+ .ds-flex--wrap { flex-wrap: wrap; }
183
+ .ds-flex-1 { flex: 1; }
184
+ .ds-flex-none { flex: none; }
185
+ .ds-items-center { align-items: center; }
186
+ .ds-items-start { align-items: flex-start; }
187
+ .ds-items-end { align-items: flex-end; }
188
+ .ds-items-stretch { align-items: stretch; }
189
+ .ds-justify-center { justify-content: center; }
190
+ .ds-justify-between { justify-content: space-between; }
191
+ .ds-justify-end { justify-content: flex-end; }
192
+ .ds-justify-start { justify-content: flex-start; }
193
+
194
+ /* Gap */
195
+ .ds-gap-2 { gap: var(--spacer-2); }
196
+ .ds-gap-4 { gap: var(--spacer-4); }
197
+ .ds-gap-6 { gap: var(--spacer-6); }
198
+ .ds-gap-8 { gap: var(--spacer-8); }
199
+ .ds-gap-12 { gap: var(--spacer-12); }
200
+ .ds-gap-16 { gap: var(--spacer-16); }
201
+ .ds-gap-24 { gap: var(--spacer-24); }
202
+ .ds-gap-32 { gap: var(--spacer-32); }
203
+
204
+ /* Grid */
205
+ .ds-grid { display: grid; }
206
+ .ds-grid--2 { grid-template-columns: repeat(2, 1fr); }
207
+ .ds-grid--3 { grid-template-columns: repeat(3, 1fr); }
208
+ .ds-grid--4 { grid-template-columns: repeat(4, 1fr); }
209
+ .ds-grid--5 { grid-template-columns: repeat(5, 1fr); }
210
+ .ds-grid--6 { grid-template-columns: repeat(6, 1fr); }
211
+ .ds-grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
212
+ .ds-grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
213
+ .ds-grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
214
+
215
+ /* Display */
216
+ .ds-block { display: block; }
217
+ .ds-inline-block { display: inline-block; }
218
+ .ds-inline { display: inline; }
219
+ .ds-hidden { display: none; }
220
+
221
+ /* Text */
222
+ .ds-text-left { text-align: left; }
223
+ .ds-text-center { text-align: center; }
224
+ .ds-text-right { text-align: right; }
225
+ .ds-text-xs { font-size: var(--body-xs-font-size); }
226
+ .ds-text-sm { font-size: var(--body-sm-font-size); }
227
+ .ds-text-md { font-size: var(--body-md-font-size); }
228
+ .ds-text-base { font-size: var(--body-base-font-size); }
229
+ .ds-font-medium { font-weight: var(--font-weight-medium); }
230
+ .ds-font-strong { font-weight: var(--font-weight-strong); }
231
+ .ds-text-default { color: var(--text-default); }
232
+ .ds-text-secondary { color: var(--text-secondary); }
233
+ .ds-text-tertiary { color: var(--text-tertiary); }
234
+ .ds-text-brand { color: var(--text-brand); }
235
+ .ds-text-success { color: var(--status-success-default); }
236
+ .ds-text-warning { color: var(--status-warning-default); }
237
+ .ds-text-error { color: var(--status-error-default); }
238
+
239
+ /* Width */
240
+ .ds-w-full { width: 100%; }
241
+ .ds-w-auto { width: auto; }
242
+ .ds-max-w-md { max-width: 480px; }
243
+ .ds-max-w-lg { max-width: 640px; }
244
+ .ds-max-w-xl { max-width: 960px; }
245
+
246
+ /* Spacing (ds- prefixed margin/padding) */
247
+ .ds-m-0 { margin: var(--spacer-0); }
248
+ .ds-m-4 { margin: var(--spacer-4); }
249
+ .ds-m-8 { margin: var(--spacer-8); }
250
+ .ds-m-12 { margin: var(--spacer-12); }
251
+ .ds-m-16 { margin: var(--spacer-16); }
252
+ .ds-m-auto { margin: auto; }
253
+ .ds-mt-0 { margin-top: var(--spacer-0); }
254
+ .ds-mt-4 { margin-top: var(--spacer-4); }
255
+ .ds-mt-8 { margin-top: var(--spacer-8); }
256
+ .ds-mt-12 { margin-top: var(--spacer-12); }
257
+ .ds-mt-16 { margin-top: var(--spacer-16); }
258
+ .ds-mb-0 { margin-bottom: var(--spacer-0); }
259
+ .ds-mb-4 { margin-bottom: var(--spacer-4); }
260
+ .ds-mb-8 { margin-bottom: var(--spacer-8); }
261
+ .ds-mb-12 { margin-bottom: var(--spacer-12); }
262
+ .ds-mb-16 { margin-bottom: var(--spacer-16); }
263
+ .ds-p-0 { padding: var(--spacer-0); }
264
+ .ds-p-4 { padding: var(--spacer-4); }
265
+ .ds-p-8 { padding: var(--spacer-8); }
266
+ .ds-p-12 { padding: var(--spacer-12); }
267
+ .ds-p-16 { padding: var(--spacer-16); }
268
+ .ds-p-24 { padding: var(--spacer-24); }
269
+
270
+ /* Rounded */
271
+ .ds-rounded-2 { border-radius: var(--radius-2); }
272
+ .ds-rounded-4 { border-radius: var(--radius-4); }
273
+ .ds-rounded-6 { border-radius: var(--radius-6); }
274
+ .ds-rounded-8 { border-radius: var(--radius-8); }
275
+ .ds-rounded-full { border-radius: var(--radius-full); }
276
+
277
+ /* Position */
278
+ .ds-relative { position: relative; }
279
+ .ds-absolute { position: absolute; }
280
+ .ds-fixed { position: fixed; }
281
+ .ds-sticky { position: sticky; }
282
+
283
+ /* Overflow */
284
+ .ds-overflow-hidden { overflow: hidden; }
285
+ .ds-overflow-auto { overflow: auto; }
286
+
287
+ /* Cursor */
288
+ .ds-cursor-pointer { cursor: pointer; }
289
+ .ds-cursor-not-allowed { cursor: not-allowed; }
@@ -1,12 +1 @@
1
- @import url('colors_and_type.css');
2
- @import url('theme-light.css');
3
- @import url('theme-dark.css');
4
- @import url('brand-themes.css');
5
- @import url('scaffold.css');
6
- @import url('components.css');
7
- @import url('components-ext.css');
8
- @import url('states.css');
9
- @import url('utilities.css');
10
- @import url('responsive.css');
11
- @import url('accessibility.css');
12
- @import url('animations.css');
1
+ @import "../css/scaffold.css";@import "../css/colors_and_type.css";@import "../css/theme-light.css";@import "../css/brand-themes.css";@import "../css/components.css";@import "../css/components-ext.css";@import "../css/states.css";@import "../css/responsive.css";@import "../css/animations.css";@import "../css/accessibility.css";@import "../css/utilities.css";
@@ -0,0 +1 @@
1
+ @import "../css/scaffold.css";@import "../css/colors_and_type.css";@import "../css/theme-light.css";@import "../css/brand-themes.css";@import "../css/components.css";@import "../css/components-ext.css";@import "../css/states.css";@import "../css/responsive.css";@import "../css/animations.css";@import "../css/accessibility.css";@import "../css/utilities.css";