@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
@@ -268,6 +268,17 @@ body {
268
268
  --container-gap-default: 2rem;
269
269
  --container-gap-compact: 1.5rem;
270
270
  --container-gap-spacious: 2.5rem;
271
+ --duration-none: 0ms;
272
+ --duration-instant: 100ms;
273
+ --duration-fast: 150ms;
274
+ --duration-normal: 200ms;
275
+ --duration-slow: 300ms;
276
+ --duration-slower: 500ms;
277
+ --easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
278
+ --easing-enter: cubic-bezier(0, 0, 0.2, 1);
279
+ --easing-exit: cubic-bezier(0.4, 0, 1, 1);
280
+ --easing-spring: cubic-bezier(0.16, 1, 0.3, 1);
281
+ --easing-linear: linear;
271
282
  --color-white: #ffffff;
272
283
  --color-black: #000000;
273
284
  --color-gray-1: #fcfcfc;
@@ -1289,6 +1300,17 @@ body {
1289
1300
  --alias-radius-xl: 1.5rem;
1290
1301
  --alias-radius-2xl: 3rem;
1291
1302
  --alias-radius-full: 999rem;
1303
+ --alias-motion-duration-none: 0ms;
1304
+ --alias-motion-duration-instant: 100ms;
1305
+ --alias-motion-duration-fast: 150ms;
1306
+ --alias-motion-duration-normal: 200ms;
1307
+ --alias-motion-duration-slow: 300ms;
1308
+ --alias-motion-duration-slower: 500ms;
1309
+ --alias-motion-easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
1310
+ --alias-motion-easing-enter: cubic-bezier(0, 0, 0.2, 1);
1311
+ --alias-motion-easing-exit: cubic-bezier(0.4, 0, 1, 1);
1312
+ --alias-motion-easing-spring: cubic-bezier(0.16, 1, 0.3, 1);
1313
+ --alias-motion-easing-linear: linear;
1292
1314
  --section-padding-vertical-default: 2rem;
1293
1315
  --section-padding-vertical-compact: 1.5rem;
1294
1316
  --section-padding-vertical-spacious: 2.5rem;
@@ -1496,6 +1518,12 @@ body {
1496
1518
  --shadow-level6: 0 48px 96px 0 rgba(0, 0, 0, 0.220), inset 0 0 1px 0 rgba(0, 0, 0, 0.220);
1497
1519
  --shadow-bevel: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1498
1520
  --shadow-sunken: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.090), inset 0px 2px 4px 0px rgba(0, 0, 0, 0.090);
1521
+ --motion-duration-micro: 150ms;
1522
+ --motion-duration-component: 200ms;
1523
+ --motion-duration-view: 300ms;
1524
+ --motion-easing-default: cubic-bezier(0.4, 0, 0.2, 1);
1525
+ --motion-easing-enter: cubic-bezier(0.16, 1, 0.3, 1);
1526
+ --motion-easing-exit: cubic-bezier(0.4, 0, 1, 1);
1499
1527
  --button-color-primary-background-default: #113264;
1500
1528
  --button-color-primary-background-hover: #0d74ce;
1501
1529
  --button-color-primary-background-pressed: #0d74ce;
@@ -2191,6 +2219,15 @@ body {
2191
2219
  --container-gap-spacious: 3rem;
2192
2220
  }
2193
2221
 
2222
+ /* Accessibility: disable motion for users who prefer reduced motion */
2223
+ @media (prefers-reduced-motion: reduce) {
2224
+ :root {
2225
+ --motion-duration-micro: 0ms;
2226
+ --motion-duration-component: 0ms;
2227
+ --motion-duration-view: 0ms;
2228
+ }
2229
+ }
2230
+
2194
2231
 
2195
2232
  /* ========== Component Styles ========== */
2196
2233
  /* View */
@@ -3275,6 +3312,180 @@ body {
3275
3312
  }
3276
3313
 
3277
3314
 
3315
+ /* Thumbnail */
3316
+ /* Thumbnail Component Styles - Using Muka Design Tokens */
3317
+
3318
+ .muka-thumbnail {
3319
+ position: relative;
3320
+ flex-shrink: 0;
3321
+ }
3322
+
3323
+ /* The frame carries the border, background and shape clip. Keeping it separate
3324
+ from the root lets the remove (×) button sit outside the clip (needed for the
3325
+ circular/ellipse shape, whose corners would otherwise clip the button). */
3326
+ .muka-thumbnail__frame {
3327
+ position: absolute;
3328
+ inset: 0;
3329
+ overflow: hidden;
3330
+ border: var(--border-width-regular, 1px) solid var(--color-black-alpha-3);
3331
+ border-radius: var(--border-radius-lg);
3332
+ background-color: var(--color-surface-level1);
3333
+ }
3334
+
3335
+ /* ─── Shapes ──────────────────────────────────────────── */
3336
+ .muka-thumbnail--4-3 {
3337
+ width: 160px;
3338
+ height: 120px;
3339
+ }
3340
+
3341
+ .muka-thumbnail--1-1 {
3342
+ width: 120px;
3343
+ height: 120px;
3344
+ }
3345
+
3346
+ .muka-thumbnail--ellipse {
3347
+ width: 120px;
3348
+ height: 120px;
3349
+ }
3350
+
3351
+ .muka-thumbnail--ellipse .muka-thumbnail__frame {
3352
+ border-radius: var(--border-radius-full);
3353
+ }
3354
+
3355
+ /* Image fills the frame, cropped to cover. Sits at scale(1) by default so the
3356
+ interactive hover zoom has a clean origin. */
3357
+ .muka-thumbnail__image {
3358
+ position: absolute;
3359
+ inset: 0;
3360
+ width: 100%;
3361
+ height: 100%;
3362
+ object-fit: cover;
3363
+ display: block;
3364
+ transform-origin: center;
3365
+ /* Micro-interaction: hover zoom eases out over the "micro" duration. */
3366
+ transition: transform var(--motion-duration-micro) var(--motion-easing-enter);
3367
+ }
3368
+
3369
+ /* ─── Interactive (click-to-enlarge) ──────────────────── */
3370
+ .muka-thumbnail__trigger {
3371
+ position: absolute;
3372
+ inset: 0;
3373
+ padding: 0;
3374
+ border: 0;
3375
+ background: none;
3376
+ cursor: pointer;
3377
+ overflow: hidden;
3378
+ }
3379
+
3380
+ .muka-thumbnail__trigger:focus-visible {
3381
+ outline: 2px solid var(--color-border-focus);
3382
+ outline-offset: -2px;
3383
+ }
3384
+
3385
+ /* On hover the image scales up ~8px (160px → 168px) with an ease-out feel. */
3386
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3387
+ transform: scale(1.05);
3388
+ }
3389
+
3390
+ /* ─── Loading overlay + progress donut ────────────────── */
3391
+ .muka-thumbnail__overlay {
3392
+ position: absolute;
3393
+ inset: 0;
3394
+ display: flex;
3395
+ align-items: center;
3396
+ justify-content: center;
3397
+ background-color: var(--dialog-color-backdrop);
3398
+ }
3399
+
3400
+ .muka-thumbnail__progress {
3401
+ width: 40px;
3402
+ height: 40px;
3403
+ }
3404
+
3405
+ /* ─── Error / corrupt state ───────────────────────────── */
3406
+ .muka-thumbnail--error .muka-thumbnail__frame {
3407
+ background-color: var(--alias-color-state-error-muted);
3408
+ border-color: var(--alias-color-state-error-default);
3409
+ }
3410
+
3411
+ .muka-thumbnail__error {
3412
+ position: absolute;
3413
+ inset: 0;
3414
+ display: flex;
3415
+ flex-direction: column;
3416
+ align-items: center;
3417
+ justify-content: center;
3418
+ gap: var(--spacing-2);
3419
+ padding: var(--spacing-3);
3420
+ text-align: center;
3421
+ }
3422
+
3423
+ .muka-thumbnail__error-icon {
3424
+ color: var(--alert-color-error-accent);
3425
+ }
3426
+
3427
+ .muka-thumbnail__caption {
3428
+ max-width: 100%;
3429
+ overflow: hidden;
3430
+ text-overflow: ellipsis;
3431
+ white-space: nowrap;
3432
+ color: var(--alert-color-error-accent);
3433
+ font-family: var(--text-body-sm-regular-fontFamily);
3434
+ font-size: var(--text-body-sm-regular-fontSize);
3435
+ font-weight: var(--text-body-sm-regular-fontWeight);
3436
+ line-height: var(--text-body-sm-regular-lineHeight);
3437
+ }
3438
+
3439
+ /* ─── Remove (×) button ───────────────────────────────── */
3440
+ .muka-thumbnail__remove {
3441
+ position: absolute;
3442
+ top: var(--spacing-2);
3443
+ right: var(--spacing-2);
3444
+ display: flex;
3445
+ align-items: center;
3446
+ justify-content: center;
3447
+ width: var(--size-2xl);
3448
+ height: var(--size-2xl);
3449
+ padding: 0;
3450
+ color: var(--button-color-tertiary-foreground-default);
3451
+ background-color: var(--button-color-tertiary-background-default);
3452
+ border: var(--border-width-regular, 1px) solid var(--button-color-tertiary-border-default);
3453
+ border-radius: var(--border-radius-lg);
3454
+ cursor: pointer;
3455
+ transition: background-color var(--motion-duration-micro) var(--motion-easing-enter),
3456
+ border-color var(--motion-duration-micro) var(--motion-easing-enter);
3457
+ }
3458
+
3459
+ .muka-thumbnail__remove:hover {
3460
+ color: var(--button-color-tertiary-foreground-hover);
3461
+ background-color: var(--button-color-tertiary-background-hover);
3462
+ border-color: var(--button-color-tertiary-border-hover);
3463
+ }
3464
+
3465
+ .muka-thumbnail__remove:active {
3466
+ color: var(--button-color-tertiary-foreground-pressed);
3467
+ background-color: var(--button-color-tertiary-background-pressed);
3468
+ border-color: var(--button-color-tertiary-border-pressed);
3469
+ }
3470
+
3471
+ .muka-thumbnail__remove:focus-visible {
3472
+ outline: 2px solid var(--color-border-focus);
3473
+ outline-offset: 2px;
3474
+ }
3475
+
3476
+ /* ─── Reduced motion ──────────────────────────────────── */
3477
+ @media (prefers-reduced-motion: reduce) {
3478
+ .muka-thumbnail__image,
3479
+ .muka-thumbnail__remove {
3480
+ transition: none;
3481
+ }
3482
+
3483
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3484
+ transform: none;
3485
+ }
3486
+ }
3487
+
3488
+
3278
3489
  /* Textarea */
3279
3490
  /* Textarea Component Styles - Using Muka Design Tokens */
3280
3491
 
@@ -4150,55 +4361,48 @@ body {
4150
4361
  .muka-spec-list {
4151
4362
  margin: 0;
4152
4363
  padding: 0;
4153
- background-color: var(--color-surface-level1);
4154
- border-radius: var(--radius-md);
4155
- overflow: hidden;
4156
4364
  }
4157
4365
 
4158
4366
  /* ─── Row ─────────────────────────────────────────────── */
4159
4367
 
4160
4368
  .muka-spec-row {
4161
4369
  display: flex;
4162
- align-items: baseline;
4370
+ align-items: flex-start;
4163
4371
  gap: var(--spacing-3);
4164
- padding: var(--spacing-3) var(--spacing-4);
4165
- border-top: var(--border-width-regular) solid var(--color-border-default);
4166
- }
4167
-
4168
- .muka-spec-row:first-child {
4169
- border-top: none;
4372
+ padding-bottom: var(--spacing-3);
4170
4373
  }
4171
4374
 
4172
4375
  /* ─── Label ───────────────────────────────────────────── */
4173
4376
 
4174
4377
  .muka-spec-row__label {
4175
4378
  flex: 0 0 auto;
4176
- min-width: 40%;
4177
4379
  margin: 0;
4178
4380
  color: var(--color-text-subtle-default);
4179
4381
  font-family: var(--text-body-md-regular-fontFamily);
4180
4382
  font-weight: var(--text-body-md-regular-fontWeight);
4181
4383
  font-size: var(--text-body-md-regular-fontSize);
4182
4384
  line-height: var(--text-body-md-regular-lineHeight);
4385
+ overflow: hidden;
4386
+ text-overflow: ellipsis;
4387
+ white-space: nowrap;
4183
4388
  }
4184
4389
 
4185
4390
  /* ─── Value ───────────────────────────────────────────── */
4186
4391
 
4187
4392
  .muka-spec-row__value {
4188
- flex: 1 1 auto;
4393
+ flex: 1 1 0;
4394
+ min-width: 0;
4189
4395
  margin: 0;
4190
4396
  display: flex;
4191
4397
  flex-direction: column;
4192
- align-items: flex-end;
4193
- text-align: right;
4194
4398
  color: var(--color-text-default-default);
4195
4399
  }
4196
4400
 
4197
4401
  .muka-spec-row__value-text {
4198
- font-family: var(--text-body-md-medium-fontFamily);
4199
- font-weight: var(--text-body-md-medium-fontWeight);
4200
- font-size: var(--text-body-md-medium-fontSize);
4201
- line-height: var(--text-body-md-medium-lineHeight);
4402
+ font-family: var(--text-body-md-regular-fontFamily);
4403
+ font-weight: var(--text-body-md-regular-fontWeight);
4404
+ font-size: var(--text-body-md-regular-fontSize);
4405
+ line-height: var(--text-body-md-regular-lineHeight);
4202
4406
  }
4203
4407
 
4204
4408
  .muka-spec-row__hint {
@@ -4209,10 +4413,30 @@ body {
4209
4413
  line-height: var(--text-body-sm-regular-lineHeight);
4210
4414
  }
4211
4415
 
4212
- /* ─── Compact density ─────────────────────────────────── */
4416
+ /* ─── Label width (horizontal stacking) ───────────────── */
4417
+
4418
+ .muka-spec-list--label-small .muka-spec-row__label {
4419
+ width: 80px;
4420
+ }
4421
+
4422
+ .muka-spec-list--label-medium .muka-spec-row__label {
4423
+ width: 120px;
4424
+ }
4425
+
4426
+ .muka-spec-list--label-large .muka-spec-row__label {
4427
+ width: 160px;
4428
+ }
4429
+
4430
+ /* ─── Vertical stacking ───────────────────────────────── */
4431
+
4432
+ .muka-spec-list--vertical .muka-spec-row {
4433
+ flex-direction: column;
4434
+ gap: var(--spacing-1);
4435
+ }
4213
4436
 
4214
- .muka-spec-list--compact .muka-spec-row {
4215
- padding: var(--spacing-2) var(--spacing-4);
4437
+ .muka-spec-list--vertical .muka-spec-row__label {
4438
+ width: 100%;
4439
+ white-space: normal;
4216
4440
  }
4217
4441
 
4218
4442
 
@@ -4563,232 +4787,38 @@ body {
4563
4787
  }
4564
4788
 
4565
4789
 
4566
- /* Select */
4567
- /* Select Component Styles - Aligned with Input for consistency */
4790
+ /* SegmentGroup */
4791
+ /* SegmentGroup Component Styles - Using Muka Design Tokens */
4568
4792
 
4569
- .muka-select {
4793
+ /* Container */
4794
+ .muka-segmentgroup {
4570
4795
  display: inline-flex;
4571
- flex-direction: column;
4572
- gap: var(--spacing-2);
4573
- }
4574
-
4575
- .muka-select--full-width {
4576
- width: 100%;
4577
- }
4578
-
4579
- /* Label */
4580
- .muka-select__label {
4581
- color: var(--color-text-default-default);
4582
- cursor: pointer;
4583
- }
4584
-
4585
- .muka-select__label--sm {
4586
- font-family: var(--text-label-sm-semibold-fontFamily);
4587
- font-weight: var(--text-label-sm-semibold-fontWeight);
4588
- font-size: var(--text-label-sm-semibold-fontSize);
4589
- line-height: var(--text-label-sm-semibold-lineHeight);
4590
- }
4591
-
4592
- .muka-select__label--md {
4593
- font-family: var(--text-label-md-semibold-fontFamily);
4594
- font-weight: var(--text-label-md-semibold-fontWeight);
4595
- font-size: var(--text-label-md-semibold-fontSize);
4596
- line-height: var(--text-label-md-semibold-lineHeight);
4597
- }
4598
-
4599
- .muka-select__label--lg {
4600
- font-family: var(--text-label-lg-semibold-fontFamily);
4601
- font-weight: var(--text-label-lg-semibold-fontWeight);
4602
- font-size: var(--text-label-lg-semibold-fontSize);
4603
- line-height: var(--text-label-lg-semibold-lineHeight);
4604
- }
4605
-
4606
- .muka-select__required {
4607
- color: var(--color-state-error-foreground);
4608
- }
4609
-
4610
- .muka-select__label--sm + .muka-select__field--disabled,
4611
- .muka-select__label--md + .muka-select__field--disabled,
4612
- .muka-select__label--lg + .muka-select__field--disabled {
4613
- cursor: not-allowed;
4614
- }
4615
-
4616
- /* Field container — same as Input: 1px border, radius, padding, inset shadow */
4617
- .muka-select__field {
4618
- display: flex;
4619
4796
  align-items: center;
4620
- gap: var(--spacing-2);
4797
+ gap: 0;
4798
+ padding: var(--segmentgroup-container-padding);
4799
+ background-color: var(--segmentgroup-container-background);
4800
+ border-radius: var(--segmentgroup-container-radius);
4621
4801
  position: relative;
4622
- background-color: var(--input-field-color-default-background);
4623
- border: var(--border-width-regular) solid var(--input-field-color-default-border);
4624
- border-radius: var(--input-field-radius-md);
4625
- padding: var(--input-field-padding-y) var(--input-field-padding-x);
4626
- transition: border-color 0.2s ease, background-color 0.2s ease;
4627
- cursor: pointer;
4628
- box-sizing: border-box;
4802
+ transition: all 0.2s ease;
4629
4803
  }
4630
4804
 
4631
- /* Inset shadow — same as Input (single subtle line) */
4632
- .muka-select__field::after {
4805
+ /* Inset shadow on container */
4806
+ .muka-segmentgroup::after {
4633
4807
  content: '';
4634
4808
  position: absolute;
4635
4809
  inset: 0;
4636
4810
  border-radius: inherit;
4637
- box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.08);
4811
+ box-shadow: var(--segmentgroup-container-shadow);
4638
4812
  pointer-events: none;
4639
4813
  }
4640
4814
 
4641
- /* Size variants — same radius/height as Input */
4642
- .muka-select__field--sm {
4643
- min-height: var(--input-field-height-sm);
4644
- border-radius: var(--input-field-radius-sm);
4645
- }
4646
-
4647
- .muka-select__field--md {
4648
- min-height: var(--input-field-height-default);
4649
- border-radius: var(--input-field-radius-md);
4815
+ /* Full width variant */
4816
+ .muka-segmentgroup--full-width {
4817
+ width: 100%;
4650
4818
  }
4651
4819
 
4652
- .muka-select__field--lg {
4653
- min-height: var(--input-field-height-lg);
4654
- border-radius: var(--input-field-radius-lg);
4655
- }
4656
-
4657
- /* Hover — no visual change (same as Input) */
4658
-
4659
- /* Focus (active) — same as Input: 2px border, padding compensation */
4660
- .muka-select__field--focused:not(.muka-select__field--disabled) {
4661
- border-width: var(--border-width-bold);
4662
- border-color: var(--input-field-color-focus-border);
4663
- background-color: var(--input-field-color-focus-background);
4664
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4665
- }
4666
-
4667
- /* Error — same as Input: 2px border, padding compensation */
4668
- .muka-select__field--error:not(.muka-select__field--disabled) {
4669
- border-width: var(--border-width-bold);
4670
- border-color: var(--input-field-color-error-border);
4671
- background-color: var(--input-field-color-error-background);
4672
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4673
- }
4674
-
4675
- /* Disabled — same as Input */
4676
- .muka-select__field--disabled {
4677
- background-color: var(--input-field-color-disabled-background);
4678
- border-color: var(--input-field-color-disabled-border);
4679
- cursor: not-allowed;
4680
- }
4681
-
4682
- .muka-select__field--disabled::after {
4683
- display: none;
4684
- }
4685
-
4686
- /* Native select — padding on field so native has 0 + right space for chevron */
4687
- .muka-select__native {
4688
- appearance: none;
4689
- -webkit-appearance: none;
4690
- flex: 1;
4691
- border: none;
4692
- outline: none;
4693
- background: transparent;
4694
- color: var(--input-field-color-default-foreground);
4695
- font-family: var(--text-input-md-fontFamily);
4696
- font-weight: var(--text-input-md-fontWeight);
4697
- font-size: var(--text-input-md-fontSize);
4698
- line-height: var(--text-input-md-lineHeight);
4699
- padding: 0;
4700
- padding-right: calc(var(--input-field-padding-x) + 1.5rem);
4701
- cursor: pointer;
4702
- min-width: 0;
4703
- width: 100%;
4704
- }
4705
-
4706
- .muka-select__field--sm .muka-select__native {
4707
- font-family: var(--text-input-sm-fontFamily);
4708
- font-weight: var(--text-input-sm-fontWeight);
4709
- font-size: var(--text-input-sm-fontSize);
4710
- line-height: var(--text-input-sm-lineHeight);
4711
- }
4712
-
4713
- .muka-select__field--lg .muka-select__native {
4714
- font-family: var(--text-input-lg-fontFamily);
4715
- font-weight: var(--text-input-lg-fontWeight);
4716
- font-size: var(--text-input-lg-fontSize);
4717
- line-height: var(--text-input-lg-lineHeight);
4718
- }
4719
-
4720
- .muka-select__field--disabled .muka-select__native {
4721
- color: var(--input-field-color-disabled-foreground);
4722
- cursor: not-allowed;
4723
- }
4724
-
4725
- /* Chevron — aligned with field padding */
4726
- .muka-select__chevron {
4727
- display: inline-flex;
4728
- align-items: center;
4729
- position: absolute;
4730
- right: var(--input-field-padding-x);
4731
- pointer-events: none;
4732
- color: var(--color-text-subtle-default);
4733
- }
4734
-
4735
- .muka-select__field--disabled .muka-select__chevron {
4736
- color: var(--input-field-color-disabled-foreground);
4737
- }
4738
-
4739
- /* Helper text — same as Input */
4740
- .muka-select__helper {
4741
- font-family: var(--text-label-sm-regular-fontFamily);
4742
- font-weight: var(--text-label-sm-regular-fontWeight);
4743
- font-size: var(--text-label-sm-regular-fontSize);
4744
- line-height: var(--text-label-sm-regular-lineHeight);
4745
- color: var(--color-text-subtle-default);
4746
- margin: 0;
4747
- }
4748
-
4749
- /* Error message — same as Input */
4750
- .muka-select__error {
4751
- font-family: var(--text-label-sm-regular-fontFamily);
4752
- font-weight: var(--text-label-sm-regular-fontWeight);
4753
- font-size: var(--text-label-sm-regular-fontSize);
4754
- line-height: var(--text-label-sm-regular-lineHeight);
4755
- color: var(--color-state-error-foreground);
4756
- margin: 0;
4757
- }
4758
-
4759
-
4760
- /* SegmentGroup */
4761
- /* SegmentGroup Component Styles - Using Muka Design Tokens */
4762
-
4763
- /* Container */
4764
- .muka-segmentgroup {
4765
- display: inline-flex;
4766
- align-items: center;
4767
- gap: 0;
4768
- padding: var(--segmentgroup-container-padding);
4769
- background-color: var(--segmentgroup-container-background);
4770
- border-radius: var(--segmentgroup-container-radius);
4771
- position: relative;
4772
- transition: all 0.2s ease;
4773
- }
4774
-
4775
- /* Inset shadow on container */
4776
- .muka-segmentgroup::after {
4777
- content: '';
4778
- position: absolute;
4779
- inset: 0;
4780
- border-radius: inherit;
4781
- box-shadow: var(--segmentgroup-container-shadow);
4782
- pointer-events: none;
4783
- }
4784
-
4785
- /* Full width variant */
4786
- .muka-segmentgroup--full-width {
4787
- width: 100%;
4788
- }
4789
-
4790
- .muka-segmentgroup--full-width .muka-segmentgroup__segment {
4791
- flex: 1;
4820
+ .muka-segmentgroup--full-width .muka-segmentgroup__segment {
4821
+ flex: 1;
4792
4822
  }
4793
4823
 
4794
4824
  /* Pill */
@@ -5496,80 +5526,271 @@ body {
5496
5526
  }
5497
5527
 
5498
5528
 
5499
- /* ProgressTracker */
5500
- /* ProgressTracker Component Styles — Using Muka Design Tokens */
5529
+ /* Radio */
5530
+ /* Radio Component Styles - Using Muka Design Tokens */
5501
5531
 
5502
- /* ─── Root ──────────────────────────────────────────────── */
5503
- .muka-progress-tracker {
5504
- width: 100%;
5505
- padding-bottom: var(--spacing-7);
5532
+ /* Wrapper - clickable label container */
5533
+ .muka-radio {
5534
+ display: inline-flex;
5535
+ align-items: center;
5536
+ gap: var(--spacing-4);
5537
+ cursor: pointer;
5538
+ user-select: none;
5506
5539
  }
5507
5540
 
5508
- /* ─── Track (layered container) ─────────────────────────── */
5509
- .muka-progress-tracker__track {
5541
+ .muka-radio--disabled {
5542
+ cursor: not-allowed;
5543
+ opacity: 0.6;
5544
+ }
5545
+
5546
+ /* Control container */
5547
+ .muka-radio__control {
5510
5548
  position: relative;
5511
- /* Vertical padding = (indicator size - connector height) / 2 = (32 - 4) / 2 = 14px */
5512
- padding-top: 14px;
5513
- padding-bottom: 14px;
5549
+ display: inline-flex;
5550
+ align-items: center;
5551
+ justify-content: center;
5552
+ flex-shrink: 0;
5514
5553
  }
5515
5554
 
5516
- /* ─── Steps layer (on top) ──────────────────────────────── */
5517
- .muka-progress-tracker__steps {
5555
+ /* Hidden native input */
5556
+ .muka-radio__input {
5518
5557
  position: absolute;
5519
- inset: 0;
5520
- display: flex;
5521
- align-items: flex-start;
5522
- justify-content: space-between;
5523
- z-index: 2;
5558
+ width: 1px;
5559
+ height: 1px;
5560
+ padding: 0;
5561
+ margin: -1px;
5562
+ overflow: hidden;
5563
+ clip: rect(0, 0, 0, 0);
5564
+ white-space: nowrap;
5565
+ border: 0;
5524
5566
  }
5525
5567
 
5526
- /* ─── Individual step ───────────────────────────────────── */
5527
- .muka-progress-tracker__step {
5568
+ /* Visual indicator (circle) */
5569
+ .muka-radio__indicator {
5528
5570
  display: flex;
5529
- flex-direction: column;
5530
5571
  align-items: center;
5531
- gap: 7px;
5532
- position: relative;
5572
+ justify-content: center;
5573
+ width: var(--radio-size-default);
5574
+ height: var(--radio-size-default);
5575
+ border-radius: var(--border-radius-full);
5576
+ background-color: var(--radio-color-default-background);
5577
+ border: var(--border-width-regular) solid var(--radio-color-default-border);
5578
+ transition: all 0.15s ease;
5579
+ box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
5533
5580
  }
5534
5581
 
5535
- /* ─── Step indicator (circle) ───────────────────────────── */
5536
- .muka-progress-tracker__indicator {
5537
- width: 32px;
5538
- height: 32px;
5582
+ /* Size variants */
5583
+ .muka-radio--sm .muka-radio__indicator {
5584
+ width: var(--radio-size-sm);
5585
+ height: var(--radio-size-sm);
5586
+ }
5587
+
5588
+ .muka-radio--lg .muka-radio__indicator {
5589
+ width: var(--radio-size-lg);
5590
+ height: var(--radio-size-lg);
5591
+ }
5592
+
5593
+ /* Inner dot (shown when checked) */
5594
+ .muka-radio__dot {
5595
+ width: var(--radio-dot-size-default);
5596
+ height: var(--radio-dot-size-default);
5539
5597
  border-radius: var(--border-radius-full);
5540
- display: flex;
5541
- align-items: center;
5542
- justify-content: center;
5543
- flex-shrink: 0;
5544
- position: relative;
5598
+ background-color: var(--radio-color-default-dot);
5599
+ transform: scale(0);
5600
+ transition: transform 0.15s ease;
5545
5601
  }
5546
5602
 
5547
- /* Past: dark accent contrast circle with white checkmark */
5548
- .muka-progress-tracker__indicator--past {
5549
- background-color: var(--alias-color-accent-contrast);
5550
- color: var(--color-text-default-inverse);
5551
- cursor: pointer;
5603
+ .muka-radio--sm .muka-radio__dot {
5604
+ width: var(--radio-dot-size-sm);
5605
+ height: var(--radio-dot-size-sm);
5552
5606
  }
5553
5607
 
5554
- .muka-progress-tracker__indicator--past:hover {
5555
- background-color: var(--alias-color-accent-pressed);
5608
+ .muka-radio--lg .muka-radio__dot {
5609
+ width: var(--radio-dot-size-lg);
5610
+ height: var(--radio-dot-size-lg);
5556
5611
  }
5557
5612
 
5558
- .muka-progress-tracker__indicator--past:focus-visible {
5613
+ /* Hover state - removed per design */
5614
+
5615
+ /* Focus state */
5616
+ .muka-radio__input:focus-visible + .muka-radio__indicator {
5559
5617
  outline: 2px solid var(--color-border-focus);
5560
5618
  outline-offset: 2px;
5561
5619
  }
5562
5620
 
5563
- /* Current: accent default circle with white number */
5564
- .muka-progress-tracker__indicator--current {
5565
- background-color: var(--alias-color-accent-default);
5566
- color: var(--color-text-default-inverse);
5567
- }
5568
-
5569
- /* Upcoming: sunken/gray circle with dark number */
5570
- .muka-progress-tracker__indicator--upcoming {
5571
- background-color: var(--color-surface-sunken);
5572
- color: var(--color-text-default-default);
5621
+ /* Checked state */
5622
+ .muka-radio__input:checked + .muka-radio__indicator {
5623
+ background-color: var(--radio-color-checked-background);
5624
+ border-width: var(--border-width-bold);
5625
+ border-color: var(--radio-color-checked-border);
5626
+ box-shadow: none;
5627
+ }
5628
+
5629
+ .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
5630
+ background-color: var(--radio-color-checked-dot);
5631
+ transform: scale(1);
5632
+ }
5633
+
5634
+ /* Disabled state */
5635
+ .muka-radio--disabled .muka-radio__indicator {
5636
+ background-color: var(--radio-color-disabled-background);
5637
+ border-color: var(--radio-color-disabled-border);
5638
+ box-shadow: none;
5639
+ }
5640
+
5641
+ .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
5642
+ background-color: var(--radio-color-disabled-dot);
5643
+ }
5644
+
5645
+ /* Label text */
5646
+ .muka-radio__label {
5647
+ font-family: var(--text-label-lg-regular-fontFamily);
5648
+ font-weight: var(--text-label-lg-regular-fontWeight);
5649
+ font-size: var(--text-label-lg-regular-fontSize);
5650
+ line-height: var(--text-label-lg-regular-lineHeight);
5651
+ color: var(--color-text-default-default);
5652
+ }
5653
+
5654
+ .muka-radio--sm .muka-radio__label {
5655
+ font-family: var(--text-label-md-regular-fontFamily);
5656
+ font-weight: var(--text-label-md-regular-fontWeight);
5657
+ font-size: var(--text-label-md-regular-fontSize);
5658
+ line-height: var(--text-label-md-regular-lineHeight);
5659
+ }
5660
+
5661
+ .muka-radio--lg .muka-radio__label {
5662
+ font-family: var(--text-label-xl-regular-fontFamily);
5663
+ font-weight: var(--text-label-xl-regular-fontWeight);
5664
+ font-size: var(--text-label-xl-regular-fontSize);
5665
+ line-height: var(--text-label-xl-regular-lineHeight);
5666
+ }
5667
+
5668
+ .muka-radio--disabled .muka-radio__label {
5669
+ color: var(--color-text-subtle-default);
5670
+ }
5671
+
5672
+
5673
+ /* PullToRefresh */
5674
+ /* PullToRefresh Component Styles */
5675
+
5676
+ .muka-pull-to-refresh {
5677
+ position: relative;
5678
+ display: flex;
5679
+ flex-direction: column;
5680
+ width: 100%;
5681
+ height: 100%;
5682
+ overflow: hidden;
5683
+ }
5684
+
5685
+ .muka-pull-to-refresh__indicator {
5686
+ position: absolute;
5687
+ top: 0;
5688
+ left: 0;
5689
+ right: 0;
5690
+ display: flex;
5691
+ align-items: flex-end;
5692
+ justify-content: center;
5693
+ padding-bottom: var(--spacing-2);
5694
+ color: var(--color-text-subtle-default);
5695
+ overflow: hidden;
5696
+ pointer-events: none;
5697
+ z-index: 1;
5698
+ }
5699
+
5700
+ .muka-pull-to-refresh__chevron {
5701
+ display: inline-flex;
5702
+ align-items: center;
5703
+ justify-content: center;
5704
+ transition: transform 0.16s ease;
5705
+ }
5706
+
5707
+ .muka-pull-to-refresh__scroller {
5708
+ flex: 1 1 auto;
5709
+ min-height: 0;
5710
+ width: 100%;
5711
+ overflow-x: clip;
5712
+ overflow-y: auto;
5713
+ -webkit-overflow-scrolling: touch;
5714
+ overscroll-behavior-y: contain;
5715
+ touch-action: pan-y;
5716
+ will-change: transform;
5717
+ }
5718
+
5719
+
5720
+ /* ProgressTracker */
5721
+ /* ProgressTracker Component Styles — Using Muka Design Tokens */
5722
+
5723
+ /* ─── Root ──────────────────────────────────────────────── */
5724
+ .muka-progress-tracker {
5725
+ width: 100%;
5726
+ padding-bottom: var(--spacing-7);
5727
+ }
5728
+
5729
+ /* ─── Track (layered container) ─────────────────────────── */
5730
+ .muka-progress-tracker__track {
5731
+ position: relative;
5732
+ /* Vertical padding = (indicator size - connector height) / 2 = (32 - 4) / 2 = 14px */
5733
+ padding-top: 14px;
5734
+ padding-bottom: 14px;
5735
+ }
5736
+
5737
+ /* ─── Steps layer (on top) ──────────────────────────────── */
5738
+ .muka-progress-tracker__steps {
5739
+ position: absolute;
5740
+ inset: 0;
5741
+ display: flex;
5742
+ align-items: flex-start;
5743
+ justify-content: space-between;
5744
+ z-index: 2;
5745
+ }
5746
+
5747
+ /* ─── Individual step ───────────────────────────────────── */
5748
+ .muka-progress-tracker__step {
5749
+ display: flex;
5750
+ flex-direction: column;
5751
+ align-items: center;
5752
+ gap: 7px;
5753
+ position: relative;
5754
+ }
5755
+
5756
+ /* ─── Step indicator (circle) ───────────────────────────── */
5757
+ .muka-progress-tracker__indicator {
5758
+ width: 32px;
5759
+ height: 32px;
5760
+ border-radius: var(--border-radius-full);
5761
+ display: flex;
5762
+ align-items: center;
5763
+ justify-content: center;
5764
+ flex-shrink: 0;
5765
+ position: relative;
5766
+ }
5767
+
5768
+ /* Past: dark accent contrast circle with white checkmark */
5769
+ .muka-progress-tracker__indicator--past {
5770
+ background-color: var(--alias-color-accent-contrast);
5771
+ color: var(--color-text-default-inverse);
5772
+ cursor: pointer;
5773
+ }
5774
+
5775
+ .muka-progress-tracker__indicator--past:hover {
5776
+ background-color: var(--alias-color-accent-pressed);
5777
+ }
5778
+
5779
+ .muka-progress-tracker__indicator--past:focus-visible {
5780
+ outline: 2px solid var(--color-border-focus);
5781
+ outline-offset: 2px;
5782
+ }
5783
+
5784
+ /* Current: accent default circle with white number */
5785
+ .muka-progress-tracker__indicator--current {
5786
+ background-color: var(--alias-color-accent-default);
5787
+ color: var(--color-text-default-inverse);
5788
+ }
5789
+
5790
+ /* Upcoming: sunken/gray circle with dark number */
5791
+ .muka-progress-tracker__indicator--upcoming {
5792
+ background-color: var(--color-surface-sunken);
5793
+ color: var(--color-text-default-default);
5573
5794
  }
5574
5795
 
5575
5796
  /* ─── Step number text ──────────────────────────────────── */
@@ -5687,11 +5908,13 @@ body {
5687
5908
  gap: var(--spacing-8);
5688
5909
  }
5689
5910
 
5690
- /* Past-expanded groups header + slot with a tighter internal gap */
5911
+ /* Past steps group header + slot. The header↔content gap lives inside the
5912
+ collapsing slot (as padding-top) so it collapses with the content, so the
5913
+ body gap itself is 0. */
5691
5914
  .muka-progress-accordeon__body {
5692
5915
  display: flex;
5693
5916
  flex-direction: column;
5694
- gap: var(--spacing-4);
5917
+ gap: 0;
5695
5918
  width: 100%;
5696
5919
  }
5697
5920
 
@@ -5824,6 +6047,34 @@ body {
5824
6047
  width: 100%;
5825
6048
  }
5826
6049
 
6050
+ /* ─── Collapse/expand animation (past steps) ─────────────────
6051
+ The grid-template-rows 1fr → 0fr technique animates the content to/from its
6052
+ intrinsic (auto) height with no magic max-height. Under prefers-reduced-motion
6053
+ --motion-duration-view resolves to 0ms, so the toggle stays instant. */
6054
+ .muka-progress-accordeon__slot-wrapper {
6055
+ display: grid;
6056
+ grid-template-rows: 1fr;
6057
+ transition: grid-template-rows var(--motion-duration-view) var(--motion-easing-enter);
6058
+ }
6059
+
6060
+ .muka-progress-accordeon__slot-wrapper--collapsed {
6061
+ grid-template-rows: 0fr;
6062
+ }
6063
+
6064
+ /* The direct grid child clips and must have NO padding/border of its own —
6065
+ min-height:0 lets it shrink, and with no padding the 0fr track reaches a true
6066
+ 0 height (padding on the item would leave a residual gap when collapsed). */
6067
+ .muka-progress-accordeon__slot-clip {
6068
+ overflow: hidden;
6069
+ min-height: 0;
6070
+ }
6071
+
6072
+ /* The header↔content spacing lives on the inner slot (inside the clip region)
6073
+ so it collapses together with the content. */
6074
+ .muka-progress-accordeon__slot-wrapper .muka-progress-accordeon__slot {
6075
+ padding-top: var(--spacing-4);
6076
+ }
6077
+
5827
6078
  /* ─── Action buttons (current state) ─────────────────────── */
5828
6079
  .muka-progress-accordeon__actions {
5829
6080
  display: flex;
@@ -6340,52 +6591,180 @@ body {
6340
6591
  }
6341
6592
 
6342
6593
 
6343
- /* Pagination */
6344
- /* Pagination Component Styles */
6594
+ /* PhotoUploader */
6595
+ /* PhotoUploader Component Styles - Using Muka Design Tokens */
6345
6596
 
6346
- .muka-pagination__list {
6597
+ .muka-photo-uploader {
6347
6598
  display: flex;
6348
- align-items: center;
6349
- gap: var(--spacing-1);
6599
+ flex-direction: column;
6600
+ align-items: flex-start;
6601
+ gap: var(--spacing-4);
6602
+ width: 100%;
6603
+ }
6604
+
6605
+ /* Visually-hidden native file input */
6606
+ .muka-photo-uploader__input {
6607
+ position: absolute;
6608
+ width: 1px;
6609
+ height: 1px;
6610
+ padding: 0;
6611
+ margin: -1px;
6612
+ overflow: hidden;
6613
+ clip: rect(0, 0, 0, 0);
6614
+ white-space: nowrap;
6615
+ border: 0;
6616
+ }
6617
+
6618
+ /* ─── Error feedback alert ────────────────────────────── */
6619
+ .muka-photo-uploader__alert {
6620
+ width: 100%;
6621
+ }
6622
+
6623
+ /* ─── Thumbnail grid ──────────────────────────────────── */
6624
+ .muka-photo-uploader__grid {
6625
+ display: flex;
6626
+ flex-wrap: wrap;
6627
+ gap: var(--spacing-3);
6628
+ width: 100%;
6629
+ margin: 0;
6630
+ padding: 0;
6350
6631
  list-style: none;
6632
+ }
6633
+
6634
+ .muka-photo-uploader__grid-item {
6351
6635
  margin: 0;
6352
6636
  padding: 0;
6353
6637
  }
6354
6638
 
6355
- /* Base button */
6356
- .muka-pagination__button {
6357
- display: inline-flex;
6639
+ /* ─── Drop zone card ──────────────────────────────────── */
6640
+ .muka-photo-uploader__dropzone {
6641
+ display: flex;
6642
+ flex-direction: column;
6358
6643
  align-items: center;
6359
6644
  justify-content: center;
6360
- border: var(--border-width-regular) solid transparent;
6361
- border-radius: var(--radius-md);
6362
- background: transparent;
6363
- color: var(--color-text-default-default);
6645
+ gap: var(--spacing-4);
6646
+ width: 100%;
6647
+ padding: var(--card-padding-lg);
6648
+ background-color: var(--card-color-default-background);
6649
+ border: var(--border-width-regular, 1px) solid var(--card-color-default-border);
6650
+ border-radius: var(--border-radius-lg);
6364
6651
  cursor: pointer;
6365
- font: inherit;
6366
- transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
6367
- padding: 0;
6652
+ text-align: center;
6653
+ transition: background-color var(--motion-duration-micro) var(--motion-easing-enter),
6654
+ border-color var(--motion-duration-micro) var(--motion-easing-enter);
6368
6655
  }
6369
6656
 
6370
- .muka-pagination__button:hover:not(:disabled):not(.muka-pagination__button--active) {
6657
+ .muka-photo-uploader__dropzone:hover,
6658
+ .muka-photo-uploader__dropzone--active {
6659
+ border-color: var(--color-border-focus);
6371
6660
  background-color: var(--color-surface-level1);
6372
6661
  }
6373
6662
 
6374
- /* Active page */
6375
- .muka-pagination__button--active {
6376
- background-color: var(--button-color-primary-default-background);
6377
- color: var(--button-color-primary-default-foreground);
6378
- border-color: var(--button-color-primary-default-background);
6379
- font-weight: 600;
6663
+ .muka-photo-uploader__dropzone:focus-visible {
6664
+ outline: 2px solid var(--color-border-focus);
6665
+ outline-offset: 2px;
6380
6666
  }
6381
6667
 
6382
- /* Nav buttons (prev/next/first/last) */
6383
- .muka-pagination__button--nav {
6668
+ .muka-photo-uploader__dropzone-icon {
6669
+ display: flex;
6670
+ align-items: center;
6671
+ justify-content: center;
6672
+ color: var(--color-icon-subtle-default);
6673
+ }
6674
+
6675
+ .muka-photo-uploader__dropzone-text {
6676
+ font-family: var(--text-body-md-regular-fontFamily);
6677
+ font-size: var(--text-body-md-regular-fontSize);
6678
+ font-weight: var(--text-body-md-regular-fontWeight);
6679
+ line-height: var(--text-body-md-regular-lineHeight);
6384
6680
  color: var(--color-text-subtle-default);
6385
6681
  }
6386
6682
 
6387
- .muka-pagination__button:disabled {
6388
- opacity: 0.4;
6683
+ /* ─── Disabled ────────────────────────────────────────── */
6684
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone {
6685
+ cursor: not-allowed;
6686
+ opacity: 0.6;
6687
+ }
6688
+
6689
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone:hover {
6690
+ border-color: var(--card-color-default-border);
6691
+ background-color: var(--card-color-default-background);
6692
+ }
6693
+
6694
+ /* ─── Enlarged photo dialog ───────────────────────────── */
6695
+ .muka-photo-uploader__preview {
6696
+ display: flex;
6697
+ align-items: center;
6698
+ justify-content: center;
6699
+ width: 100%;
6700
+ height: 100%;
6701
+ }
6702
+
6703
+ /* Fits the dialog while preserving the photo's original aspect ratio. */
6704
+ .muka-photo-uploader__preview-image {
6705
+ display: block;
6706
+ max-width: 100%;
6707
+ max-height: 100%;
6708
+ width: auto;
6709
+ height: auto;
6710
+ object-fit: contain;
6711
+ border-radius: var(--border-radius-lg);
6712
+ }
6713
+
6714
+ /* ─── Reduced motion ──────────────────────────────────── */
6715
+ @media (prefers-reduced-motion: reduce) {
6716
+ .muka-photo-uploader__dropzone {
6717
+ transition: none;
6718
+ }
6719
+ }
6720
+
6721
+
6722
+ /* Pagination */
6723
+ /* Pagination Component Styles */
6724
+
6725
+ .muka-pagination__list {
6726
+ display: flex;
6727
+ align-items: center;
6728
+ gap: var(--spacing-1);
6729
+ list-style: none;
6730
+ margin: 0;
6731
+ padding: 0;
6732
+ }
6733
+
6734
+ /* Base button */
6735
+ .muka-pagination__button {
6736
+ display: inline-flex;
6737
+ align-items: center;
6738
+ justify-content: center;
6739
+ border: var(--border-width-regular) solid transparent;
6740
+ border-radius: var(--radius-md);
6741
+ background: transparent;
6742
+ color: var(--color-text-default-default);
6743
+ cursor: pointer;
6744
+ font: inherit;
6745
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
6746
+ padding: 0;
6747
+ }
6748
+
6749
+ .muka-pagination__button:hover:not(:disabled):not(.muka-pagination__button--active) {
6750
+ background-color: var(--color-surface-level1);
6751
+ }
6752
+
6753
+ /* Active page */
6754
+ .muka-pagination__button--active {
6755
+ background-color: var(--button-color-primary-default-background);
6756
+ color: var(--button-color-primary-default-foreground);
6757
+ border-color: var(--button-color-primary-default-background);
6758
+ font-weight: 600;
6759
+ }
6760
+
6761
+ /* Nav buttons (prev/next/first/last) */
6762
+ .muka-pagination__button--nav {
6763
+ color: var(--color-text-subtle-default);
6764
+ }
6765
+
6766
+ .muka-pagination__button:disabled {
6767
+ opacity: 0.4;
6389
6768
  cursor: not-allowed;
6390
6769
  }
6391
6770
 
@@ -9304,6 +9683,35 @@ li.muka-listitem {
9304
9683
  transition: stroke-dasharray 0.3s ease;
9305
9684
  }
9306
9685
 
9686
+ /* ─── Indeterminate (spinner) ─────────────────────────── */
9687
+ /* A masked ring filled with an angular (conic) gradient that rotates. The mask
9688
+ band matches the donut geometry (r=40, strokeWidth=16 → 64%–96% of radius) so
9689
+ it swaps seamlessly with the value-based progress donut. */
9690
+ .muka-data-pie-chart__spinner-track,
9691
+ .muka-data-pie-chart__spinner {
9692
+ position: absolute;
9693
+ inset: 0;
9694
+ border-radius: 50%;
9695
+ -webkit-mask: radial-gradient(farthest-side, transparent 63%, #000 65%, #000 95%, transparent 97%);
9696
+ mask: radial-gradient(farthest-side, transparent 63%, #000 65%, #000 95%, transparent 97%);
9697
+ }
9698
+
9699
+ .muka-data-pie-chart__spinner {
9700
+ animation: muka-data-pie-chart-spin 0.9s linear infinite;
9701
+ }
9702
+
9703
+ @keyframes muka-data-pie-chart-spin {
9704
+ to {
9705
+ transform: rotate(360deg);
9706
+ }
9707
+ }
9708
+
9709
+ @media (prefers-reduced-motion: reduce) {
9710
+ .muka-data-pie-chart__spinner {
9711
+ animation-duration: 2.5s;
9712
+ }
9713
+ }
9714
+
9307
9715
  .muka-data-pie-chart__value {
9308
9716
  position: absolute;
9309
9717
  inset: 0;
@@ -11877,6 +12285,13 @@ li.muka-listitem {
11877
12285
  height: 100%;
11878
12286
  }
11879
12287
 
12288
+ /* The leading icon and the dismiss (×) icon inherit the variant accent set on
12289
+ their container, overriding the Icon component's default color. */
12290
+ .muka-alert__icon .muka-icon,
12291
+ .muka-alert__dismiss .muka-icon {
12292
+ color: inherit;
12293
+ }
12294
+
11880
12295
  /* Content */
11881
12296
  .muka-alert__content {
11882
12297
  flex: 1;
@@ -12383,193 +12798,196 @@ li.muka-listitem {
12383
12798
  }
12384
12799
 
12385
12800
 
12386
- /* Radio */
12387
- /* Radio Component Styles - Using Muka Design Tokens */
12801
+ /* Select */
12802
+ /* Select Component Styles - Aligned with Input for consistency */
12388
12803
 
12389
- /* Wrapper - clickable label container */
12390
- .muka-radio {
12804
+ .muka-select {
12391
12805
  display: inline-flex;
12392
- align-items: center;
12393
- gap: var(--spacing-4);
12394
- cursor: pointer;
12395
- user-select: none;
12806
+ flex-direction: column;
12807
+ gap: var(--spacing-2);
12396
12808
  }
12397
12809
 
12398
- .muka-radio--disabled {
12399
- cursor: not-allowed;
12400
- opacity: 0.6;
12810
+ .muka-select--full-width {
12811
+ width: 100%;
12401
12812
  }
12402
12813
 
12403
- /* Control container */
12404
- .muka-radio__control {
12405
- position: relative;
12406
- display: inline-flex;
12407
- align-items: center;
12408
- justify-content: center;
12409
- flex-shrink: 0;
12814
+ /* Label */
12815
+ .muka-select__label {
12816
+ color: var(--color-text-default-default);
12817
+ cursor: pointer;
12410
12818
  }
12411
12819
 
12412
- /* Hidden native input */
12413
- .muka-radio__input {
12414
- position: absolute;
12415
- width: 1px;
12416
- height: 1px;
12417
- padding: 0;
12418
- margin: -1px;
12419
- overflow: hidden;
12420
- clip: rect(0, 0, 0, 0);
12421
- white-space: nowrap;
12422
- border: 0;
12820
+ .muka-select__label--sm {
12821
+ font-family: var(--text-label-sm-semibold-fontFamily);
12822
+ font-weight: var(--text-label-sm-semibold-fontWeight);
12823
+ font-size: var(--text-label-sm-semibold-fontSize);
12824
+ line-height: var(--text-label-sm-semibold-lineHeight);
12423
12825
  }
12424
12826
 
12425
- /* Visual indicator (circle) */
12426
- .muka-radio__indicator {
12427
- display: flex;
12428
- align-items: center;
12429
- justify-content: center;
12430
- width: var(--radio-size-default);
12431
- height: var(--radio-size-default);
12432
- border-radius: var(--border-radius-full);
12433
- background-color: var(--radio-color-default-background);
12434
- border: var(--border-width-regular) solid var(--radio-color-default-border);
12435
- transition: all 0.15s ease;
12436
- box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
12827
+ .muka-select__label--md {
12828
+ font-family: var(--text-label-md-semibold-fontFamily);
12829
+ font-weight: var(--text-label-md-semibold-fontWeight);
12830
+ font-size: var(--text-label-md-semibold-fontSize);
12831
+ line-height: var(--text-label-md-semibold-lineHeight);
12437
12832
  }
12438
12833
 
12439
- /* Size variants */
12440
- .muka-radio--sm .muka-radio__indicator {
12441
- width: var(--radio-size-sm);
12442
- height: var(--radio-size-sm);
12834
+ .muka-select__label--lg {
12835
+ font-family: var(--text-label-lg-semibold-fontFamily);
12836
+ font-weight: var(--text-label-lg-semibold-fontWeight);
12837
+ font-size: var(--text-label-lg-semibold-fontSize);
12838
+ line-height: var(--text-label-lg-semibold-lineHeight);
12443
12839
  }
12444
12840
 
12445
- .muka-radio--lg .muka-radio__indicator {
12446
- width: var(--radio-size-lg);
12447
- height: var(--radio-size-lg);
12841
+ .muka-select__required {
12842
+ color: var(--color-state-error-foreground);
12448
12843
  }
12449
12844
 
12450
- /* Inner dot (shown when checked) */
12451
- .muka-radio__dot {
12452
- width: var(--radio-dot-size-default);
12453
- height: var(--radio-dot-size-default);
12454
- border-radius: var(--border-radius-full);
12455
- background-color: var(--radio-color-default-dot);
12456
- transform: scale(0);
12457
- transition: transform 0.15s ease;
12845
+ .muka-select__label--sm + .muka-select__field--disabled,
12846
+ .muka-select__label--md + .muka-select__field--disabled,
12847
+ .muka-select__label--lg + .muka-select__field--disabled {
12848
+ cursor: not-allowed;
12458
12849
  }
12459
12850
 
12460
- .muka-radio--sm .muka-radio__dot {
12461
- width: var(--radio-dot-size-sm);
12462
- height: var(--radio-dot-size-sm);
12851
+ /* Field container — same as Input: 1px border, radius, padding, inset shadow */
12852
+ .muka-select__field {
12853
+ display: flex;
12854
+ align-items: center;
12855
+ gap: var(--spacing-2);
12856
+ position: relative;
12857
+ background-color: var(--input-field-color-default-background);
12858
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
12859
+ border-radius: var(--input-field-radius-md);
12860
+ padding: var(--input-field-padding-y) var(--input-field-padding-x);
12861
+ transition: border-color 0.2s ease, background-color 0.2s ease;
12862
+ cursor: pointer;
12863
+ box-sizing: border-box;
12463
12864
  }
12464
12865
 
12465
- .muka-radio--lg .muka-radio__dot {
12466
- width: var(--radio-dot-size-lg);
12467
- height: var(--radio-dot-size-lg);
12866
+ /* Inset shadow — same as Input (single subtle line) */
12867
+ .muka-select__field::after {
12868
+ content: '';
12869
+ position: absolute;
12870
+ inset: 0;
12871
+ border-radius: inherit;
12872
+ box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.08);
12873
+ pointer-events: none;
12468
12874
  }
12469
12875
 
12470
- /* Hover state - removed per design */
12471
-
12472
- /* Focus state */
12473
- .muka-radio__input:focus-visible + .muka-radio__indicator {
12474
- outline: 2px solid var(--color-border-focus);
12475
- outline-offset: 2px;
12876
+ /* Size variants — same radius/height as Input */
12877
+ .muka-select__field--sm {
12878
+ min-height: var(--input-field-height-sm);
12879
+ border-radius: var(--input-field-radius-sm);
12476
12880
  }
12477
12881
 
12478
- /* Checked state */
12479
- .muka-radio__input:checked + .muka-radio__indicator {
12480
- background-color: var(--radio-color-checked-background);
12481
- border-width: var(--border-width-bold);
12482
- border-color: var(--radio-color-checked-border);
12483
- box-shadow: none;
12882
+ .muka-select__field--md {
12883
+ min-height: var(--input-field-height-default);
12884
+ border-radius: var(--input-field-radius-md);
12484
12885
  }
12485
12886
 
12486
- .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
12487
- background-color: var(--radio-color-checked-dot);
12488
- transform: scale(1);
12887
+ .muka-select__field--lg {
12888
+ min-height: var(--input-field-height-lg);
12889
+ border-radius: var(--input-field-radius-lg);
12489
12890
  }
12490
12891
 
12491
- /* Disabled state */
12492
- .muka-radio--disabled .muka-radio__indicator {
12493
- background-color: var(--radio-color-disabled-background);
12494
- border-color: var(--radio-color-disabled-border);
12495
- box-shadow: none;
12496
- }
12892
+ /* Hover — no visual change (same as Input) */
12497
12893
 
12498
- .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
12499
- background-color: var(--radio-color-disabled-dot);
12894
+ /* Focus (active) — same as Input: 2px border, padding compensation */
12895
+ .muka-select__field--focused:not(.muka-select__field--disabled) {
12896
+ border-width: var(--border-width-bold);
12897
+ border-color: var(--input-field-color-focus-border);
12898
+ background-color: var(--input-field-color-focus-background);
12899
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
12500
12900
  }
12501
12901
 
12502
- /* Label text */
12503
- .muka-radio__label {
12504
- font-family: var(--text-label-lg-regular-fontFamily);
12505
- font-weight: var(--text-label-lg-regular-fontWeight);
12506
- font-size: var(--text-label-lg-regular-fontSize);
12507
- line-height: var(--text-label-lg-regular-lineHeight);
12508
- color: var(--color-text-default-default);
12902
+ /* Error — same as Input: 2px border, padding compensation */
12903
+ .muka-select__field--error:not(.muka-select__field--disabled) {
12904
+ border-width: var(--border-width-bold);
12905
+ border-color: var(--input-field-color-error-border);
12906
+ background-color: var(--input-field-color-error-background);
12907
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
12509
12908
  }
12510
12909
 
12511
- .muka-radio--sm .muka-radio__label {
12512
- font-family: var(--text-label-md-regular-fontFamily);
12513
- font-weight: var(--text-label-md-regular-fontWeight);
12514
- font-size: var(--text-label-md-regular-fontSize);
12515
- line-height: var(--text-label-md-regular-lineHeight);
12910
+ /* Disabled — same as Input */
12911
+ .muka-select__field--disabled {
12912
+ background-color: var(--input-field-color-disabled-background);
12913
+ border-color: var(--input-field-color-disabled-border);
12914
+ cursor: not-allowed;
12516
12915
  }
12517
12916
 
12518
- .muka-radio--lg .muka-radio__label {
12519
- font-family: var(--text-label-xl-regular-fontFamily);
12520
- font-weight: var(--text-label-xl-regular-fontWeight);
12521
- font-size: var(--text-label-xl-regular-fontSize);
12522
- line-height: var(--text-label-xl-regular-lineHeight);
12917
+ .muka-select__field--disabled::after {
12918
+ display: none;
12523
12919
  }
12524
12920
 
12525
- .muka-radio--disabled .muka-radio__label {
12526
- color: var(--color-text-subtle-default);
12921
+ /* Native select — padding on field so native has 0 + right space for chevron */
12922
+ .muka-select__native {
12923
+ appearance: none;
12924
+ -webkit-appearance: none;
12925
+ flex: 1;
12926
+ border: none;
12927
+ outline: none;
12928
+ background: transparent;
12929
+ color: var(--input-field-color-default-foreground);
12930
+ font-family: var(--text-input-md-fontFamily);
12931
+ font-weight: var(--text-input-md-fontWeight);
12932
+ font-size: var(--text-input-md-fontSize);
12933
+ line-height: var(--text-input-md-lineHeight);
12934
+ padding: 0;
12935
+ padding-right: calc(var(--input-field-padding-x) + 1.5rem);
12936
+ cursor: pointer;
12937
+ min-width: 0;
12938
+ width: 100%;
12527
12939
  }
12528
12940
 
12941
+ .muka-select__field--sm .muka-select__native {
12942
+ font-family: var(--text-input-sm-fontFamily);
12943
+ font-weight: var(--text-input-sm-fontWeight);
12944
+ font-size: var(--text-input-sm-fontSize);
12945
+ line-height: var(--text-input-sm-lineHeight);
12946
+ }
12529
12947
 
12530
- /* PullToRefresh */
12531
- /* PullToRefresh Component Styles */
12948
+ .muka-select__field--lg .muka-select__native {
12949
+ font-family: var(--text-input-lg-fontFamily);
12950
+ font-weight: var(--text-input-lg-fontWeight);
12951
+ font-size: var(--text-input-lg-fontSize);
12952
+ line-height: var(--text-input-lg-lineHeight);
12953
+ }
12532
12954
 
12533
- .muka-pull-to-refresh {
12534
- position: relative;
12535
- display: flex;
12536
- flex-direction: column;
12537
- width: 100%;
12538
- height: 100%;
12539
- overflow: hidden;
12955
+ .muka-select__field--disabled .muka-select__native {
12956
+ color: var(--input-field-color-disabled-foreground);
12957
+ cursor: not-allowed;
12540
12958
  }
12541
12959
 
12542
- .muka-pull-to-refresh__indicator {
12960
+ /* Chevron — aligned with field padding */
12961
+ .muka-select__chevron {
12962
+ display: inline-flex;
12963
+ align-items: center;
12543
12964
  position: absolute;
12544
- top: 0;
12545
- left: 0;
12546
- right: 0;
12547
- display: flex;
12548
- align-items: flex-end;
12549
- justify-content: center;
12550
- padding-bottom: var(--spacing-2);
12551
- color: var(--color-text-subtle-default);
12552
- overflow: hidden;
12965
+ right: var(--input-field-padding-x);
12553
12966
  pointer-events: none;
12554
- z-index: 1;
12967
+ color: var(--color-text-subtle-default);
12555
12968
  }
12556
12969
 
12557
- .muka-pull-to-refresh__chevron {
12558
- display: inline-flex;
12559
- align-items: center;
12560
- justify-content: center;
12561
- transition: transform 0.16s ease;
12970
+ .muka-select__field--disabled .muka-select__chevron {
12971
+ color: var(--input-field-color-disabled-foreground);
12562
12972
  }
12563
12973
 
12564
- .muka-pull-to-refresh__scroller {
12565
- flex: 1 1 auto;
12566
- min-height: 0;
12567
- width: 100%;
12568
- overflow-x: clip;
12569
- overflow-y: auto;
12570
- -webkit-overflow-scrolling: touch;
12571
- overscroll-behavior-y: contain;
12572
- touch-action: pan-y;
12573
- will-change: transform;
12974
+ /* Helper text — same as Input */
12975
+ .muka-select__helper {
12976
+ font-family: var(--text-label-sm-regular-fontFamily);
12977
+ font-weight: var(--text-label-sm-regular-fontWeight);
12978
+ font-size: var(--text-label-sm-regular-fontSize);
12979
+ line-height: var(--text-label-sm-regular-lineHeight);
12980
+ color: var(--color-text-subtle-default);
12981
+ margin: 0;
12982
+ }
12983
+
12984
+ /* Error message — same as Input */
12985
+ .muka-select__error {
12986
+ font-family: var(--text-label-sm-regular-fontFamily);
12987
+ font-weight: var(--text-label-sm-regular-fontWeight);
12988
+ font-size: var(--text-label-sm-regular-fontSize);
12989
+ line-height: var(--text-label-sm-regular-lineHeight);
12990
+ color: var(--color-state-error-foreground);
12991
+ margin: 0;
12574
12992
  }
12575
12993