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