@revikornmann/muka-ui 0.27.3 → 0.28.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 (61) hide show
  1. package/dist/cjs/components/DataPieChart/DataPieChart.css +4 -1
  2. package/dist/cjs/components/DataPieChart/DataPieChart.js +1 -1
  3. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  4. package/dist/cjs/components/Dialog/Dialog.css +3 -0
  5. package/dist/cjs/components/Dialog/Dialog.js +66 -3
  6. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  7. package/dist/cjs/components/Input/Input.css +21 -0
  8. package/dist/cjs/components/MediaViewer/MediaViewer.css +180 -0
  9. package/dist/cjs/components/MediaViewer/MediaViewer.js +271 -0
  10. package/dist/cjs/components/MediaViewer/MediaViewer.js.map +1 -0
  11. package/dist/cjs/components/MediaViewer/index.js +6 -0
  12. package/dist/cjs/components/MediaViewer/index.js.map +1 -0
  13. package/dist/cjs/components/MediaViewer/mediaViewerGestures.js +65 -0
  14. package/dist/cjs/components/MediaViewer/mediaViewerGestures.js.map +1 -0
  15. package/dist/cjs/components/Thumbnail/Thumbnail.css +11 -0
  16. package/dist/cjs/components/Thumbnail/Thumbnail.js +6 -2
  17. package/dist/cjs/components/Thumbnail/Thumbnail.js.map +1 -1
  18. package/dist/cjs/components/index.js +3 -1
  19. package/dist/cjs/components/index.js.map +1 -1
  20. package/dist/esm/components/DataPieChart/DataPieChart.css +4 -1
  21. package/dist/esm/components/DataPieChart/DataPieChart.js +1 -1
  22. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  23. package/dist/esm/components/Dialog/Dialog.css +3 -0
  24. package/dist/esm/components/Dialog/Dialog.js +66 -3
  25. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  26. package/dist/esm/components/Input/Input.css +21 -0
  27. package/dist/esm/components/MediaViewer/MediaViewer.css +180 -0
  28. package/dist/esm/components/MediaViewer/MediaViewer.js +267 -0
  29. package/dist/esm/components/MediaViewer/MediaViewer.js.map +1 -0
  30. package/dist/esm/components/MediaViewer/index.js +2 -0
  31. package/dist/esm/components/MediaViewer/index.js.map +1 -0
  32. package/dist/esm/components/MediaViewer/mediaViewerGestures.js +58 -0
  33. package/dist/esm/components/MediaViewer/mediaViewerGestures.js.map +1 -0
  34. package/dist/esm/components/Thumbnail/Thumbnail.css +11 -0
  35. package/dist/esm/components/Thumbnail/Thumbnail.js +6 -2
  36. package/dist/esm/components/Thumbnail/Thumbnail.js.map +1 -1
  37. package/dist/esm/components/index.js +1 -0
  38. package/dist/esm/components/index.js.map +1 -1
  39. package/dist/styles/base.css +2 -0
  40. package/dist/styles/components/DataPieChart.css +4 -1
  41. package/dist/styles/components/Dialog.css +3 -0
  42. package/dist/styles/components/Input.css +21 -0
  43. package/dist/styles/components/MediaViewer.css +180 -0
  44. package/dist/styles/components/Thumbnail.css +11 -0
  45. package/dist/styles/index.css +824 -601
  46. package/dist/styles/muka-dark.css +824 -601
  47. package/dist/styles/muka-light.css +824 -601
  48. package/dist/styles/wireframe-dark.css +824 -601
  49. package/dist/styles/wireframe-light.css +824 -601
  50. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  51. package/dist/types/components/MediaViewer/MediaViewer.d.ts +86 -0
  52. package/dist/types/components/MediaViewer/MediaViewer.d.ts.map +1 -0
  53. package/dist/types/components/MediaViewer/index.d.ts +2 -0
  54. package/dist/types/components/MediaViewer/index.d.ts.map +1 -0
  55. package/dist/types/components/MediaViewer/mediaViewerGestures.d.ts +35 -0
  56. package/dist/types/components/MediaViewer/mediaViewerGestures.d.ts.map +1 -0
  57. package/dist/types/components/Thumbnail/Thumbnail.d.ts +21 -0
  58. package/dist/types/components/Thumbnail/Thumbnail.d.ts.map +1 -1
  59. package/dist/types/components/index.d.ts +1 -0
  60. package/dist/types/components/index.d.ts.map +1 -1
  61. package/package.json +1 -1
@@ -152,6 +152,8 @@ body {
152
152
  padding: 0;
153
153
  /* Page background uses Muka surface token so it matches theme (e.g. dark for muka-dark, wireframe-dark) */
154
154
  background-color: var(--color-surface-level3);
155
+ /* Default text color so bare text (h1–h6, p, span outside components) follows the theme instead of browser black */
156
+ color: var(--color-text-default-default);
155
157
  }
156
158
 
157
159
 
@@ -2469,6 +2471,38 @@ body {
2469
2471
  }
2470
2472
 
2471
2473
 
2474
+ /* VoiceMessage */
2475
+ /* VoiceMessage Component Styles */
2476
+
2477
+ .muka-voice-message {
2478
+ display: flex;
2479
+ align-items: center;
2480
+ gap: var(--spacing-3);
2481
+ width: 100%;
2482
+ min-width: min(16rem, 60vw);
2483
+ }
2484
+
2485
+ .muka-voice-message__wave {
2486
+ flex: 1 1 auto;
2487
+ min-width: 0;
2488
+ }
2489
+
2490
+ .muka-voice-message__time {
2491
+ flex: 0 0 auto;
2492
+ white-space: nowrap;
2493
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
2494
+ line-height: var(--text-label-sm-lineHeight, 1);
2495
+ font-variant-numeric: tabular-nums;
2496
+ color: var(--color-text-subtle-default);
2497
+ }
2498
+
2499
+ /* On the tinted own bubble the surface is the action color, so the timer flips
2500
+ * to the inverse text token for contrast. */
2501
+ .muka-voice-message--own .muka-voice-message__time {
2502
+ color: var(--color-text-default-inverse);
2503
+ }
2504
+
2505
+
2472
2506
  /* View */
2473
2507
  /* View Component Styles */
2474
2508
 
@@ -2579,38 +2613,6 @@ body {
2579
2613
  }
2580
2614
 
2581
2615
 
2582
- /* VoiceMessage */
2583
- /* VoiceMessage Component Styles */
2584
-
2585
- .muka-voice-message {
2586
- display: flex;
2587
- align-items: center;
2588
- gap: var(--spacing-3);
2589
- width: 100%;
2590
- min-width: min(16rem, 60vw);
2591
- }
2592
-
2593
- .muka-voice-message__wave {
2594
- flex: 1 1 auto;
2595
- min-width: 0;
2596
- }
2597
-
2598
- .muka-voice-message__time {
2599
- flex: 0 0 auto;
2600
- white-space: nowrap;
2601
- font-size: var(--text-label-sm-fontSize, 0.75rem);
2602
- line-height: var(--text-label-sm-lineHeight, 1);
2603
- font-variant-numeric: tabular-nums;
2604
- color: var(--color-text-subtle-default);
2605
- }
2606
-
2607
- /* On the tinted own bubble the surface is the action color, so the timer flips
2608
- * to the inverse text token for contrast. */
2609
- .muka-voice-message--own .muka-voice-message__time {
2610
- color: var(--color-text-default-inverse);
2611
- }
2612
-
2613
-
2614
2616
  /* Typography */
2615
2617
  .muka-typography-catalog {
2616
2618
  display: flex;
@@ -3711,6 +3713,17 @@ body {
3711
3713
  height: 120px;
3712
3714
  }
3713
3715
 
3716
+ /* Fluid: fill the parent's width; the shape sets the height via aspect-ratio. */
3717
+ .muka-thumbnail--fluid {
3718
+ width: 100%;
3719
+ height: auto;
3720
+ aspect-ratio: 1 / 1;
3721
+ }
3722
+
3723
+ .muka-thumbnail--fluid.muka-thumbnail--4-3 {
3724
+ aspect-ratio: 4 / 3;
3725
+ }
3726
+
3714
3727
  .muka-thumbnail--ellipse .muka-thumbnail__frame {
3715
3728
  border-radius: var(--border-radius-full);
3716
3729
  }
@@ -6156,147 +6169,219 @@ body {
6156
6169
  }
6157
6170
 
6158
6171
 
6159
- /* Radio */
6160
- /* Radio Component Styles - Using Muka Design Tokens */
6172
+ /* RangeSlider */
6173
+ /* RangeSlider Component Styles - Using Muka Design Tokens */
6161
6174
 
6162
- /* Wrapper - clickable label container */
6163
- .muka-radio {
6164
- display: inline-flex;
6165
- align-items: center;
6166
- gap: var(--spacing-4);
6167
- cursor: pointer;
6168
- user-select: none;
6175
+ .muka-range-slider {
6176
+ display: flex;
6177
+ flex-direction: column;
6178
+ gap: var(--spacing-1);
6179
+ width: 100%;
6169
6180
  }
6170
6181
 
6171
- .muka-radio--disabled {
6172
- cursor: not-allowed;
6173
- opacity: 0.6;
6174
- }
6182
+ /* ========================================
6183
+ HEADER: label group (label + info + optional) and value readout
6184
+ ======================================== */
6175
6185
 
6176
- /* Control container */
6177
- .muka-radio__control {
6178
- position: relative;
6179
- display: inline-flex;
6186
+ .muka-range-slider__header {
6187
+ display: flex;
6180
6188
  align-items: center;
6181
- justify-content: center;
6182
- flex-shrink: 0;
6183
- }
6184
-
6185
- /* Hidden native input */
6186
- .muka-radio__input {
6187
- position: absolute;
6188
- width: 1px;
6189
- height: 1px;
6190
- padding: 0;
6191
- margin: -1px;
6192
- overflow: hidden;
6193
- clip: rect(0, 0, 0, 0);
6194
- white-space: nowrap;
6195
- border: 0;
6189
+ justify-content: space-between;
6190
+ gap: var(--spacing-2);
6191
+ min-height: 24px;
6196
6192
  }
6197
6193
 
6198
- /* Visual indicator (circle) */
6199
- .muka-radio__indicator {
6200
- display: flex;
6194
+ .muka-range-slider__label-group {
6195
+ display: inline-flex;
6201
6196
  align-items: center;
6202
- justify-content: center;
6203
- width: var(--radio-size-default);
6204
- height: var(--radio-size-default);
6205
- border-radius: var(--border-radius-full);
6206
- background-color: var(--radio-color-default-background);
6207
- border: var(--border-width-regular) solid var(--radio-color-default-border);
6208
- transition: all 0.15s ease;
6209
- box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
6197
+ gap: var(--spacing-2);
6210
6198
  }
6211
6199
 
6212
- /* Size variants */
6213
- .muka-radio--sm .muka-radio__indicator {
6214
- width: var(--radio-size-sm);
6215
- height: var(--radio-size-sm);
6200
+ .muka-range-slider__label {
6201
+ font-family: var(--text-label-md-semibold-fontFamily);
6202
+ font-weight: var(--text-label-md-semibold-fontWeight);
6203
+ font-size: var(--text-label-md-semibold-fontSize);
6204
+ line-height: var(--text-label-md-semibold-lineHeight);
6205
+ color: var(--color-text-default-default);
6216
6206
  }
6217
6207
 
6218
- .muka-radio--lg .muka-radio__indicator {
6219
- width: var(--radio-size-lg);
6220
- height: var(--radio-size-lg);
6208
+ .muka-range-slider__info {
6209
+ color: var(--color-text-subtle-default);
6221
6210
  }
6222
6211
 
6223
- /* Inner dot (shown when checked) */
6224
- .muka-radio__dot {
6225
- width: var(--radio-dot-size-default);
6226
- height: var(--radio-dot-size-default);
6227
- border-radius: var(--border-radius-full);
6228
- background-color: var(--radio-color-default-dot);
6229
- transform: scale(0);
6230
- transition: transform 0.15s ease;
6212
+ .muka-range-slider__optional {
6213
+ font-family: var(--text-label-sm-regular-fontFamily);
6214
+ font-weight: var(--text-label-sm-regular-fontWeight);
6215
+ font-size: var(--text-label-sm-regular-fontSize);
6216
+ line-height: var(--text-label-sm-regular-lineHeight);
6217
+ color: var(--color-text-subtle-default);
6231
6218
  }
6232
6219
 
6233
- .muka-radio--sm .muka-radio__dot {
6234
- width: var(--radio-dot-size-sm);
6235
- height: var(--radio-dot-size-sm);
6220
+ .muka-range-slider__value {
6221
+ font-family: var(--text-label-md-regular-fontFamily);
6222
+ font-weight: var(--text-label-md-regular-fontWeight);
6223
+ font-size: var(--text-label-md-regular-fontSize);
6224
+ line-height: var(--text-label-md-regular-lineHeight);
6225
+ color: var(--color-text-default-default);
6226
+ font-variant-numeric: tabular-nums;
6236
6227
  }
6237
6228
 
6238
- .muka-radio--lg .muka-radio__dot {
6239
- width: var(--radio-dot-size-lg);
6240
- height: var(--radio-dot-size-lg);
6229
+ .muka-range-slider__helper {
6230
+ margin: 0;
6231
+ font-family: var(--text-body-sm-regular-fontFamily);
6232
+ font-weight: var(--text-body-sm-regular-fontWeight);
6233
+ font-size: var(--text-body-sm-regular-fontSize);
6234
+ line-height: var(--text-body-sm-regular-lineHeight);
6235
+ color: var(--color-text-subtle-default);
6241
6236
  }
6242
6237
 
6243
- /* Hover state - removed per design */
6238
+ /* ========================================
6239
+ TRACK + THUMB
6240
+ Native range input, restyled. A thick sunken track holds an accent fill up to
6241
+ the current value, with a circular grip handle. The filled portion is driven
6242
+ by the inline --muka-range-fill custom property (set from the component value).
6243
+ ======================================== */
6244
6244
 
6245
- /* Focus state */
6246
- .muka-radio__input:focus-visible + .muka-radio__indicator {
6247
- outline: 2px solid var(--color-border-focus);
6248
- outline-offset: 2px;
6245
+ /* Size variants: track height, thumb diameter and grip geometry */
6246
+ .muka-range-slider--sm {
6247
+ --muka-range-track-h: 12px;
6248
+ --muka-range-thumb: 24px;
6249
+ --muka-range-grip-h: 9px;
6249
6250
  }
6250
-
6251
- /* Checked state */
6252
- .muka-radio__input:checked + .muka-radio__indicator {
6253
- background-color: var(--radio-color-checked-background);
6254
- border-width: var(--border-width-bold);
6255
- border-color: var(--radio-color-checked-border);
6256
- box-shadow: none;
6251
+ .muka-range-slider--md {
6252
+ --muka-range-track-h: 16px;
6253
+ --muka-range-thumb: 32px;
6254
+ --muka-range-grip-h: 12px;
6255
+ }
6256
+ .muka-range-slider--lg {
6257
+ --muka-range-track-h: 20px;
6258
+ --muka-range-thumb: 40px;
6259
+ --muka-range-grip-h: 15px;
6257
6260
  }
6258
6261
 
6259
- .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
6260
- background-color: var(--radio-color-checked-dot);
6261
- transform: scale(1);
6262
+ .muka-range-slider__bar {
6263
+ /* Reserve the full thumb height so the handle never clips the layout. */
6264
+ display: flex;
6265
+ align-items: center;
6266
+ height: var(--muka-range-thumb);
6262
6267
  }
6263
6268
 
6264
- /* Disabled state */
6265
- .muka-radio--disabled .muka-radio__indicator {
6266
- background-color: var(--radio-color-disabled-background);
6267
- border-color: var(--radio-color-disabled-border);
6268
- box-shadow: none;
6269
+ .muka-range-slider__input {
6270
+ -webkit-appearance: none;
6271
+ appearance: none;
6272
+ width: 100%;
6273
+ height: var(--muka-range-thumb);
6274
+ margin: 0;
6275
+ background: transparent;
6276
+ cursor: pointer;
6277
+
6278
+ /* Grip handle fill + two vertical grip bars, all theme-aware. */
6279
+ --muka-range-grip-color: var(--color-text-subtle-default);
6280
+ --muka-range-grip-w: 2px;
6281
+ --muka-range-grip-gap: 3px;
6282
+
6283
+ /* The track fill: action colour up to the value, sunken surface beyond it. */
6284
+ --muka-range-track-fill: linear-gradient(
6285
+ to right,
6286
+ var(--color-action-default) 0,
6287
+ var(--color-action-default) var(--muka-range-fill, 0%),
6288
+ var(--color-surface-sunken) var(--muka-range-fill, 0%),
6289
+ var(--color-surface-sunken) 100%
6290
+ );
6269
6291
  }
6270
6292
 
6271
- .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
6272
- background-color: var(--radio-color-disabled-dot);
6293
+ .muka-range-slider__input:focus {
6294
+ outline: none;
6273
6295
  }
6274
6296
 
6275
- /* Label text */
6276
- .muka-radio__label {
6277
- font-family: var(--text-label-lg-regular-fontFamily);
6278
- font-weight: var(--text-label-lg-regular-fontWeight);
6279
- font-size: var(--text-label-lg-regular-fontSize);
6280
- line-height: var(--text-label-lg-regular-lineHeight);
6281
- color: var(--color-text-default-default);
6297
+ /* WebKit / Blink track */
6298
+ .muka-range-slider__input::-webkit-slider-runnable-track {
6299
+ height: var(--muka-range-track-h);
6300
+ border-radius: var(--border-radius-full);
6301
+ background-image: var(--muka-range-track-fill);
6302
+ border: 1px solid var(--color-border-contrast);
6303
+ box-shadow: var(--shadow-sunken);
6282
6304
  }
6283
6305
 
6284
- .muka-radio--sm .muka-radio__label {
6285
- font-family: var(--text-label-md-regular-fontFamily);
6286
- font-weight: var(--text-label-md-regular-fontWeight);
6287
- font-size: var(--text-label-md-regular-fontSize);
6288
- line-height: var(--text-label-md-regular-lineHeight);
6306
+ /* Firefox track + progress */
6307
+ .muka-range-slider__input::-moz-range-track {
6308
+ height: var(--muka-range-track-h);
6309
+ border-radius: var(--border-radius-full);
6310
+ background: var(--color-surface-sunken);
6311
+ border: 1px solid var(--color-border-contrast);
6312
+ box-shadow: var(--shadow-sunken);
6313
+ }
6314
+ .muka-range-slider__input::-moz-range-progress {
6315
+ height: var(--muka-range-track-h);
6316
+ border-radius: var(--border-radius-full);
6317
+ background: var(--color-action-default);
6289
6318
  }
6290
6319
 
6291
- .muka-radio--lg .muka-radio__label {
6292
- font-family: var(--text-label-xl-regular-fontFamily);
6293
- font-weight: var(--text-label-xl-regular-fontWeight);
6294
- font-size: var(--text-label-xl-regular-fontSize);
6295
- line-height: var(--text-label-xl-regular-lineHeight);
6320
+ /* WebKit / Blink thumb (vertically centred over the track) */
6321
+ .muka-range-slider__input::-webkit-slider-thumb {
6322
+ -webkit-appearance: none;
6323
+ appearance: none;
6324
+ width: var(--muka-range-thumb);
6325
+ height: var(--muka-range-thumb);
6326
+ margin-top: calc((var(--muka-range-track-h) - var(--muka-range-thumb)) / 2);
6327
+ border-radius: var(--border-radius-full);
6328
+ border: 1px solid var(--color-border-contrast);
6329
+ box-shadow: var(--shadow-level2);
6330
+ background-color: var(--color-surface-level1);
6331
+ background-image:
6332
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
6333
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
6334
+ background-repeat: no-repeat;
6335
+ background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
6336
+ background-position:
6337
+ calc(50% - var(--muka-range-grip-gap)) center,
6338
+ calc(50% + var(--muka-range-grip-gap)) center;
6339
+ transition: box-shadow 0.15s ease, background-color 0.15s ease;
6296
6340
  }
6297
6341
 
6298
- .muka-radio--disabled .muka-radio__label {
6299
- color: var(--color-text-subtle-default);
6342
+ /* Firefox thumb */
6343
+ .muka-range-slider__input::-moz-range-thumb {
6344
+ width: var(--muka-range-thumb);
6345
+ height: var(--muka-range-thumb);
6346
+ border-radius: var(--border-radius-full);
6347
+ border: 1px solid var(--color-border-contrast);
6348
+ box-shadow: var(--shadow-level2);
6349
+ background-color: var(--color-surface-level1);
6350
+ background-image:
6351
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
6352
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
6353
+ background-repeat: no-repeat;
6354
+ background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
6355
+ background-position:
6356
+ calc(50% - var(--muka-range-grip-gap)) center,
6357
+ calc(50% + var(--muka-range-grip-gap)) center;
6358
+ transition: box-shadow 0.15s ease, background-color 0.15s ease;
6359
+ }
6360
+
6361
+ /* Hover */
6362
+ .muka-range-slider__input:hover::-webkit-slider-thumb {
6363
+ background-color: var(--color-surface-level1);
6364
+ box-shadow: var(--shadow-level3);
6365
+ }
6366
+ .muka-range-slider__input:hover::-moz-range-thumb {
6367
+ background-color: var(--color-surface-level1);
6368
+ box-shadow: var(--shadow-level3);
6369
+ }
6370
+
6371
+ /* Focus ring */
6372
+ .muka-range-slider__input:focus-visible::-webkit-slider-thumb {
6373
+ box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
6374
+ }
6375
+ .muka-range-slider__input:focus-visible::-moz-range-thumb {
6376
+ box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
6377
+ }
6378
+
6379
+ /* Disabled */
6380
+ .muka-range-slider--disabled {
6381
+ opacity: 0.5;
6382
+ }
6383
+ .muka-range-slider--disabled .muka-range-slider__input {
6384
+ cursor: not-allowed;
6300
6385
  }
6301
6386
 
6302
6387
 
@@ -6443,6 +6528,150 @@ body {
6443
6528
  }
6444
6529
 
6445
6530
 
6531
+ /* Radio */
6532
+ /* Radio Component Styles - Using Muka Design Tokens */
6533
+
6534
+ /* Wrapper - clickable label container */
6535
+ .muka-radio {
6536
+ display: inline-flex;
6537
+ align-items: center;
6538
+ gap: var(--spacing-4);
6539
+ cursor: pointer;
6540
+ user-select: none;
6541
+ }
6542
+
6543
+ .muka-radio--disabled {
6544
+ cursor: not-allowed;
6545
+ opacity: 0.6;
6546
+ }
6547
+
6548
+ /* Control container */
6549
+ .muka-radio__control {
6550
+ position: relative;
6551
+ display: inline-flex;
6552
+ align-items: center;
6553
+ justify-content: center;
6554
+ flex-shrink: 0;
6555
+ }
6556
+
6557
+ /* Hidden native input */
6558
+ .muka-radio__input {
6559
+ position: absolute;
6560
+ width: 1px;
6561
+ height: 1px;
6562
+ padding: 0;
6563
+ margin: -1px;
6564
+ overflow: hidden;
6565
+ clip: rect(0, 0, 0, 0);
6566
+ white-space: nowrap;
6567
+ border: 0;
6568
+ }
6569
+
6570
+ /* Visual indicator (circle) */
6571
+ .muka-radio__indicator {
6572
+ display: flex;
6573
+ align-items: center;
6574
+ justify-content: center;
6575
+ width: var(--radio-size-default);
6576
+ height: var(--radio-size-default);
6577
+ border-radius: var(--border-radius-full);
6578
+ background-color: var(--radio-color-default-background);
6579
+ border: var(--border-width-regular) solid var(--radio-color-default-border);
6580
+ transition: all 0.15s ease;
6581
+ box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
6582
+ }
6583
+
6584
+ /* Size variants */
6585
+ .muka-radio--sm .muka-radio__indicator {
6586
+ width: var(--radio-size-sm);
6587
+ height: var(--radio-size-sm);
6588
+ }
6589
+
6590
+ .muka-radio--lg .muka-radio__indicator {
6591
+ width: var(--radio-size-lg);
6592
+ height: var(--radio-size-lg);
6593
+ }
6594
+
6595
+ /* Inner dot (shown when checked) */
6596
+ .muka-radio__dot {
6597
+ width: var(--radio-dot-size-default);
6598
+ height: var(--radio-dot-size-default);
6599
+ border-radius: var(--border-radius-full);
6600
+ background-color: var(--radio-color-default-dot);
6601
+ transform: scale(0);
6602
+ transition: transform 0.15s ease;
6603
+ }
6604
+
6605
+ .muka-radio--sm .muka-radio__dot {
6606
+ width: var(--radio-dot-size-sm);
6607
+ height: var(--radio-dot-size-sm);
6608
+ }
6609
+
6610
+ .muka-radio--lg .muka-radio__dot {
6611
+ width: var(--radio-dot-size-lg);
6612
+ height: var(--radio-dot-size-lg);
6613
+ }
6614
+
6615
+ /* Hover state - removed per design */
6616
+
6617
+ /* Focus state */
6618
+ .muka-radio__input:focus-visible + .muka-radio__indicator {
6619
+ outline: 2px solid var(--color-border-focus);
6620
+ outline-offset: 2px;
6621
+ }
6622
+
6623
+ /* Checked state */
6624
+ .muka-radio__input:checked + .muka-radio__indicator {
6625
+ background-color: var(--radio-color-checked-background);
6626
+ border-width: var(--border-width-bold);
6627
+ border-color: var(--radio-color-checked-border);
6628
+ box-shadow: none;
6629
+ }
6630
+
6631
+ .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
6632
+ background-color: var(--radio-color-checked-dot);
6633
+ transform: scale(1);
6634
+ }
6635
+
6636
+ /* Disabled state */
6637
+ .muka-radio--disabled .muka-radio__indicator {
6638
+ background-color: var(--radio-color-disabled-background);
6639
+ border-color: var(--radio-color-disabled-border);
6640
+ box-shadow: none;
6641
+ }
6642
+
6643
+ .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
6644
+ background-color: var(--radio-color-disabled-dot);
6645
+ }
6646
+
6647
+ /* Label text */
6648
+ .muka-radio__label {
6649
+ font-family: var(--text-label-lg-regular-fontFamily);
6650
+ font-weight: var(--text-label-lg-regular-fontWeight);
6651
+ font-size: var(--text-label-lg-regular-fontSize);
6652
+ line-height: var(--text-label-lg-regular-lineHeight);
6653
+ color: var(--color-text-default-default);
6654
+ }
6655
+
6656
+ .muka-radio--sm .muka-radio__label {
6657
+ font-family: var(--text-label-md-regular-fontFamily);
6658
+ font-weight: var(--text-label-md-regular-fontWeight);
6659
+ font-size: var(--text-label-md-regular-fontSize);
6660
+ line-height: var(--text-label-md-regular-lineHeight);
6661
+ }
6662
+
6663
+ .muka-radio--lg .muka-radio__label {
6664
+ font-family: var(--text-label-xl-regular-fontFamily);
6665
+ font-weight: var(--text-label-xl-regular-fontWeight);
6666
+ font-size: var(--text-label-xl-regular-fontSize);
6667
+ line-height: var(--text-label-xl-regular-lineHeight);
6668
+ }
6669
+
6670
+ .muka-radio--disabled .muka-radio__label {
6671
+ color: var(--color-text-subtle-default);
6672
+ }
6673
+
6674
+
6446
6675
  /* PullToRefresh */
6447
6676
  /* PullToRefresh Component Styles */
6448
6677
 
@@ -7151,401 +7380,13 @@ body {
7151
7380
  }
7152
7381
 
7153
7382
 
7154
- /* RangeSlider */
7155
- /* RangeSlider Component Styles - Using Muka Design Tokens */
7383
+ /* ProfileBadge */
7384
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7156
7385
 
7157
- .muka-range-slider {
7158
- display: flex;
7159
- flex-direction: column;
7160
- gap: var(--spacing-1);
7161
- width: 100%;
7162
- }
7163
-
7164
- /* ========================================
7165
- HEADER: label group (label + info + optional) and value readout
7166
- ======================================== */
7167
-
7168
- .muka-range-slider__header {
7169
- display: flex;
7170
- align-items: center;
7171
- justify-content: space-between;
7172
- gap: var(--spacing-2);
7173
- min-height: 24px;
7174
- }
7175
-
7176
- .muka-range-slider__label-group {
7177
- display: inline-flex;
7178
- align-items: center;
7179
- gap: var(--spacing-2);
7180
- }
7181
-
7182
- .muka-range-slider__label {
7183
- font-family: var(--text-label-md-semibold-fontFamily);
7184
- font-weight: var(--text-label-md-semibold-fontWeight);
7185
- font-size: var(--text-label-md-semibold-fontSize);
7186
- line-height: var(--text-label-md-semibold-lineHeight);
7187
- color: var(--color-text-default-default);
7188
- }
7189
-
7190
- .muka-range-slider__info {
7191
- color: var(--color-text-subtle-default);
7192
- }
7193
-
7194
- .muka-range-slider__optional {
7195
- font-family: var(--text-label-sm-regular-fontFamily);
7196
- font-weight: var(--text-label-sm-regular-fontWeight);
7197
- font-size: var(--text-label-sm-regular-fontSize);
7198
- line-height: var(--text-label-sm-regular-lineHeight);
7199
- color: var(--color-text-subtle-default);
7200
- }
7201
-
7202
- .muka-range-slider__value {
7203
- font-family: var(--text-label-md-regular-fontFamily);
7204
- font-weight: var(--text-label-md-regular-fontWeight);
7205
- font-size: var(--text-label-md-regular-fontSize);
7206
- line-height: var(--text-label-md-regular-lineHeight);
7207
- color: var(--color-text-default-default);
7208
- font-variant-numeric: tabular-nums;
7209
- }
7210
-
7211
- .muka-range-slider__helper {
7212
- margin: 0;
7213
- font-family: var(--text-body-sm-regular-fontFamily);
7214
- font-weight: var(--text-body-sm-regular-fontWeight);
7215
- font-size: var(--text-body-sm-regular-fontSize);
7216
- line-height: var(--text-body-sm-regular-lineHeight);
7217
- color: var(--color-text-subtle-default);
7218
- }
7219
-
7220
- /* ========================================
7221
- TRACK + THUMB
7222
- Native range input, restyled. A thick sunken track holds an accent fill up to
7223
- the current value, with a circular grip handle. The filled portion is driven
7224
- by the inline --muka-range-fill custom property (set from the component value).
7225
- ======================================== */
7226
-
7227
- /* Size variants: track height, thumb diameter and grip geometry */
7228
- .muka-range-slider--sm {
7229
- --muka-range-track-h: 12px;
7230
- --muka-range-thumb: 24px;
7231
- --muka-range-grip-h: 9px;
7232
- }
7233
- .muka-range-slider--md {
7234
- --muka-range-track-h: 16px;
7235
- --muka-range-thumb: 32px;
7236
- --muka-range-grip-h: 12px;
7237
- }
7238
- .muka-range-slider--lg {
7239
- --muka-range-track-h: 20px;
7240
- --muka-range-thumb: 40px;
7241
- --muka-range-grip-h: 15px;
7242
- }
7243
-
7244
- .muka-range-slider__bar {
7245
- /* Reserve the full thumb height so the handle never clips the layout. */
7246
- display: flex;
7247
- align-items: center;
7248
- height: var(--muka-range-thumb);
7249
- }
7250
-
7251
- .muka-range-slider__input {
7252
- -webkit-appearance: none;
7253
- appearance: none;
7254
- width: 100%;
7255
- height: var(--muka-range-thumb);
7256
- margin: 0;
7257
- background: transparent;
7258
- cursor: pointer;
7259
-
7260
- /* Grip handle fill + two vertical grip bars, all theme-aware. */
7261
- --muka-range-grip-color: var(--color-text-subtle-default);
7262
- --muka-range-grip-w: 2px;
7263
- --muka-range-grip-gap: 3px;
7264
-
7265
- /* The track fill: action colour up to the value, sunken surface beyond it. */
7266
- --muka-range-track-fill: linear-gradient(
7267
- to right,
7268
- var(--color-action-default) 0,
7269
- var(--color-action-default) var(--muka-range-fill, 0%),
7270
- var(--color-surface-sunken) var(--muka-range-fill, 0%),
7271
- var(--color-surface-sunken) 100%
7272
- );
7273
- }
7274
-
7275
- .muka-range-slider__input:focus {
7276
- outline: none;
7277
- }
7278
-
7279
- /* WebKit / Blink track */
7280
- .muka-range-slider__input::-webkit-slider-runnable-track {
7281
- height: var(--muka-range-track-h);
7282
- border-radius: var(--border-radius-full);
7283
- background-image: var(--muka-range-track-fill);
7284
- border: 1px solid var(--color-border-contrast);
7285
- box-shadow: var(--shadow-sunken);
7286
- }
7287
-
7288
- /* Firefox track + progress */
7289
- .muka-range-slider__input::-moz-range-track {
7290
- height: var(--muka-range-track-h);
7291
- border-radius: var(--border-radius-full);
7292
- background: var(--color-surface-sunken);
7293
- border: 1px solid var(--color-border-contrast);
7294
- box-shadow: var(--shadow-sunken);
7295
- }
7296
- .muka-range-slider__input::-moz-range-progress {
7297
- height: var(--muka-range-track-h);
7298
- border-radius: var(--border-radius-full);
7299
- background: var(--color-action-default);
7300
- }
7301
-
7302
- /* WebKit / Blink thumb (vertically centred over the track) */
7303
- .muka-range-slider__input::-webkit-slider-thumb {
7304
- -webkit-appearance: none;
7305
- appearance: none;
7306
- width: var(--muka-range-thumb);
7307
- height: var(--muka-range-thumb);
7308
- margin-top: calc((var(--muka-range-track-h) - var(--muka-range-thumb)) / 2);
7309
- border-radius: var(--border-radius-full);
7310
- border: 1px solid var(--color-border-contrast);
7311
- box-shadow: var(--shadow-level2);
7312
- background-color: var(--color-surface-level1);
7313
- background-image:
7314
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
7315
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
7316
- background-repeat: no-repeat;
7317
- background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
7318
- background-position:
7319
- calc(50% - var(--muka-range-grip-gap)) center,
7320
- calc(50% + var(--muka-range-grip-gap)) center;
7321
- transition: box-shadow 0.15s ease, background-color 0.15s ease;
7322
- }
7323
-
7324
- /* Firefox thumb */
7325
- .muka-range-slider__input::-moz-range-thumb {
7326
- width: var(--muka-range-thumb);
7327
- height: var(--muka-range-thumb);
7328
- border-radius: var(--border-radius-full);
7329
- border: 1px solid var(--color-border-contrast);
7330
- box-shadow: var(--shadow-level2);
7331
- background-color: var(--color-surface-level1);
7332
- background-image:
7333
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
7334
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
7335
- background-repeat: no-repeat;
7336
- background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
7337
- background-position:
7338
- calc(50% - var(--muka-range-grip-gap)) center,
7339
- calc(50% + var(--muka-range-grip-gap)) center;
7340
- transition: box-shadow 0.15s ease, background-color 0.15s ease;
7341
- }
7342
-
7343
- /* Hover */
7344
- .muka-range-slider__input:hover::-webkit-slider-thumb {
7345
- background-color: var(--color-surface-level1);
7346
- box-shadow: var(--shadow-level3);
7347
- }
7348
- .muka-range-slider__input:hover::-moz-range-thumb {
7349
- background-color: var(--color-surface-level1);
7350
- box-shadow: var(--shadow-level3);
7351
- }
7352
-
7353
- /* Focus ring */
7354
- .muka-range-slider__input:focus-visible::-webkit-slider-thumb {
7355
- box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
7356
- }
7357
- .muka-range-slider__input:focus-visible::-moz-range-thumb {
7358
- box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
7359
- }
7360
-
7361
- /* Disabled */
7362
- .muka-range-slider--disabled {
7363
- opacity: 0.5;
7364
- }
7365
- .muka-range-slider--disabled .muka-range-slider__input {
7366
- cursor: not-allowed;
7367
- }
7368
-
7369
-
7370
- /* Progress */
7371
- /* Progress Component Styles - Using Muka Design Tokens */
7372
-
7373
- /* ========================================
7374
- BAR VARIANT
7375
- ======================================== */
7376
-
7377
- .muka-progress--bar {
7378
- display: flex;
7379
- align-items: center;
7380
- gap: var(--spacing-2);
7381
- width: 100%;
7382
- }
7383
-
7384
- .muka-progress--bar .muka-progress__track {
7385
- flex: 1;
7386
- background-color: var(--color-surface-level1);
7387
- border-radius: var(--border-radius-full);
7388
- overflow: hidden;
7389
- }
7390
-
7391
- .muka-progress--bar.muka-progress--sm .muka-progress__track {
7392
- height: var(--progress-size-bar-height-sm);
7393
- }
7394
-
7395
- .muka-progress--bar.muka-progress--md .muka-progress__track {
7396
- height: var(--progress-size-bar-height-md);
7397
- }
7398
-
7399
- .muka-progress--bar.muka-progress--lg .muka-progress__track {
7400
- height: var(--progress-size-bar-height-lg);
7401
- }
7402
-
7403
- .muka-progress--bar .muka-progress__fill {
7404
- height: 100%;
7405
- background-color: var(--color-action-default);
7406
- border-radius: var(--border-radius-full);
7407
- transition: width 0.3s ease;
7408
- }
7409
-
7410
- .muka-progress--bar .muka-progress__label {
7411
- flex-shrink: 0;
7412
- font-family: var(--text-label-sm-semibold-fontFamily);
7413
- font-weight: var(--text-label-sm-semibold-fontWeight);
7414
- font-size: var(--text-label-sm-semibold-fontSize);
7415
- line-height: var(--text-label-sm-semibold-lineHeight);
7416
- color: var(--color-text-default-default);
7417
- min-width: 3ch;
7418
- text-align: right;
7419
- }
7420
-
7421
- /* Indeterminate animation for bar */
7422
- .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7423
- width: 40%;
7424
- animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7425
- }
7426
-
7427
- @keyframes muka-progress-bar-indeterminate {
7428
- 0% {
7429
- transform: translateX(-100%);
7430
- }
7431
- 100% {
7432
- transform: translateX(250%);
7433
- }
7434
- }
7435
-
7436
- /* ========================================
7437
- CIRCLE VARIANT
7438
- ======================================== */
7439
-
7440
- .muka-progress--circle {
7441
- position: relative;
7442
- display: inline-flex;
7443
- align-items: center;
7444
- justify-content: center;
7445
- }
7446
-
7447
- .muka-progress--circle.muka-progress--sm {
7448
- width: var(--progress-size-circle-diameter-sm);
7449
- height: var(--progress-size-circle-diameter-sm);
7450
- }
7451
-
7452
- .muka-progress--circle.muka-progress--md {
7453
- width: var(--progress-size-circle-diameter-md);
7454
- height: var(--progress-size-circle-diameter-md);
7455
- }
7456
-
7457
- .muka-progress--circle.muka-progress--lg {
7458
- width: var(--progress-size-circle-diameter-lg);
7459
- height: var(--progress-size-circle-diameter-lg);
7460
- }
7461
-
7462
- .muka-progress__circle {
7463
- width: 100%;
7464
- height: 100%;
7465
- transform: rotate(-90deg);
7466
- }
7467
-
7468
- .muka-progress--circle .muka-progress__track {
7469
- fill: none;
7470
- stroke: var(--color-surface-level1);
7471
- }
7472
-
7473
- .muka-progress--circle.muka-progress--sm .muka-progress__track,
7474
- .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7475
- stroke-width: var(--progress-size-circle-strokeWidth-sm);
7476
- }
7477
-
7478
- .muka-progress--circle.muka-progress--md .muka-progress__track,
7479
- .muka-progress--circle.muka-progress--md .muka-progress__fill {
7480
- stroke-width: var(--progress-size-circle-strokeWidth-md);
7481
- }
7482
-
7483
- .muka-progress--circle.muka-progress--lg .muka-progress__track,
7484
- .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7485
- stroke-width: var(--progress-size-circle-strokeWidth-lg);
7486
- }
7487
-
7488
- .muka-progress--circle .muka-progress__fill {
7489
- fill: none;
7490
- stroke: var(--color-action-default);
7491
- stroke-linecap: round;
7492
- transition: stroke-dashoffset 0.3s ease;
7493
- }
7494
-
7495
- .muka-progress--circle .muka-progress__label {
7496
- position: absolute;
7497
- font-family: var(--text-label-sm-semibold-fontFamily);
7498
- font-weight: var(--text-label-sm-semibold-fontWeight);
7499
- color: var(--color-text-default-default);
7500
- }
7501
-
7502
- .muka-progress--circle.muka-progress--sm .muka-progress__label {
7503
- font-size: var(--text-label-sm-semibold-fontSize);
7504
- }
7505
-
7506
- .muka-progress--circle.muka-progress--md .muka-progress__label {
7507
- font-size: var(--text-label-md-semibold-fontSize);
7508
- }
7509
-
7510
- .muka-progress--circle.muka-progress--lg .muka-progress__label {
7511
- font-size: var(--text-label-lg-semibold-fontSize);
7512
- }
7513
-
7514
- /* Indeterminate animation for circle */
7515
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7516
- animation: muka-progress-circle-rotate 2s linear infinite;
7517
- }
7518
-
7519
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7520
- animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7521
- }
7522
-
7523
- @keyframes muka-progress-circle-rotate {
7524
- 100% {
7525
- transform: rotate(270deg);
7526
- }
7527
- }
7528
-
7529
- @keyframes muka-progress-circle-dash {
7530
- 0% {
7531
- stroke-dashoffset: 220;
7532
- }
7533
- 50% {
7534
- stroke-dashoffset: 70;
7535
- }
7536
- 100% {
7537
- stroke-dashoffset: 220;
7538
- }
7539
- }
7540
-
7541
-
7542
- /* ProfileBadge */
7543
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7544
-
7545
- .muka-profile-badge {
7546
- display: inline-flex;
7547
- align-items: center;
7548
- font-family: var(--text-body-base-regular-fontFamily);
7386
+ .muka-profile-badge {
7387
+ display: inline-flex;
7388
+ align-items: center;
7389
+ font-family: var(--text-body-base-regular-fontFamily);
7549
7390
  }
7550
7391
 
7551
7392
  /* Size variants */
@@ -7904,62 +7745,264 @@ body {
7904
7745
  background-color: var(--color-surface-level1);
7905
7746
  }
7906
7747
 
7907
- .muka-photo-uploader__dropzone:focus-visible {
7908
- outline: 2px solid var(--color-border-focus);
7909
- outline-offset: 2px;
7748
+ .muka-photo-uploader__dropzone:focus-visible {
7749
+ outline: 2px solid var(--color-border-focus);
7750
+ outline-offset: 2px;
7751
+ }
7752
+
7753
+ .muka-photo-uploader__dropzone-icon {
7754
+ display: flex;
7755
+ align-items: center;
7756
+ justify-content: center;
7757
+ color: var(--color-icon-subtle-default);
7758
+ }
7759
+
7760
+ .muka-photo-uploader__dropzone-text {
7761
+ font-family: var(--text-body-base-regular-fontFamily);
7762
+ font-size: var(--text-body-base-regular-fontSize);
7763
+ font-weight: var(--text-body-base-regular-fontWeight);
7764
+ line-height: var(--text-body-base-regular-lineHeight);
7765
+ color: var(--color-text-subtle-default);
7766
+ }
7767
+
7768
+ /* ─── Disabled ────────────────────────────────────────── */
7769
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone {
7770
+ cursor: not-allowed;
7771
+ opacity: 0.6;
7772
+ }
7773
+
7774
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone:hover {
7775
+ border-color: var(--card-color-default-border);
7776
+ background-color: var(--card-color-default-background);
7777
+ }
7778
+
7779
+ /* ─── Enlarged photo dialog ───────────────────────────── */
7780
+ .muka-photo-uploader__preview {
7781
+ display: flex;
7782
+ align-items: center;
7783
+ justify-content: center;
7784
+ width: 100%;
7785
+ height: 100%;
7786
+ }
7787
+
7788
+ /* Fits the dialog while preserving the photo's original aspect ratio. */
7789
+ .muka-photo-uploader__preview-image {
7790
+ display: block;
7791
+ max-width: 100%;
7792
+ max-height: 100%;
7793
+ width: auto;
7794
+ height: auto;
7795
+ object-fit: contain;
7796
+ border-radius: var(--border-radius-lg);
7797
+ }
7798
+
7799
+ /* ─── Reduced motion ──────────────────────────────────── */
7800
+ @media (prefers-reduced-motion: reduce) {
7801
+ .muka-photo-uploader__dropzone {
7802
+ transition: none;
7803
+ }
7804
+ }
7805
+
7806
+
7807
+ /* Progress */
7808
+ /* Progress Component Styles - Using Muka Design Tokens */
7809
+
7810
+ /* ========================================
7811
+ BAR VARIANT
7812
+ ======================================== */
7813
+
7814
+ .muka-progress--bar {
7815
+ display: flex;
7816
+ align-items: center;
7817
+ gap: var(--spacing-2);
7818
+ width: 100%;
7819
+ }
7820
+
7821
+ .muka-progress--bar .muka-progress__track {
7822
+ flex: 1;
7823
+ background-color: var(--color-surface-level1);
7824
+ border-radius: var(--border-radius-full);
7825
+ overflow: hidden;
7826
+ }
7827
+
7828
+ .muka-progress--bar.muka-progress--sm .muka-progress__track {
7829
+ height: var(--progress-size-bar-height-sm);
7830
+ }
7831
+
7832
+ .muka-progress--bar.muka-progress--md .muka-progress__track {
7833
+ height: var(--progress-size-bar-height-md);
7834
+ }
7835
+
7836
+ .muka-progress--bar.muka-progress--lg .muka-progress__track {
7837
+ height: var(--progress-size-bar-height-lg);
7838
+ }
7839
+
7840
+ .muka-progress--bar .muka-progress__fill {
7841
+ height: 100%;
7842
+ background-color: var(--color-action-default);
7843
+ border-radius: var(--border-radius-full);
7844
+ transition: width 0.3s ease;
7845
+ }
7846
+
7847
+ .muka-progress--bar .muka-progress__label {
7848
+ flex-shrink: 0;
7849
+ font-family: var(--text-label-sm-semibold-fontFamily);
7850
+ font-weight: var(--text-label-sm-semibold-fontWeight);
7851
+ font-size: var(--text-label-sm-semibold-fontSize);
7852
+ line-height: var(--text-label-sm-semibold-lineHeight);
7853
+ color: var(--color-text-default-default);
7854
+ min-width: 3ch;
7855
+ text-align: right;
7856
+ }
7857
+
7858
+ /* Indeterminate animation for bar */
7859
+ .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7860
+ width: 40%;
7861
+ animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7862
+ }
7863
+
7864
+ @keyframes muka-progress-bar-indeterminate {
7865
+ 0% {
7866
+ transform: translateX(-100%);
7867
+ }
7868
+ 100% {
7869
+ transform: translateX(250%);
7870
+ }
7871
+ }
7872
+
7873
+ /* ========================================
7874
+ CIRCLE VARIANT
7875
+ ======================================== */
7876
+
7877
+ .muka-progress--circle {
7878
+ position: relative;
7879
+ display: inline-flex;
7880
+ align-items: center;
7881
+ justify-content: center;
7882
+ }
7883
+
7884
+ .muka-progress--circle.muka-progress--sm {
7885
+ width: var(--progress-size-circle-diameter-sm);
7886
+ height: var(--progress-size-circle-diameter-sm);
7887
+ }
7888
+
7889
+ .muka-progress--circle.muka-progress--md {
7890
+ width: var(--progress-size-circle-diameter-md);
7891
+ height: var(--progress-size-circle-diameter-md);
7892
+ }
7893
+
7894
+ .muka-progress--circle.muka-progress--lg {
7895
+ width: var(--progress-size-circle-diameter-lg);
7896
+ height: var(--progress-size-circle-diameter-lg);
7897
+ }
7898
+
7899
+ .muka-progress__circle {
7900
+ width: 100%;
7901
+ height: 100%;
7902
+ transform: rotate(-90deg);
7903
+ }
7904
+
7905
+ .muka-progress--circle .muka-progress__track {
7906
+ fill: none;
7907
+ stroke: var(--color-surface-level1);
7908
+ }
7909
+
7910
+ .muka-progress--circle.muka-progress--sm .muka-progress__track,
7911
+ .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7912
+ stroke-width: var(--progress-size-circle-strokeWidth-sm);
7913
+ }
7914
+
7915
+ .muka-progress--circle.muka-progress--md .muka-progress__track,
7916
+ .muka-progress--circle.muka-progress--md .muka-progress__fill {
7917
+ stroke-width: var(--progress-size-circle-strokeWidth-md);
7918
+ }
7919
+
7920
+ .muka-progress--circle.muka-progress--lg .muka-progress__track,
7921
+ .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7922
+ stroke-width: var(--progress-size-circle-strokeWidth-lg);
7923
+ }
7924
+
7925
+ .muka-progress--circle .muka-progress__fill {
7926
+ fill: none;
7927
+ stroke: var(--color-action-default);
7928
+ stroke-linecap: round;
7929
+ transition: stroke-dashoffset 0.3s ease;
7930
+ }
7931
+
7932
+ .muka-progress--circle .muka-progress__label {
7933
+ position: absolute;
7934
+ font-family: var(--text-label-sm-semibold-fontFamily);
7935
+ font-weight: var(--text-label-sm-semibold-fontWeight);
7936
+ color: var(--color-text-default-default);
7937
+ }
7938
+
7939
+ .muka-progress--circle.muka-progress--sm .muka-progress__label {
7940
+ font-size: var(--text-label-sm-semibold-fontSize);
7941
+ }
7942
+
7943
+ .muka-progress--circle.muka-progress--md .muka-progress__label {
7944
+ font-size: var(--text-label-md-semibold-fontSize);
7945
+ }
7946
+
7947
+ .muka-progress--circle.muka-progress--lg .muka-progress__label {
7948
+ font-size: var(--text-label-lg-semibold-fontSize);
7910
7949
  }
7911
7950
 
7912
- .muka-photo-uploader__dropzone-icon {
7913
- display: flex;
7914
- align-items: center;
7915
- justify-content: center;
7916
- color: var(--color-icon-subtle-default);
7951
+ /* Indeterminate animation for circle */
7952
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7953
+ animation: muka-progress-circle-rotate 2s linear infinite;
7917
7954
  }
7918
7955
 
7919
- .muka-photo-uploader__dropzone-text {
7920
- font-family: var(--text-body-base-regular-fontFamily);
7921
- font-size: var(--text-body-base-regular-fontSize);
7922
- font-weight: var(--text-body-base-regular-fontWeight);
7923
- line-height: var(--text-body-base-regular-lineHeight);
7924
- color: var(--color-text-subtle-default);
7956
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7957
+ animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7925
7958
  }
7926
7959
 
7927
- /* ─── Disabled ────────────────────────────────────────── */
7928
- .muka-photo-uploader--disabled .muka-photo-uploader__dropzone {
7929
- cursor: not-allowed;
7930
- opacity: 0.6;
7960
+ @keyframes muka-progress-circle-rotate {
7961
+ 100% {
7962
+ transform: rotate(270deg);
7963
+ }
7931
7964
  }
7932
7965
 
7933
- .muka-photo-uploader--disabled .muka-photo-uploader__dropzone:hover {
7934
- border-color: var(--card-color-default-border);
7935
- background-color: var(--card-color-default-background);
7966
+ @keyframes muka-progress-circle-dash {
7967
+ 0% {
7968
+ stroke-dashoffset: 220;
7969
+ }
7970
+ 50% {
7971
+ stroke-dashoffset: 70;
7972
+ }
7973
+ 100% {
7974
+ stroke-dashoffset: 220;
7975
+ }
7936
7976
  }
7937
7977
 
7938
- /* ─── Enlarged photo dialog ───────────────────────────── */
7939
- .muka-photo-uploader__preview {
7978
+
7979
+ /* PhotoDraftStrip */
7980
+ /* PhotoDraftStrip Component Styles */
7981
+
7982
+ .muka-photo-draft-strip {
7940
7983
  display: flex;
7941
7984
  align-items: center;
7942
- justify-content: center;
7985
+ gap: var(--spacing-3);
7943
7986
  width: 100%;
7944
- height: 100%;
7987
+ padding: var(--spacing-2) 0;
7945
7988
  }
7946
7989
 
7947
- /* Fits the dialog while preserving the photo's original aspect ratio. */
7948
- .muka-photo-uploader__preview-image {
7949
- display: block;
7950
- max-width: 100%;
7951
- max-height: 100%;
7952
- width: auto;
7953
- height: auto;
7954
- object-fit: contain;
7955
- border-radius: var(--border-radius-lg);
7990
+ .muka-photo-draft-strip__track {
7991
+ display: flex;
7992
+ gap: var(--spacing-2);
7993
+ flex: 1 1 auto;
7994
+ min-width: 0;
7995
+ overflow-x: auto;
7996
+ scroll-behavior: smooth;
7997
+ scrollbar-width: none;
7956
7998
  }
7957
7999
 
7958
- /* ─── Reduced motion ──────────────────────────────────── */
7959
- @media (prefers-reduced-motion: reduce) {
7960
- .muka-photo-uploader__dropzone {
7961
- transition: none;
7962
- }
8000
+ .muka-photo-draft-strip__track::-webkit-scrollbar {
8001
+ display: none;
8002
+ }
8003
+
8004
+ .muka-photo-draft-strip__item {
8005
+ flex: 0 0 auto;
7963
8006
  }
7964
8007
 
7965
8008
 
@@ -8065,36 +8108,6 @@ body {
8065
8108
  }
8066
8109
 
8067
8110
 
8068
- /* PhotoDraftStrip */
8069
- /* PhotoDraftStrip Component Styles */
8070
-
8071
- .muka-photo-draft-strip {
8072
- display: flex;
8073
- align-items: center;
8074
- gap: var(--spacing-3);
8075
- width: 100%;
8076
- padding: var(--spacing-2) 0;
8077
- }
8078
-
8079
- .muka-photo-draft-strip__track {
8080
- display: flex;
8081
- gap: var(--spacing-2);
8082
- flex: 1 1 auto;
8083
- min-width: 0;
8084
- overflow-x: auto;
8085
- scroll-behavior: smooth;
8086
- scrollbar-width: none;
8087
- }
8088
-
8089
- .muka-photo-draft-strip__track::-webkit-scrollbar {
8090
- display: none;
8091
- }
8092
-
8093
- .muka-photo-draft-strip__item {
8094
- flex: 0 0 auto;
8095
- }
8096
-
8097
-
8098
8111
  /* NumberInput */
8099
8112
  /* NumberInput — reuses Input field styles (../Input/Input.css). */
8100
8113
  /* Only the prefix/suffix affixes are NumberInput-specific. */
@@ -8632,6 +8645,189 @@ body {
8632
8645
  }
8633
8646
 
8634
8647
 
8648
+ /* MediaViewer */
8649
+ /* MediaViewer Component Styles - Using Muka Design Tokens */
8650
+
8651
+ /* ─── Native dialog: full viewport ────────────────────── */
8652
+ .muka-media-viewer {
8653
+ position: fixed;
8654
+ inset: 0;
8655
+ width: 100%;
8656
+ height: 100%;
8657
+ max-width: none;
8658
+ max-height: none;
8659
+ margin: 0;
8660
+ padding: 0;
8661
+ border: none;
8662
+ display: flex;
8663
+ flex-direction: column;
8664
+ overflow: hidden;
8665
+ overscroll-behavior: contain;
8666
+ color: var(--color-text-default-default);
8667
+ background-color: var(--color-black-alpha-12);
8668
+ animation: muka-media-viewer-in var(--motion-duration-component) var(--motion-easing-enter);
8669
+ }
8670
+
8671
+ .muka-media-viewer:not([open]) {
8672
+ display: none;
8673
+ }
8674
+
8675
+ .muka-media-viewer::backdrop {
8676
+ background-color: var(--color-black-alpha-12);
8677
+ }
8678
+
8679
+ @keyframes muka-media-viewer-in {
8680
+ from {
8681
+ opacity: 0;
8682
+ }
8683
+ to {
8684
+ opacity: 1;
8685
+ }
8686
+ }
8687
+
8688
+ /* ─── Chrome: TopBar and footer sit on a surface ──────── */
8689
+ .muka-media-viewer__topbar {
8690
+ flex-shrink: 0;
8691
+ background-color: var(--color-surface-level3);
8692
+ }
8693
+
8694
+ .muka-media-viewer__live {
8695
+ position: absolute;
8696
+ width: 1px;
8697
+ height: 1px;
8698
+ padding: 0;
8699
+ margin: -1px;
8700
+ overflow: hidden;
8701
+ clip: rect(0, 0, 0, 0);
8702
+ white-space: nowrap;
8703
+ border: 0;
8704
+ }
8705
+
8706
+ /* ─── Stage: the dark area the images slide across ────── */
8707
+ .muka-media-viewer__stage {
8708
+ position: relative;
8709
+ flex: 1 1 auto;
8710
+ min-height: 0;
8711
+ overflow: hidden;
8712
+ /* Gestures are handled in JS: no browser panning or pinch on the stage. */
8713
+ touch-action: none;
8714
+ user-select: none;
8715
+ -webkit-user-select: none;
8716
+ }
8717
+
8718
+ .muka-media-viewer__slide {
8719
+ position: absolute;
8720
+ inset: 0;
8721
+ display: flex;
8722
+ align-items: center;
8723
+ justify-content: center;
8724
+ padding: var(--spacing-4);
8725
+ transition: transform var(--motion-duration-component) var(--motion-easing-default);
8726
+ will-change: transform;
8727
+ }
8728
+
8729
+ /* While a finger drags, the image follows it without easing. */
8730
+ .muka-media-viewer--dragging .muka-media-viewer__slide {
8731
+ transition: none;
8732
+ }
8733
+
8734
+ .muka-media-viewer__image {
8735
+ display: block;
8736
+ max-width: 100%;
8737
+ max-height: 100%;
8738
+ object-fit: contain;
8739
+ pointer-events: none;
8740
+ }
8741
+
8742
+ /* ─── Previous / next: devices that can hover ─────────── */
8743
+ .muka-media-viewer__nav {
8744
+ position: absolute;
8745
+ top: 50%;
8746
+ display: none;
8747
+ transform: translateY(-50%);
8748
+ opacity: 0;
8749
+ transition: opacity var(--motion-duration-micro) var(--motion-easing-enter);
8750
+ }
8751
+
8752
+ .muka-media-viewer__nav--previous {
8753
+ left: var(--spacing-4);
8754
+ }
8755
+
8756
+ .muka-media-viewer__nav--next {
8757
+ right: var(--spacing-4);
8758
+ }
8759
+
8760
+ @media (hover: hover) and (pointer: fine) {
8761
+ .muka-media-viewer__nav {
8762
+ display: block;
8763
+ }
8764
+
8765
+ .muka-media-viewer__stage:hover .muka-media-viewer__nav,
8766
+ .muka-media-viewer__nav:focus-within {
8767
+ opacity: 1;
8768
+ }
8769
+ }
8770
+
8771
+ /* ─── Footer: caption, meta and actions ───────────────── */
8772
+ .muka-media-viewer__footer {
8773
+ flex-shrink: 0;
8774
+ display: flex;
8775
+ flex-direction: column;
8776
+ gap: var(--spacing-3);
8777
+ padding: var(--spacing-4);
8778
+ padding-bottom: calc(var(--spacing-4) + env(safe-area-inset-bottom, 0px));
8779
+ background-color: var(--color-surface-level3);
8780
+ }
8781
+
8782
+ .muka-media-viewer__details {
8783
+ display: flex;
8784
+ align-items: flex-start;
8785
+ justify-content: space-between;
8786
+ gap: var(--spacing-3);
8787
+ }
8788
+
8789
+ .muka-media-viewer__caption {
8790
+ min-width: 0;
8791
+ color: var(--color-text-subtle-default);
8792
+ font-family: var(--text-body-sm-regular-fontFamily);
8793
+ font-size: var(--text-body-sm-regular-fontSize);
8794
+ font-weight: var(--text-body-sm-regular-fontWeight);
8795
+ line-height: var(--text-body-sm-regular-lineHeight);
8796
+ overflow-wrap: anywhere;
8797
+ }
8798
+
8799
+ .muka-media-viewer__meta {
8800
+ flex-shrink: 0;
8801
+ }
8802
+
8803
+ .muka-media-viewer__actions {
8804
+ display: flex;
8805
+ flex-wrap: wrap;
8806
+ gap: var(--spacing-2);
8807
+ }
8808
+
8809
+ /* Mobile: actions stack full width, like Dialog footers. */
8810
+ @media (max-width: 1023px) {
8811
+ .muka-media-viewer__actions {
8812
+ flex-direction: column;
8813
+ }
8814
+
8815
+ .muka-media-viewer__actions > * {
8816
+ width: 100%;
8817
+ }
8818
+ }
8819
+
8820
+ /* ─── Reduced motion ──────────────────────────────────── */
8821
+ @media (prefers-reduced-motion: reduce) {
8822
+ .muka-media-viewer,
8823
+ .muka-media-viewer__slide,
8824
+ .muka-media-viewer__nav {
8825
+ animation: none;
8826
+ transition: none;
8827
+ }
8828
+ }
8829
+
8830
+
8635
8831
  /* ListItem */
8636
8832
  /* ListItem Component Styles - Using Muka Design Tokens */
8637
8833
 
@@ -9433,6 +9629,9 @@ li.muka-listitem {
9433
9629
  flex-shrink: 0;
9434
9630
  width: var(--size-2xl, 2rem);
9435
9631
  height: var(--size-2xl, 2rem);
9632
+ /* Bleed into the field's vertical padding: keeps the full hit area without
9633
+ making a password or clearable field taller than a plain one. */
9634
+ margin-block: calc(var(--input-field-padding-y) * -1);
9436
9635
  padding: 0;
9437
9636
  border: none;
9438
9637
  background: transparent;
@@ -9440,6 +9639,24 @@ li.muka-listitem {
9440
9639
  cursor: pointer;
9441
9640
  }
9442
9641
 
9642
+ /* The outermost button bleeds into the right padding by the same amount, so
9643
+ its glyph sits as close to the edge as it does to the top and bottom. */
9644
+ .muka-input__clear:last-child,
9645
+ .muka-input__reveal:last-child {
9646
+ margin-inline-end: calc(var(--input-field-padding-y) * -1);
9647
+ }
9648
+
9649
+ /* md: match the right gap to the gap above and below the vertically centred
9650
+ button exactly, i.e. (field height − borders − button) / 2. Holds in the
9651
+ focus/error state too, where border and padding trade 1px. */
9652
+ .muka-input__field--md .muka-input__clear:last-child,
9653
+ .muka-input__field--md .muka-input__reveal:last-child {
9654
+ margin-inline-end: calc(
9655
+ (var(--input-field-height-default) - 2 * var(--border-width-regular) - var(--size-2xl, 2rem)) / 2
9656
+ - var(--input-field-padding-x)
9657
+ );
9658
+ }
9659
+
9443
9660
  .muka-input__field--sm .muka-input__clear,
9444
9661
  .muka-input__field--sm .muka-input__reveal {
9445
9662
  width: var(--size-xl, 1.5rem);
@@ -10869,6 +11086,7 @@ li.muka-listitem {
10869
11086
  height: 100%;
10870
11087
  max-width: 100vw;
10871
11088
  max-height: 100vh;
11089
+ max-height: 100dvh;
10872
11090
  margin: 0;
10873
11091
  display: flex;
10874
11092
  flex-direction: column;
@@ -10903,6 +11121,8 @@ li.muka-listitem {
10903
11121
 
10904
11122
  .muka-dialog--lg .muka-dialog__surface {
10905
11123
  height: calc(100vh - var(--dialog-margin-top-mobile));
11124
+ /* dvh tracks the visible area as mobile toolbars show and hide */
11125
+ height: calc(100dvh - var(--dialog-margin-top-mobile));
10906
11126
  }
10907
11127
 
10908
11128
  /* Body */
@@ -11648,7 +11868,10 @@ li.muka-listitem {
11648
11868
  fill: none;
11649
11869
  /* Subtle lift on the filled segment, matching the Figma elevation */
11650
11870
  filter: drop-shadow(0 2px 4px var(--color-black-alpha-5, rgba(0, 0, 0, 0.05)));
11651
- transition: stroke-dasharray 0.3s ease;
11871
+ /* Butt caps keep the always-rendered 0% arc invisible (round caps would draw a dot) */
11872
+ stroke-linecap: butt;
11873
+ /* view duration (300ms) reads at the 24px size; tokens zero it for reduced motion */
11874
+ transition: stroke-dasharray var(--motion-duration-view) var(--motion-easing-default);
11652
11875
  }
11653
11876
 
11654
11877
  /* ─── Indeterminate (spinner) ─────────────────────────── */