@revikornmann/muka-ui 0.27.2 → 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 (84) hide show
  1. package/dist/cjs/components/Avatar/Avatar.css +30 -7
  2. package/dist/cjs/components/Avatar/Avatar.js +4 -1
  3. package/dist/cjs/components/Avatar/Avatar.js.map +1 -1
  4. package/dist/cjs/components/DataPieChart/DataPieChart.css +4 -1
  5. package/dist/cjs/components/DataPieChart/DataPieChart.js +1 -1
  6. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  7. package/dist/cjs/components/Dialog/Dialog.css +3 -0
  8. package/dist/cjs/components/Dialog/Dialog.js +66 -3
  9. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  10. package/dist/cjs/components/Input/Input.css +21 -0
  11. package/dist/cjs/components/MediaViewer/MediaViewer.css +180 -0
  12. package/dist/cjs/components/MediaViewer/MediaViewer.js +271 -0
  13. package/dist/cjs/components/MediaViewer/MediaViewer.js.map +1 -0
  14. package/dist/cjs/components/MediaViewer/index.js +6 -0
  15. package/dist/cjs/components/MediaViewer/index.js.map +1 -0
  16. package/dist/cjs/components/MediaViewer/mediaViewerGestures.js +65 -0
  17. package/dist/cjs/components/MediaViewer/mediaViewerGestures.js.map +1 -0
  18. package/dist/cjs/components/Thumbnail/Thumbnail.css +11 -0
  19. package/dist/cjs/components/Thumbnail/Thumbnail.js +6 -2
  20. package/dist/cjs/components/Thumbnail/Thumbnail.js.map +1 -1
  21. package/dist/cjs/components/index.js +3 -1
  22. package/dist/cjs/components/index.js.map +1 -1
  23. package/dist/esm/components/Avatar/Avatar.css +30 -7
  24. package/dist/esm/components/Avatar/Avatar.js +4 -1
  25. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  26. package/dist/esm/components/DataPieChart/DataPieChart.css +4 -1
  27. package/dist/esm/components/DataPieChart/DataPieChart.js +1 -1
  28. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  29. package/dist/esm/components/Dialog/Dialog.css +3 -0
  30. package/dist/esm/components/Dialog/Dialog.js +66 -3
  31. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  32. package/dist/esm/components/Input/Input.css +21 -0
  33. package/dist/esm/components/MediaViewer/MediaViewer.css +180 -0
  34. package/dist/esm/components/MediaViewer/MediaViewer.js +267 -0
  35. package/dist/esm/components/MediaViewer/MediaViewer.js.map +1 -0
  36. package/dist/esm/components/MediaViewer/index.js +2 -0
  37. package/dist/esm/components/MediaViewer/index.js.map +1 -0
  38. package/dist/esm/components/MediaViewer/mediaViewerGestures.js +58 -0
  39. package/dist/esm/components/MediaViewer/mediaViewerGestures.js.map +1 -0
  40. package/dist/esm/components/Thumbnail/Thumbnail.css +11 -0
  41. package/dist/esm/components/Thumbnail/Thumbnail.js +6 -2
  42. package/dist/esm/components/Thumbnail/Thumbnail.js.map +1 -1
  43. package/dist/esm/components/index.js +1 -0
  44. package/dist/esm/components/index.js.map +1 -1
  45. package/dist/styles/base.css +2 -0
  46. package/dist/styles/components/Avatar.css +30 -7
  47. package/dist/styles/components/DataPieChart.css +4 -1
  48. package/dist/styles/components/Dialog.css +3 -0
  49. package/dist/styles/components/Input.css +21 -0
  50. package/dist/styles/components/MediaViewer.css +180 -0
  51. package/dist/styles/components/Thumbnail.css +11 -0
  52. package/dist/styles/index.css +554 -301
  53. package/dist/styles/muka-dark.css +554 -301
  54. package/dist/styles/muka-light.css +554 -301
  55. package/dist/styles/tokens-bouwplan-dark.css +8 -1
  56. package/dist/styles/tokens-bouwplan-light.css +8 -1
  57. package/dist/styles/tokens-fscl-dark.css +8 -1
  58. package/dist/styles/tokens-fscl-light.css +8 -1
  59. package/dist/styles/tokens-grip-dark.css +8 -1
  60. package/dist/styles/tokens-grip-light.css +8 -1
  61. package/dist/styles/tokens-muka-dark.css +8 -1
  62. package/dist/styles/tokens-muka-light.css +8 -1
  63. package/dist/styles/tokens-wireframe-dark.css +8 -1
  64. package/dist/styles/tokens-wireframe-light.css +8 -1
  65. package/dist/styles/wireframe-dark.css +554 -301
  66. package/dist/styles/wireframe-light.css +554 -301
  67. package/dist/types/components/Avatar/Avatar.d.ts +4 -1
  68. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  69. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  70. package/dist/types/components/MediaViewer/MediaViewer.d.ts +86 -0
  71. package/dist/types/components/MediaViewer/MediaViewer.d.ts.map +1 -0
  72. package/dist/types/components/MediaViewer/index.d.ts +2 -0
  73. package/dist/types/components/MediaViewer/index.d.ts.map +1 -0
  74. package/dist/types/components/MediaViewer/mediaViewerGestures.d.ts +35 -0
  75. package/dist/types/components/MediaViewer/mediaViewerGestures.d.ts.map +1 -0
  76. package/dist/types/components/Thumbnail/Thumbnail.d.ts +21 -0
  77. package/dist/types/components/Thumbnail/Thumbnail.d.ts.map +1 -1
  78. package/dist/types/components/index.d.ts +1 -0
  79. package/dist/types/components/index.d.ts.map +1 -1
  80. package/docs/consumers/brand.md +6 -2
  81. package/docs/consumers/setup-instructions.md +35 -3
  82. package/package.json +1 -1
  83. package/skills/setup-muka/SKILL.md +36 -3
  84. package/tokens/t4-components/avatar.json +33 -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
 
@@ -2053,9 +2055,16 @@ body {
2053
2055
  --avatar-size-md: 4rem;
2054
2056
  --avatar-size-lg: 5rem;
2055
2057
  --avatar-size-xl: 7rem;
2058
+ --avatar-icon-size-3xs: 1rem;
2059
+ --avatar-icon-size-2xs: 1.25rem;
2060
+ --avatar-icon-size-xs: 1.5rem;
2061
+ --avatar-icon-size-sm: 2rem;
2062
+ --avatar-icon-size-md: 2.5rem;
2063
+ --avatar-icon-size-lg: 3rem;
2064
+ --avatar-icon-size-xl: 4rem;
2056
2065
  --avatar-color-background-default: #f2eff3;
2057
2066
  --avatar-color-background-loading: #eae7ec;
2058
- --avatar-color-foreground-default: #211f26;
2067
+ --avatar-color-foreground-default: #8e8c99;
2059
2068
  --avatar-color-foreground-muted: #d0cdd7;
2060
2069
  --avatar-color-status-online: #027864;
2061
2070
  --avatar-color-status-offline: #d0cdd7;
@@ -3705,6 +3714,17 @@ body {
3705
3714
  height: 120px;
3706
3715
  }
3707
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
+
3708
3728
  .muka-thumbnail--ellipse .muka-thumbnail__frame {
3709
3729
  border-radius: var(--border-radius-full);
3710
3730
  }
@@ -4631,6 +4651,114 @@ body {
4631
4651
  }
4632
4652
 
4633
4653
 
4654
+ /* SwipeActions */
4655
+ /* SwipeActions Component Styles */
4656
+
4657
+ .muka-swipe-actions {
4658
+ position: relative;
4659
+ overflow: hidden;
4660
+ touch-action: pan-y;
4661
+ -webkit-user-select: none;
4662
+ user-select: none;
4663
+ background-color: var(--color-surface-level3);
4664
+ }
4665
+
4666
+ .muka-swipe-actions--disabled {
4667
+ touch-action: auto;
4668
+ }
4669
+
4670
+ /* ─── Row that holds the actual content ────────────────── */
4671
+
4672
+ .muka-swipe-actions__row {
4673
+ position: relative;
4674
+ z-index: 1;
4675
+ background-color: inherit;
4676
+ will-change: transform;
4677
+ }
4678
+
4679
+ /* ─── Action panels — sit beneath the row ──────────────── */
4680
+
4681
+ .muka-swipe-actions__panel {
4682
+ position: absolute;
4683
+ top: 0;
4684
+ bottom: 0;
4685
+ display: flex;
4686
+ align-items: stretch;
4687
+ z-index: 0;
4688
+ }
4689
+
4690
+ .muka-swipe-actions__panel--left {
4691
+ left: 0;
4692
+ }
4693
+
4694
+ .muka-swipe-actions__panel--right {
4695
+ right: 0;
4696
+ }
4697
+
4698
+ /* ─── Single action button ─────────────────────────────── */
4699
+
4700
+ .muka-swipe-actions__button {
4701
+ display: flex;
4702
+ flex-direction: column;
4703
+ align-items: center;
4704
+ justify-content: center;
4705
+ gap: var(--spacing-1);
4706
+ border: none;
4707
+ cursor: pointer;
4708
+ padding: var(--spacing-2);
4709
+ background-color: var(--color-surface-level2);
4710
+ color: var(--color-text-default-default);
4711
+ font-family: var(--text-label-sm-semibold-fontFamily);
4712
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4713
+ font-size: var(--text-label-sm-semibold-fontSize);
4714
+ line-height: var(--text-label-sm-semibold-lineHeight);
4715
+ -webkit-tap-highlight-color: transparent;
4716
+ transition: filter 0.12s ease;
4717
+ }
4718
+
4719
+ .muka-swipe-actions__button:hover {
4720
+ filter: brightness(0.95);
4721
+ }
4722
+
4723
+ .muka-swipe-actions__button:focus-visible {
4724
+ outline: 2px solid var(--color-action-default);
4725
+ outline-offset: -2px;
4726
+ }
4727
+
4728
+ .muka-swipe-actions__button-icon {
4729
+ display: inline-flex;
4730
+ align-items: center;
4731
+ justify-content: center;
4732
+ }
4733
+
4734
+ /* ─── Color variants ───────────────────────────────────── */
4735
+
4736
+ .muka-swipe-actions__button--neutral {
4737
+ background-color: var(--color-surface-level2);
4738
+ color: var(--color-text-default-default);
4739
+ }
4740
+
4741
+ .muka-swipe-actions__button--primary {
4742
+ background-color: var(--color-action-default);
4743
+ color: var(--color-text-default-inverse);
4744
+ }
4745
+
4746
+ .muka-swipe-actions__button--success {
4747
+ background-color: var(--color-state-success-default);
4748
+ color: var(--color-text-default-inverse);
4749
+ }
4750
+
4751
+ .muka-swipe-actions__button--warning {
4752
+ background-color: var(--color-state-warning-default);
4753
+ color: var(--color-text-default-default);
4754
+ }
4755
+
4756
+ .muka-swipe-actions__button--destructive {
4757
+ background-color: var(--color-state-error-default);
4758
+ color: var(--color-text-default-inverse);
4759
+ }
4760
+
4761
+
4634
4762
  /* Spinner */
4635
4763
  /* Spinner Component Styles */
4636
4764
 
@@ -4794,114 +4922,6 @@ body {
4794
4922
  }
4795
4923
 
4796
4924
 
4797
- /* SwipeActions */
4798
- /* SwipeActions Component Styles */
4799
-
4800
- .muka-swipe-actions {
4801
- position: relative;
4802
- overflow: hidden;
4803
- touch-action: pan-y;
4804
- -webkit-user-select: none;
4805
- user-select: none;
4806
- background-color: var(--color-surface-level3);
4807
- }
4808
-
4809
- .muka-swipe-actions--disabled {
4810
- touch-action: auto;
4811
- }
4812
-
4813
- /* ─── Row that holds the actual content ────────────────── */
4814
-
4815
- .muka-swipe-actions__row {
4816
- position: relative;
4817
- z-index: 1;
4818
- background-color: inherit;
4819
- will-change: transform;
4820
- }
4821
-
4822
- /* ─── Action panels — sit beneath the row ──────────────── */
4823
-
4824
- .muka-swipe-actions__panel {
4825
- position: absolute;
4826
- top: 0;
4827
- bottom: 0;
4828
- display: flex;
4829
- align-items: stretch;
4830
- z-index: 0;
4831
- }
4832
-
4833
- .muka-swipe-actions__panel--left {
4834
- left: 0;
4835
- }
4836
-
4837
- .muka-swipe-actions__panel--right {
4838
- right: 0;
4839
- }
4840
-
4841
- /* ─── Single action button ─────────────────────────────── */
4842
-
4843
- .muka-swipe-actions__button {
4844
- display: flex;
4845
- flex-direction: column;
4846
- align-items: center;
4847
- justify-content: center;
4848
- gap: var(--spacing-1);
4849
- border: none;
4850
- cursor: pointer;
4851
- padding: var(--spacing-2);
4852
- background-color: var(--color-surface-level2);
4853
- color: var(--color-text-default-default);
4854
- font-family: var(--text-label-sm-semibold-fontFamily);
4855
- font-weight: var(--text-label-sm-semibold-fontWeight);
4856
- font-size: var(--text-label-sm-semibold-fontSize);
4857
- line-height: var(--text-label-sm-semibold-lineHeight);
4858
- -webkit-tap-highlight-color: transparent;
4859
- transition: filter 0.12s ease;
4860
- }
4861
-
4862
- .muka-swipe-actions__button:hover {
4863
- filter: brightness(0.95);
4864
- }
4865
-
4866
- .muka-swipe-actions__button:focus-visible {
4867
- outline: 2px solid var(--color-action-default);
4868
- outline-offset: -2px;
4869
- }
4870
-
4871
- .muka-swipe-actions__button-icon {
4872
- display: inline-flex;
4873
- align-items: center;
4874
- justify-content: center;
4875
- }
4876
-
4877
- /* ─── Color variants ───────────────────────────────────── */
4878
-
4879
- .muka-swipe-actions__button--neutral {
4880
- background-color: var(--color-surface-level2);
4881
- color: var(--color-text-default-default);
4882
- }
4883
-
4884
- .muka-swipe-actions__button--primary {
4885
- background-color: var(--color-action-default);
4886
- color: var(--color-text-default-inverse);
4887
- }
4888
-
4889
- .muka-swipe-actions__button--success {
4890
- background-color: var(--color-state-success-default);
4891
- color: var(--color-text-default-inverse);
4892
- }
4893
-
4894
- .muka-swipe-actions__button--warning {
4895
- background-color: var(--color-state-warning-default);
4896
- color: var(--color-text-default-default);
4897
- }
4898
-
4899
- .muka-swipe-actions__button--destructive {
4900
- background-color: var(--color-state-error-default);
4901
- color: var(--color-text-default-inverse);
4902
- }
4903
-
4904
-
4905
4925
  /* SocialSignInButton */
4906
4926
  /*
4907
4927
  * SocialSignInButton lockup colors are provider-mandated (Apple HIG /
@@ -7361,198 +7381,26 @@ body {
7361
7381
  }
7362
7382
 
7363
7383
 
7364
- /* Progress */
7365
- /* Progress Component Styles - Using Muka Design Tokens */
7366
-
7367
- /* ========================================
7368
- BAR VARIANT
7369
- ======================================== */
7384
+ /* ProfileBadge */
7385
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7370
7386
 
7371
- .muka-progress--bar {
7372
- display: flex;
7387
+ .muka-profile-badge {
7388
+ display: inline-flex;
7373
7389
  align-items: center;
7374
- gap: var(--spacing-2);
7375
- width: 100%;
7390
+ font-family: var(--text-body-base-regular-fontFamily);
7376
7391
  }
7377
7392
 
7378
- .muka-progress--bar .muka-progress__track {
7379
- flex: 1;
7380
- background-color: var(--color-surface-level1);
7381
- border-radius: var(--border-radius-full);
7382
- overflow: hidden;
7393
+ /* Size variants */
7394
+ .muka-profile-badge--lg {
7395
+ gap: var(--spacing-4); /* 16px */
7383
7396
  }
7384
7397
 
7385
- .muka-progress--bar.muka-progress--sm .muka-progress__track {
7386
- height: var(--progress-size-bar-height-sm);
7398
+ .muka-profile-badge--md {
7399
+ gap: var(--spacing-3); /* 12px */
7387
7400
  }
7388
7401
 
7389
- .muka-progress--bar.muka-progress--md .muka-progress__track {
7390
- height: var(--progress-size-bar-height-md);
7391
- }
7392
-
7393
- .muka-progress--bar.muka-progress--lg .muka-progress__track {
7394
- height: var(--progress-size-bar-height-lg);
7395
- }
7396
-
7397
- .muka-progress--bar .muka-progress__fill {
7398
- height: 100%;
7399
- background-color: var(--color-action-default);
7400
- border-radius: var(--border-radius-full);
7401
- transition: width 0.3s ease;
7402
- }
7403
-
7404
- .muka-progress--bar .muka-progress__label {
7405
- flex-shrink: 0;
7406
- font-family: var(--text-label-sm-semibold-fontFamily);
7407
- font-weight: var(--text-label-sm-semibold-fontWeight);
7408
- font-size: var(--text-label-sm-semibold-fontSize);
7409
- line-height: var(--text-label-sm-semibold-lineHeight);
7410
- color: var(--color-text-default-default);
7411
- min-width: 3ch;
7412
- text-align: right;
7413
- }
7414
-
7415
- /* Indeterminate animation for bar */
7416
- .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7417
- width: 40%;
7418
- animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7419
- }
7420
-
7421
- @keyframes muka-progress-bar-indeterminate {
7422
- 0% {
7423
- transform: translateX(-100%);
7424
- }
7425
- 100% {
7426
- transform: translateX(250%);
7427
- }
7428
- }
7429
-
7430
- /* ========================================
7431
- CIRCLE VARIANT
7432
- ======================================== */
7433
-
7434
- .muka-progress--circle {
7435
- position: relative;
7436
- display: inline-flex;
7437
- align-items: center;
7438
- justify-content: center;
7439
- }
7440
-
7441
- .muka-progress--circle.muka-progress--sm {
7442
- width: var(--progress-size-circle-diameter-sm);
7443
- height: var(--progress-size-circle-diameter-sm);
7444
- }
7445
-
7446
- .muka-progress--circle.muka-progress--md {
7447
- width: var(--progress-size-circle-diameter-md);
7448
- height: var(--progress-size-circle-diameter-md);
7449
- }
7450
-
7451
- .muka-progress--circle.muka-progress--lg {
7452
- width: var(--progress-size-circle-diameter-lg);
7453
- height: var(--progress-size-circle-diameter-lg);
7454
- }
7455
-
7456
- .muka-progress__circle {
7457
- width: 100%;
7458
- height: 100%;
7459
- transform: rotate(-90deg);
7460
- }
7461
-
7462
- .muka-progress--circle .muka-progress__track {
7463
- fill: none;
7464
- stroke: var(--color-surface-level1);
7465
- }
7466
-
7467
- .muka-progress--circle.muka-progress--sm .muka-progress__track,
7468
- .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7469
- stroke-width: var(--progress-size-circle-strokeWidth-sm);
7470
- }
7471
-
7472
- .muka-progress--circle.muka-progress--md .muka-progress__track,
7473
- .muka-progress--circle.muka-progress--md .muka-progress__fill {
7474
- stroke-width: var(--progress-size-circle-strokeWidth-md);
7475
- }
7476
-
7477
- .muka-progress--circle.muka-progress--lg .muka-progress__track,
7478
- .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7479
- stroke-width: var(--progress-size-circle-strokeWidth-lg);
7480
- }
7481
-
7482
- .muka-progress--circle .muka-progress__fill {
7483
- fill: none;
7484
- stroke: var(--color-action-default);
7485
- stroke-linecap: round;
7486
- transition: stroke-dashoffset 0.3s ease;
7487
- }
7488
-
7489
- .muka-progress--circle .muka-progress__label {
7490
- position: absolute;
7491
- font-family: var(--text-label-sm-semibold-fontFamily);
7492
- font-weight: var(--text-label-sm-semibold-fontWeight);
7493
- color: var(--color-text-default-default);
7494
- }
7495
-
7496
- .muka-progress--circle.muka-progress--sm .muka-progress__label {
7497
- font-size: var(--text-label-sm-semibold-fontSize);
7498
- }
7499
-
7500
- .muka-progress--circle.muka-progress--md .muka-progress__label {
7501
- font-size: var(--text-label-md-semibold-fontSize);
7502
- }
7503
-
7504
- .muka-progress--circle.muka-progress--lg .muka-progress__label {
7505
- font-size: var(--text-label-lg-semibold-fontSize);
7506
- }
7507
-
7508
- /* Indeterminate animation for circle */
7509
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7510
- animation: muka-progress-circle-rotate 2s linear infinite;
7511
- }
7512
-
7513
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7514
- animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7515
- }
7516
-
7517
- @keyframes muka-progress-circle-rotate {
7518
- 100% {
7519
- transform: rotate(270deg);
7520
- }
7521
- }
7522
-
7523
- @keyframes muka-progress-circle-dash {
7524
- 0% {
7525
- stroke-dashoffset: 220;
7526
- }
7527
- 50% {
7528
- stroke-dashoffset: 70;
7529
- }
7530
- 100% {
7531
- stroke-dashoffset: 220;
7532
- }
7533
- }
7534
-
7535
-
7536
- /* ProfileBadge */
7537
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7538
-
7539
- .muka-profile-badge {
7540
- display: inline-flex;
7541
- align-items: center;
7542
- font-family: var(--text-body-base-regular-fontFamily);
7543
- }
7544
-
7545
- /* Size variants */
7546
- .muka-profile-badge--lg {
7547
- gap: var(--spacing-4); /* 16px */
7548
- }
7549
-
7550
- .muka-profile-badge--md {
7551
- gap: var(--spacing-3); /* 12px */
7552
- }
7553
-
7554
- .muka-profile-badge__avatar {
7555
- flex-shrink: 0;
7402
+ .muka-profile-badge__avatar {
7403
+ flex-shrink: 0;
7556
7404
  }
7557
7405
 
7558
7406
  /* Text stack */
@@ -7957,6 +7805,178 @@ body {
7957
7805
  }
7958
7806
 
7959
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);
7950
+ }
7951
+
7952
+ /* Indeterminate animation for circle */
7953
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7954
+ animation: muka-progress-circle-rotate 2s linear infinite;
7955
+ }
7956
+
7957
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7958
+ animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7959
+ }
7960
+
7961
+ @keyframes muka-progress-circle-rotate {
7962
+ 100% {
7963
+ transform: rotate(270deg);
7964
+ }
7965
+ }
7966
+
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
+ }
7977
+ }
7978
+
7979
+
7960
7980
  /* PhotoDraftStrip */
7961
7981
  /* PhotoDraftStrip Component Styles */
7962
7982
 
@@ -8626,6 +8646,189 @@ body {
8626
8646
  }
8627
8647
 
8628
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
+
8629
8832
  /* ListItem */
8630
8833
  /* ListItem Component Styles - Using Muka Design Tokens */
8631
8834
 
@@ -9427,6 +9630,9 @@ li.muka-listitem {
9427
9630
  flex-shrink: 0;
9428
9631
  width: var(--size-2xl, 2rem);
9429
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);
9430
9636
  padding: 0;
9431
9637
  border: none;
9432
9638
  background: transparent;
@@ -9434,6 +9640,24 @@ li.muka-listitem {
9434
9640
  cursor: pointer;
9435
9641
  }
9436
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
+
9437
9661
  .muka-input__field--sm .muka-input__clear,
9438
9662
  .muka-input__field--sm .muka-input__reveal {
9439
9663
  width: var(--size-xl, 1.5rem);
@@ -10863,6 +11087,7 @@ li.muka-listitem {
10863
11087
  height: 100%;
10864
11088
  max-width: 100vw;
10865
11089
  max-height: 100vh;
11090
+ max-height: 100dvh;
10866
11091
  margin: 0;
10867
11092
  display: flex;
10868
11093
  flex-direction: column;
@@ -10897,6 +11122,8 @@ li.muka-listitem {
10897
11122
 
10898
11123
  .muka-dialog--lg .muka-dialog__surface {
10899
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));
10900
11127
  }
10901
11128
 
10902
11129
  /* Body */
@@ -11642,7 +11869,10 @@ li.muka-listitem {
11642
11869
  fill: none;
11643
11870
  /* Subtle lift on the filled segment, matching the Figma elevation */
11644
11871
  filter: drop-shadow(0 2px 4px var(--color-black-alpha-5, rgba(0, 0, 0, 0.05)));
11645
- 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);
11646
11876
  }
11647
11877
 
11648
11878
  /* ─── Indeterminate (spinner) ─────────────────────────── */
@@ -14631,7 +14861,8 @@ button.muka-chat-photo-grid__tile:focus-visible {
14631
14861
  align-items: center;
14632
14862
  justify-content: center;
14633
14863
  flex-shrink: 0;
14634
- overflow: hidden;
14864
+ /* No overflow clipping: the status dot sits on the edge. The image and the
14865
+ loading shimmer round themselves to the avatar shape instead. */
14635
14866
  user-select: none;
14636
14867
  vertical-align: middle;
14637
14868
  background-color: var(--avatar-color-background-default);
@@ -14704,9 +14935,10 @@ button.muka-chat-photo-grid__tile:focus-visible {
14704
14935
  border-radius: var(--avatar-radius-square-sm);
14705
14936
  }
14706
14937
 
14707
- /* 4xs is too small for initials, the fallback icon or a status dot:
14938
+ /* 4xs is too small for initials, an icon, the fallback icon or a status dot:
14708
14939
  it shows the picture, or the plain background */
14709
14940
  .muka-avatar--4xs .muka-avatar__initials,
14941
+ .muka-avatar--4xs .muka-avatar__icon,
14710
14942
  .muka-avatar--4xs .muka-avatar__fallback,
14711
14943
  .muka-avatar--4xs .muka-avatar__status {
14712
14944
  display: none;
@@ -14742,38 +14974,59 @@ button.muka-chat-photo-grid__tile:focus-visible {
14742
14974
  .muka-avatar__skeleton {
14743
14975
  position: absolute;
14744
14976
  inset: 0;
14977
+ border-radius: inherit;
14745
14978
  background: linear-gradient(
14746
14979
  90deg,
14747
14980
  transparent 0%,
14748
14981
  var(--color-surface-level1) 50%,
14749
14982
  transparent 100%
14750
- );
14983
+ ) no-repeat;
14984
+ background-size: 50% 100%;
14751
14985
  animation: avatar-loading 1.5s ease-in-out infinite;
14752
14986
  }
14753
14987
 
14988
+ /* The highlight sweeps by background position, so it stays inside the
14989
+ rounded shape without the avatar clipping its overflow */
14754
14990
  @keyframes avatar-loading {
14755
14991
  0% {
14756
- transform: translateX(-100%);
14992
+ background-position: -100% 0;
14757
14993
  }
14758
14994
  100% {
14759
- transform: translateX(100%);
14995
+ background-position: 200% 0;
14760
14996
  }
14761
14997
  }
14762
14998
 
14763
14999
  /* Avatar content */
14764
15000
  .muka-avatar__image {
15001
+ border-radius: inherit;
14765
15002
  width: 100%;
14766
15003
  height: 100%;
14767
15004
  object-fit: cover;
14768
15005
  display: block;
14769
15006
  }
14770
15007
 
15008
+ /* Icon slot: a fixed icon size per avatar size, in the initials colour
15009
+ (subtle text) */
14771
15010
  .muka-avatar__icon {
14772
- width: 60%;
14773
- height: 60%;
14774
15011
  display: flex;
14775
15012
  align-items: center;
14776
15013
  justify-content: center;
15014
+ color: var(--avatar-color-foreground-default);
15015
+ }
15016
+
15017
+ .muka-avatar--3xs .muka-avatar__icon { width: var(--avatar-icon-size-3xs); height: var(--avatar-icon-size-3xs); }
15018
+ .muka-avatar--2xs .muka-avatar__icon { width: var(--avatar-icon-size-2xs); height: var(--avatar-icon-size-2xs); }
15019
+ .muka-avatar--xs .muka-avatar__icon { width: var(--avatar-icon-size-xs); height: var(--avatar-icon-size-xs); }
15020
+ .muka-avatar--sm .muka-avatar__icon { width: var(--avatar-icon-size-sm); height: var(--avatar-icon-size-sm); }
15021
+ .muka-avatar--md .muka-avatar__icon { width: var(--avatar-icon-size-md); height: var(--avatar-icon-size-md); }
15022
+ .muka-avatar--lg .muka-avatar__icon { width: var(--avatar-icon-size-lg); height: var(--avatar-icon-size-lg); }
15023
+ .muka-avatar--xl .muka-avatar__icon { width: var(--avatar-icon-size-xl); height: var(--avatar-icon-size-xl); }
15024
+
15025
+ /* A Muka Icon fills the slot and takes its colour (its own `color` prop still wins) */
15026
+ .muka-avatar__icon .muka-icon {
15027
+ width: 100%;
15028
+ height: 100%;
15029
+ color: inherit;
14777
15030
  }
14778
15031
 
14779
15032
  .muka-avatar__icon svg {