@revikornmann/muka-ui 0.6.0 → 0.8.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.
Files changed (100) hide show
  1. package/dist/cjs/components/Alert/Alert.css +7 -0
  2. package/dist/cjs/components/DataPieChart/DataPieChart.css +29 -0
  3. package/dist/cjs/components/DataPieChart/DataPieChart.js +20 -3
  4. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  5. package/dist/cjs/components/Dialog/Dialog.js +64 -7
  6. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  7. package/dist/cjs/components/NavigationTransition/NavigationTransition.js +25 -8
  8. package/dist/cjs/components/NavigationTransition/NavigationTransition.js.map +1 -1
  9. package/dist/cjs/components/PhotoUploader/PhotoUploader.css +125 -0
  10. package/dist/cjs/components/PhotoUploader/PhotoUploader.js +257 -0
  11. package/dist/cjs/components/PhotoUploader/PhotoUploader.js.map +1 -0
  12. package/dist/cjs/components/PhotoUploader/index.js +6 -0
  13. package/dist/cjs/components/PhotoUploader/index.js.map +1 -0
  14. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
  15. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
  16. package/dist/cjs/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
  17. package/dist/cjs/components/SpecList/SpecList.css +34 -21
  18. package/dist/cjs/components/SpecList/SpecList.js +9 -3
  19. package/dist/cjs/components/SpecList/SpecList.js.map +1 -1
  20. package/dist/cjs/components/Thumbnail/Thumbnail.css +171 -0
  21. package/dist/cjs/components/Thumbnail/Thumbnail.js +55 -0
  22. package/dist/cjs/components/Thumbnail/Thumbnail.js.map +1 -0
  23. package/dist/cjs/components/Thumbnail/index.js +6 -0
  24. package/dist/cjs/components/Thumbnail/index.js.map +1 -0
  25. package/dist/cjs/components/index.js +5 -1
  26. package/dist/cjs/components/index.js.map +1 -1
  27. package/dist/esm/components/Alert/Alert.css +7 -0
  28. package/dist/esm/components/DataPieChart/DataPieChart.css +29 -0
  29. package/dist/esm/components/DataPieChart/DataPieChart.js +20 -3
  30. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  31. package/dist/esm/components/Dialog/Dialog.js +31 -7
  32. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  33. package/dist/esm/components/NavigationTransition/NavigationTransition.js +25 -8
  34. package/dist/esm/components/NavigationTransition/NavigationTransition.js.map +1 -1
  35. package/dist/esm/components/PhotoUploader/PhotoUploader.css +125 -0
  36. package/dist/esm/components/PhotoUploader/PhotoUploader.js +254 -0
  37. package/dist/esm/components/PhotoUploader/PhotoUploader.js.map +1 -0
  38. package/dist/esm/components/PhotoUploader/index.js +2 -0
  39. package/dist/esm/components/PhotoUploader/index.js.map +1 -0
  40. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.css +32 -2
  41. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js +13 -2
  42. package/dist/esm/components/ProgressAccordeon/ProgressAccordeon.js.map +1 -1
  43. package/dist/esm/components/SpecList/SpecList.css +34 -21
  44. package/dist/esm/components/SpecList/SpecList.js +9 -3
  45. package/dist/esm/components/SpecList/SpecList.js.map +1 -1
  46. package/dist/esm/components/Thumbnail/Thumbnail.css +171 -0
  47. package/dist/esm/components/Thumbnail/Thumbnail.js +52 -0
  48. package/dist/esm/components/Thumbnail/Thumbnail.js.map +1 -0
  49. package/dist/esm/components/Thumbnail/index.js +2 -0
  50. package/dist/esm/components/Thumbnail/index.js.map +1 -0
  51. package/dist/esm/components/index.js +2 -0
  52. package/dist/esm/components/index.js.map +1 -1
  53. package/dist/styles/components/Alert.css +7 -0
  54. package/dist/styles/components/DataPieChart.css +29 -0
  55. package/dist/styles/components/PhotoUploader.css +125 -0
  56. package/dist/styles/components/ProgressAccordeon.css +32 -2
  57. package/dist/styles/components/SpecList.css +34 -21
  58. package/dist/styles/components/Thumbnail.css +171 -0
  59. package/dist/styles/index.css +867 -449
  60. package/dist/styles/muka-dark.css +867 -449
  61. package/dist/styles/muka-light.css +867 -449
  62. package/dist/styles/tokens-bouwplan-dark.css +37 -0
  63. package/dist/styles/tokens-bouwplan-light.css +37 -0
  64. package/dist/styles/tokens-fscl-dark.css +37 -0
  65. package/dist/styles/tokens-fscl-light.css +37 -0
  66. package/dist/styles/tokens-grip-dark.css +37 -0
  67. package/dist/styles/tokens-grip-light.css +37 -0
  68. package/dist/styles/tokens-muka-dark.css +37 -0
  69. package/dist/styles/tokens-muka-light.css +37 -0
  70. package/dist/styles/tokens-wireframe-dark.css +37 -0
  71. package/dist/styles/tokens-wireframe-light.css +37 -0
  72. package/dist/styles/wireframe-dark.css +867 -449
  73. package/dist/styles/wireframe-light.css +867 -449
  74. package/dist/types/components/DataPieChart/DataPieChart.d.ts +7 -0
  75. package/dist/types/components/DataPieChart/DataPieChart.d.ts.map +1 -1
  76. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  77. package/dist/types/components/FileUpload/FileUpload.d.ts +1 -1
  78. package/dist/types/components/FileUpload/FileUpload.d.ts.map +1 -1
  79. package/dist/types/components/FileUpload/FileUploadItem.d.ts +1 -1
  80. package/dist/types/components/FileUpload/FileUploadItem.d.ts.map +1 -1
  81. package/dist/types/components/NavigationTransition/NavigationTransition.d.ts +3 -1
  82. package/dist/types/components/NavigationTransition/NavigationTransition.d.ts.map +1 -1
  83. package/dist/types/components/PhotoUploader/PhotoUploader.d.ts +71 -0
  84. package/dist/types/components/PhotoUploader/PhotoUploader.d.ts.map +1 -0
  85. package/dist/types/components/PhotoUploader/index.d.ts +2 -0
  86. package/dist/types/components/PhotoUploader/index.d.ts.map +1 -0
  87. package/dist/types/components/ProgressAccordeon/ProgressAccordeon.d.ts.map +1 -1
  88. package/dist/types/components/SpecList/SpecList.d.ts +13 -5
  89. package/dist/types/components/SpecList/SpecList.d.ts.map +1 -1
  90. package/dist/types/components/Thumbnail/Thumbnail.d.ts +77 -0
  91. package/dist/types/components/Thumbnail/Thumbnail.d.ts.map +1 -0
  92. package/dist/types/components/Thumbnail/index.d.ts +2 -0
  93. package/dist/types/components/Thumbnail/index.d.ts.map +1 -0
  94. package/dist/types/components/index.d.ts +2 -0
  95. package/dist/types/components/index.d.ts.map +1 -1
  96. package/package.json +1 -1
  97. package/scripts/build-tokens.js +12 -1
  98. package/tokens/t1-primitives/motion.json +21 -0
  99. package/tokens/t2-alias/base.json +17 -0
  100. package/tokens/t3-semantics/ui.json +12 -0
@@ -301,6 +301,17 @@ body {
301
301
  --container-gap-default: 2rem;
302
302
  --container-gap-compact: 1.5rem;
303
303
  --container-gap-spacious: 2.5rem;
304
+ --duration-none: 0ms;
305
+ --duration-instant: 100ms;
306
+ --duration-fast: 150ms;
307
+ --duration-normal: 200ms;
308
+ --duration-slow: 300ms;
309
+ --duration-slower: 500ms;
310
+ --easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
311
+ --easing-enter: cubic-bezier(0, 0, 0.2, 1);
312
+ --easing-exit: cubic-bezier(0.4, 0, 1, 1);
313
+ --easing-spring: cubic-bezier(0.16, 1, 0.3, 1);
314
+ --easing-linear: linear;
304
315
  --color-white: #ffffff;
305
316
  --color-black: #000000;
306
317
  --color-gray-1: #fcfcfc;
@@ -1322,6 +1333,17 @@ body {
1322
1333
  --alias-radius-xl: 1.5rem;
1323
1334
  --alias-radius-2xl: 3rem;
1324
1335
  --alias-radius-full: 999rem;
1336
+ --alias-motion-duration-none: 0ms;
1337
+ --alias-motion-duration-instant: 100ms;
1338
+ --alias-motion-duration-fast: 150ms;
1339
+ --alias-motion-duration-normal: 200ms;
1340
+ --alias-motion-duration-slow: 300ms;
1341
+ --alias-motion-duration-slower: 500ms;
1342
+ --alias-motion-easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
1343
+ --alias-motion-easing-enter: cubic-bezier(0, 0, 0.2, 1);
1344
+ --alias-motion-easing-exit: cubic-bezier(0.4, 0, 1, 1);
1345
+ --alias-motion-easing-spring: cubic-bezier(0.16, 1, 0.3, 1);
1346
+ --alias-motion-easing-linear: linear;
1325
1347
  --section-padding-vertical-default: 2rem;
1326
1348
  --section-padding-vertical-compact: 1.5rem;
1327
1349
  --section-padding-vertical-spacious: 2.5rem;
@@ -1529,6 +1551,12 @@ body {
1529
1551
  --shadow-level6: 0 48px 96px 0 rgba(0, 0, 0, 0.220), inset 0 0 1px 0 rgba(0, 0, 0, 0.220);
1530
1552
  --shadow-bevel: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1531
1553
  --shadow-sunken: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.090), inset 0px 2px 4px 0px rgba(0, 0, 0, 0.090);
1554
+ --motion-duration-micro: 150ms;
1555
+ --motion-duration-component: 200ms;
1556
+ --motion-duration-view: 300ms;
1557
+ --motion-easing-default: cubic-bezier(0.4, 0, 0.2, 1);
1558
+ --motion-easing-enter: cubic-bezier(0.16, 1, 0.3, 1);
1559
+ --motion-easing-exit: cubic-bezier(0.4, 0, 1, 1);
1532
1560
  --button-color-primary-background-default: #3e63dd;
1533
1561
  --button-color-primary-background-hover: #3358d4;
1534
1562
  --button-color-primary-background-pressed: #3a5ccc;
@@ -2224,6 +2252,15 @@ body {
2224
2252
  --container-gap-spacious: 3rem;
2225
2253
  }
2226
2254
 
2255
+ /* Accessibility: disable motion for users who prefer reduced motion */
2256
+ @media (prefers-reduced-motion: reduce) {
2257
+ :root {
2258
+ --motion-duration-micro: 0ms;
2259
+ --motion-duration-component: 0ms;
2260
+ --motion-duration-view: 0ms;
2261
+ }
2262
+ }
2263
+
2227
2264
 
2228
2265
  /* ========== Component Styles ========== */
2229
2266
  /* View */
@@ -3308,6 +3345,180 @@ body {
3308
3345
  }
3309
3346
 
3310
3347
 
3348
+ /* Thumbnail */
3349
+ /* Thumbnail Component Styles - Using Muka Design Tokens */
3350
+
3351
+ .muka-thumbnail {
3352
+ position: relative;
3353
+ flex-shrink: 0;
3354
+ }
3355
+
3356
+ /* The frame carries the border, background and shape clip. Keeping it separate
3357
+ from the root lets the remove (×) button sit outside the clip (needed for the
3358
+ circular/ellipse shape, whose corners would otherwise clip the button). */
3359
+ .muka-thumbnail__frame {
3360
+ position: absolute;
3361
+ inset: 0;
3362
+ overflow: hidden;
3363
+ border: var(--border-width-regular, 1px) solid var(--color-black-alpha-3);
3364
+ border-radius: var(--border-radius-lg);
3365
+ background-color: var(--color-surface-level1);
3366
+ }
3367
+
3368
+ /* ─── Shapes ──────────────────────────────────────────── */
3369
+ .muka-thumbnail--4-3 {
3370
+ width: 160px;
3371
+ height: 120px;
3372
+ }
3373
+
3374
+ .muka-thumbnail--1-1 {
3375
+ width: 120px;
3376
+ height: 120px;
3377
+ }
3378
+
3379
+ .muka-thumbnail--ellipse {
3380
+ width: 120px;
3381
+ height: 120px;
3382
+ }
3383
+
3384
+ .muka-thumbnail--ellipse .muka-thumbnail__frame {
3385
+ border-radius: var(--border-radius-full);
3386
+ }
3387
+
3388
+ /* Image fills the frame, cropped to cover. Sits at scale(1) by default so the
3389
+ interactive hover zoom has a clean origin. */
3390
+ .muka-thumbnail__image {
3391
+ position: absolute;
3392
+ inset: 0;
3393
+ width: 100%;
3394
+ height: 100%;
3395
+ object-fit: cover;
3396
+ display: block;
3397
+ transform-origin: center;
3398
+ /* Micro-interaction: hover zoom eases out over the "micro" duration. */
3399
+ transition: transform var(--motion-duration-micro) var(--motion-easing-enter);
3400
+ }
3401
+
3402
+ /* ─── Interactive (click-to-enlarge) ──────────────────── */
3403
+ .muka-thumbnail__trigger {
3404
+ position: absolute;
3405
+ inset: 0;
3406
+ padding: 0;
3407
+ border: 0;
3408
+ background: none;
3409
+ cursor: pointer;
3410
+ overflow: hidden;
3411
+ }
3412
+
3413
+ .muka-thumbnail__trigger:focus-visible {
3414
+ outline: 2px solid var(--color-border-focus);
3415
+ outline-offset: -2px;
3416
+ }
3417
+
3418
+ /* On hover the image scales up ~8px (160px → 168px) with an ease-out feel. */
3419
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3420
+ transform: scale(1.05);
3421
+ }
3422
+
3423
+ /* ─── Loading overlay + progress donut ────────────────── */
3424
+ .muka-thumbnail__overlay {
3425
+ position: absolute;
3426
+ inset: 0;
3427
+ display: flex;
3428
+ align-items: center;
3429
+ justify-content: center;
3430
+ background-color: var(--dialog-color-backdrop);
3431
+ }
3432
+
3433
+ .muka-thumbnail__progress {
3434
+ width: 40px;
3435
+ height: 40px;
3436
+ }
3437
+
3438
+ /* ─── Error / corrupt state ───────────────────────────── */
3439
+ .muka-thumbnail--error .muka-thumbnail__frame {
3440
+ background-color: var(--alias-color-state-error-muted);
3441
+ border-color: var(--alias-color-state-error-default);
3442
+ }
3443
+
3444
+ .muka-thumbnail__error {
3445
+ position: absolute;
3446
+ inset: 0;
3447
+ display: flex;
3448
+ flex-direction: column;
3449
+ align-items: center;
3450
+ justify-content: center;
3451
+ gap: var(--spacing-2);
3452
+ padding: var(--spacing-3);
3453
+ text-align: center;
3454
+ }
3455
+
3456
+ .muka-thumbnail__error-icon {
3457
+ color: var(--alert-color-error-accent);
3458
+ }
3459
+
3460
+ .muka-thumbnail__caption {
3461
+ max-width: 100%;
3462
+ overflow: hidden;
3463
+ text-overflow: ellipsis;
3464
+ white-space: nowrap;
3465
+ color: var(--alert-color-error-accent);
3466
+ font-family: var(--text-body-sm-regular-fontFamily);
3467
+ font-size: var(--text-body-sm-regular-fontSize);
3468
+ font-weight: var(--text-body-sm-regular-fontWeight);
3469
+ line-height: var(--text-body-sm-regular-lineHeight);
3470
+ }
3471
+
3472
+ /* ─── Remove (×) button ───────────────────────────────── */
3473
+ .muka-thumbnail__remove {
3474
+ position: absolute;
3475
+ top: var(--spacing-2);
3476
+ right: var(--spacing-2);
3477
+ display: flex;
3478
+ align-items: center;
3479
+ justify-content: center;
3480
+ width: var(--size-2xl);
3481
+ height: var(--size-2xl);
3482
+ padding: 0;
3483
+ color: var(--button-color-tertiary-foreground-default);
3484
+ background-color: var(--button-color-tertiary-background-default);
3485
+ border: var(--border-width-regular, 1px) solid var(--button-color-tertiary-border-default);
3486
+ border-radius: var(--border-radius-lg);
3487
+ cursor: pointer;
3488
+ transition: background-color var(--motion-duration-micro) var(--motion-easing-enter),
3489
+ border-color var(--motion-duration-micro) var(--motion-easing-enter);
3490
+ }
3491
+
3492
+ .muka-thumbnail__remove:hover {
3493
+ color: var(--button-color-tertiary-foreground-hover);
3494
+ background-color: var(--button-color-tertiary-background-hover);
3495
+ border-color: var(--button-color-tertiary-border-hover);
3496
+ }
3497
+
3498
+ .muka-thumbnail__remove:active {
3499
+ color: var(--button-color-tertiary-foreground-pressed);
3500
+ background-color: var(--button-color-tertiary-background-pressed);
3501
+ border-color: var(--button-color-tertiary-border-pressed);
3502
+ }
3503
+
3504
+ .muka-thumbnail__remove:focus-visible {
3505
+ outline: 2px solid var(--color-border-focus);
3506
+ outline-offset: 2px;
3507
+ }
3508
+
3509
+ /* ─── Reduced motion ──────────────────────────────────── */
3510
+ @media (prefers-reduced-motion: reduce) {
3511
+ .muka-thumbnail__image,
3512
+ .muka-thumbnail__remove {
3513
+ transition: none;
3514
+ }
3515
+
3516
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3517
+ transform: none;
3518
+ }
3519
+ }
3520
+
3521
+
3311
3522
  /* Textarea */
3312
3523
  /* Textarea Component Styles - Using Muka Design Tokens */
3313
3524
 
@@ -4183,55 +4394,48 @@ body {
4183
4394
  .muka-spec-list {
4184
4395
  margin: 0;
4185
4396
  padding: 0;
4186
- background-color: var(--color-surface-level1);
4187
- border-radius: var(--radius-md);
4188
- overflow: hidden;
4189
4397
  }
4190
4398
 
4191
4399
  /* ─── Row ─────────────────────────────────────────────── */
4192
4400
 
4193
4401
  .muka-spec-row {
4194
4402
  display: flex;
4195
- align-items: baseline;
4403
+ align-items: flex-start;
4196
4404
  gap: var(--spacing-3);
4197
- padding: var(--spacing-3) var(--spacing-4);
4198
- border-top: var(--border-width-regular) solid var(--color-border-default);
4199
- }
4200
-
4201
- .muka-spec-row:first-child {
4202
- border-top: none;
4405
+ padding-bottom: var(--spacing-3);
4203
4406
  }
4204
4407
 
4205
4408
  /* ─── Label ───────────────────────────────────────────── */
4206
4409
 
4207
4410
  .muka-spec-row__label {
4208
4411
  flex: 0 0 auto;
4209
- min-width: 40%;
4210
4412
  margin: 0;
4211
4413
  color: var(--color-text-subtle-default);
4212
4414
  font-family: var(--text-body-md-regular-fontFamily);
4213
4415
  font-weight: var(--text-body-md-regular-fontWeight);
4214
4416
  font-size: var(--text-body-md-regular-fontSize);
4215
4417
  line-height: var(--text-body-md-regular-lineHeight);
4418
+ overflow: hidden;
4419
+ text-overflow: ellipsis;
4420
+ white-space: nowrap;
4216
4421
  }
4217
4422
 
4218
4423
  /* ─── Value ───────────────────────────────────────────── */
4219
4424
 
4220
4425
  .muka-spec-row__value {
4221
- flex: 1 1 auto;
4426
+ flex: 1 1 0;
4427
+ min-width: 0;
4222
4428
  margin: 0;
4223
4429
  display: flex;
4224
4430
  flex-direction: column;
4225
- align-items: flex-end;
4226
- text-align: right;
4227
4431
  color: var(--color-text-default-default);
4228
4432
  }
4229
4433
 
4230
4434
  .muka-spec-row__value-text {
4231
- font-family: var(--text-body-md-medium-fontFamily);
4232
- font-weight: var(--text-body-md-medium-fontWeight);
4233
- font-size: var(--text-body-md-medium-fontSize);
4234
- line-height: var(--text-body-md-medium-lineHeight);
4435
+ font-family: var(--text-body-md-regular-fontFamily);
4436
+ font-weight: var(--text-body-md-regular-fontWeight);
4437
+ font-size: var(--text-body-md-regular-fontSize);
4438
+ line-height: var(--text-body-md-regular-lineHeight);
4235
4439
  }
4236
4440
 
4237
4441
  .muka-spec-row__hint {
@@ -4242,10 +4446,30 @@ body {
4242
4446
  line-height: var(--text-body-sm-regular-lineHeight);
4243
4447
  }
4244
4448
 
4245
- /* ─── Compact density ─────────────────────────────────── */
4449
+ /* ─── Label width (horizontal stacking) ───────────────── */
4450
+
4451
+ .muka-spec-list--label-small .muka-spec-row__label {
4452
+ width: 80px;
4453
+ }
4454
+
4455
+ .muka-spec-list--label-medium .muka-spec-row__label {
4456
+ width: 120px;
4457
+ }
4458
+
4459
+ .muka-spec-list--label-large .muka-spec-row__label {
4460
+ width: 160px;
4461
+ }
4462
+
4463
+ /* ─── Vertical stacking ───────────────────────────────── */
4464
+
4465
+ .muka-spec-list--vertical .muka-spec-row {
4466
+ flex-direction: column;
4467
+ gap: var(--spacing-1);
4468
+ }
4246
4469
 
4247
- .muka-spec-list--compact .muka-spec-row {
4248
- padding: var(--spacing-2) var(--spacing-4);
4470
+ .muka-spec-list--vertical .muka-spec-row__label {
4471
+ width: 100%;
4472
+ white-space: normal;
4249
4473
  }
4250
4474
 
4251
4475
 
@@ -4596,232 +4820,38 @@ body {
4596
4820
  }
4597
4821
 
4598
4822
 
4599
- /* Select */
4600
- /* Select Component Styles - Aligned with Input for consistency */
4823
+ /* SegmentGroup */
4824
+ /* SegmentGroup Component Styles - Using Muka Design Tokens */
4601
4825
 
4602
- .muka-select {
4826
+ /* Container */
4827
+ .muka-segmentgroup {
4603
4828
  display: inline-flex;
4604
- flex-direction: column;
4605
- gap: var(--spacing-2);
4606
- }
4607
-
4608
- .muka-select--full-width {
4609
- width: 100%;
4610
- }
4611
-
4612
- /* Label */
4613
- .muka-select__label {
4614
- color: var(--color-text-default-default);
4615
- cursor: pointer;
4616
- }
4617
-
4618
- .muka-select__label--sm {
4619
- font-family: var(--text-label-sm-semibold-fontFamily);
4620
- font-weight: var(--text-label-sm-semibold-fontWeight);
4621
- font-size: var(--text-label-sm-semibold-fontSize);
4622
- line-height: var(--text-label-sm-semibold-lineHeight);
4623
- }
4624
-
4625
- .muka-select__label--md {
4626
- font-family: var(--text-label-md-semibold-fontFamily);
4627
- font-weight: var(--text-label-md-semibold-fontWeight);
4628
- font-size: var(--text-label-md-semibold-fontSize);
4629
- line-height: var(--text-label-md-semibold-lineHeight);
4630
- }
4631
-
4632
- .muka-select__label--lg {
4633
- font-family: var(--text-label-lg-semibold-fontFamily);
4634
- font-weight: var(--text-label-lg-semibold-fontWeight);
4635
- font-size: var(--text-label-lg-semibold-fontSize);
4636
- line-height: var(--text-label-lg-semibold-lineHeight);
4637
- }
4638
-
4639
- .muka-select__required {
4640
- color: var(--color-state-error-foreground);
4641
- }
4642
-
4643
- .muka-select__label--sm + .muka-select__field--disabled,
4644
- .muka-select__label--md + .muka-select__field--disabled,
4645
- .muka-select__label--lg + .muka-select__field--disabled {
4646
- cursor: not-allowed;
4647
- }
4648
-
4649
- /* Field container — same as Input: 1px border, radius, padding, inset shadow */
4650
- .muka-select__field {
4651
- display: flex;
4652
4829
  align-items: center;
4653
- gap: var(--spacing-2);
4830
+ gap: 0;
4831
+ padding: var(--segmentgroup-container-padding);
4832
+ background-color: var(--segmentgroup-container-background);
4833
+ border-radius: var(--segmentgroup-container-radius);
4654
4834
  position: relative;
4655
- background-color: var(--input-field-color-default-background);
4656
- border: var(--border-width-regular) solid var(--input-field-color-default-border);
4657
- border-radius: var(--input-field-radius-md);
4658
- padding: var(--input-field-padding-y) var(--input-field-padding-x);
4659
- transition: border-color 0.2s ease, background-color 0.2s ease;
4660
- cursor: pointer;
4661
- box-sizing: border-box;
4835
+ transition: all 0.2s ease;
4662
4836
  }
4663
4837
 
4664
- /* Inset shadow — same as Input (single subtle line) */
4665
- .muka-select__field::after {
4838
+ /* Inset shadow on container */
4839
+ .muka-segmentgroup::after {
4666
4840
  content: '';
4667
4841
  position: absolute;
4668
4842
  inset: 0;
4669
4843
  border-radius: inherit;
4670
- box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.08);
4844
+ box-shadow: var(--segmentgroup-container-shadow);
4671
4845
  pointer-events: none;
4672
4846
  }
4673
4847
 
4674
- /* Size variants — same radius/height as Input */
4675
- .muka-select__field--sm {
4676
- min-height: var(--input-field-height-sm);
4677
- border-radius: var(--input-field-radius-sm);
4678
- }
4679
-
4680
- .muka-select__field--md {
4681
- min-height: var(--input-field-height-default);
4682
- border-radius: var(--input-field-radius-md);
4848
+ /* Full width variant */
4849
+ .muka-segmentgroup--full-width {
4850
+ width: 100%;
4683
4851
  }
4684
4852
 
4685
- .muka-select__field--lg {
4686
- min-height: var(--input-field-height-lg);
4687
- border-radius: var(--input-field-radius-lg);
4688
- }
4689
-
4690
- /* Hover — no visual change (same as Input) */
4691
-
4692
- /* Focus (active) — same as Input: 2px border, padding compensation */
4693
- .muka-select__field--focused:not(.muka-select__field--disabled) {
4694
- border-width: var(--border-width-bold);
4695
- border-color: var(--input-field-color-focus-border);
4696
- background-color: var(--input-field-color-focus-background);
4697
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4698
- }
4699
-
4700
- /* Error — same as Input: 2px border, padding compensation */
4701
- .muka-select__field--error:not(.muka-select__field--disabled) {
4702
- border-width: var(--border-width-bold);
4703
- border-color: var(--input-field-color-error-border);
4704
- background-color: var(--input-field-color-error-background);
4705
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4706
- }
4707
-
4708
- /* Disabled — same as Input */
4709
- .muka-select__field--disabled {
4710
- background-color: var(--input-field-color-disabled-background);
4711
- border-color: var(--input-field-color-disabled-border);
4712
- cursor: not-allowed;
4713
- }
4714
-
4715
- .muka-select__field--disabled::after {
4716
- display: none;
4717
- }
4718
-
4719
- /* Native select — padding on field so native has 0 + right space for chevron */
4720
- .muka-select__native {
4721
- appearance: none;
4722
- -webkit-appearance: none;
4723
- flex: 1;
4724
- border: none;
4725
- outline: none;
4726
- background: transparent;
4727
- color: var(--input-field-color-default-foreground);
4728
- font-family: var(--text-input-md-fontFamily);
4729
- font-weight: var(--text-input-md-fontWeight);
4730
- font-size: var(--text-input-md-fontSize);
4731
- line-height: var(--text-input-md-lineHeight);
4732
- padding: 0;
4733
- padding-right: calc(var(--input-field-padding-x) + 1.5rem);
4734
- cursor: pointer;
4735
- min-width: 0;
4736
- width: 100%;
4737
- }
4738
-
4739
- .muka-select__field--sm .muka-select__native {
4740
- font-family: var(--text-input-sm-fontFamily);
4741
- font-weight: var(--text-input-sm-fontWeight);
4742
- font-size: var(--text-input-sm-fontSize);
4743
- line-height: var(--text-input-sm-lineHeight);
4744
- }
4745
-
4746
- .muka-select__field--lg .muka-select__native {
4747
- font-family: var(--text-input-lg-fontFamily);
4748
- font-weight: var(--text-input-lg-fontWeight);
4749
- font-size: var(--text-input-lg-fontSize);
4750
- line-height: var(--text-input-lg-lineHeight);
4751
- }
4752
-
4753
- .muka-select__field--disabled .muka-select__native {
4754
- color: var(--input-field-color-disabled-foreground);
4755
- cursor: not-allowed;
4756
- }
4757
-
4758
- /* Chevron — aligned with field padding */
4759
- .muka-select__chevron {
4760
- display: inline-flex;
4761
- align-items: center;
4762
- position: absolute;
4763
- right: var(--input-field-padding-x);
4764
- pointer-events: none;
4765
- color: var(--color-text-subtle-default);
4766
- }
4767
-
4768
- .muka-select__field--disabled .muka-select__chevron {
4769
- color: var(--input-field-color-disabled-foreground);
4770
- }
4771
-
4772
- /* Helper text — same as Input */
4773
- .muka-select__helper {
4774
- font-family: var(--text-label-sm-regular-fontFamily);
4775
- font-weight: var(--text-label-sm-regular-fontWeight);
4776
- font-size: var(--text-label-sm-regular-fontSize);
4777
- line-height: var(--text-label-sm-regular-lineHeight);
4778
- color: var(--color-text-subtle-default);
4779
- margin: 0;
4780
- }
4781
-
4782
- /* Error message — same as Input */
4783
- .muka-select__error {
4784
- font-family: var(--text-label-sm-regular-fontFamily);
4785
- font-weight: var(--text-label-sm-regular-fontWeight);
4786
- font-size: var(--text-label-sm-regular-fontSize);
4787
- line-height: var(--text-label-sm-regular-lineHeight);
4788
- color: var(--color-state-error-foreground);
4789
- margin: 0;
4790
- }
4791
-
4792
-
4793
- /* SegmentGroup */
4794
- /* SegmentGroup Component Styles - Using Muka Design Tokens */
4795
-
4796
- /* Container */
4797
- .muka-segmentgroup {
4798
- display: inline-flex;
4799
- align-items: center;
4800
- gap: 0;
4801
- padding: var(--segmentgroup-container-padding);
4802
- background-color: var(--segmentgroup-container-background);
4803
- border-radius: var(--segmentgroup-container-radius);
4804
- position: relative;
4805
- transition: all 0.2s ease;
4806
- }
4807
-
4808
- /* Inset shadow on container */
4809
- .muka-segmentgroup::after {
4810
- content: '';
4811
- position: absolute;
4812
- inset: 0;
4813
- border-radius: inherit;
4814
- box-shadow: var(--segmentgroup-container-shadow);
4815
- pointer-events: none;
4816
- }
4817
-
4818
- /* Full width variant */
4819
- .muka-segmentgroup--full-width {
4820
- width: 100%;
4821
- }
4822
-
4823
- .muka-segmentgroup--full-width .muka-segmentgroup__segment {
4824
- flex: 1;
4853
+ .muka-segmentgroup--full-width .muka-segmentgroup__segment {
4854
+ flex: 1;
4825
4855
  }
4826
4856
 
4827
4857
  /* Pill */
@@ -5529,80 +5559,271 @@ body {
5529
5559
  }
5530
5560
 
5531
5561
 
5532
- /* ProgressTracker */
5533
- /* ProgressTracker Component Styles — Using Muka Design Tokens */
5562
+ /* Radio */
5563
+ /* Radio Component Styles - Using Muka Design Tokens */
5534
5564
 
5535
- /* ─── Root ──────────────────────────────────────────────── */
5536
- .muka-progress-tracker {
5537
- width: 100%;
5538
- padding-bottom: var(--spacing-7);
5565
+ /* Wrapper - clickable label container */
5566
+ .muka-radio {
5567
+ display: inline-flex;
5568
+ align-items: center;
5569
+ gap: var(--spacing-4);
5570
+ cursor: pointer;
5571
+ user-select: none;
5539
5572
  }
5540
5573
 
5541
- /* ─── Track (layered container) ─────────────────────────── */
5542
- .muka-progress-tracker__track {
5574
+ .muka-radio--disabled {
5575
+ cursor: not-allowed;
5576
+ opacity: 0.6;
5577
+ }
5578
+
5579
+ /* Control container */
5580
+ .muka-radio__control {
5543
5581
  position: relative;
5544
- /* Vertical padding = (indicator size - connector height) / 2 = (32 - 4) / 2 = 14px */
5545
- padding-top: 14px;
5546
- padding-bottom: 14px;
5582
+ display: inline-flex;
5583
+ align-items: center;
5584
+ justify-content: center;
5585
+ flex-shrink: 0;
5547
5586
  }
5548
5587
 
5549
- /* ─── Steps layer (on top) ──────────────────────────────── */
5550
- .muka-progress-tracker__steps {
5588
+ /* Hidden native input */
5589
+ .muka-radio__input {
5551
5590
  position: absolute;
5552
- inset: 0;
5553
- display: flex;
5554
- align-items: flex-start;
5555
- justify-content: space-between;
5556
- z-index: 2;
5591
+ width: 1px;
5592
+ height: 1px;
5593
+ padding: 0;
5594
+ margin: -1px;
5595
+ overflow: hidden;
5596
+ clip: rect(0, 0, 0, 0);
5597
+ white-space: nowrap;
5598
+ border: 0;
5557
5599
  }
5558
5600
 
5559
- /* ─── Individual step ───────────────────────────────────── */
5560
- .muka-progress-tracker__step {
5601
+ /* Visual indicator (circle) */
5602
+ .muka-radio__indicator {
5561
5603
  display: flex;
5562
- flex-direction: column;
5563
5604
  align-items: center;
5564
- gap: 7px;
5565
- position: relative;
5605
+ justify-content: center;
5606
+ width: var(--radio-size-default);
5607
+ height: var(--radio-size-default);
5608
+ border-radius: var(--border-radius-full);
5609
+ background-color: var(--radio-color-default-background);
5610
+ border: var(--border-width-regular) solid var(--radio-color-default-border);
5611
+ transition: all 0.15s ease;
5612
+ box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
5566
5613
  }
5567
5614
 
5568
- /* ─── Step indicator (circle) ───────────────────────────── */
5569
- .muka-progress-tracker__indicator {
5570
- width: 32px;
5571
- height: 32px;
5615
+ /* Size variants */
5616
+ .muka-radio--sm .muka-radio__indicator {
5617
+ width: var(--radio-size-sm);
5618
+ height: var(--radio-size-sm);
5619
+ }
5620
+
5621
+ .muka-radio--lg .muka-radio__indicator {
5622
+ width: var(--radio-size-lg);
5623
+ height: var(--radio-size-lg);
5624
+ }
5625
+
5626
+ /* Inner dot (shown when checked) */
5627
+ .muka-radio__dot {
5628
+ width: var(--radio-dot-size-default);
5629
+ height: var(--radio-dot-size-default);
5572
5630
  border-radius: var(--border-radius-full);
5573
- display: flex;
5574
- align-items: center;
5575
- justify-content: center;
5576
- flex-shrink: 0;
5577
- position: relative;
5631
+ background-color: var(--radio-color-default-dot);
5632
+ transform: scale(0);
5633
+ transition: transform 0.15s ease;
5578
5634
  }
5579
5635
 
5580
- /* Past: dark accent contrast circle with white checkmark */
5581
- .muka-progress-tracker__indicator--past {
5582
- background-color: var(--alias-color-accent-contrast);
5583
- color: var(--color-text-default-inverse);
5584
- cursor: pointer;
5636
+ .muka-radio--sm .muka-radio__dot {
5637
+ width: var(--radio-dot-size-sm);
5638
+ height: var(--radio-dot-size-sm);
5585
5639
  }
5586
5640
 
5587
- .muka-progress-tracker__indicator--past:hover {
5588
- background-color: var(--alias-color-accent-pressed);
5641
+ .muka-radio--lg .muka-radio__dot {
5642
+ width: var(--radio-dot-size-lg);
5643
+ height: var(--radio-dot-size-lg);
5589
5644
  }
5590
5645
 
5591
- .muka-progress-tracker__indicator--past:focus-visible {
5646
+ /* Hover state - removed per design */
5647
+
5648
+ /* Focus state */
5649
+ .muka-radio__input:focus-visible + .muka-radio__indicator {
5592
5650
  outline: 2px solid var(--color-border-focus);
5593
5651
  outline-offset: 2px;
5594
5652
  }
5595
5653
 
5596
- /* Current: accent default circle with white number */
5597
- .muka-progress-tracker__indicator--current {
5598
- background-color: var(--alias-color-accent-default);
5599
- color: var(--color-text-default-inverse);
5600
- }
5601
-
5602
- /* Upcoming: sunken/gray circle with dark number */
5603
- .muka-progress-tracker__indicator--upcoming {
5604
- background-color: var(--color-surface-sunken);
5605
- color: var(--color-text-default-default);
5654
+ /* Checked state */
5655
+ .muka-radio__input:checked + .muka-radio__indicator {
5656
+ background-color: var(--radio-color-checked-background);
5657
+ border-width: var(--border-width-bold);
5658
+ border-color: var(--radio-color-checked-border);
5659
+ box-shadow: none;
5660
+ }
5661
+
5662
+ .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
5663
+ background-color: var(--radio-color-checked-dot);
5664
+ transform: scale(1);
5665
+ }
5666
+
5667
+ /* Disabled state */
5668
+ .muka-radio--disabled .muka-radio__indicator {
5669
+ background-color: var(--radio-color-disabled-background);
5670
+ border-color: var(--radio-color-disabled-border);
5671
+ box-shadow: none;
5672
+ }
5673
+
5674
+ .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
5675
+ background-color: var(--radio-color-disabled-dot);
5676
+ }
5677
+
5678
+ /* Label text */
5679
+ .muka-radio__label {
5680
+ font-family: var(--text-label-lg-regular-fontFamily);
5681
+ font-weight: var(--text-label-lg-regular-fontWeight);
5682
+ font-size: var(--text-label-lg-regular-fontSize);
5683
+ line-height: var(--text-label-lg-regular-lineHeight);
5684
+ color: var(--color-text-default-default);
5685
+ }
5686
+
5687
+ .muka-radio--sm .muka-radio__label {
5688
+ font-family: var(--text-label-md-regular-fontFamily);
5689
+ font-weight: var(--text-label-md-regular-fontWeight);
5690
+ font-size: var(--text-label-md-regular-fontSize);
5691
+ line-height: var(--text-label-md-regular-lineHeight);
5692
+ }
5693
+
5694
+ .muka-radio--lg .muka-radio__label {
5695
+ font-family: var(--text-label-xl-regular-fontFamily);
5696
+ font-weight: var(--text-label-xl-regular-fontWeight);
5697
+ font-size: var(--text-label-xl-regular-fontSize);
5698
+ line-height: var(--text-label-xl-regular-lineHeight);
5699
+ }
5700
+
5701
+ .muka-radio--disabled .muka-radio__label {
5702
+ color: var(--color-text-subtle-default);
5703
+ }
5704
+
5705
+
5706
+ /* PullToRefresh */
5707
+ /* PullToRefresh Component Styles */
5708
+
5709
+ .muka-pull-to-refresh {
5710
+ position: relative;
5711
+ display: flex;
5712
+ flex-direction: column;
5713
+ width: 100%;
5714
+ height: 100%;
5715
+ overflow: hidden;
5716
+ }
5717
+
5718
+ .muka-pull-to-refresh__indicator {
5719
+ position: absolute;
5720
+ top: 0;
5721
+ left: 0;
5722
+ right: 0;
5723
+ display: flex;
5724
+ align-items: flex-end;
5725
+ justify-content: center;
5726
+ padding-bottom: var(--spacing-2);
5727
+ color: var(--color-text-subtle-default);
5728
+ overflow: hidden;
5729
+ pointer-events: none;
5730
+ z-index: 1;
5731
+ }
5732
+
5733
+ .muka-pull-to-refresh__chevron {
5734
+ display: inline-flex;
5735
+ align-items: center;
5736
+ justify-content: center;
5737
+ transition: transform 0.16s ease;
5738
+ }
5739
+
5740
+ .muka-pull-to-refresh__scroller {
5741
+ flex: 1 1 auto;
5742
+ min-height: 0;
5743
+ width: 100%;
5744
+ overflow-x: clip;
5745
+ overflow-y: auto;
5746
+ -webkit-overflow-scrolling: touch;
5747
+ overscroll-behavior-y: contain;
5748
+ touch-action: pan-y;
5749
+ will-change: transform;
5750
+ }
5751
+
5752
+
5753
+ /* ProgressTracker */
5754
+ /* ProgressTracker Component Styles — Using Muka Design Tokens */
5755
+
5756
+ /* ─── Root ──────────────────────────────────────────────── */
5757
+ .muka-progress-tracker {
5758
+ width: 100%;
5759
+ padding-bottom: var(--spacing-7);
5760
+ }
5761
+
5762
+ /* ─── Track (layered container) ─────────────────────────── */
5763
+ .muka-progress-tracker__track {
5764
+ position: relative;
5765
+ /* Vertical padding = (indicator size - connector height) / 2 = (32 - 4) / 2 = 14px */
5766
+ padding-top: 14px;
5767
+ padding-bottom: 14px;
5768
+ }
5769
+
5770
+ /* ─── Steps layer (on top) ──────────────────────────────── */
5771
+ .muka-progress-tracker__steps {
5772
+ position: absolute;
5773
+ inset: 0;
5774
+ display: flex;
5775
+ align-items: flex-start;
5776
+ justify-content: space-between;
5777
+ z-index: 2;
5778
+ }
5779
+
5780
+ /* ─── Individual step ───────────────────────────────────── */
5781
+ .muka-progress-tracker__step {
5782
+ display: flex;
5783
+ flex-direction: column;
5784
+ align-items: center;
5785
+ gap: 7px;
5786
+ position: relative;
5787
+ }
5788
+
5789
+ /* ─── Step indicator (circle) ───────────────────────────── */
5790
+ .muka-progress-tracker__indicator {
5791
+ width: 32px;
5792
+ height: 32px;
5793
+ border-radius: var(--border-radius-full);
5794
+ display: flex;
5795
+ align-items: center;
5796
+ justify-content: center;
5797
+ flex-shrink: 0;
5798
+ position: relative;
5799
+ }
5800
+
5801
+ /* Past: dark accent contrast circle with white checkmark */
5802
+ .muka-progress-tracker__indicator--past {
5803
+ background-color: var(--alias-color-accent-contrast);
5804
+ color: var(--color-text-default-inverse);
5805
+ cursor: pointer;
5806
+ }
5807
+
5808
+ .muka-progress-tracker__indicator--past:hover {
5809
+ background-color: var(--alias-color-accent-pressed);
5810
+ }
5811
+
5812
+ .muka-progress-tracker__indicator--past:focus-visible {
5813
+ outline: 2px solid var(--color-border-focus);
5814
+ outline-offset: 2px;
5815
+ }
5816
+
5817
+ /* Current: accent default circle with white number */
5818
+ .muka-progress-tracker__indicator--current {
5819
+ background-color: var(--alias-color-accent-default);
5820
+ color: var(--color-text-default-inverse);
5821
+ }
5822
+
5823
+ /* Upcoming: sunken/gray circle with dark number */
5824
+ .muka-progress-tracker__indicator--upcoming {
5825
+ background-color: var(--color-surface-sunken);
5826
+ color: var(--color-text-default-default);
5606
5827
  }
5607
5828
 
5608
5829
  /* ─── Step number text ──────────────────────────────────── */
@@ -5720,11 +5941,13 @@ body {
5720
5941
  gap: var(--spacing-8);
5721
5942
  }
5722
5943
 
5723
- /* Past-expanded groups header + slot with a tighter internal gap */
5944
+ /* Past steps group header + slot. The header↔content gap lives inside the
5945
+ collapsing slot (as padding-top) so it collapses with the content, so the
5946
+ body gap itself is 0. */
5724
5947
  .muka-progress-accordeon__body {
5725
5948
  display: flex;
5726
5949
  flex-direction: column;
5727
- gap: var(--spacing-4);
5950
+ gap: 0;
5728
5951
  width: 100%;
5729
5952
  }
5730
5953
 
@@ -5857,6 +6080,34 @@ body {
5857
6080
  width: 100%;
5858
6081
  }
5859
6082
 
6083
+ /* ─── Collapse/expand animation (past steps) ─────────────────
6084
+ The grid-template-rows 1fr → 0fr technique animates the content to/from its
6085
+ intrinsic (auto) height with no magic max-height. Under prefers-reduced-motion
6086
+ --motion-duration-view resolves to 0ms, so the toggle stays instant. */
6087
+ .muka-progress-accordeon__slot-wrapper {
6088
+ display: grid;
6089
+ grid-template-rows: 1fr;
6090
+ transition: grid-template-rows var(--motion-duration-view) var(--motion-easing-enter);
6091
+ }
6092
+
6093
+ .muka-progress-accordeon__slot-wrapper--collapsed {
6094
+ grid-template-rows: 0fr;
6095
+ }
6096
+
6097
+ /* The direct grid child clips and must have NO padding/border of its own —
6098
+ min-height:0 lets it shrink, and with no padding the 0fr track reaches a true
6099
+ 0 height (padding on the item would leave a residual gap when collapsed). */
6100
+ .muka-progress-accordeon__slot-clip {
6101
+ overflow: hidden;
6102
+ min-height: 0;
6103
+ }
6104
+
6105
+ /* The header↔content spacing lives on the inner slot (inside the clip region)
6106
+ so it collapses together with the content. */
6107
+ .muka-progress-accordeon__slot-wrapper .muka-progress-accordeon__slot {
6108
+ padding-top: var(--spacing-4);
6109
+ }
6110
+
5860
6111
  /* ─── Action buttons (current state) ─────────────────────── */
5861
6112
  .muka-progress-accordeon__actions {
5862
6113
  display: flex;
@@ -6373,52 +6624,180 @@ body {
6373
6624
  }
6374
6625
 
6375
6626
 
6376
- /* Pagination */
6377
- /* Pagination Component Styles */
6627
+ /* PhotoUploader */
6628
+ /* PhotoUploader Component Styles - Using Muka Design Tokens */
6378
6629
 
6379
- .muka-pagination__list {
6630
+ .muka-photo-uploader {
6380
6631
  display: flex;
6381
- align-items: center;
6382
- gap: var(--spacing-1);
6632
+ flex-direction: column;
6633
+ align-items: flex-start;
6634
+ gap: var(--spacing-4);
6635
+ width: 100%;
6636
+ }
6637
+
6638
+ /* Visually-hidden native file input */
6639
+ .muka-photo-uploader__input {
6640
+ position: absolute;
6641
+ width: 1px;
6642
+ height: 1px;
6643
+ padding: 0;
6644
+ margin: -1px;
6645
+ overflow: hidden;
6646
+ clip: rect(0, 0, 0, 0);
6647
+ white-space: nowrap;
6648
+ border: 0;
6649
+ }
6650
+
6651
+ /* ─── Error feedback alert ────────────────────────────── */
6652
+ .muka-photo-uploader__alert {
6653
+ width: 100%;
6654
+ }
6655
+
6656
+ /* ─── Thumbnail grid ──────────────────────────────────── */
6657
+ .muka-photo-uploader__grid {
6658
+ display: flex;
6659
+ flex-wrap: wrap;
6660
+ gap: var(--spacing-3);
6661
+ width: 100%;
6662
+ margin: 0;
6663
+ padding: 0;
6383
6664
  list-style: none;
6665
+ }
6666
+
6667
+ .muka-photo-uploader__grid-item {
6384
6668
  margin: 0;
6385
6669
  padding: 0;
6386
6670
  }
6387
6671
 
6388
- /* Base button */
6389
- .muka-pagination__button {
6390
- display: inline-flex;
6672
+ /* ─── Drop zone card ──────────────────────────────────── */
6673
+ .muka-photo-uploader__dropzone {
6674
+ display: flex;
6675
+ flex-direction: column;
6391
6676
  align-items: center;
6392
6677
  justify-content: center;
6393
- border: var(--border-width-regular) solid transparent;
6394
- border-radius: var(--radius-md);
6395
- background: transparent;
6396
- color: var(--color-text-default-default);
6678
+ gap: var(--spacing-4);
6679
+ width: 100%;
6680
+ padding: var(--card-padding-lg);
6681
+ background-color: var(--card-color-default-background);
6682
+ border: var(--border-width-regular, 1px) solid var(--card-color-default-border);
6683
+ border-radius: var(--border-radius-lg);
6397
6684
  cursor: pointer;
6398
- font: inherit;
6399
- transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
6400
- padding: 0;
6685
+ text-align: center;
6686
+ transition: background-color var(--motion-duration-micro) var(--motion-easing-enter),
6687
+ border-color var(--motion-duration-micro) var(--motion-easing-enter);
6401
6688
  }
6402
6689
 
6403
- .muka-pagination__button:hover:not(:disabled):not(.muka-pagination__button--active) {
6690
+ .muka-photo-uploader__dropzone:hover,
6691
+ .muka-photo-uploader__dropzone--active {
6692
+ border-color: var(--color-border-focus);
6404
6693
  background-color: var(--color-surface-level1);
6405
6694
  }
6406
6695
 
6407
- /* Active page */
6408
- .muka-pagination__button--active {
6409
- background-color: var(--button-color-primary-default-background);
6410
- color: var(--button-color-primary-default-foreground);
6411
- border-color: var(--button-color-primary-default-background);
6412
- font-weight: 600;
6696
+ .muka-photo-uploader__dropzone:focus-visible {
6697
+ outline: 2px solid var(--color-border-focus);
6698
+ outline-offset: 2px;
6413
6699
  }
6414
6700
 
6415
- /* Nav buttons (prev/next/first/last) */
6416
- .muka-pagination__button--nav {
6701
+ .muka-photo-uploader__dropzone-icon {
6702
+ display: flex;
6703
+ align-items: center;
6704
+ justify-content: center;
6705
+ color: var(--color-icon-subtle-default);
6706
+ }
6707
+
6708
+ .muka-photo-uploader__dropzone-text {
6709
+ font-family: var(--text-body-md-regular-fontFamily);
6710
+ font-size: var(--text-body-md-regular-fontSize);
6711
+ font-weight: var(--text-body-md-regular-fontWeight);
6712
+ line-height: var(--text-body-md-regular-lineHeight);
6417
6713
  color: var(--color-text-subtle-default);
6418
6714
  }
6419
6715
 
6420
- .muka-pagination__button:disabled {
6421
- opacity: 0.4;
6716
+ /* ─── Disabled ────────────────────────────────────────── */
6717
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone {
6718
+ cursor: not-allowed;
6719
+ opacity: 0.6;
6720
+ }
6721
+
6722
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone:hover {
6723
+ border-color: var(--card-color-default-border);
6724
+ background-color: var(--card-color-default-background);
6725
+ }
6726
+
6727
+ /* ─── Enlarged photo dialog ───────────────────────────── */
6728
+ .muka-photo-uploader__preview {
6729
+ display: flex;
6730
+ align-items: center;
6731
+ justify-content: center;
6732
+ width: 100%;
6733
+ height: 100%;
6734
+ }
6735
+
6736
+ /* Fits the dialog while preserving the photo's original aspect ratio. */
6737
+ .muka-photo-uploader__preview-image {
6738
+ display: block;
6739
+ max-width: 100%;
6740
+ max-height: 100%;
6741
+ width: auto;
6742
+ height: auto;
6743
+ object-fit: contain;
6744
+ border-radius: var(--border-radius-lg);
6745
+ }
6746
+
6747
+ /* ─── Reduced motion ──────────────────────────────────── */
6748
+ @media (prefers-reduced-motion: reduce) {
6749
+ .muka-photo-uploader__dropzone {
6750
+ transition: none;
6751
+ }
6752
+ }
6753
+
6754
+
6755
+ /* Pagination */
6756
+ /* Pagination Component Styles */
6757
+
6758
+ .muka-pagination__list {
6759
+ display: flex;
6760
+ align-items: center;
6761
+ gap: var(--spacing-1);
6762
+ list-style: none;
6763
+ margin: 0;
6764
+ padding: 0;
6765
+ }
6766
+
6767
+ /* Base button */
6768
+ .muka-pagination__button {
6769
+ display: inline-flex;
6770
+ align-items: center;
6771
+ justify-content: center;
6772
+ border: var(--border-width-regular) solid transparent;
6773
+ border-radius: var(--radius-md);
6774
+ background: transparent;
6775
+ color: var(--color-text-default-default);
6776
+ cursor: pointer;
6777
+ font: inherit;
6778
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
6779
+ padding: 0;
6780
+ }
6781
+
6782
+ .muka-pagination__button:hover:not(:disabled):not(.muka-pagination__button--active) {
6783
+ background-color: var(--color-surface-level1);
6784
+ }
6785
+
6786
+ /* Active page */
6787
+ .muka-pagination__button--active {
6788
+ background-color: var(--button-color-primary-default-background);
6789
+ color: var(--button-color-primary-default-foreground);
6790
+ border-color: var(--button-color-primary-default-background);
6791
+ font-weight: 600;
6792
+ }
6793
+
6794
+ /* Nav buttons (prev/next/first/last) */
6795
+ .muka-pagination__button--nav {
6796
+ color: var(--color-text-subtle-default);
6797
+ }
6798
+
6799
+ .muka-pagination__button:disabled {
6800
+ opacity: 0.4;
6422
6801
  cursor: not-allowed;
6423
6802
  }
6424
6803
 
@@ -9337,6 +9716,35 @@ li.muka-listitem {
9337
9716
  transition: stroke-dasharray 0.3s ease;
9338
9717
  }
9339
9718
 
9719
+ /* ─── Indeterminate (spinner) ─────────────────────────── */
9720
+ /* A masked ring filled with an angular (conic) gradient that rotates. The mask
9721
+ band matches the donut geometry (r=40, strokeWidth=16 → 64%–96% of radius) so
9722
+ it swaps seamlessly with the value-based progress donut. */
9723
+ .muka-data-pie-chart__spinner-track,
9724
+ .muka-data-pie-chart__spinner {
9725
+ position: absolute;
9726
+ inset: 0;
9727
+ border-radius: 50%;
9728
+ -webkit-mask: radial-gradient(farthest-side, transparent 63%, #000 65%, #000 95%, transparent 97%);
9729
+ mask: radial-gradient(farthest-side, transparent 63%, #000 65%, #000 95%, transparent 97%);
9730
+ }
9731
+
9732
+ .muka-data-pie-chart__spinner {
9733
+ animation: muka-data-pie-chart-spin 0.9s linear infinite;
9734
+ }
9735
+
9736
+ @keyframes muka-data-pie-chart-spin {
9737
+ to {
9738
+ transform: rotate(360deg);
9739
+ }
9740
+ }
9741
+
9742
+ @media (prefers-reduced-motion: reduce) {
9743
+ .muka-data-pie-chart__spinner {
9744
+ animation-duration: 2.5s;
9745
+ }
9746
+ }
9747
+
9340
9748
  .muka-data-pie-chart__value {
9341
9749
  position: absolute;
9342
9750
  inset: 0;
@@ -11910,6 +12318,13 @@ li.muka-listitem {
11910
12318
  height: 100%;
11911
12319
  }
11912
12320
 
12321
+ /* The leading icon and the dismiss (×) icon inherit the variant accent set on
12322
+ their container, overriding the Icon component's default color. */
12323
+ .muka-alert__icon .muka-icon,
12324
+ .muka-alert__dismiss .muka-icon {
12325
+ color: inherit;
12326
+ }
12327
+
11913
12328
  /* Content */
11914
12329
  .muka-alert__content {
11915
12330
  flex: 1;
@@ -12416,193 +12831,196 @@ li.muka-listitem {
12416
12831
  }
12417
12832
 
12418
12833
 
12419
- /* Radio */
12420
- /* Radio Component Styles - Using Muka Design Tokens */
12834
+ /* Select */
12835
+ /* Select Component Styles - Aligned with Input for consistency */
12421
12836
 
12422
- /* Wrapper - clickable label container */
12423
- .muka-radio {
12837
+ .muka-select {
12424
12838
  display: inline-flex;
12425
- align-items: center;
12426
- gap: var(--spacing-4);
12427
- cursor: pointer;
12428
- user-select: none;
12839
+ flex-direction: column;
12840
+ gap: var(--spacing-2);
12429
12841
  }
12430
12842
 
12431
- .muka-radio--disabled {
12432
- cursor: not-allowed;
12433
- opacity: 0.6;
12843
+ .muka-select--full-width {
12844
+ width: 100%;
12434
12845
  }
12435
12846
 
12436
- /* Control container */
12437
- .muka-radio__control {
12438
- position: relative;
12439
- display: inline-flex;
12440
- align-items: center;
12441
- justify-content: center;
12442
- flex-shrink: 0;
12847
+ /* Label */
12848
+ .muka-select__label {
12849
+ color: var(--color-text-default-default);
12850
+ cursor: pointer;
12443
12851
  }
12444
12852
 
12445
- /* Hidden native input */
12446
- .muka-radio__input {
12447
- position: absolute;
12448
- width: 1px;
12449
- height: 1px;
12450
- padding: 0;
12451
- margin: -1px;
12452
- overflow: hidden;
12453
- clip: rect(0, 0, 0, 0);
12454
- white-space: nowrap;
12455
- border: 0;
12853
+ .muka-select__label--sm {
12854
+ font-family: var(--text-label-sm-semibold-fontFamily);
12855
+ font-weight: var(--text-label-sm-semibold-fontWeight);
12856
+ font-size: var(--text-label-sm-semibold-fontSize);
12857
+ line-height: var(--text-label-sm-semibold-lineHeight);
12456
12858
  }
12457
12859
 
12458
- /* Visual indicator (circle) */
12459
- .muka-radio__indicator {
12460
- display: flex;
12461
- align-items: center;
12462
- justify-content: center;
12463
- width: var(--radio-size-default);
12464
- height: var(--radio-size-default);
12465
- border-radius: var(--border-radius-full);
12466
- background-color: var(--radio-color-default-background);
12467
- border: var(--border-width-regular) solid var(--radio-color-default-border);
12468
- transition: all 0.15s ease;
12469
- box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
12860
+ .muka-select__label--md {
12861
+ font-family: var(--text-label-md-semibold-fontFamily);
12862
+ font-weight: var(--text-label-md-semibold-fontWeight);
12863
+ font-size: var(--text-label-md-semibold-fontSize);
12864
+ line-height: var(--text-label-md-semibold-lineHeight);
12470
12865
  }
12471
12866
 
12472
- /* Size variants */
12473
- .muka-radio--sm .muka-radio__indicator {
12474
- width: var(--radio-size-sm);
12475
- height: var(--radio-size-sm);
12867
+ .muka-select__label--lg {
12868
+ font-family: var(--text-label-lg-semibold-fontFamily);
12869
+ font-weight: var(--text-label-lg-semibold-fontWeight);
12870
+ font-size: var(--text-label-lg-semibold-fontSize);
12871
+ line-height: var(--text-label-lg-semibold-lineHeight);
12476
12872
  }
12477
12873
 
12478
- .muka-radio--lg .muka-radio__indicator {
12479
- width: var(--radio-size-lg);
12480
- height: var(--radio-size-lg);
12874
+ .muka-select__required {
12875
+ color: var(--color-state-error-foreground);
12481
12876
  }
12482
12877
 
12483
- /* Inner dot (shown when checked) */
12484
- .muka-radio__dot {
12485
- width: var(--radio-dot-size-default);
12486
- height: var(--radio-dot-size-default);
12487
- border-radius: var(--border-radius-full);
12488
- background-color: var(--radio-color-default-dot);
12489
- transform: scale(0);
12490
- transition: transform 0.15s ease;
12878
+ .muka-select__label--sm + .muka-select__field--disabled,
12879
+ .muka-select__label--md + .muka-select__field--disabled,
12880
+ .muka-select__label--lg + .muka-select__field--disabled {
12881
+ cursor: not-allowed;
12491
12882
  }
12492
12883
 
12493
- .muka-radio--sm .muka-radio__dot {
12494
- width: var(--radio-dot-size-sm);
12495
- height: var(--radio-dot-size-sm);
12884
+ /* Field container — same as Input: 1px border, radius, padding, inset shadow */
12885
+ .muka-select__field {
12886
+ display: flex;
12887
+ align-items: center;
12888
+ gap: var(--spacing-2);
12889
+ position: relative;
12890
+ background-color: var(--input-field-color-default-background);
12891
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
12892
+ border-radius: var(--input-field-radius-md);
12893
+ padding: var(--input-field-padding-y) var(--input-field-padding-x);
12894
+ transition: border-color 0.2s ease, background-color 0.2s ease;
12895
+ cursor: pointer;
12896
+ box-sizing: border-box;
12496
12897
  }
12497
12898
 
12498
- .muka-radio--lg .muka-radio__dot {
12499
- width: var(--radio-dot-size-lg);
12500
- height: var(--radio-dot-size-lg);
12899
+ /* Inset shadow — same as Input (single subtle line) */
12900
+ .muka-select__field::after {
12901
+ content: '';
12902
+ position: absolute;
12903
+ inset: 0;
12904
+ border-radius: inherit;
12905
+ box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.08);
12906
+ pointer-events: none;
12501
12907
  }
12502
12908
 
12503
- /* Hover state - removed per design */
12504
-
12505
- /* Focus state */
12506
- .muka-radio__input:focus-visible + .muka-radio__indicator {
12507
- outline: 2px solid var(--color-border-focus);
12508
- outline-offset: 2px;
12909
+ /* Size variants — same radius/height as Input */
12910
+ .muka-select__field--sm {
12911
+ min-height: var(--input-field-height-sm);
12912
+ border-radius: var(--input-field-radius-sm);
12509
12913
  }
12510
12914
 
12511
- /* Checked state */
12512
- .muka-radio__input:checked + .muka-radio__indicator {
12513
- background-color: var(--radio-color-checked-background);
12514
- border-width: var(--border-width-bold);
12515
- border-color: var(--radio-color-checked-border);
12516
- box-shadow: none;
12915
+ .muka-select__field--md {
12916
+ min-height: var(--input-field-height-default);
12917
+ border-radius: var(--input-field-radius-md);
12517
12918
  }
12518
12919
 
12519
- .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
12520
- background-color: var(--radio-color-checked-dot);
12521
- transform: scale(1);
12920
+ .muka-select__field--lg {
12921
+ min-height: var(--input-field-height-lg);
12922
+ border-radius: var(--input-field-radius-lg);
12522
12923
  }
12523
12924
 
12524
- /* Disabled state */
12525
- .muka-radio--disabled .muka-radio__indicator {
12526
- background-color: var(--radio-color-disabled-background);
12527
- border-color: var(--radio-color-disabled-border);
12528
- box-shadow: none;
12529
- }
12925
+ /* Hover — no visual change (same as Input) */
12530
12926
 
12531
- .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
12532
- background-color: var(--radio-color-disabled-dot);
12927
+ /* Focus (active) — same as Input: 2px border, padding compensation */
12928
+ .muka-select__field--focused:not(.muka-select__field--disabled) {
12929
+ border-width: var(--border-width-bold);
12930
+ border-color: var(--input-field-color-focus-border);
12931
+ background-color: var(--input-field-color-focus-background);
12932
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
12533
12933
  }
12534
12934
 
12535
- /* Label text */
12536
- .muka-radio__label {
12537
- font-family: var(--text-label-lg-regular-fontFamily);
12538
- font-weight: var(--text-label-lg-regular-fontWeight);
12539
- font-size: var(--text-label-lg-regular-fontSize);
12540
- line-height: var(--text-label-lg-regular-lineHeight);
12541
- color: var(--color-text-default-default);
12935
+ /* Error — same as Input: 2px border, padding compensation */
12936
+ .muka-select__field--error:not(.muka-select__field--disabled) {
12937
+ border-width: var(--border-width-bold);
12938
+ border-color: var(--input-field-color-error-border);
12939
+ background-color: var(--input-field-color-error-background);
12940
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
12542
12941
  }
12543
12942
 
12544
- .muka-radio--sm .muka-radio__label {
12545
- font-family: var(--text-label-md-regular-fontFamily);
12546
- font-weight: var(--text-label-md-regular-fontWeight);
12547
- font-size: var(--text-label-md-regular-fontSize);
12548
- line-height: var(--text-label-md-regular-lineHeight);
12943
+ /* Disabled — same as Input */
12944
+ .muka-select__field--disabled {
12945
+ background-color: var(--input-field-color-disabled-background);
12946
+ border-color: var(--input-field-color-disabled-border);
12947
+ cursor: not-allowed;
12549
12948
  }
12550
12949
 
12551
- .muka-radio--lg .muka-radio__label {
12552
- font-family: var(--text-label-xl-regular-fontFamily);
12553
- font-weight: var(--text-label-xl-regular-fontWeight);
12554
- font-size: var(--text-label-xl-regular-fontSize);
12555
- line-height: var(--text-label-xl-regular-lineHeight);
12950
+ .muka-select__field--disabled::after {
12951
+ display: none;
12556
12952
  }
12557
12953
 
12558
- .muka-radio--disabled .muka-radio__label {
12559
- color: var(--color-text-subtle-default);
12954
+ /* Native select — padding on field so native has 0 + right space for chevron */
12955
+ .muka-select__native {
12956
+ appearance: none;
12957
+ -webkit-appearance: none;
12958
+ flex: 1;
12959
+ border: none;
12960
+ outline: none;
12961
+ background: transparent;
12962
+ color: var(--input-field-color-default-foreground);
12963
+ font-family: var(--text-input-md-fontFamily);
12964
+ font-weight: var(--text-input-md-fontWeight);
12965
+ font-size: var(--text-input-md-fontSize);
12966
+ line-height: var(--text-input-md-lineHeight);
12967
+ padding: 0;
12968
+ padding-right: calc(var(--input-field-padding-x) + 1.5rem);
12969
+ cursor: pointer;
12970
+ min-width: 0;
12971
+ width: 100%;
12560
12972
  }
12561
12973
 
12974
+ .muka-select__field--sm .muka-select__native {
12975
+ font-family: var(--text-input-sm-fontFamily);
12976
+ font-weight: var(--text-input-sm-fontWeight);
12977
+ font-size: var(--text-input-sm-fontSize);
12978
+ line-height: var(--text-input-sm-lineHeight);
12979
+ }
12562
12980
 
12563
- /* PullToRefresh */
12564
- /* PullToRefresh Component Styles */
12981
+ .muka-select__field--lg .muka-select__native {
12982
+ font-family: var(--text-input-lg-fontFamily);
12983
+ font-weight: var(--text-input-lg-fontWeight);
12984
+ font-size: var(--text-input-lg-fontSize);
12985
+ line-height: var(--text-input-lg-lineHeight);
12986
+ }
12565
12987
 
12566
- .muka-pull-to-refresh {
12567
- position: relative;
12568
- display: flex;
12569
- flex-direction: column;
12570
- width: 100%;
12571
- height: 100%;
12572
- overflow: hidden;
12988
+ .muka-select__field--disabled .muka-select__native {
12989
+ color: var(--input-field-color-disabled-foreground);
12990
+ cursor: not-allowed;
12573
12991
  }
12574
12992
 
12575
- .muka-pull-to-refresh__indicator {
12993
+ /* Chevron — aligned with field padding */
12994
+ .muka-select__chevron {
12995
+ display: inline-flex;
12996
+ align-items: center;
12576
12997
  position: absolute;
12577
- top: 0;
12578
- left: 0;
12579
- right: 0;
12580
- display: flex;
12581
- align-items: flex-end;
12582
- justify-content: center;
12583
- padding-bottom: var(--spacing-2);
12584
- color: var(--color-text-subtle-default);
12585
- overflow: hidden;
12998
+ right: var(--input-field-padding-x);
12586
12999
  pointer-events: none;
12587
- z-index: 1;
13000
+ color: var(--color-text-subtle-default);
12588
13001
  }
12589
13002
 
12590
- .muka-pull-to-refresh__chevron {
12591
- display: inline-flex;
12592
- align-items: center;
12593
- justify-content: center;
12594
- transition: transform 0.16s ease;
13003
+ .muka-select__field--disabled .muka-select__chevron {
13004
+ color: var(--input-field-color-disabled-foreground);
12595
13005
  }
12596
13006
 
12597
- .muka-pull-to-refresh__scroller {
12598
- flex: 1 1 auto;
12599
- min-height: 0;
12600
- width: 100%;
12601
- overflow-x: clip;
12602
- overflow-y: auto;
12603
- -webkit-overflow-scrolling: touch;
12604
- overscroll-behavior-y: contain;
12605
- touch-action: pan-y;
12606
- will-change: transform;
13007
+ /* Helper text — same as Input */
13008
+ .muka-select__helper {
13009
+ font-family: var(--text-label-sm-regular-fontFamily);
13010
+ font-weight: var(--text-label-sm-regular-fontWeight);
13011
+ font-size: var(--text-label-sm-regular-fontSize);
13012
+ line-height: var(--text-label-sm-regular-lineHeight);
13013
+ color: var(--color-text-subtle-default);
13014
+ margin: 0;
13015
+ }
13016
+
13017
+ /* Error message — same as Input */
13018
+ .muka-select__error {
13019
+ font-family: var(--text-label-sm-regular-fontFamily);
13020
+ font-weight: var(--text-label-sm-regular-fontWeight);
13021
+ font-size: var(--text-label-sm-regular-fontSize);
13022
+ line-height: var(--text-label-sm-regular-lineHeight);
13023
+ color: var(--color-state-error-foreground);
13024
+ margin: 0;
12607
13025
  }
12608
13026