@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
@@ -152,6 +152,8 @@ body {
152
152
  padding: 0;
153
153
  /* Page background uses Muka surface token so it matches theme (e.g. dark for muka-dark, wireframe-dark) */
154
154
  background-color: var(--color-surface-level3);
155
+ /* Default text color so bare text (h1–h6, p, span outside components) follows the theme instead of browser black */
156
+ color: var(--color-text-default-default);
155
157
  }
156
158
 
157
159
 
@@ -2052,9 +2054,16 @@ body {
2052
2054
  --avatar-size-md: 4rem;
2053
2055
  --avatar-size-lg: 5rem;
2054
2056
  --avatar-size-xl: 7rem;
2057
+ --avatar-icon-size-3xs: 1rem;
2058
+ --avatar-icon-size-2xs: 1.25rem;
2059
+ --avatar-icon-size-xs: 1.5rem;
2060
+ --avatar-icon-size-sm: 2rem;
2061
+ --avatar-icon-size-md: 2.5rem;
2062
+ --avatar-icon-size-lg: 3rem;
2063
+ --avatar-icon-size-xl: 4rem;
2055
2064
  --avatar-color-background-default: #232326;
2056
2065
  --avatar-color-background-loading: #2b2b30;
2057
- --avatar-color-foreground-default: #e6e6ea;
2066
+ --avatar-color-foreground-default: #737387;
2058
2067
  --avatar-color-foreground-muted: #4c4c57;
2059
2068
  --avatar-color-status-online: #58d5ba;
2060
2069
  --avatar-color-status-offline: #4c4c57;
@@ -3704,6 +3713,17 @@ body {
3704
3713
  height: 120px;
3705
3714
  }
3706
3715
 
3716
+ /* Fluid: fill the parent's width; the shape sets the height via aspect-ratio. */
3717
+ .muka-thumbnail--fluid {
3718
+ width: 100%;
3719
+ height: auto;
3720
+ aspect-ratio: 1 / 1;
3721
+ }
3722
+
3723
+ .muka-thumbnail--fluid.muka-thumbnail--4-3 {
3724
+ aspect-ratio: 4 / 3;
3725
+ }
3726
+
3707
3727
  .muka-thumbnail--ellipse .muka-thumbnail__frame {
3708
3728
  border-radius: var(--border-radius-full);
3709
3729
  }
@@ -4630,6 +4650,114 @@ body {
4630
4650
  }
4631
4651
 
4632
4652
 
4653
+ /* SwipeActions */
4654
+ /* SwipeActions Component Styles */
4655
+
4656
+ .muka-swipe-actions {
4657
+ position: relative;
4658
+ overflow: hidden;
4659
+ touch-action: pan-y;
4660
+ -webkit-user-select: none;
4661
+ user-select: none;
4662
+ background-color: var(--color-surface-level3);
4663
+ }
4664
+
4665
+ .muka-swipe-actions--disabled {
4666
+ touch-action: auto;
4667
+ }
4668
+
4669
+ /* ─── Row that holds the actual content ────────────────── */
4670
+
4671
+ .muka-swipe-actions__row {
4672
+ position: relative;
4673
+ z-index: 1;
4674
+ background-color: inherit;
4675
+ will-change: transform;
4676
+ }
4677
+
4678
+ /* ─── Action panels — sit beneath the row ──────────────── */
4679
+
4680
+ .muka-swipe-actions__panel {
4681
+ position: absolute;
4682
+ top: 0;
4683
+ bottom: 0;
4684
+ display: flex;
4685
+ align-items: stretch;
4686
+ z-index: 0;
4687
+ }
4688
+
4689
+ .muka-swipe-actions__panel--left {
4690
+ left: 0;
4691
+ }
4692
+
4693
+ .muka-swipe-actions__panel--right {
4694
+ right: 0;
4695
+ }
4696
+
4697
+ /* ─── Single action button ─────────────────────────────── */
4698
+
4699
+ .muka-swipe-actions__button {
4700
+ display: flex;
4701
+ flex-direction: column;
4702
+ align-items: center;
4703
+ justify-content: center;
4704
+ gap: var(--spacing-1);
4705
+ border: none;
4706
+ cursor: pointer;
4707
+ padding: var(--spacing-2);
4708
+ background-color: var(--color-surface-level2);
4709
+ color: var(--color-text-default-default);
4710
+ font-family: var(--text-label-sm-semibold-fontFamily);
4711
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4712
+ font-size: var(--text-label-sm-semibold-fontSize);
4713
+ line-height: var(--text-label-sm-semibold-lineHeight);
4714
+ -webkit-tap-highlight-color: transparent;
4715
+ transition: filter 0.12s ease;
4716
+ }
4717
+
4718
+ .muka-swipe-actions__button:hover {
4719
+ filter: brightness(0.95);
4720
+ }
4721
+
4722
+ .muka-swipe-actions__button:focus-visible {
4723
+ outline: 2px solid var(--color-action-default);
4724
+ outline-offset: -2px;
4725
+ }
4726
+
4727
+ .muka-swipe-actions__button-icon {
4728
+ display: inline-flex;
4729
+ align-items: center;
4730
+ justify-content: center;
4731
+ }
4732
+
4733
+ /* ─── Color variants ───────────────────────────────────── */
4734
+
4735
+ .muka-swipe-actions__button--neutral {
4736
+ background-color: var(--color-surface-level2);
4737
+ color: var(--color-text-default-default);
4738
+ }
4739
+
4740
+ .muka-swipe-actions__button--primary {
4741
+ background-color: var(--color-action-default);
4742
+ color: var(--color-text-default-inverse);
4743
+ }
4744
+
4745
+ .muka-swipe-actions__button--success {
4746
+ background-color: var(--color-state-success-default);
4747
+ color: var(--color-text-default-inverse);
4748
+ }
4749
+
4750
+ .muka-swipe-actions__button--warning {
4751
+ background-color: var(--color-state-warning-default);
4752
+ color: var(--color-text-default-default);
4753
+ }
4754
+
4755
+ .muka-swipe-actions__button--destructive {
4756
+ background-color: var(--color-state-error-default);
4757
+ color: var(--color-text-default-inverse);
4758
+ }
4759
+
4760
+
4633
4761
  /* Spinner */
4634
4762
  /* Spinner Component Styles */
4635
4763
 
@@ -4793,114 +4921,6 @@ body {
4793
4921
  }
4794
4922
 
4795
4923
 
4796
- /* SwipeActions */
4797
- /* SwipeActions Component Styles */
4798
-
4799
- .muka-swipe-actions {
4800
- position: relative;
4801
- overflow: hidden;
4802
- touch-action: pan-y;
4803
- -webkit-user-select: none;
4804
- user-select: none;
4805
- background-color: var(--color-surface-level3);
4806
- }
4807
-
4808
- .muka-swipe-actions--disabled {
4809
- touch-action: auto;
4810
- }
4811
-
4812
- /* ─── Row that holds the actual content ────────────────── */
4813
-
4814
- .muka-swipe-actions__row {
4815
- position: relative;
4816
- z-index: 1;
4817
- background-color: inherit;
4818
- will-change: transform;
4819
- }
4820
-
4821
- /* ─── Action panels — sit beneath the row ──────────────── */
4822
-
4823
- .muka-swipe-actions__panel {
4824
- position: absolute;
4825
- top: 0;
4826
- bottom: 0;
4827
- display: flex;
4828
- align-items: stretch;
4829
- z-index: 0;
4830
- }
4831
-
4832
- .muka-swipe-actions__panel--left {
4833
- left: 0;
4834
- }
4835
-
4836
- .muka-swipe-actions__panel--right {
4837
- right: 0;
4838
- }
4839
-
4840
- /* ─── Single action button ─────────────────────────────── */
4841
-
4842
- .muka-swipe-actions__button {
4843
- display: flex;
4844
- flex-direction: column;
4845
- align-items: center;
4846
- justify-content: center;
4847
- gap: var(--spacing-1);
4848
- border: none;
4849
- cursor: pointer;
4850
- padding: var(--spacing-2);
4851
- background-color: var(--color-surface-level2);
4852
- color: var(--color-text-default-default);
4853
- font-family: var(--text-label-sm-semibold-fontFamily);
4854
- font-weight: var(--text-label-sm-semibold-fontWeight);
4855
- font-size: var(--text-label-sm-semibold-fontSize);
4856
- line-height: var(--text-label-sm-semibold-lineHeight);
4857
- -webkit-tap-highlight-color: transparent;
4858
- transition: filter 0.12s ease;
4859
- }
4860
-
4861
- .muka-swipe-actions__button:hover {
4862
- filter: brightness(0.95);
4863
- }
4864
-
4865
- .muka-swipe-actions__button:focus-visible {
4866
- outline: 2px solid var(--color-action-default);
4867
- outline-offset: -2px;
4868
- }
4869
-
4870
- .muka-swipe-actions__button-icon {
4871
- display: inline-flex;
4872
- align-items: center;
4873
- justify-content: center;
4874
- }
4875
-
4876
- /* ─── Color variants ───────────────────────────────────── */
4877
-
4878
- .muka-swipe-actions__button--neutral {
4879
- background-color: var(--color-surface-level2);
4880
- color: var(--color-text-default-default);
4881
- }
4882
-
4883
- .muka-swipe-actions__button--primary {
4884
- background-color: var(--color-action-default);
4885
- color: var(--color-text-default-inverse);
4886
- }
4887
-
4888
- .muka-swipe-actions__button--success {
4889
- background-color: var(--color-state-success-default);
4890
- color: var(--color-text-default-inverse);
4891
- }
4892
-
4893
- .muka-swipe-actions__button--warning {
4894
- background-color: var(--color-state-warning-default);
4895
- color: var(--color-text-default-default);
4896
- }
4897
-
4898
- .muka-swipe-actions__button--destructive {
4899
- background-color: var(--color-state-error-default);
4900
- color: var(--color-text-default-inverse);
4901
- }
4902
-
4903
-
4904
4924
  /* SocialSignInButton */
4905
4925
  /*
4906
4926
  * SocialSignInButton lockup colors are provider-mandated (Apple HIG /
@@ -7360,198 +7380,26 @@ body {
7360
7380
  }
7361
7381
 
7362
7382
 
7363
- /* Progress */
7364
- /* Progress Component Styles - Using Muka Design Tokens */
7365
-
7366
- /* ========================================
7367
- BAR VARIANT
7368
- ======================================== */
7383
+ /* ProfileBadge */
7384
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7369
7385
 
7370
- .muka-progress--bar {
7371
- display: flex;
7386
+ .muka-profile-badge {
7387
+ display: inline-flex;
7372
7388
  align-items: center;
7373
- gap: var(--spacing-2);
7374
- width: 100%;
7389
+ font-family: var(--text-body-base-regular-fontFamily);
7375
7390
  }
7376
7391
 
7377
- .muka-progress--bar .muka-progress__track {
7378
- flex: 1;
7379
- background-color: var(--color-surface-level1);
7380
- border-radius: var(--border-radius-full);
7381
- overflow: hidden;
7392
+ /* Size variants */
7393
+ .muka-profile-badge--lg {
7394
+ gap: var(--spacing-4); /* 16px */
7382
7395
  }
7383
7396
 
7384
- .muka-progress--bar.muka-progress--sm .muka-progress__track {
7385
- height: var(--progress-size-bar-height-sm);
7397
+ .muka-profile-badge--md {
7398
+ gap: var(--spacing-3); /* 12px */
7386
7399
  }
7387
7400
 
7388
- .muka-progress--bar.muka-progress--md .muka-progress__track {
7389
- height: var(--progress-size-bar-height-md);
7390
- }
7391
-
7392
- .muka-progress--bar.muka-progress--lg .muka-progress__track {
7393
- height: var(--progress-size-bar-height-lg);
7394
- }
7395
-
7396
- .muka-progress--bar .muka-progress__fill {
7397
- height: 100%;
7398
- background-color: var(--color-action-default);
7399
- border-radius: var(--border-radius-full);
7400
- transition: width 0.3s ease;
7401
- }
7402
-
7403
- .muka-progress--bar .muka-progress__label {
7404
- flex-shrink: 0;
7405
- font-family: var(--text-label-sm-semibold-fontFamily);
7406
- font-weight: var(--text-label-sm-semibold-fontWeight);
7407
- font-size: var(--text-label-sm-semibold-fontSize);
7408
- line-height: var(--text-label-sm-semibold-lineHeight);
7409
- color: var(--color-text-default-default);
7410
- min-width: 3ch;
7411
- text-align: right;
7412
- }
7413
-
7414
- /* Indeterminate animation for bar */
7415
- .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7416
- width: 40%;
7417
- animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7418
- }
7419
-
7420
- @keyframes muka-progress-bar-indeterminate {
7421
- 0% {
7422
- transform: translateX(-100%);
7423
- }
7424
- 100% {
7425
- transform: translateX(250%);
7426
- }
7427
- }
7428
-
7429
- /* ========================================
7430
- CIRCLE VARIANT
7431
- ======================================== */
7432
-
7433
- .muka-progress--circle {
7434
- position: relative;
7435
- display: inline-flex;
7436
- align-items: center;
7437
- justify-content: center;
7438
- }
7439
-
7440
- .muka-progress--circle.muka-progress--sm {
7441
- width: var(--progress-size-circle-diameter-sm);
7442
- height: var(--progress-size-circle-diameter-sm);
7443
- }
7444
-
7445
- .muka-progress--circle.muka-progress--md {
7446
- width: var(--progress-size-circle-diameter-md);
7447
- height: var(--progress-size-circle-diameter-md);
7448
- }
7449
-
7450
- .muka-progress--circle.muka-progress--lg {
7451
- width: var(--progress-size-circle-diameter-lg);
7452
- height: var(--progress-size-circle-diameter-lg);
7453
- }
7454
-
7455
- .muka-progress__circle {
7456
- width: 100%;
7457
- height: 100%;
7458
- transform: rotate(-90deg);
7459
- }
7460
-
7461
- .muka-progress--circle .muka-progress__track {
7462
- fill: none;
7463
- stroke: var(--color-surface-level1);
7464
- }
7465
-
7466
- .muka-progress--circle.muka-progress--sm .muka-progress__track,
7467
- .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7468
- stroke-width: var(--progress-size-circle-strokeWidth-sm);
7469
- }
7470
-
7471
- .muka-progress--circle.muka-progress--md .muka-progress__track,
7472
- .muka-progress--circle.muka-progress--md .muka-progress__fill {
7473
- stroke-width: var(--progress-size-circle-strokeWidth-md);
7474
- }
7475
-
7476
- .muka-progress--circle.muka-progress--lg .muka-progress__track,
7477
- .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7478
- stroke-width: var(--progress-size-circle-strokeWidth-lg);
7479
- }
7480
-
7481
- .muka-progress--circle .muka-progress__fill {
7482
- fill: none;
7483
- stroke: var(--color-action-default);
7484
- stroke-linecap: round;
7485
- transition: stroke-dashoffset 0.3s ease;
7486
- }
7487
-
7488
- .muka-progress--circle .muka-progress__label {
7489
- position: absolute;
7490
- font-family: var(--text-label-sm-semibold-fontFamily);
7491
- font-weight: var(--text-label-sm-semibold-fontWeight);
7492
- color: var(--color-text-default-default);
7493
- }
7494
-
7495
- .muka-progress--circle.muka-progress--sm .muka-progress__label {
7496
- font-size: var(--text-label-sm-semibold-fontSize);
7497
- }
7498
-
7499
- .muka-progress--circle.muka-progress--md .muka-progress__label {
7500
- font-size: var(--text-label-md-semibold-fontSize);
7501
- }
7502
-
7503
- .muka-progress--circle.muka-progress--lg .muka-progress__label {
7504
- font-size: var(--text-label-lg-semibold-fontSize);
7505
- }
7506
-
7507
- /* Indeterminate animation for circle */
7508
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7509
- animation: muka-progress-circle-rotate 2s linear infinite;
7510
- }
7511
-
7512
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7513
- animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7514
- }
7515
-
7516
- @keyframes muka-progress-circle-rotate {
7517
- 100% {
7518
- transform: rotate(270deg);
7519
- }
7520
- }
7521
-
7522
- @keyframes muka-progress-circle-dash {
7523
- 0% {
7524
- stroke-dashoffset: 220;
7525
- }
7526
- 50% {
7527
- stroke-dashoffset: 70;
7528
- }
7529
- 100% {
7530
- stroke-dashoffset: 220;
7531
- }
7532
- }
7533
-
7534
-
7535
- /* ProfileBadge */
7536
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7537
-
7538
- .muka-profile-badge {
7539
- display: inline-flex;
7540
- align-items: center;
7541
- font-family: var(--text-body-base-regular-fontFamily);
7542
- }
7543
-
7544
- /* Size variants */
7545
- .muka-profile-badge--lg {
7546
- gap: var(--spacing-4); /* 16px */
7547
- }
7548
-
7549
- .muka-profile-badge--md {
7550
- gap: var(--spacing-3); /* 12px */
7551
- }
7552
-
7553
- .muka-profile-badge__avatar {
7554
- flex-shrink: 0;
7401
+ .muka-profile-badge__avatar {
7402
+ flex-shrink: 0;
7555
7403
  }
7556
7404
 
7557
7405
  /* Text stack */
@@ -7956,6 +7804,178 @@ body {
7956
7804
  }
7957
7805
 
7958
7806
 
7807
+ /* Progress */
7808
+ /* Progress Component Styles - Using Muka Design Tokens */
7809
+
7810
+ /* ========================================
7811
+ BAR VARIANT
7812
+ ======================================== */
7813
+
7814
+ .muka-progress--bar {
7815
+ display: flex;
7816
+ align-items: center;
7817
+ gap: var(--spacing-2);
7818
+ width: 100%;
7819
+ }
7820
+
7821
+ .muka-progress--bar .muka-progress__track {
7822
+ flex: 1;
7823
+ background-color: var(--color-surface-level1);
7824
+ border-radius: var(--border-radius-full);
7825
+ overflow: hidden;
7826
+ }
7827
+
7828
+ .muka-progress--bar.muka-progress--sm .muka-progress__track {
7829
+ height: var(--progress-size-bar-height-sm);
7830
+ }
7831
+
7832
+ .muka-progress--bar.muka-progress--md .muka-progress__track {
7833
+ height: var(--progress-size-bar-height-md);
7834
+ }
7835
+
7836
+ .muka-progress--bar.muka-progress--lg .muka-progress__track {
7837
+ height: var(--progress-size-bar-height-lg);
7838
+ }
7839
+
7840
+ .muka-progress--bar .muka-progress__fill {
7841
+ height: 100%;
7842
+ background-color: var(--color-action-default);
7843
+ border-radius: var(--border-radius-full);
7844
+ transition: width 0.3s ease;
7845
+ }
7846
+
7847
+ .muka-progress--bar .muka-progress__label {
7848
+ flex-shrink: 0;
7849
+ font-family: var(--text-label-sm-semibold-fontFamily);
7850
+ font-weight: var(--text-label-sm-semibold-fontWeight);
7851
+ font-size: var(--text-label-sm-semibold-fontSize);
7852
+ line-height: var(--text-label-sm-semibold-lineHeight);
7853
+ color: var(--color-text-default-default);
7854
+ min-width: 3ch;
7855
+ text-align: right;
7856
+ }
7857
+
7858
+ /* Indeterminate animation for bar */
7859
+ .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7860
+ width: 40%;
7861
+ animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7862
+ }
7863
+
7864
+ @keyframes muka-progress-bar-indeterminate {
7865
+ 0% {
7866
+ transform: translateX(-100%);
7867
+ }
7868
+ 100% {
7869
+ transform: translateX(250%);
7870
+ }
7871
+ }
7872
+
7873
+ /* ========================================
7874
+ CIRCLE VARIANT
7875
+ ======================================== */
7876
+
7877
+ .muka-progress--circle {
7878
+ position: relative;
7879
+ display: inline-flex;
7880
+ align-items: center;
7881
+ justify-content: center;
7882
+ }
7883
+
7884
+ .muka-progress--circle.muka-progress--sm {
7885
+ width: var(--progress-size-circle-diameter-sm);
7886
+ height: var(--progress-size-circle-diameter-sm);
7887
+ }
7888
+
7889
+ .muka-progress--circle.muka-progress--md {
7890
+ width: var(--progress-size-circle-diameter-md);
7891
+ height: var(--progress-size-circle-diameter-md);
7892
+ }
7893
+
7894
+ .muka-progress--circle.muka-progress--lg {
7895
+ width: var(--progress-size-circle-diameter-lg);
7896
+ height: var(--progress-size-circle-diameter-lg);
7897
+ }
7898
+
7899
+ .muka-progress__circle {
7900
+ width: 100%;
7901
+ height: 100%;
7902
+ transform: rotate(-90deg);
7903
+ }
7904
+
7905
+ .muka-progress--circle .muka-progress__track {
7906
+ fill: none;
7907
+ stroke: var(--color-surface-level1);
7908
+ }
7909
+
7910
+ .muka-progress--circle.muka-progress--sm .muka-progress__track,
7911
+ .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7912
+ stroke-width: var(--progress-size-circle-strokeWidth-sm);
7913
+ }
7914
+
7915
+ .muka-progress--circle.muka-progress--md .muka-progress__track,
7916
+ .muka-progress--circle.muka-progress--md .muka-progress__fill {
7917
+ stroke-width: var(--progress-size-circle-strokeWidth-md);
7918
+ }
7919
+
7920
+ .muka-progress--circle.muka-progress--lg .muka-progress__track,
7921
+ .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7922
+ stroke-width: var(--progress-size-circle-strokeWidth-lg);
7923
+ }
7924
+
7925
+ .muka-progress--circle .muka-progress__fill {
7926
+ fill: none;
7927
+ stroke: var(--color-action-default);
7928
+ stroke-linecap: round;
7929
+ transition: stroke-dashoffset 0.3s ease;
7930
+ }
7931
+
7932
+ .muka-progress--circle .muka-progress__label {
7933
+ position: absolute;
7934
+ font-family: var(--text-label-sm-semibold-fontFamily);
7935
+ font-weight: var(--text-label-sm-semibold-fontWeight);
7936
+ color: var(--color-text-default-default);
7937
+ }
7938
+
7939
+ .muka-progress--circle.muka-progress--sm .muka-progress__label {
7940
+ font-size: var(--text-label-sm-semibold-fontSize);
7941
+ }
7942
+
7943
+ .muka-progress--circle.muka-progress--md .muka-progress__label {
7944
+ font-size: var(--text-label-md-semibold-fontSize);
7945
+ }
7946
+
7947
+ .muka-progress--circle.muka-progress--lg .muka-progress__label {
7948
+ font-size: var(--text-label-lg-semibold-fontSize);
7949
+ }
7950
+
7951
+ /* Indeterminate animation for circle */
7952
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7953
+ animation: muka-progress-circle-rotate 2s linear infinite;
7954
+ }
7955
+
7956
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7957
+ animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7958
+ }
7959
+
7960
+ @keyframes muka-progress-circle-rotate {
7961
+ 100% {
7962
+ transform: rotate(270deg);
7963
+ }
7964
+ }
7965
+
7966
+ @keyframes muka-progress-circle-dash {
7967
+ 0% {
7968
+ stroke-dashoffset: 220;
7969
+ }
7970
+ 50% {
7971
+ stroke-dashoffset: 70;
7972
+ }
7973
+ 100% {
7974
+ stroke-dashoffset: 220;
7975
+ }
7976
+ }
7977
+
7978
+
7959
7979
  /* PhotoDraftStrip */
7960
7980
  /* PhotoDraftStrip Component Styles */
7961
7981
 
@@ -8625,6 +8645,189 @@ body {
8625
8645
  }
8626
8646
 
8627
8647
 
8648
+ /* MediaViewer */
8649
+ /* MediaViewer Component Styles - Using Muka Design Tokens */
8650
+
8651
+ /* ─── Native dialog: full viewport ────────────────────── */
8652
+ .muka-media-viewer {
8653
+ position: fixed;
8654
+ inset: 0;
8655
+ width: 100%;
8656
+ height: 100%;
8657
+ max-width: none;
8658
+ max-height: none;
8659
+ margin: 0;
8660
+ padding: 0;
8661
+ border: none;
8662
+ display: flex;
8663
+ flex-direction: column;
8664
+ overflow: hidden;
8665
+ overscroll-behavior: contain;
8666
+ color: var(--color-text-default-default);
8667
+ background-color: var(--color-black-alpha-12);
8668
+ animation: muka-media-viewer-in var(--motion-duration-component) var(--motion-easing-enter);
8669
+ }
8670
+
8671
+ .muka-media-viewer:not([open]) {
8672
+ display: none;
8673
+ }
8674
+
8675
+ .muka-media-viewer::backdrop {
8676
+ background-color: var(--color-black-alpha-12);
8677
+ }
8678
+
8679
+ @keyframes muka-media-viewer-in {
8680
+ from {
8681
+ opacity: 0;
8682
+ }
8683
+ to {
8684
+ opacity: 1;
8685
+ }
8686
+ }
8687
+
8688
+ /* ─── Chrome: TopBar and footer sit on a surface ──────── */
8689
+ .muka-media-viewer__topbar {
8690
+ flex-shrink: 0;
8691
+ background-color: var(--color-surface-level3);
8692
+ }
8693
+
8694
+ .muka-media-viewer__live {
8695
+ position: absolute;
8696
+ width: 1px;
8697
+ height: 1px;
8698
+ padding: 0;
8699
+ margin: -1px;
8700
+ overflow: hidden;
8701
+ clip: rect(0, 0, 0, 0);
8702
+ white-space: nowrap;
8703
+ border: 0;
8704
+ }
8705
+
8706
+ /* ─── Stage: the dark area the images slide across ────── */
8707
+ .muka-media-viewer__stage {
8708
+ position: relative;
8709
+ flex: 1 1 auto;
8710
+ min-height: 0;
8711
+ overflow: hidden;
8712
+ /* Gestures are handled in JS: no browser panning or pinch on the stage. */
8713
+ touch-action: none;
8714
+ user-select: none;
8715
+ -webkit-user-select: none;
8716
+ }
8717
+
8718
+ .muka-media-viewer__slide {
8719
+ position: absolute;
8720
+ inset: 0;
8721
+ display: flex;
8722
+ align-items: center;
8723
+ justify-content: center;
8724
+ padding: var(--spacing-4);
8725
+ transition: transform var(--motion-duration-component) var(--motion-easing-default);
8726
+ will-change: transform;
8727
+ }
8728
+
8729
+ /* While a finger drags, the image follows it without easing. */
8730
+ .muka-media-viewer--dragging .muka-media-viewer__slide {
8731
+ transition: none;
8732
+ }
8733
+
8734
+ .muka-media-viewer__image {
8735
+ display: block;
8736
+ max-width: 100%;
8737
+ max-height: 100%;
8738
+ object-fit: contain;
8739
+ pointer-events: none;
8740
+ }
8741
+
8742
+ /* ─── Previous / next: devices that can hover ─────────── */
8743
+ .muka-media-viewer__nav {
8744
+ position: absolute;
8745
+ top: 50%;
8746
+ display: none;
8747
+ transform: translateY(-50%);
8748
+ opacity: 0;
8749
+ transition: opacity var(--motion-duration-micro) var(--motion-easing-enter);
8750
+ }
8751
+
8752
+ .muka-media-viewer__nav--previous {
8753
+ left: var(--spacing-4);
8754
+ }
8755
+
8756
+ .muka-media-viewer__nav--next {
8757
+ right: var(--spacing-4);
8758
+ }
8759
+
8760
+ @media (hover: hover) and (pointer: fine) {
8761
+ .muka-media-viewer__nav {
8762
+ display: block;
8763
+ }
8764
+
8765
+ .muka-media-viewer__stage:hover .muka-media-viewer__nav,
8766
+ .muka-media-viewer__nav:focus-within {
8767
+ opacity: 1;
8768
+ }
8769
+ }
8770
+
8771
+ /* ─── Footer: caption, meta and actions ───────────────── */
8772
+ .muka-media-viewer__footer {
8773
+ flex-shrink: 0;
8774
+ display: flex;
8775
+ flex-direction: column;
8776
+ gap: var(--spacing-3);
8777
+ padding: var(--spacing-4);
8778
+ padding-bottom: calc(var(--spacing-4) + env(safe-area-inset-bottom, 0px));
8779
+ background-color: var(--color-surface-level3);
8780
+ }
8781
+
8782
+ .muka-media-viewer__details {
8783
+ display: flex;
8784
+ align-items: flex-start;
8785
+ justify-content: space-between;
8786
+ gap: var(--spacing-3);
8787
+ }
8788
+
8789
+ .muka-media-viewer__caption {
8790
+ min-width: 0;
8791
+ color: var(--color-text-subtle-default);
8792
+ font-family: var(--text-body-sm-regular-fontFamily);
8793
+ font-size: var(--text-body-sm-regular-fontSize);
8794
+ font-weight: var(--text-body-sm-regular-fontWeight);
8795
+ line-height: var(--text-body-sm-regular-lineHeight);
8796
+ overflow-wrap: anywhere;
8797
+ }
8798
+
8799
+ .muka-media-viewer__meta {
8800
+ flex-shrink: 0;
8801
+ }
8802
+
8803
+ .muka-media-viewer__actions {
8804
+ display: flex;
8805
+ flex-wrap: wrap;
8806
+ gap: var(--spacing-2);
8807
+ }
8808
+
8809
+ /* Mobile: actions stack full width, like Dialog footers. */
8810
+ @media (max-width: 1023px) {
8811
+ .muka-media-viewer__actions {
8812
+ flex-direction: column;
8813
+ }
8814
+
8815
+ .muka-media-viewer__actions > * {
8816
+ width: 100%;
8817
+ }
8818
+ }
8819
+
8820
+ /* ─── Reduced motion ──────────────────────────────────── */
8821
+ @media (prefers-reduced-motion: reduce) {
8822
+ .muka-media-viewer,
8823
+ .muka-media-viewer__slide,
8824
+ .muka-media-viewer__nav {
8825
+ animation: none;
8826
+ transition: none;
8827
+ }
8828
+ }
8829
+
8830
+
8628
8831
  /* ListItem */
8629
8832
  /* ListItem Component Styles - Using Muka Design Tokens */
8630
8833
 
@@ -9426,6 +9629,9 @@ li.muka-listitem {
9426
9629
  flex-shrink: 0;
9427
9630
  width: var(--size-2xl, 2rem);
9428
9631
  height: var(--size-2xl, 2rem);
9632
+ /* Bleed into the field's vertical padding: keeps the full hit area without
9633
+ making a password or clearable field taller than a plain one. */
9634
+ margin-block: calc(var(--input-field-padding-y) * -1);
9429
9635
  padding: 0;
9430
9636
  border: none;
9431
9637
  background: transparent;
@@ -9433,6 +9639,24 @@ li.muka-listitem {
9433
9639
  cursor: pointer;
9434
9640
  }
9435
9641
 
9642
+ /* The outermost button bleeds into the right padding by the same amount, so
9643
+ its glyph sits as close to the edge as it does to the top and bottom. */
9644
+ .muka-input__clear:last-child,
9645
+ .muka-input__reveal:last-child {
9646
+ margin-inline-end: calc(var(--input-field-padding-y) * -1);
9647
+ }
9648
+
9649
+ /* md: match the right gap to the gap above and below the vertically centred
9650
+ button exactly, i.e. (field height − borders − button) / 2. Holds in the
9651
+ focus/error state too, where border and padding trade 1px. */
9652
+ .muka-input__field--md .muka-input__clear:last-child,
9653
+ .muka-input__field--md .muka-input__reveal:last-child {
9654
+ margin-inline-end: calc(
9655
+ (var(--input-field-height-default) - 2 * var(--border-width-regular) - var(--size-2xl, 2rem)) / 2
9656
+ - var(--input-field-padding-x)
9657
+ );
9658
+ }
9659
+
9436
9660
  .muka-input__field--sm .muka-input__clear,
9437
9661
  .muka-input__field--sm .muka-input__reveal {
9438
9662
  width: var(--size-xl, 1.5rem);
@@ -10862,6 +11086,7 @@ li.muka-listitem {
10862
11086
  height: 100%;
10863
11087
  max-width: 100vw;
10864
11088
  max-height: 100vh;
11089
+ max-height: 100dvh;
10865
11090
  margin: 0;
10866
11091
  display: flex;
10867
11092
  flex-direction: column;
@@ -10896,6 +11121,8 @@ li.muka-listitem {
10896
11121
 
10897
11122
  .muka-dialog--lg .muka-dialog__surface {
10898
11123
  height: calc(100vh - var(--dialog-margin-top-mobile));
11124
+ /* dvh tracks the visible area as mobile toolbars show and hide */
11125
+ height: calc(100dvh - var(--dialog-margin-top-mobile));
10899
11126
  }
10900
11127
 
10901
11128
  /* Body */
@@ -11641,7 +11868,10 @@ li.muka-listitem {
11641
11868
  fill: none;
11642
11869
  /* Subtle lift on the filled segment, matching the Figma elevation */
11643
11870
  filter: drop-shadow(0 2px 4px var(--color-black-alpha-5, rgba(0, 0, 0, 0.05)));
11644
- transition: stroke-dasharray 0.3s ease;
11871
+ /* Butt caps keep the always-rendered 0% arc invisible (round caps would draw a dot) */
11872
+ stroke-linecap: butt;
11873
+ /* view duration (300ms) reads at the 24px size; tokens zero it for reduced motion */
11874
+ transition: stroke-dasharray var(--motion-duration-view) var(--motion-easing-default);
11645
11875
  }
11646
11876
 
11647
11877
  /* ─── Indeterminate (spinner) ─────────────────────────── */
@@ -14630,7 +14860,8 @@ button.muka-chat-photo-grid__tile:focus-visible {
14630
14860
  align-items: center;
14631
14861
  justify-content: center;
14632
14862
  flex-shrink: 0;
14633
- overflow: hidden;
14863
+ /* No overflow clipping: the status dot sits on the edge. The image and the
14864
+ loading shimmer round themselves to the avatar shape instead. */
14634
14865
  user-select: none;
14635
14866
  vertical-align: middle;
14636
14867
  background-color: var(--avatar-color-background-default);
@@ -14703,9 +14934,10 @@ button.muka-chat-photo-grid__tile:focus-visible {
14703
14934
  border-radius: var(--avatar-radius-square-sm);
14704
14935
  }
14705
14936
 
14706
- /* 4xs is too small for initials, the fallback icon or a status dot:
14937
+ /* 4xs is too small for initials, an icon, the fallback icon or a status dot:
14707
14938
  it shows the picture, or the plain background */
14708
14939
  .muka-avatar--4xs .muka-avatar__initials,
14940
+ .muka-avatar--4xs .muka-avatar__icon,
14709
14941
  .muka-avatar--4xs .muka-avatar__fallback,
14710
14942
  .muka-avatar--4xs .muka-avatar__status {
14711
14943
  display: none;
@@ -14741,38 +14973,59 @@ button.muka-chat-photo-grid__tile:focus-visible {
14741
14973
  .muka-avatar__skeleton {
14742
14974
  position: absolute;
14743
14975
  inset: 0;
14976
+ border-radius: inherit;
14744
14977
  background: linear-gradient(
14745
14978
  90deg,
14746
14979
  transparent 0%,
14747
14980
  var(--color-surface-level1) 50%,
14748
14981
  transparent 100%
14749
- );
14982
+ ) no-repeat;
14983
+ background-size: 50% 100%;
14750
14984
  animation: avatar-loading 1.5s ease-in-out infinite;
14751
14985
  }
14752
14986
 
14987
+ /* The highlight sweeps by background position, so it stays inside the
14988
+ rounded shape without the avatar clipping its overflow */
14753
14989
  @keyframes avatar-loading {
14754
14990
  0% {
14755
- transform: translateX(-100%);
14991
+ background-position: -100% 0;
14756
14992
  }
14757
14993
  100% {
14758
- transform: translateX(100%);
14994
+ background-position: 200% 0;
14759
14995
  }
14760
14996
  }
14761
14997
 
14762
14998
  /* Avatar content */
14763
14999
  .muka-avatar__image {
15000
+ border-radius: inherit;
14764
15001
  width: 100%;
14765
15002
  height: 100%;
14766
15003
  object-fit: cover;
14767
15004
  display: block;
14768
15005
  }
14769
15006
 
15007
+ /* Icon slot: a fixed icon size per avatar size, in the initials colour
15008
+ (subtle text) */
14770
15009
  .muka-avatar__icon {
14771
- width: 60%;
14772
- height: 60%;
14773
15010
  display: flex;
14774
15011
  align-items: center;
14775
15012
  justify-content: center;
15013
+ color: var(--avatar-color-foreground-default);
15014
+ }
15015
+
15016
+ .muka-avatar--3xs .muka-avatar__icon { width: var(--avatar-icon-size-3xs); height: var(--avatar-icon-size-3xs); }
15017
+ .muka-avatar--2xs .muka-avatar__icon { width: var(--avatar-icon-size-2xs); height: var(--avatar-icon-size-2xs); }
15018
+ .muka-avatar--xs .muka-avatar__icon { width: var(--avatar-icon-size-xs); height: var(--avatar-icon-size-xs); }
15019
+ .muka-avatar--sm .muka-avatar__icon { width: var(--avatar-icon-size-sm); height: var(--avatar-icon-size-sm); }
15020
+ .muka-avatar--md .muka-avatar__icon { width: var(--avatar-icon-size-md); height: var(--avatar-icon-size-md); }
15021
+ .muka-avatar--lg .muka-avatar__icon { width: var(--avatar-icon-size-lg); height: var(--avatar-icon-size-lg); }
15022
+ .muka-avatar--xl .muka-avatar__icon { width: var(--avatar-icon-size-xl); height: var(--avatar-icon-size-xl); }
15023
+
15024
+ /* A Muka Icon fills the slot and takes its colour (its own `color` prop still wins) */
15025
+ .muka-avatar__icon .muka-icon {
15026
+ width: 100%;
15027
+ height: 100%;
15028
+ color: inherit;
14776
15029
  }
14777
15030
 
14778
15031
  .muka-avatar__icon svg {