@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
@@ -120,6 +120,8 @@ body {
120
120
  padding: 0;
121
121
  /* Page background uses Muka surface token so it matches theme (e.g. dark for muka-dark, wireframe-dark) */
122
122
  background-color: var(--color-surface-level3);
123
+ /* Default text color so bare text (h1–h6, p, span outside components) follows the theme instead of browser black */
124
+ color: var(--color-text-default-default);
123
125
  }
124
126
 
125
127
 
@@ -2437,6 +2439,38 @@ body {
2437
2439
  }
2438
2440
 
2439
2441
 
2442
+ /* VoiceMessage */
2443
+ /* VoiceMessage Component Styles */
2444
+
2445
+ .muka-voice-message {
2446
+ display: flex;
2447
+ align-items: center;
2448
+ gap: var(--spacing-3);
2449
+ width: 100%;
2450
+ min-width: min(16rem, 60vw);
2451
+ }
2452
+
2453
+ .muka-voice-message__wave {
2454
+ flex: 1 1 auto;
2455
+ min-width: 0;
2456
+ }
2457
+
2458
+ .muka-voice-message__time {
2459
+ flex: 0 0 auto;
2460
+ white-space: nowrap;
2461
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
2462
+ line-height: var(--text-label-sm-lineHeight, 1);
2463
+ font-variant-numeric: tabular-nums;
2464
+ color: var(--color-text-subtle-default);
2465
+ }
2466
+
2467
+ /* On the tinted own bubble the surface is the action color, so the timer flips
2468
+ * to the inverse text token for contrast. */
2469
+ .muka-voice-message--own .muka-voice-message__time {
2470
+ color: var(--color-text-default-inverse);
2471
+ }
2472
+
2473
+
2440
2474
  /* View */
2441
2475
  /* View Component Styles */
2442
2476
 
@@ -2547,38 +2581,6 @@ body {
2547
2581
  }
2548
2582
 
2549
2583
 
2550
- /* VoiceMessage */
2551
- /* VoiceMessage Component Styles */
2552
-
2553
- .muka-voice-message {
2554
- display: flex;
2555
- align-items: center;
2556
- gap: var(--spacing-3);
2557
- width: 100%;
2558
- min-width: min(16rem, 60vw);
2559
- }
2560
-
2561
- .muka-voice-message__wave {
2562
- flex: 1 1 auto;
2563
- min-width: 0;
2564
- }
2565
-
2566
- .muka-voice-message__time {
2567
- flex: 0 0 auto;
2568
- white-space: nowrap;
2569
- font-size: var(--text-label-sm-fontSize, 0.75rem);
2570
- line-height: var(--text-label-sm-lineHeight, 1);
2571
- font-variant-numeric: tabular-nums;
2572
- color: var(--color-text-subtle-default);
2573
- }
2574
-
2575
- /* On the tinted own bubble the surface is the action color, so the timer flips
2576
- * to the inverse text token for contrast. */
2577
- .muka-voice-message--own .muka-voice-message__time {
2578
- color: var(--color-text-default-inverse);
2579
- }
2580
-
2581
-
2582
2584
  /* Typography */
2583
2585
  .muka-typography-catalog {
2584
2586
  display: flex;
@@ -3679,6 +3681,17 @@ body {
3679
3681
  height: 120px;
3680
3682
  }
3681
3683
 
3684
+ /* Fluid: fill the parent's width; the shape sets the height via aspect-ratio. */
3685
+ .muka-thumbnail--fluid {
3686
+ width: 100%;
3687
+ height: auto;
3688
+ aspect-ratio: 1 / 1;
3689
+ }
3690
+
3691
+ .muka-thumbnail--fluid.muka-thumbnail--4-3 {
3692
+ aspect-ratio: 4 / 3;
3693
+ }
3694
+
3682
3695
  .muka-thumbnail--ellipse .muka-thumbnail__frame {
3683
3696
  border-radius: var(--border-radius-full);
3684
3697
  }
@@ -6124,147 +6137,219 @@ body {
6124
6137
  }
6125
6138
 
6126
6139
 
6127
- /* Radio */
6128
- /* Radio Component Styles - Using Muka Design Tokens */
6140
+ /* RangeSlider */
6141
+ /* RangeSlider Component Styles - Using Muka Design Tokens */
6129
6142
 
6130
- /* Wrapper - clickable label container */
6131
- .muka-radio {
6132
- display: inline-flex;
6133
- align-items: center;
6134
- gap: var(--spacing-4);
6135
- cursor: pointer;
6136
- user-select: none;
6143
+ .muka-range-slider {
6144
+ display: flex;
6145
+ flex-direction: column;
6146
+ gap: var(--spacing-1);
6147
+ width: 100%;
6137
6148
  }
6138
6149
 
6139
- .muka-radio--disabled {
6140
- cursor: not-allowed;
6141
- opacity: 0.6;
6142
- }
6150
+ /* ========================================
6151
+ HEADER: label group (label + info + optional) and value readout
6152
+ ======================================== */
6143
6153
 
6144
- /* Control container */
6145
- .muka-radio__control {
6146
- position: relative;
6147
- display: inline-flex;
6154
+ .muka-range-slider__header {
6155
+ display: flex;
6148
6156
  align-items: center;
6149
- justify-content: center;
6150
- flex-shrink: 0;
6151
- }
6152
-
6153
- /* Hidden native input */
6154
- .muka-radio__input {
6155
- position: absolute;
6156
- width: 1px;
6157
- height: 1px;
6158
- padding: 0;
6159
- margin: -1px;
6160
- overflow: hidden;
6161
- clip: rect(0, 0, 0, 0);
6162
- white-space: nowrap;
6163
- border: 0;
6157
+ justify-content: space-between;
6158
+ gap: var(--spacing-2);
6159
+ min-height: 24px;
6164
6160
  }
6165
6161
 
6166
- /* Visual indicator (circle) */
6167
- .muka-radio__indicator {
6168
- display: flex;
6162
+ .muka-range-slider__label-group {
6163
+ display: inline-flex;
6169
6164
  align-items: center;
6170
- justify-content: center;
6171
- width: var(--radio-size-default);
6172
- height: var(--radio-size-default);
6173
- border-radius: var(--border-radius-full);
6174
- background-color: var(--radio-color-default-background);
6175
- border: var(--border-width-regular) solid var(--radio-color-default-border);
6176
- transition: all 0.15s ease;
6177
- box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
6165
+ gap: var(--spacing-2);
6178
6166
  }
6179
6167
 
6180
- /* Size variants */
6181
- .muka-radio--sm .muka-radio__indicator {
6182
- width: var(--radio-size-sm);
6183
- height: var(--radio-size-sm);
6168
+ .muka-range-slider__label {
6169
+ font-family: var(--text-label-md-semibold-fontFamily);
6170
+ font-weight: var(--text-label-md-semibold-fontWeight);
6171
+ font-size: var(--text-label-md-semibold-fontSize);
6172
+ line-height: var(--text-label-md-semibold-lineHeight);
6173
+ color: var(--color-text-default-default);
6184
6174
  }
6185
6175
 
6186
- .muka-radio--lg .muka-radio__indicator {
6187
- width: var(--radio-size-lg);
6188
- height: var(--radio-size-lg);
6176
+ .muka-range-slider__info {
6177
+ color: var(--color-text-subtle-default);
6189
6178
  }
6190
6179
 
6191
- /* Inner dot (shown when checked) */
6192
- .muka-radio__dot {
6193
- width: var(--radio-dot-size-default);
6194
- height: var(--radio-dot-size-default);
6195
- border-radius: var(--border-radius-full);
6196
- background-color: var(--radio-color-default-dot);
6197
- transform: scale(0);
6198
- transition: transform 0.15s ease;
6180
+ .muka-range-slider__optional {
6181
+ font-family: var(--text-label-sm-regular-fontFamily);
6182
+ font-weight: var(--text-label-sm-regular-fontWeight);
6183
+ font-size: var(--text-label-sm-regular-fontSize);
6184
+ line-height: var(--text-label-sm-regular-lineHeight);
6185
+ color: var(--color-text-subtle-default);
6199
6186
  }
6200
6187
 
6201
- .muka-radio--sm .muka-radio__dot {
6202
- width: var(--radio-dot-size-sm);
6203
- height: var(--radio-dot-size-sm);
6188
+ .muka-range-slider__value {
6189
+ font-family: var(--text-label-md-regular-fontFamily);
6190
+ font-weight: var(--text-label-md-regular-fontWeight);
6191
+ font-size: var(--text-label-md-regular-fontSize);
6192
+ line-height: var(--text-label-md-regular-lineHeight);
6193
+ color: var(--color-text-default-default);
6194
+ font-variant-numeric: tabular-nums;
6204
6195
  }
6205
6196
 
6206
- .muka-radio--lg .muka-radio__dot {
6207
- width: var(--radio-dot-size-lg);
6208
- height: var(--radio-dot-size-lg);
6197
+ .muka-range-slider__helper {
6198
+ margin: 0;
6199
+ font-family: var(--text-body-sm-regular-fontFamily);
6200
+ font-weight: var(--text-body-sm-regular-fontWeight);
6201
+ font-size: var(--text-body-sm-regular-fontSize);
6202
+ line-height: var(--text-body-sm-regular-lineHeight);
6203
+ color: var(--color-text-subtle-default);
6209
6204
  }
6210
6205
 
6211
- /* Hover state - removed per design */
6206
+ /* ========================================
6207
+ TRACK + THUMB
6208
+ Native range input, restyled. A thick sunken track holds an accent fill up to
6209
+ the current value, with a circular grip handle. The filled portion is driven
6210
+ by the inline --muka-range-fill custom property (set from the component value).
6211
+ ======================================== */
6212
6212
 
6213
- /* Focus state */
6214
- .muka-radio__input:focus-visible + .muka-radio__indicator {
6215
- outline: 2px solid var(--color-border-focus);
6216
- outline-offset: 2px;
6213
+ /* Size variants: track height, thumb diameter and grip geometry */
6214
+ .muka-range-slider--sm {
6215
+ --muka-range-track-h: 12px;
6216
+ --muka-range-thumb: 24px;
6217
+ --muka-range-grip-h: 9px;
6217
6218
  }
6218
-
6219
- /* Checked state */
6220
- .muka-radio__input:checked + .muka-radio__indicator {
6221
- background-color: var(--radio-color-checked-background);
6222
- border-width: var(--border-width-bold);
6223
- border-color: var(--radio-color-checked-border);
6224
- box-shadow: none;
6219
+ .muka-range-slider--md {
6220
+ --muka-range-track-h: 16px;
6221
+ --muka-range-thumb: 32px;
6222
+ --muka-range-grip-h: 12px;
6223
+ }
6224
+ .muka-range-slider--lg {
6225
+ --muka-range-track-h: 20px;
6226
+ --muka-range-thumb: 40px;
6227
+ --muka-range-grip-h: 15px;
6225
6228
  }
6226
6229
 
6227
- .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
6228
- background-color: var(--radio-color-checked-dot);
6229
- transform: scale(1);
6230
+ .muka-range-slider__bar {
6231
+ /* Reserve the full thumb height so the handle never clips the layout. */
6232
+ display: flex;
6233
+ align-items: center;
6234
+ height: var(--muka-range-thumb);
6230
6235
  }
6231
6236
 
6232
- /* Disabled state */
6233
- .muka-radio--disabled .muka-radio__indicator {
6234
- background-color: var(--radio-color-disabled-background);
6235
- border-color: var(--radio-color-disabled-border);
6236
- box-shadow: none;
6237
+ .muka-range-slider__input {
6238
+ -webkit-appearance: none;
6239
+ appearance: none;
6240
+ width: 100%;
6241
+ height: var(--muka-range-thumb);
6242
+ margin: 0;
6243
+ background: transparent;
6244
+ cursor: pointer;
6245
+
6246
+ /* Grip handle fill + two vertical grip bars, all theme-aware. */
6247
+ --muka-range-grip-color: var(--color-text-subtle-default);
6248
+ --muka-range-grip-w: 2px;
6249
+ --muka-range-grip-gap: 3px;
6250
+
6251
+ /* The track fill: action colour up to the value, sunken surface beyond it. */
6252
+ --muka-range-track-fill: linear-gradient(
6253
+ to right,
6254
+ var(--color-action-default) 0,
6255
+ var(--color-action-default) var(--muka-range-fill, 0%),
6256
+ var(--color-surface-sunken) var(--muka-range-fill, 0%),
6257
+ var(--color-surface-sunken) 100%
6258
+ );
6237
6259
  }
6238
6260
 
6239
- .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
6240
- background-color: var(--radio-color-disabled-dot);
6261
+ .muka-range-slider__input:focus {
6262
+ outline: none;
6241
6263
  }
6242
6264
 
6243
- /* Label text */
6244
- .muka-radio__label {
6245
- font-family: var(--text-label-lg-regular-fontFamily);
6246
- font-weight: var(--text-label-lg-regular-fontWeight);
6247
- font-size: var(--text-label-lg-regular-fontSize);
6248
- line-height: var(--text-label-lg-regular-lineHeight);
6249
- color: var(--color-text-default-default);
6265
+ /* WebKit / Blink track */
6266
+ .muka-range-slider__input::-webkit-slider-runnable-track {
6267
+ height: var(--muka-range-track-h);
6268
+ border-radius: var(--border-radius-full);
6269
+ background-image: var(--muka-range-track-fill);
6270
+ border: 1px solid var(--color-border-contrast);
6271
+ box-shadow: var(--shadow-sunken);
6250
6272
  }
6251
6273
 
6252
- .muka-radio--sm .muka-radio__label {
6253
- font-family: var(--text-label-md-regular-fontFamily);
6254
- font-weight: var(--text-label-md-regular-fontWeight);
6255
- font-size: var(--text-label-md-regular-fontSize);
6256
- line-height: var(--text-label-md-regular-lineHeight);
6274
+ /* Firefox track + progress */
6275
+ .muka-range-slider__input::-moz-range-track {
6276
+ height: var(--muka-range-track-h);
6277
+ border-radius: var(--border-radius-full);
6278
+ background: var(--color-surface-sunken);
6279
+ border: 1px solid var(--color-border-contrast);
6280
+ box-shadow: var(--shadow-sunken);
6281
+ }
6282
+ .muka-range-slider__input::-moz-range-progress {
6283
+ height: var(--muka-range-track-h);
6284
+ border-radius: var(--border-radius-full);
6285
+ background: var(--color-action-default);
6257
6286
  }
6258
6287
 
6259
- .muka-radio--lg .muka-radio__label {
6260
- font-family: var(--text-label-xl-regular-fontFamily);
6261
- font-weight: var(--text-label-xl-regular-fontWeight);
6262
- font-size: var(--text-label-xl-regular-fontSize);
6263
- line-height: var(--text-label-xl-regular-lineHeight);
6288
+ /* WebKit / Blink thumb (vertically centred over the track) */
6289
+ .muka-range-slider__input::-webkit-slider-thumb {
6290
+ -webkit-appearance: none;
6291
+ appearance: none;
6292
+ width: var(--muka-range-thumb);
6293
+ height: var(--muka-range-thumb);
6294
+ margin-top: calc((var(--muka-range-track-h) - var(--muka-range-thumb)) / 2);
6295
+ border-radius: var(--border-radius-full);
6296
+ border: 1px solid var(--color-border-contrast);
6297
+ box-shadow: var(--shadow-level2);
6298
+ background-color: var(--color-surface-level1);
6299
+ background-image:
6300
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
6301
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
6302
+ background-repeat: no-repeat;
6303
+ background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
6304
+ background-position:
6305
+ calc(50% - var(--muka-range-grip-gap)) center,
6306
+ calc(50% + var(--muka-range-grip-gap)) center;
6307
+ transition: box-shadow 0.15s ease, background-color 0.15s ease;
6264
6308
  }
6265
6309
 
6266
- .muka-radio--disabled .muka-radio__label {
6267
- color: var(--color-text-subtle-default);
6310
+ /* Firefox thumb */
6311
+ .muka-range-slider__input::-moz-range-thumb {
6312
+ width: var(--muka-range-thumb);
6313
+ height: var(--muka-range-thumb);
6314
+ border-radius: var(--border-radius-full);
6315
+ border: 1px solid var(--color-border-contrast);
6316
+ box-shadow: var(--shadow-level2);
6317
+ background-color: var(--color-surface-level1);
6318
+ background-image:
6319
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
6320
+ linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
6321
+ background-repeat: no-repeat;
6322
+ background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
6323
+ background-position:
6324
+ calc(50% - var(--muka-range-grip-gap)) center,
6325
+ calc(50% + var(--muka-range-grip-gap)) center;
6326
+ transition: box-shadow 0.15s ease, background-color 0.15s ease;
6327
+ }
6328
+
6329
+ /* Hover */
6330
+ .muka-range-slider__input:hover::-webkit-slider-thumb {
6331
+ background-color: var(--color-surface-level1);
6332
+ box-shadow: var(--shadow-level3);
6333
+ }
6334
+ .muka-range-slider__input:hover::-moz-range-thumb {
6335
+ background-color: var(--color-surface-level1);
6336
+ box-shadow: var(--shadow-level3);
6337
+ }
6338
+
6339
+ /* Focus ring */
6340
+ .muka-range-slider__input:focus-visible::-webkit-slider-thumb {
6341
+ box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
6342
+ }
6343
+ .muka-range-slider__input:focus-visible::-moz-range-thumb {
6344
+ box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
6345
+ }
6346
+
6347
+ /* Disabled */
6348
+ .muka-range-slider--disabled {
6349
+ opacity: 0.5;
6350
+ }
6351
+ .muka-range-slider--disabled .muka-range-slider__input {
6352
+ cursor: not-allowed;
6268
6353
  }
6269
6354
 
6270
6355
 
@@ -6411,6 +6496,150 @@ body {
6411
6496
  }
6412
6497
 
6413
6498
 
6499
+ /* Radio */
6500
+ /* Radio Component Styles - Using Muka Design Tokens */
6501
+
6502
+ /* Wrapper - clickable label container */
6503
+ .muka-radio {
6504
+ display: inline-flex;
6505
+ align-items: center;
6506
+ gap: var(--spacing-4);
6507
+ cursor: pointer;
6508
+ user-select: none;
6509
+ }
6510
+
6511
+ .muka-radio--disabled {
6512
+ cursor: not-allowed;
6513
+ opacity: 0.6;
6514
+ }
6515
+
6516
+ /* Control container */
6517
+ .muka-radio__control {
6518
+ position: relative;
6519
+ display: inline-flex;
6520
+ align-items: center;
6521
+ justify-content: center;
6522
+ flex-shrink: 0;
6523
+ }
6524
+
6525
+ /* Hidden native input */
6526
+ .muka-radio__input {
6527
+ position: absolute;
6528
+ width: 1px;
6529
+ height: 1px;
6530
+ padding: 0;
6531
+ margin: -1px;
6532
+ overflow: hidden;
6533
+ clip: rect(0, 0, 0, 0);
6534
+ white-space: nowrap;
6535
+ border: 0;
6536
+ }
6537
+
6538
+ /* Visual indicator (circle) */
6539
+ .muka-radio__indicator {
6540
+ display: flex;
6541
+ align-items: center;
6542
+ justify-content: center;
6543
+ width: var(--radio-size-default);
6544
+ height: var(--radio-size-default);
6545
+ border-radius: var(--border-radius-full);
6546
+ background-color: var(--radio-color-default-background);
6547
+ border: var(--border-width-regular) solid var(--radio-color-default-border);
6548
+ transition: all 0.15s ease;
6549
+ box-shadow: inset 0 1px 2px 0 rgba(26, 26, 26, 0.15);
6550
+ }
6551
+
6552
+ /* Size variants */
6553
+ .muka-radio--sm .muka-radio__indicator {
6554
+ width: var(--radio-size-sm);
6555
+ height: var(--radio-size-sm);
6556
+ }
6557
+
6558
+ .muka-radio--lg .muka-radio__indicator {
6559
+ width: var(--radio-size-lg);
6560
+ height: var(--radio-size-lg);
6561
+ }
6562
+
6563
+ /* Inner dot (shown when checked) */
6564
+ .muka-radio__dot {
6565
+ width: var(--radio-dot-size-default);
6566
+ height: var(--radio-dot-size-default);
6567
+ border-radius: var(--border-radius-full);
6568
+ background-color: var(--radio-color-default-dot);
6569
+ transform: scale(0);
6570
+ transition: transform 0.15s ease;
6571
+ }
6572
+
6573
+ .muka-radio--sm .muka-radio__dot {
6574
+ width: var(--radio-dot-size-sm);
6575
+ height: var(--radio-dot-size-sm);
6576
+ }
6577
+
6578
+ .muka-radio--lg .muka-radio__dot {
6579
+ width: var(--radio-dot-size-lg);
6580
+ height: var(--radio-dot-size-lg);
6581
+ }
6582
+
6583
+ /* Hover state - removed per design */
6584
+
6585
+ /* Focus state */
6586
+ .muka-radio__input:focus-visible + .muka-radio__indicator {
6587
+ outline: 2px solid var(--color-border-focus);
6588
+ outline-offset: 2px;
6589
+ }
6590
+
6591
+ /* Checked state */
6592
+ .muka-radio__input:checked + .muka-radio__indicator {
6593
+ background-color: var(--radio-color-checked-background);
6594
+ border-width: var(--border-width-bold);
6595
+ border-color: var(--radio-color-checked-border);
6596
+ box-shadow: none;
6597
+ }
6598
+
6599
+ .muka-radio__input:checked + .muka-radio__indicator .muka-radio__dot {
6600
+ background-color: var(--radio-color-checked-dot);
6601
+ transform: scale(1);
6602
+ }
6603
+
6604
+ /* Disabled state */
6605
+ .muka-radio--disabled .muka-radio__indicator {
6606
+ background-color: var(--radio-color-disabled-background);
6607
+ border-color: var(--radio-color-disabled-border);
6608
+ box-shadow: none;
6609
+ }
6610
+
6611
+ .muka-radio__input:disabled:checked + .muka-radio__indicator .muka-radio__dot {
6612
+ background-color: var(--radio-color-disabled-dot);
6613
+ }
6614
+
6615
+ /* Label text */
6616
+ .muka-radio__label {
6617
+ font-family: var(--text-label-lg-regular-fontFamily);
6618
+ font-weight: var(--text-label-lg-regular-fontWeight);
6619
+ font-size: var(--text-label-lg-regular-fontSize);
6620
+ line-height: var(--text-label-lg-regular-lineHeight);
6621
+ color: var(--color-text-default-default);
6622
+ }
6623
+
6624
+ .muka-radio--sm .muka-radio__label {
6625
+ font-family: var(--text-label-md-regular-fontFamily);
6626
+ font-weight: var(--text-label-md-regular-fontWeight);
6627
+ font-size: var(--text-label-md-regular-fontSize);
6628
+ line-height: var(--text-label-md-regular-lineHeight);
6629
+ }
6630
+
6631
+ .muka-radio--lg .muka-radio__label {
6632
+ font-family: var(--text-label-xl-regular-fontFamily);
6633
+ font-weight: var(--text-label-xl-regular-fontWeight);
6634
+ font-size: var(--text-label-xl-regular-fontSize);
6635
+ line-height: var(--text-label-xl-regular-lineHeight);
6636
+ }
6637
+
6638
+ .muka-radio--disabled .muka-radio__label {
6639
+ color: var(--color-text-subtle-default);
6640
+ }
6641
+
6642
+
6414
6643
  /* PullToRefresh */
6415
6644
  /* PullToRefresh Component Styles */
6416
6645
 
@@ -7119,401 +7348,13 @@ body {
7119
7348
  }
7120
7349
 
7121
7350
 
7122
- /* RangeSlider */
7123
- /* RangeSlider Component Styles - Using Muka Design Tokens */
7351
+ /* ProfileBadge */
7352
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7124
7353
 
7125
- .muka-range-slider {
7126
- display: flex;
7127
- flex-direction: column;
7128
- gap: var(--spacing-1);
7129
- width: 100%;
7130
- }
7131
-
7132
- /* ========================================
7133
- HEADER: label group (label + info + optional) and value readout
7134
- ======================================== */
7135
-
7136
- .muka-range-slider__header {
7137
- display: flex;
7138
- align-items: center;
7139
- justify-content: space-between;
7140
- gap: var(--spacing-2);
7141
- min-height: 24px;
7142
- }
7143
-
7144
- .muka-range-slider__label-group {
7145
- display: inline-flex;
7146
- align-items: center;
7147
- gap: var(--spacing-2);
7148
- }
7149
-
7150
- .muka-range-slider__label {
7151
- font-family: var(--text-label-md-semibold-fontFamily);
7152
- font-weight: var(--text-label-md-semibold-fontWeight);
7153
- font-size: var(--text-label-md-semibold-fontSize);
7154
- line-height: var(--text-label-md-semibold-lineHeight);
7155
- color: var(--color-text-default-default);
7156
- }
7157
-
7158
- .muka-range-slider__info {
7159
- color: var(--color-text-subtle-default);
7160
- }
7161
-
7162
- .muka-range-slider__optional {
7163
- font-family: var(--text-label-sm-regular-fontFamily);
7164
- font-weight: var(--text-label-sm-regular-fontWeight);
7165
- font-size: var(--text-label-sm-regular-fontSize);
7166
- line-height: var(--text-label-sm-regular-lineHeight);
7167
- color: var(--color-text-subtle-default);
7168
- }
7169
-
7170
- .muka-range-slider__value {
7171
- font-family: var(--text-label-md-regular-fontFamily);
7172
- font-weight: var(--text-label-md-regular-fontWeight);
7173
- font-size: var(--text-label-md-regular-fontSize);
7174
- line-height: var(--text-label-md-regular-lineHeight);
7175
- color: var(--color-text-default-default);
7176
- font-variant-numeric: tabular-nums;
7177
- }
7178
-
7179
- .muka-range-slider__helper {
7180
- margin: 0;
7181
- font-family: var(--text-body-sm-regular-fontFamily);
7182
- font-weight: var(--text-body-sm-regular-fontWeight);
7183
- font-size: var(--text-body-sm-regular-fontSize);
7184
- line-height: var(--text-body-sm-regular-lineHeight);
7185
- color: var(--color-text-subtle-default);
7186
- }
7187
-
7188
- /* ========================================
7189
- TRACK + THUMB
7190
- Native range input, restyled. A thick sunken track holds an accent fill up to
7191
- the current value, with a circular grip handle. The filled portion is driven
7192
- by the inline --muka-range-fill custom property (set from the component value).
7193
- ======================================== */
7194
-
7195
- /* Size variants: track height, thumb diameter and grip geometry */
7196
- .muka-range-slider--sm {
7197
- --muka-range-track-h: 12px;
7198
- --muka-range-thumb: 24px;
7199
- --muka-range-grip-h: 9px;
7200
- }
7201
- .muka-range-slider--md {
7202
- --muka-range-track-h: 16px;
7203
- --muka-range-thumb: 32px;
7204
- --muka-range-grip-h: 12px;
7205
- }
7206
- .muka-range-slider--lg {
7207
- --muka-range-track-h: 20px;
7208
- --muka-range-thumb: 40px;
7209
- --muka-range-grip-h: 15px;
7210
- }
7211
-
7212
- .muka-range-slider__bar {
7213
- /* Reserve the full thumb height so the handle never clips the layout. */
7214
- display: flex;
7215
- align-items: center;
7216
- height: var(--muka-range-thumb);
7217
- }
7218
-
7219
- .muka-range-slider__input {
7220
- -webkit-appearance: none;
7221
- appearance: none;
7222
- width: 100%;
7223
- height: var(--muka-range-thumb);
7224
- margin: 0;
7225
- background: transparent;
7226
- cursor: pointer;
7227
-
7228
- /* Grip handle fill + two vertical grip bars, all theme-aware. */
7229
- --muka-range-grip-color: var(--color-text-subtle-default);
7230
- --muka-range-grip-w: 2px;
7231
- --muka-range-grip-gap: 3px;
7232
-
7233
- /* The track fill: action colour up to the value, sunken surface beyond it. */
7234
- --muka-range-track-fill: linear-gradient(
7235
- to right,
7236
- var(--color-action-default) 0,
7237
- var(--color-action-default) var(--muka-range-fill, 0%),
7238
- var(--color-surface-sunken) var(--muka-range-fill, 0%),
7239
- var(--color-surface-sunken) 100%
7240
- );
7241
- }
7242
-
7243
- .muka-range-slider__input:focus {
7244
- outline: none;
7245
- }
7246
-
7247
- /* WebKit / Blink track */
7248
- .muka-range-slider__input::-webkit-slider-runnable-track {
7249
- height: var(--muka-range-track-h);
7250
- border-radius: var(--border-radius-full);
7251
- background-image: var(--muka-range-track-fill);
7252
- border: 1px solid var(--color-border-contrast);
7253
- box-shadow: var(--shadow-sunken);
7254
- }
7255
-
7256
- /* Firefox track + progress */
7257
- .muka-range-slider__input::-moz-range-track {
7258
- height: var(--muka-range-track-h);
7259
- border-radius: var(--border-radius-full);
7260
- background: var(--color-surface-sunken);
7261
- border: 1px solid var(--color-border-contrast);
7262
- box-shadow: var(--shadow-sunken);
7263
- }
7264
- .muka-range-slider__input::-moz-range-progress {
7265
- height: var(--muka-range-track-h);
7266
- border-radius: var(--border-radius-full);
7267
- background: var(--color-action-default);
7268
- }
7269
-
7270
- /* WebKit / Blink thumb (vertically centred over the track) */
7271
- .muka-range-slider__input::-webkit-slider-thumb {
7272
- -webkit-appearance: none;
7273
- appearance: none;
7274
- width: var(--muka-range-thumb);
7275
- height: var(--muka-range-thumb);
7276
- margin-top: calc((var(--muka-range-track-h) - var(--muka-range-thumb)) / 2);
7277
- border-radius: var(--border-radius-full);
7278
- border: 1px solid var(--color-border-contrast);
7279
- box-shadow: var(--shadow-level2);
7280
- background-color: var(--color-surface-level1);
7281
- background-image:
7282
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
7283
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
7284
- background-repeat: no-repeat;
7285
- background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
7286
- background-position:
7287
- calc(50% - var(--muka-range-grip-gap)) center,
7288
- calc(50% + var(--muka-range-grip-gap)) center;
7289
- transition: box-shadow 0.15s ease, background-color 0.15s ease;
7290
- }
7291
-
7292
- /* Firefox thumb */
7293
- .muka-range-slider__input::-moz-range-thumb {
7294
- width: var(--muka-range-thumb);
7295
- height: var(--muka-range-thumb);
7296
- border-radius: var(--border-radius-full);
7297
- border: 1px solid var(--color-border-contrast);
7298
- box-shadow: var(--shadow-level2);
7299
- background-color: var(--color-surface-level1);
7300
- background-image:
7301
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color)),
7302
- linear-gradient(var(--muka-range-grip-color), var(--muka-range-grip-color));
7303
- background-repeat: no-repeat;
7304
- background-size: var(--muka-range-grip-w) var(--muka-range-grip-h), var(--muka-range-grip-w) var(--muka-range-grip-h);
7305
- background-position:
7306
- calc(50% - var(--muka-range-grip-gap)) center,
7307
- calc(50% + var(--muka-range-grip-gap)) center;
7308
- transition: box-shadow 0.15s ease, background-color 0.15s ease;
7309
- }
7310
-
7311
- /* Hover */
7312
- .muka-range-slider__input:hover::-webkit-slider-thumb {
7313
- background-color: var(--color-surface-level1);
7314
- box-shadow: var(--shadow-level3);
7315
- }
7316
- .muka-range-slider__input:hover::-moz-range-thumb {
7317
- background-color: var(--color-surface-level1);
7318
- box-shadow: var(--shadow-level3);
7319
- }
7320
-
7321
- /* Focus ring */
7322
- .muka-range-slider__input:focus-visible::-webkit-slider-thumb {
7323
- box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
7324
- }
7325
- .muka-range-slider__input:focus-visible::-moz-range-thumb {
7326
- box-shadow: var(--shadow-level2), 0 0 0 3px var(--color-border-focus);
7327
- }
7328
-
7329
- /* Disabled */
7330
- .muka-range-slider--disabled {
7331
- opacity: 0.5;
7332
- }
7333
- .muka-range-slider--disabled .muka-range-slider__input {
7334
- cursor: not-allowed;
7335
- }
7336
-
7337
-
7338
- /* Progress */
7339
- /* Progress Component Styles - Using Muka Design Tokens */
7340
-
7341
- /* ========================================
7342
- BAR VARIANT
7343
- ======================================== */
7344
-
7345
- .muka-progress--bar {
7346
- display: flex;
7347
- align-items: center;
7348
- gap: var(--spacing-2);
7349
- width: 100%;
7350
- }
7351
-
7352
- .muka-progress--bar .muka-progress__track {
7353
- flex: 1;
7354
- background-color: var(--color-surface-level1);
7355
- border-radius: var(--border-radius-full);
7356
- overflow: hidden;
7357
- }
7358
-
7359
- .muka-progress--bar.muka-progress--sm .muka-progress__track {
7360
- height: var(--progress-size-bar-height-sm);
7361
- }
7362
-
7363
- .muka-progress--bar.muka-progress--md .muka-progress__track {
7364
- height: var(--progress-size-bar-height-md);
7365
- }
7366
-
7367
- .muka-progress--bar.muka-progress--lg .muka-progress__track {
7368
- height: var(--progress-size-bar-height-lg);
7369
- }
7370
-
7371
- .muka-progress--bar .muka-progress__fill {
7372
- height: 100%;
7373
- background-color: var(--color-action-default);
7374
- border-radius: var(--border-radius-full);
7375
- transition: width 0.3s ease;
7376
- }
7377
-
7378
- .muka-progress--bar .muka-progress__label {
7379
- flex-shrink: 0;
7380
- font-family: var(--text-label-sm-semibold-fontFamily);
7381
- font-weight: var(--text-label-sm-semibold-fontWeight);
7382
- font-size: var(--text-label-sm-semibold-fontSize);
7383
- line-height: var(--text-label-sm-semibold-lineHeight);
7384
- color: var(--color-text-default-default);
7385
- min-width: 3ch;
7386
- text-align: right;
7387
- }
7388
-
7389
- /* Indeterminate animation for bar */
7390
- .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7391
- width: 40%;
7392
- animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7393
- }
7394
-
7395
- @keyframes muka-progress-bar-indeterminate {
7396
- 0% {
7397
- transform: translateX(-100%);
7398
- }
7399
- 100% {
7400
- transform: translateX(250%);
7401
- }
7402
- }
7403
-
7404
- /* ========================================
7405
- CIRCLE VARIANT
7406
- ======================================== */
7407
-
7408
- .muka-progress--circle {
7409
- position: relative;
7410
- display: inline-flex;
7411
- align-items: center;
7412
- justify-content: center;
7413
- }
7414
-
7415
- .muka-progress--circle.muka-progress--sm {
7416
- width: var(--progress-size-circle-diameter-sm);
7417
- height: var(--progress-size-circle-diameter-sm);
7418
- }
7419
-
7420
- .muka-progress--circle.muka-progress--md {
7421
- width: var(--progress-size-circle-diameter-md);
7422
- height: var(--progress-size-circle-diameter-md);
7423
- }
7424
-
7425
- .muka-progress--circle.muka-progress--lg {
7426
- width: var(--progress-size-circle-diameter-lg);
7427
- height: var(--progress-size-circle-diameter-lg);
7428
- }
7429
-
7430
- .muka-progress__circle {
7431
- width: 100%;
7432
- height: 100%;
7433
- transform: rotate(-90deg);
7434
- }
7435
-
7436
- .muka-progress--circle .muka-progress__track {
7437
- fill: none;
7438
- stroke: var(--color-surface-level1);
7439
- }
7440
-
7441
- .muka-progress--circle.muka-progress--sm .muka-progress__track,
7442
- .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7443
- stroke-width: var(--progress-size-circle-strokeWidth-sm);
7444
- }
7445
-
7446
- .muka-progress--circle.muka-progress--md .muka-progress__track,
7447
- .muka-progress--circle.muka-progress--md .muka-progress__fill {
7448
- stroke-width: var(--progress-size-circle-strokeWidth-md);
7449
- }
7450
-
7451
- .muka-progress--circle.muka-progress--lg .muka-progress__track,
7452
- .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7453
- stroke-width: var(--progress-size-circle-strokeWidth-lg);
7454
- }
7455
-
7456
- .muka-progress--circle .muka-progress__fill {
7457
- fill: none;
7458
- stroke: var(--color-action-default);
7459
- stroke-linecap: round;
7460
- transition: stroke-dashoffset 0.3s ease;
7461
- }
7462
-
7463
- .muka-progress--circle .muka-progress__label {
7464
- position: absolute;
7465
- font-family: var(--text-label-sm-semibold-fontFamily);
7466
- font-weight: var(--text-label-sm-semibold-fontWeight);
7467
- color: var(--color-text-default-default);
7468
- }
7469
-
7470
- .muka-progress--circle.muka-progress--sm .muka-progress__label {
7471
- font-size: var(--text-label-sm-semibold-fontSize);
7472
- }
7473
-
7474
- .muka-progress--circle.muka-progress--md .muka-progress__label {
7475
- font-size: var(--text-label-md-semibold-fontSize);
7476
- }
7477
-
7478
- .muka-progress--circle.muka-progress--lg .muka-progress__label {
7479
- font-size: var(--text-label-lg-semibold-fontSize);
7480
- }
7481
-
7482
- /* Indeterminate animation for circle */
7483
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7484
- animation: muka-progress-circle-rotate 2s linear infinite;
7485
- }
7486
-
7487
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7488
- animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7489
- }
7490
-
7491
- @keyframes muka-progress-circle-rotate {
7492
- 100% {
7493
- transform: rotate(270deg);
7494
- }
7495
- }
7496
-
7497
- @keyframes muka-progress-circle-dash {
7498
- 0% {
7499
- stroke-dashoffset: 220;
7500
- }
7501
- 50% {
7502
- stroke-dashoffset: 70;
7503
- }
7504
- 100% {
7505
- stroke-dashoffset: 220;
7506
- }
7507
- }
7508
-
7509
-
7510
- /* ProfileBadge */
7511
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7512
-
7513
- .muka-profile-badge {
7514
- display: inline-flex;
7515
- align-items: center;
7516
- font-family: var(--text-body-base-regular-fontFamily);
7354
+ .muka-profile-badge {
7355
+ display: inline-flex;
7356
+ align-items: center;
7357
+ font-family: var(--text-body-base-regular-fontFamily);
7517
7358
  }
7518
7359
 
7519
7360
  /* Size variants */
@@ -7872,62 +7713,264 @@ body {
7872
7713
  background-color: var(--color-surface-level1);
7873
7714
  }
7874
7715
 
7875
- .muka-photo-uploader__dropzone:focus-visible {
7876
- outline: 2px solid var(--color-border-focus);
7877
- outline-offset: 2px;
7716
+ .muka-photo-uploader__dropzone:focus-visible {
7717
+ outline: 2px solid var(--color-border-focus);
7718
+ outline-offset: 2px;
7719
+ }
7720
+
7721
+ .muka-photo-uploader__dropzone-icon {
7722
+ display: flex;
7723
+ align-items: center;
7724
+ justify-content: center;
7725
+ color: var(--color-icon-subtle-default);
7726
+ }
7727
+
7728
+ .muka-photo-uploader__dropzone-text {
7729
+ font-family: var(--text-body-base-regular-fontFamily);
7730
+ font-size: var(--text-body-base-regular-fontSize);
7731
+ font-weight: var(--text-body-base-regular-fontWeight);
7732
+ line-height: var(--text-body-base-regular-lineHeight);
7733
+ color: var(--color-text-subtle-default);
7734
+ }
7735
+
7736
+ /* ─── Disabled ────────────────────────────────────────── */
7737
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone {
7738
+ cursor: not-allowed;
7739
+ opacity: 0.6;
7740
+ }
7741
+
7742
+ .muka-photo-uploader--disabled .muka-photo-uploader__dropzone:hover {
7743
+ border-color: var(--card-color-default-border);
7744
+ background-color: var(--card-color-default-background);
7745
+ }
7746
+
7747
+ /* ─── Enlarged photo dialog ───────────────────────────── */
7748
+ .muka-photo-uploader__preview {
7749
+ display: flex;
7750
+ align-items: center;
7751
+ justify-content: center;
7752
+ width: 100%;
7753
+ height: 100%;
7754
+ }
7755
+
7756
+ /* Fits the dialog while preserving the photo's original aspect ratio. */
7757
+ .muka-photo-uploader__preview-image {
7758
+ display: block;
7759
+ max-width: 100%;
7760
+ max-height: 100%;
7761
+ width: auto;
7762
+ height: auto;
7763
+ object-fit: contain;
7764
+ border-radius: var(--border-radius-lg);
7765
+ }
7766
+
7767
+ /* ─── Reduced motion ──────────────────────────────────── */
7768
+ @media (prefers-reduced-motion: reduce) {
7769
+ .muka-photo-uploader__dropzone {
7770
+ transition: none;
7771
+ }
7772
+ }
7773
+
7774
+
7775
+ /* Progress */
7776
+ /* Progress Component Styles - Using Muka Design Tokens */
7777
+
7778
+ /* ========================================
7779
+ BAR VARIANT
7780
+ ======================================== */
7781
+
7782
+ .muka-progress--bar {
7783
+ display: flex;
7784
+ align-items: center;
7785
+ gap: var(--spacing-2);
7786
+ width: 100%;
7787
+ }
7788
+
7789
+ .muka-progress--bar .muka-progress__track {
7790
+ flex: 1;
7791
+ background-color: var(--color-surface-level1);
7792
+ border-radius: var(--border-radius-full);
7793
+ overflow: hidden;
7794
+ }
7795
+
7796
+ .muka-progress--bar.muka-progress--sm .muka-progress__track {
7797
+ height: var(--progress-size-bar-height-sm);
7798
+ }
7799
+
7800
+ .muka-progress--bar.muka-progress--md .muka-progress__track {
7801
+ height: var(--progress-size-bar-height-md);
7802
+ }
7803
+
7804
+ .muka-progress--bar.muka-progress--lg .muka-progress__track {
7805
+ height: var(--progress-size-bar-height-lg);
7806
+ }
7807
+
7808
+ .muka-progress--bar .muka-progress__fill {
7809
+ height: 100%;
7810
+ background-color: var(--color-action-default);
7811
+ border-radius: var(--border-radius-full);
7812
+ transition: width 0.3s ease;
7813
+ }
7814
+
7815
+ .muka-progress--bar .muka-progress__label {
7816
+ flex-shrink: 0;
7817
+ font-family: var(--text-label-sm-semibold-fontFamily);
7818
+ font-weight: var(--text-label-sm-semibold-fontWeight);
7819
+ font-size: var(--text-label-sm-semibold-fontSize);
7820
+ line-height: var(--text-label-sm-semibold-lineHeight);
7821
+ color: var(--color-text-default-default);
7822
+ min-width: 3ch;
7823
+ text-align: right;
7824
+ }
7825
+
7826
+ /* Indeterminate animation for bar */
7827
+ .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7828
+ width: 40%;
7829
+ animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7830
+ }
7831
+
7832
+ @keyframes muka-progress-bar-indeterminate {
7833
+ 0% {
7834
+ transform: translateX(-100%);
7835
+ }
7836
+ 100% {
7837
+ transform: translateX(250%);
7838
+ }
7839
+ }
7840
+
7841
+ /* ========================================
7842
+ CIRCLE VARIANT
7843
+ ======================================== */
7844
+
7845
+ .muka-progress--circle {
7846
+ position: relative;
7847
+ display: inline-flex;
7848
+ align-items: center;
7849
+ justify-content: center;
7850
+ }
7851
+
7852
+ .muka-progress--circle.muka-progress--sm {
7853
+ width: var(--progress-size-circle-diameter-sm);
7854
+ height: var(--progress-size-circle-diameter-sm);
7855
+ }
7856
+
7857
+ .muka-progress--circle.muka-progress--md {
7858
+ width: var(--progress-size-circle-diameter-md);
7859
+ height: var(--progress-size-circle-diameter-md);
7860
+ }
7861
+
7862
+ .muka-progress--circle.muka-progress--lg {
7863
+ width: var(--progress-size-circle-diameter-lg);
7864
+ height: var(--progress-size-circle-diameter-lg);
7865
+ }
7866
+
7867
+ .muka-progress__circle {
7868
+ width: 100%;
7869
+ height: 100%;
7870
+ transform: rotate(-90deg);
7871
+ }
7872
+
7873
+ .muka-progress--circle .muka-progress__track {
7874
+ fill: none;
7875
+ stroke: var(--color-surface-level1);
7876
+ }
7877
+
7878
+ .muka-progress--circle.muka-progress--sm .muka-progress__track,
7879
+ .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7880
+ stroke-width: var(--progress-size-circle-strokeWidth-sm);
7881
+ }
7882
+
7883
+ .muka-progress--circle.muka-progress--md .muka-progress__track,
7884
+ .muka-progress--circle.muka-progress--md .muka-progress__fill {
7885
+ stroke-width: var(--progress-size-circle-strokeWidth-md);
7886
+ }
7887
+
7888
+ .muka-progress--circle.muka-progress--lg .muka-progress__track,
7889
+ .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7890
+ stroke-width: var(--progress-size-circle-strokeWidth-lg);
7891
+ }
7892
+
7893
+ .muka-progress--circle .muka-progress__fill {
7894
+ fill: none;
7895
+ stroke: var(--color-action-default);
7896
+ stroke-linecap: round;
7897
+ transition: stroke-dashoffset 0.3s ease;
7898
+ }
7899
+
7900
+ .muka-progress--circle .muka-progress__label {
7901
+ position: absolute;
7902
+ font-family: var(--text-label-sm-semibold-fontFamily);
7903
+ font-weight: var(--text-label-sm-semibold-fontWeight);
7904
+ color: var(--color-text-default-default);
7905
+ }
7906
+
7907
+ .muka-progress--circle.muka-progress--sm .muka-progress__label {
7908
+ font-size: var(--text-label-sm-semibold-fontSize);
7909
+ }
7910
+
7911
+ .muka-progress--circle.muka-progress--md .muka-progress__label {
7912
+ font-size: var(--text-label-md-semibold-fontSize);
7913
+ }
7914
+
7915
+ .muka-progress--circle.muka-progress--lg .muka-progress__label {
7916
+ font-size: var(--text-label-lg-semibold-fontSize);
7878
7917
  }
7879
7918
 
7880
- .muka-photo-uploader__dropzone-icon {
7881
- display: flex;
7882
- align-items: center;
7883
- justify-content: center;
7884
- color: var(--color-icon-subtle-default);
7919
+ /* Indeterminate animation for circle */
7920
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7921
+ animation: muka-progress-circle-rotate 2s linear infinite;
7885
7922
  }
7886
7923
 
7887
- .muka-photo-uploader__dropzone-text {
7888
- font-family: var(--text-body-base-regular-fontFamily);
7889
- font-size: var(--text-body-base-regular-fontSize);
7890
- font-weight: var(--text-body-base-regular-fontWeight);
7891
- line-height: var(--text-body-base-regular-lineHeight);
7892
- color: var(--color-text-subtle-default);
7924
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7925
+ animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7893
7926
  }
7894
7927
 
7895
- /* ─── Disabled ────────────────────────────────────────── */
7896
- .muka-photo-uploader--disabled .muka-photo-uploader__dropzone {
7897
- cursor: not-allowed;
7898
- opacity: 0.6;
7928
+ @keyframes muka-progress-circle-rotate {
7929
+ 100% {
7930
+ transform: rotate(270deg);
7931
+ }
7899
7932
  }
7900
7933
 
7901
- .muka-photo-uploader--disabled .muka-photo-uploader__dropzone:hover {
7902
- border-color: var(--card-color-default-border);
7903
- background-color: var(--card-color-default-background);
7934
+ @keyframes muka-progress-circle-dash {
7935
+ 0% {
7936
+ stroke-dashoffset: 220;
7937
+ }
7938
+ 50% {
7939
+ stroke-dashoffset: 70;
7940
+ }
7941
+ 100% {
7942
+ stroke-dashoffset: 220;
7943
+ }
7904
7944
  }
7905
7945
 
7906
- /* ─── Enlarged photo dialog ───────────────────────────── */
7907
- .muka-photo-uploader__preview {
7946
+
7947
+ /* PhotoDraftStrip */
7948
+ /* PhotoDraftStrip Component Styles */
7949
+
7950
+ .muka-photo-draft-strip {
7908
7951
  display: flex;
7909
7952
  align-items: center;
7910
- justify-content: center;
7953
+ gap: var(--spacing-3);
7911
7954
  width: 100%;
7912
- height: 100%;
7955
+ padding: var(--spacing-2) 0;
7913
7956
  }
7914
7957
 
7915
- /* Fits the dialog while preserving the photo's original aspect ratio. */
7916
- .muka-photo-uploader__preview-image {
7917
- display: block;
7918
- max-width: 100%;
7919
- max-height: 100%;
7920
- width: auto;
7921
- height: auto;
7922
- object-fit: contain;
7923
- border-radius: var(--border-radius-lg);
7958
+ .muka-photo-draft-strip__track {
7959
+ display: flex;
7960
+ gap: var(--spacing-2);
7961
+ flex: 1 1 auto;
7962
+ min-width: 0;
7963
+ overflow-x: auto;
7964
+ scroll-behavior: smooth;
7965
+ scrollbar-width: none;
7924
7966
  }
7925
7967
 
7926
- /* ─── Reduced motion ──────────────────────────────────── */
7927
- @media (prefers-reduced-motion: reduce) {
7928
- .muka-photo-uploader__dropzone {
7929
- transition: none;
7930
- }
7968
+ .muka-photo-draft-strip__track::-webkit-scrollbar {
7969
+ display: none;
7970
+ }
7971
+
7972
+ .muka-photo-draft-strip__item {
7973
+ flex: 0 0 auto;
7931
7974
  }
7932
7975
 
7933
7976
 
@@ -8033,36 +8076,6 @@ body {
8033
8076
  }
8034
8077
 
8035
8078
 
8036
- /* PhotoDraftStrip */
8037
- /* PhotoDraftStrip Component Styles */
8038
-
8039
- .muka-photo-draft-strip {
8040
- display: flex;
8041
- align-items: center;
8042
- gap: var(--spacing-3);
8043
- width: 100%;
8044
- padding: var(--spacing-2) 0;
8045
- }
8046
-
8047
- .muka-photo-draft-strip__track {
8048
- display: flex;
8049
- gap: var(--spacing-2);
8050
- flex: 1 1 auto;
8051
- min-width: 0;
8052
- overflow-x: auto;
8053
- scroll-behavior: smooth;
8054
- scrollbar-width: none;
8055
- }
8056
-
8057
- .muka-photo-draft-strip__track::-webkit-scrollbar {
8058
- display: none;
8059
- }
8060
-
8061
- .muka-photo-draft-strip__item {
8062
- flex: 0 0 auto;
8063
- }
8064
-
8065
-
8066
8079
  /* NumberInput */
8067
8080
  /* NumberInput — reuses Input field styles (../Input/Input.css). */
8068
8081
  /* Only the prefix/suffix affixes are NumberInput-specific. */
@@ -8600,6 +8613,189 @@ body {
8600
8613
  }
8601
8614
 
8602
8615
 
8616
+ /* MediaViewer */
8617
+ /* MediaViewer Component Styles - Using Muka Design Tokens */
8618
+
8619
+ /* ─── Native dialog: full viewport ────────────────────── */
8620
+ .muka-media-viewer {
8621
+ position: fixed;
8622
+ inset: 0;
8623
+ width: 100%;
8624
+ height: 100%;
8625
+ max-width: none;
8626
+ max-height: none;
8627
+ margin: 0;
8628
+ padding: 0;
8629
+ border: none;
8630
+ display: flex;
8631
+ flex-direction: column;
8632
+ overflow: hidden;
8633
+ overscroll-behavior: contain;
8634
+ color: var(--color-text-default-default);
8635
+ background-color: var(--color-black-alpha-12);
8636
+ animation: muka-media-viewer-in var(--motion-duration-component) var(--motion-easing-enter);
8637
+ }
8638
+
8639
+ .muka-media-viewer:not([open]) {
8640
+ display: none;
8641
+ }
8642
+
8643
+ .muka-media-viewer::backdrop {
8644
+ background-color: var(--color-black-alpha-12);
8645
+ }
8646
+
8647
+ @keyframes muka-media-viewer-in {
8648
+ from {
8649
+ opacity: 0;
8650
+ }
8651
+ to {
8652
+ opacity: 1;
8653
+ }
8654
+ }
8655
+
8656
+ /* ─── Chrome: TopBar and footer sit on a surface ──────── */
8657
+ .muka-media-viewer__topbar {
8658
+ flex-shrink: 0;
8659
+ background-color: var(--color-surface-level3);
8660
+ }
8661
+
8662
+ .muka-media-viewer__live {
8663
+ position: absolute;
8664
+ width: 1px;
8665
+ height: 1px;
8666
+ padding: 0;
8667
+ margin: -1px;
8668
+ overflow: hidden;
8669
+ clip: rect(0, 0, 0, 0);
8670
+ white-space: nowrap;
8671
+ border: 0;
8672
+ }
8673
+
8674
+ /* ─── Stage: the dark area the images slide across ────── */
8675
+ .muka-media-viewer__stage {
8676
+ position: relative;
8677
+ flex: 1 1 auto;
8678
+ min-height: 0;
8679
+ overflow: hidden;
8680
+ /* Gestures are handled in JS: no browser panning or pinch on the stage. */
8681
+ touch-action: none;
8682
+ user-select: none;
8683
+ -webkit-user-select: none;
8684
+ }
8685
+
8686
+ .muka-media-viewer__slide {
8687
+ position: absolute;
8688
+ inset: 0;
8689
+ display: flex;
8690
+ align-items: center;
8691
+ justify-content: center;
8692
+ padding: var(--spacing-4);
8693
+ transition: transform var(--motion-duration-component) var(--motion-easing-default);
8694
+ will-change: transform;
8695
+ }
8696
+
8697
+ /* While a finger drags, the image follows it without easing. */
8698
+ .muka-media-viewer--dragging .muka-media-viewer__slide {
8699
+ transition: none;
8700
+ }
8701
+
8702
+ .muka-media-viewer__image {
8703
+ display: block;
8704
+ max-width: 100%;
8705
+ max-height: 100%;
8706
+ object-fit: contain;
8707
+ pointer-events: none;
8708
+ }
8709
+
8710
+ /* ─── Previous / next: devices that can hover ─────────── */
8711
+ .muka-media-viewer__nav {
8712
+ position: absolute;
8713
+ top: 50%;
8714
+ display: none;
8715
+ transform: translateY(-50%);
8716
+ opacity: 0;
8717
+ transition: opacity var(--motion-duration-micro) var(--motion-easing-enter);
8718
+ }
8719
+
8720
+ .muka-media-viewer__nav--previous {
8721
+ left: var(--spacing-4);
8722
+ }
8723
+
8724
+ .muka-media-viewer__nav--next {
8725
+ right: var(--spacing-4);
8726
+ }
8727
+
8728
+ @media (hover: hover) and (pointer: fine) {
8729
+ .muka-media-viewer__nav {
8730
+ display: block;
8731
+ }
8732
+
8733
+ .muka-media-viewer__stage:hover .muka-media-viewer__nav,
8734
+ .muka-media-viewer__nav:focus-within {
8735
+ opacity: 1;
8736
+ }
8737
+ }
8738
+
8739
+ /* ─── Footer: caption, meta and actions ───────────────── */
8740
+ .muka-media-viewer__footer {
8741
+ flex-shrink: 0;
8742
+ display: flex;
8743
+ flex-direction: column;
8744
+ gap: var(--spacing-3);
8745
+ padding: var(--spacing-4);
8746
+ padding-bottom: calc(var(--spacing-4) + env(safe-area-inset-bottom, 0px));
8747
+ background-color: var(--color-surface-level3);
8748
+ }
8749
+
8750
+ .muka-media-viewer__details {
8751
+ display: flex;
8752
+ align-items: flex-start;
8753
+ justify-content: space-between;
8754
+ gap: var(--spacing-3);
8755
+ }
8756
+
8757
+ .muka-media-viewer__caption {
8758
+ min-width: 0;
8759
+ color: var(--color-text-subtle-default);
8760
+ font-family: var(--text-body-sm-regular-fontFamily);
8761
+ font-size: var(--text-body-sm-regular-fontSize);
8762
+ font-weight: var(--text-body-sm-regular-fontWeight);
8763
+ line-height: var(--text-body-sm-regular-lineHeight);
8764
+ overflow-wrap: anywhere;
8765
+ }
8766
+
8767
+ .muka-media-viewer__meta {
8768
+ flex-shrink: 0;
8769
+ }
8770
+
8771
+ .muka-media-viewer__actions {
8772
+ display: flex;
8773
+ flex-wrap: wrap;
8774
+ gap: var(--spacing-2);
8775
+ }
8776
+
8777
+ /* Mobile: actions stack full width, like Dialog footers. */
8778
+ @media (max-width: 1023px) {
8779
+ .muka-media-viewer__actions {
8780
+ flex-direction: column;
8781
+ }
8782
+
8783
+ .muka-media-viewer__actions > * {
8784
+ width: 100%;
8785
+ }
8786
+ }
8787
+
8788
+ /* ─── Reduced motion ──────────────────────────────────── */
8789
+ @media (prefers-reduced-motion: reduce) {
8790
+ .muka-media-viewer,
8791
+ .muka-media-viewer__slide,
8792
+ .muka-media-viewer__nav {
8793
+ animation: none;
8794
+ transition: none;
8795
+ }
8796
+ }
8797
+
8798
+
8603
8799
  /* ListItem */
8604
8800
  /* ListItem Component Styles - Using Muka Design Tokens */
8605
8801
 
@@ -9401,6 +9597,9 @@ li.muka-listitem {
9401
9597
  flex-shrink: 0;
9402
9598
  width: var(--size-2xl, 2rem);
9403
9599
  height: var(--size-2xl, 2rem);
9600
+ /* Bleed into the field's vertical padding: keeps the full hit area without
9601
+ making a password or clearable field taller than a plain one. */
9602
+ margin-block: calc(var(--input-field-padding-y) * -1);
9404
9603
  padding: 0;
9405
9604
  border: none;
9406
9605
  background: transparent;
@@ -9408,6 +9607,24 @@ li.muka-listitem {
9408
9607
  cursor: pointer;
9409
9608
  }
9410
9609
 
9610
+ /* The outermost button bleeds into the right padding by the same amount, so
9611
+ its glyph sits as close to the edge as it does to the top and bottom. */
9612
+ .muka-input__clear:last-child,
9613
+ .muka-input__reveal:last-child {
9614
+ margin-inline-end: calc(var(--input-field-padding-y) * -1);
9615
+ }
9616
+
9617
+ /* md: match the right gap to the gap above and below the vertically centred
9618
+ button exactly, i.e. (field height − borders − button) / 2. Holds in the
9619
+ focus/error state too, where border and padding trade 1px. */
9620
+ .muka-input__field--md .muka-input__clear:last-child,
9621
+ .muka-input__field--md .muka-input__reveal:last-child {
9622
+ margin-inline-end: calc(
9623
+ (var(--input-field-height-default) - 2 * var(--border-width-regular) - var(--size-2xl, 2rem)) / 2
9624
+ - var(--input-field-padding-x)
9625
+ );
9626
+ }
9627
+
9411
9628
  .muka-input__field--sm .muka-input__clear,
9412
9629
  .muka-input__field--sm .muka-input__reveal {
9413
9630
  width: var(--size-xl, 1.5rem);
@@ -10837,6 +11054,7 @@ li.muka-listitem {
10837
11054
  height: 100%;
10838
11055
  max-width: 100vw;
10839
11056
  max-height: 100vh;
11057
+ max-height: 100dvh;
10840
11058
  margin: 0;
10841
11059
  display: flex;
10842
11060
  flex-direction: column;
@@ -10871,6 +11089,8 @@ li.muka-listitem {
10871
11089
 
10872
11090
  .muka-dialog--lg .muka-dialog__surface {
10873
11091
  height: calc(100vh - var(--dialog-margin-top-mobile));
11092
+ /* dvh tracks the visible area as mobile toolbars show and hide */
11093
+ height: calc(100dvh - var(--dialog-margin-top-mobile));
10874
11094
  }
10875
11095
 
10876
11096
  /* Body */
@@ -11616,7 +11836,10 @@ li.muka-listitem {
11616
11836
  fill: none;
11617
11837
  /* Subtle lift on the filled segment, matching the Figma elevation */
11618
11838
  filter: drop-shadow(0 2px 4px var(--color-black-alpha-5, rgba(0, 0, 0, 0.05)));
11619
- transition: stroke-dasharray 0.3s ease;
11839
+ /* Butt caps keep the always-rendered 0% arc invisible (round caps would draw a dot) */
11840
+ stroke-linecap: butt;
11841
+ /* view duration (300ms) reads at the 24px size; tokens zero it for reduced motion */
11842
+ transition: stroke-dasharray var(--motion-duration-view) var(--motion-easing-default);
11620
11843
  }
11621
11844
 
11622
11845
  /* ─── Indeterminate (spinner) ─────────────────────────── */