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