@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
@@ -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
 
@@ -2020,9 +2022,16 @@ body {
2020
2022
  --avatar-size-md: 4rem;
2021
2023
  --avatar-size-lg: 5rem;
2022
2024
  --avatar-size-xl: 7rem;
2025
+ --avatar-icon-size-3xs: 1rem;
2026
+ --avatar-icon-size-2xs: 1.25rem;
2027
+ --avatar-icon-size-xs: 1.5rem;
2028
+ --avatar-icon-size-sm: 2rem;
2029
+ --avatar-icon-size-md: 2.5rem;
2030
+ --avatar-icon-size-lg: 3rem;
2031
+ --avatar-icon-size-xl: 4rem;
2023
2032
  --avatar-color-background-default: #2a2a2a;
2024
2033
  --avatar-color-background-loading: #313131;
2025
- --avatar-color-foreground-default: #eeeeee;
2034
+ --avatar-color-foreground-default: #7b7b7b;
2026
2035
  --avatar-color-foreground-muted: #606060;
2027
2036
  --avatar-color-status-online: #30a46c;
2028
2037
  --avatar-color-status-offline: #606060;
@@ -3672,6 +3681,17 @@ body {
3672
3681
  height: 120px;
3673
3682
  }
3674
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
+
3675
3695
  .muka-thumbnail--ellipse .muka-thumbnail__frame {
3676
3696
  border-radius: var(--border-radius-full);
3677
3697
  }
@@ -4598,6 +4618,114 @@ body {
4598
4618
  }
4599
4619
 
4600
4620
 
4621
+ /* SwipeActions */
4622
+ /* SwipeActions Component Styles */
4623
+
4624
+ .muka-swipe-actions {
4625
+ position: relative;
4626
+ overflow: hidden;
4627
+ touch-action: pan-y;
4628
+ -webkit-user-select: none;
4629
+ user-select: none;
4630
+ background-color: var(--color-surface-level3);
4631
+ }
4632
+
4633
+ .muka-swipe-actions--disabled {
4634
+ touch-action: auto;
4635
+ }
4636
+
4637
+ /* ─── Row that holds the actual content ────────────────── */
4638
+
4639
+ .muka-swipe-actions__row {
4640
+ position: relative;
4641
+ z-index: 1;
4642
+ background-color: inherit;
4643
+ will-change: transform;
4644
+ }
4645
+
4646
+ /* ─── Action panels — sit beneath the row ──────────────── */
4647
+
4648
+ .muka-swipe-actions__panel {
4649
+ position: absolute;
4650
+ top: 0;
4651
+ bottom: 0;
4652
+ display: flex;
4653
+ align-items: stretch;
4654
+ z-index: 0;
4655
+ }
4656
+
4657
+ .muka-swipe-actions__panel--left {
4658
+ left: 0;
4659
+ }
4660
+
4661
+ .muka-swipe-actions__panel--right {
4662
+ right: 0;
4663
+ }
4664
+
4665
+ /* ─── Single action button ─────────────────────────────── */
4666
+
4667
+ .muka-swipe-actions__button {
4668
+ display: flex;
4669
+ flex-direction: column;
4670
+ align-items: center;
4671
+ justify-content: center;
4672
+ gap: var(--spacing-1);
4673
+ border: none;
4674
+ cursor: pointer;
4675
+ padding: var(--spacing-2);
4676
+ background-color: var(--color-surface-level2);
4677
+ color: var(--color-text-default-default);
4678
+ font-family: var(--text-label-sm-semibold-fontFamily);
4679
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4680
+ font-size: var(--text-label-sm-semibold-fontSize);
4681
+ line-height: var(--text-label-sm-semibold-lineHeight);
4682
+ -webkit-tap-highlight-color: transparent;
4683
+ transition: filter 0.12s ease;
4684
+ }
4685
+
4686
+ .muka-swipe-actions__button:hover {
4687
+ filter: brightness(0.95);
4688
+ }
4689
+
4690
+ .muka-swipe-actions__button:focus-visible {
4691
+ outline: 2px solid var(--color-action-default);
4692
+ outline-offset: -2px;
4693
+ }
4694
+
4695
+ .muka-swipe-actions__button-icon {
4696
+ display: inline-flex;
4697
+ align-items: center;
4698
+ justify-content: center;
4699
+ }
4700
+
4701
+ /* ─── Color variants ───────────────────────────────────── */
4702
+
4703
+ .muka-swipe-actions__button--neutral {
4704
+ background-color: var(--color-surface-level2);
4705
+ color: var(--color-text-default-default);
4706
+ }
4707
+
4708
+ .muka-swipe-actions__button--primary {
4709
+ background-color: var(--color-action-default);
4710
+ color: var(--color-text-default-inverse);
4711
+ }
4712
+
4713
+ .muka-swipe-actions__button--success {
4714
+ background-color: var(--color-state-success-default);
4715
+ color: var(--color-text-default-inverse);
4716
+ }
4717
+
4718
+ .muka-swipe-actions__button--warning {
4719
+ background-color: var(--color-state-warning-default);
4720
+ color: var(--color-text-default-default);
4721
+ }
4722
+
4723
+ .muka-swipe-actions__button--destructive {
4724
+ background-color: var(--color-state-error-default);
4725
+ color: var(--color-text-default-inverse);
4726
+ }
4727
+
4728
+
4601
4729
  /* Spinner */
4602
4730
  /* Spinner Component Styles */
4603
4731
 
@@ -4761,114 +4889,6 @@ body {
4761
4889
  }
4762
4890
 
4763
4891
 
4764
- /* SwipeActions */
4765
- /* SwipeActions Component Styles */
4766
-
4767
- .muka-swipe-actions {
4768
- position: relative;
4769
- overflow: hidden;
4770
- touch-action: pan-y;
4771
- -webkit-user-select: none;
4772
- user-select: none;
4773
- background-color: var(--color-surface-level3);
4774
- }
4775
-
4776
- .muka-swipe-actions--disabled {
4777
- touch-action: auto;
4778
- }
4779
-
4780
- /* ─── Row that holds the actual content ────────────────── */
4781
-
4782
- .muka-swipe-actions__row {
4783
- position: relative;
4784
- z-index: 1;
4785
- background-color: inherit;
4786
- will-change: transform;
4787
- }
4788
-
4789
- /* ─── Action panels — sit beneath the row ──────────────── */
4790
-
4791
- .muka-swipe-actions__panel {
4792
- position: absolute;
4793
- top: 0;
4794
- bottom: 0;
4795
- display: flex;
4796
- align-items: stretch;
4797
- z-index: 0;
4798
- }
4799
-
4800
- .muka-swipe-actions__panel--left {
4801
- left: 0;
4802
- }
4803
-
4804
- .muka-swipe-actions__panel--right {
4805
- right: 0;
4806
- }
4807
-
4808
- /* ─── Single action button ─────────────────────────────── */
4809
-
4810
- .muka-swipe-actions__button {
4811
- display: flex;
4812
- flex-direction: column;
4813
- align-items: center;
4814
- justify-content: center;
4815
- gap: var(--spacing-1);
4816
- border: none;
4817
- cursor: pointer;
4818
- padding: var(--spacing-2);
4819
- background-color: var(--color-surface-level2);
4820
- color: var(--color-text-default-default);
4821
- font-family: var(--text-label-sm-semibold-fontFamily);
4822
- font-weight: var(--text-label-sm-semibold-fontWeight);
4823
- font-size: var(--text-label-sm-semibold-fontSize);
4824
- line-height: var(--text-label-sm-semibold-lineHeight);
4825
- -webkit-tap-highlight-color: transparent;
4826
- transition: filter 0.12s ease;
4827
- }
4828
-
4829
- .muka-swipe-actions__button:hover {
4830
- filter: brightness(0.95);
4831
- }
4832
-
4833
- .muka-swipe-actions__button:focus-visible {
4834
- outline: 2px solid var(--color-action-default);
4835
- outline-offset: -2px;
4836
- }
4837
-
4838
- .muka-swipe-actions__button-icon {
4839
- display: inline-flex;
4840
- align-items: center;
4841
- justify-content: center;
4842
- }
4843
-
4844
- /* ─── Color variants ───────────────────────────────────── */
4845
-
4846
- .muka-swipe-actions__button--neutral {
4847
- background-color: var(--color-surface-level2);
4848
- color: var(--color-text-default-default);
4849
- }
4850
-
4851
- .muka-swipe-actions__button--primary {
4852
- background-color: var(--color-action-default);
4853
- color: var(--color-text-default-inverse);
4854
- }
4855
-
4856
- .muka-swipe-actions__button--success {
4857
- background-color: var(--color-state-success-default);
4858
- color: var(--color-text-default-inverse);
4859
- }
4860
-
4861
- .muka-swipe-actions__button--warning {
4862
- background-color: var(--color-state-warning-default);
4863
- color: var(--color-text-default-default);
4864
- }
4865
-
4866
- .muka-swipe-actions__button--destructive {
4867
- background-color: var(--color-state-error-default);
4868
- color: var(--color-text-default-inverse);
4869
- }
4870
-
4871
-
4872
4892
  /* SocialSignInButton */
4873
4893
  /*
4874
4894
  * SocialSignInButton lockup colors are provider-mandated (Apple HIG /
@@ -7328,198 +7348,26 @@ body {
7328
7348
  }
7329
7349
 
7330
7350
 
7331
- /* Progress */
7332
- /* Progress Component Styles - Using Muka Design Tokens */
7333
-
7334
- /* ========================================
7335
- BAR VARIANT
7336
- ======================================== */
7351
+ /* ProfileBadge */
7352
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7337
7353
 
7338
- .muka-progress--bar {
7339
- display: flex;
7354
+ .muka-profile-badge {
7355
+ display: inline-flex;
7340
7356
  align-items: center;
7341
- gap: var(--spacing-2);
7342
- width: 100%;
7357
+ font-family: var(--text-body-base-regular-fontFamily);
7343
7358
  }
7344
7359
 
7345
- .muka-progress--bar .muka-progress__track {
7346
- flex: 1;
7347
- background-color: var(--color-surface-level1);
7348
- border-radius: var(--border-radius-full);
7349
- overflow: hidden;
7360
+ /* Size variants */
7361
+ .muka-profile-badge--lg {
7362
+ gap: var(--spacing-4); /* 16px */
7350
7363
  }
7351
7364
 
7352
- .muka-progress--bar.muka-progress--sm .muka-progress__track {
7353
- height: var(--progress-size-bar-height-sm);
7365
+ .muka-profile-badge--md {
7366
+ gap: var(--spacing-3); /* 12px */
7354
7367
  }
7355
7368
 
7356
- .muka-progress--bar.muka-progress--md .muka-progress__track {
7357
- height: var(--progress-size-bar-height-md);
7358
- }
7359
-
7360
- .muka-progress--bar.muka-progress--lg .muka-progress__track {
7361
- height: var(--progress-size-bar-height-lg);
7362
- }
7363
-
7364
- .muka-progress--bar .muka-progress__fill {
7365
- height: 100%;
7366
- background-color: var(--color-action-default);
7367
- border-radius: var(--border-radius-full);
7368
- transition: width 0.3s ease;
7369
- }
7370
-
7371
- .muka-progress--bar .muka-progress__label {
7372
- flex-shrink: 0;
7373
- font-family: var(--text-label-sm-semibold-fontFamily);
7374
- font-weight: var(--text-label-sm-semibold-fontWeight);
7375
- font-size: var(--text-label-sm-semibold-fontSize);
7376
- line-height: var(--text-label-sm-semibold-lineHeight);
7377
- color: var(--color-text-default-default);
7378
- min-width: 3ch;
7379
- text-align: right;
7380
- }
7381
-
7382
- /* Indeterminate animation for bar */
7383
- .muka-progress--bar.muka-progress--indeterminate .muka-progress__fill {
7384
- width: 40%;
7385
- animation: muka-progress-bar-indeterminate 1.5s ease-in-out infinite;
7386
- }
7387
-
7388
- @keyframes muka-progress-bar-indeterminate {
7389
- 0% {
7390
- transform: translateX(-100%);
7391
- }
7392
- 100% {
7393
- transform: translateX(250%);
7394
- }
7395
- }
7396
-
7397
- /* ========================================
7398
- CIRCLE VARIANT
7399
- ======================================== */
7400
-
7401
- .muka-progress--circle {
7402
- position: relative;
7403
- display: inline-flex;
7404
- align-items: center;
7405
- justify-content: center;
7406
- }
7407
-
7408
- .muka-progress--circle.muka-progress--sm {
7409
- width: var(--progress-size-circle-diameter-sm);
7410
- height: var(--progress-size-circle-diameter-sm);
7411
- }
7412
-
7413
- .muka-progress--circle.muka-progress--md {
7414
- width: var(--progress-size-circle-diameter-md);
7415
- height: var(--progress-size-circle-diameter-md);
7416
- }
7417
-
7418
- .muka-progress--circle.muka-progress--lg {
7419
- width: var(--progress-size-circle-diameter-lg);
7420
- height: var(--progress-size-circle-diameter-lg);
7421
- }
7422
-
7423
- .muka-progress__circle {
7424
- width: 100%;
7425
- height: 100%;
7426
- transform: rotate(-90deg);
7427
- }
7428
-
7429
- .muka-progress--circle .muka-progress__track {
7430
- fill: none;
7431
- stroke: var(--color-surface-level1);
7432
- }
7433
-
7434
- .muka-progress--circle.muka-progress--sm .muka-progress__track,
7435
- .muka-progress--circle.muka-progress--sm .muka-progress__fill {
7436
- stroke-width: var(--progress-size-circle-strokeWidth-sm);
7437
- }
7438
-
7439
- .muka-progress--circle.muka-progress--md .muka-progress__track,
7440
- .muka-progress--circle.muka-progress--md .muka-progress__fill {
7441
- stroke-width: var(--progress-size-circle-strokeWidth-md);
7442
- }
7443
-
7444
- .muka-progress--circle.muka-progress--lg .muka-progress__track,
7445
- .muka-progress--circle.muka-progress--lg .muka-progress__fill {
7446
- stroke-width: var(--progress-size-circle-strokeWidth-lg);
7447
- }
7448
-
7449
- .muka-progress--circle .muka-progress__fill {
7450
- fill: none;
7451
- stroke: var(--color-action-default);
7452
- stroke-linecap: round;
7453
- transition: stroke-dashoffset 0.3s ease;
7454
- }
7455
-
7456
- .muka-progress--circle .muka-progress__label {
7457
- position: absolute;
7458
- font-family: var(--text-label-sm-semibold-fontFamily);
7459
- font-weight: var(--text-label-sm-semibold-fontWeight);
7460
- color: var(--color-text-default-default);
7461
- }
7462
-
7463
- .muka-progress--circle.muka-progress--sm .muka-progress__label {
7464
- font-size: var(--text-label-sm-semibold-fontSize);
7465
- }
7466
-
7467
- .muka-progress--circle.muka-progress--md .muka-progress__label {
7468
- font-size: var(--text-label-md-semibold-fontSize);
7469
- }
7470
-
7471
- .muka-progress--circle.muka-progress--lg .muka-progress__label {
7472
- font-size: var(--text-label-lg-semibold-fontSize);
7473
- }
7474
-
7475
- /* Indeterminate animation for circle */
7476
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7477
- animation: muka-progress-circle-rotate 2s linear infinite;
7478
- }
7479
-
7480
- .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7481
- animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7482
- }
7483
-
7484
- @keyframes muka-progress-circle-rotate {
7485
- 100% {
7486
- transform: rotate(270deg);
7487
- }
7488
- }
7489
-
7490
- @keyframes muka-progress-circle-dash {
7491
- 0% {
7492
- stroke-dashoffset: 220;
7493
- }
7494
- 50% {
7495
- stroke-dashoffset: 70;
7496
- }
7497
- 100% {
7498
- stroke-dashoffset: 220;
7499
- }
7500
- }
7501
-
7502
-
7503
- /* ProfileBadge */
7504
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7505
-
7506
- .muka-profile-badge {
7507
- display: inline-flex;
7508
- align-items: center;
7509
- font-family: var(--text-body-base-regular-fontFamily);
7510
- }
7511
-
7512
- /* Size variants */
7513
- .muka-profile-badge--lg {
7514
- gap: var(--spacing-4); /* 16px */
7515
- }
7516
-
7517
- .muka-profile-badge--md {
7518
- gap: var(--spacing-3); /* 12px */
7519
- }
7520
-
7521
- .muka-profile-badge__avatar {
7522
- flex-shrink: 0;
7369
+ .muka-profile-badge__avatar {
7370
+ flex-shrink: 0;
7523
7371
  }
7524
7372
 
7525
7373
  /* Text stack */
@@ -7924,6 +7772,178 @@ body {
7924
7772
  }
7925
7773
 
7926
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);
7917
+ }
7918
+
7919
+ /* Indeterminate animation for circle */
7920
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__circle {
7921
+ animation: muka-progress-circle-rotate 2s linear infinite;
7922
+ }
7923
+
7924
+ .muka-progress--circle.muka-progress--indeterminate .muka-progress__fill {
7925
+ animation: muka-progress-circle-dash 1.5s ease-in-out infinite;
7926
+ }
7927
+
7928
+ @keyframes muka-progress-circle-rotate {
7929
+ 100% {
7930
+ transform: rotate(270deg);
7931
+ }
7932
+ }
7933
+
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
+ }
7944
+ }
7945
+
7946
+
7927
7947
  /* PhotoDraftStrip */
7928
7948
  /* PhotoDraftStrip Component Styles */
7929
7949
 
@@ -8593,6 +8613,189 @@ body {
8593
8613
  }
8594
8614
 
8595
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
+
8596
8799
  /* ListItem */
8597
8800
  /* ListItem Component Styles - Using Muka Design Tokens */
8598
8801
 
@@ -9394,6 +9597,9 @@ li.muka-listitem {
9394
9597
  flex-shrink: 0;
9395
9598
  width: var(--size-2xl, 2rem);
9396
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);
9397
9603
  padding: 0;
9398
9604
  border: none;
9399
9605
  background: transparent;
@@ -9401,6 +9607,24 @@ li.muka-listitem {
9401
9607
  cursor: pointer;
9402
9608
  }
9403
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
+
9404
9628
  .muka-input__field--sm .muka-input__clear,
9405
9629
  .muka-input__field--sm .muka-input__reveal {
9406
9630
  width: var(--size-xl, 1.5rem);
@@ -10830,6 +11054,7 @@ li.muka-listitem {
10830
11054
  height: 100%;
10831
11055
  max-width: 100vw;
10832
11056
  max-height: 100vh;
11057
+ max-height: 100dvh;
10833
11058
  margin: 0;
10834
11059
  display: flex;
10835
11060
  flex-direction: column;
@@ -10864,6 +11089,8 @@ li.muka-listitem {
10864
11089
 
10865
11090
  .muka-dialog--lg .muka-dialog__surface {
10866
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));
10867
11094
  }
10868
11095
 
10869
11096
  /* Body */
@@ -11609,7 +11836,10 @@ li.muka-listitem {
11609
11836
  fill: none;
11610
11837
  /* Subtle lift on the filled segment, matching the Figma elevation */
11611
11838
  filter: drop-shadow(0 2px 4px var(--color-black-alpha-5, rgba(0, 0, 0, 0.05)));
11612
- 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);
11613
11843
  }
11614
11844
 
11615
11845
  /* ─── Indeterminate (spinner) ─────────────────────────── */
@@ -14598,7 +14828,8 @@ button.muka-chat-photo-grid__tile:focus-visible {
14598
14828
  align-items: center;
14599
14829
  justify-content: center;
14600
14830
  flex-shrink: 0;
14601
- overflow: hidden;
14831
+ /* No overflow clipping: the status dot sits on the edge. The image and the
14832
+ loading shimmer round themselves to the avatar shape instead. */
14602
14833
  user-select: none;
14603
14834
  vertical-align: middle;
14604
14835
  background-color: var(--avatar-color-background-default);
@@ -14671,9 +14902,10 @@ button.muka-chat-photo-grid__tile:focus-visible {
14671
14902
  border-radius: var(--avatar-radius-square-sm);
14672
14903
  }
14673
14904
 
14674
- /* 4xs is too small for initials, the fallback icon or a status dot:
14905
+ /* 4xs is too small for initials, an icon, the fallback icon or a status dot:
14675
14906
  it shows the picture, or the plain background */
14676
14907
  .muka-avatar--4xs .muka-avatar__initials,
14908
+ .muka-avatar--4xs .muka-avatar__icon,
14677
14909
  .muka-avatar--4xs .muka-avatar__fallback,
14678
14910
  .muka-avatar--4xs .muka-avatar__status {
14679
14911
  display: none;
@@ -14709,38 +14941,59 @@ button.muka-chat-photo-grid__tile:focus-visible {
14709
14941
  .muka-avatar__skeleton {
14710
14942
  position: absolute;
14711
14943
  inset: 0;
14944
+ border-radius: inherit;
14712
14945
  background: linear-gradient(
14713
14946
  90deg,
14714
14947
  transparent 0%,
14715
14948
  var(--color-surface-level1) 50%,
14716
14949
  transparent 100%
14717
- );
14950
+ ) no-repeat;
14951
+ background-size: 50% 100%;
14718
14952
  animation: avatar-loading 1.5s ease-in-out infinite;
14719
14953
  }
14720
14954
 
14955
+ /* The highlight sweeps by background position, so it stays inside the
14956
+ rounded shape without the avatar clipping its overflow */
14721
14957
  @keyframes avatar-loading {
14722
14958
  0% {
14723
- transform: translateX(-100%);
14959
+ background-position: -100% 0;
14724
14960
  }
14725
14961
  100% {
14726
- transform: translateX(100%);
14962
+ background-position: 200% 0;
14727
14963
  }
14728
14964
  }
14729
14965
 
14730
14966
  /* Avatar content */
14731
14967
  .muka-avatar__image {
14968
+ border-radius: inherit;
14732
14969
  width: 100%;
14733
14970
  height: 100%;
14734
14971
  object-fit: cover;
14735
14972
  display: block;
14736
14973
  }
14737
14974
 
14975
+ /* Icon slot: a fixed icon size per avatar size, in the initials colour
14976
+ (subtle text) */
14738
14977
  .muka-avatar__icon {
14739
- width: 60%;
14740
- height: 60%;
14741
14978
  display: flex;
14742
14979
  align-items: center;
14743
14980
  justify-content: center;
14981
+ color: var(--avatar-color-foreground-default);
14982
+ }
14983
+
14984
+ .muka-avatar--3xs .muka-avatar__icon { width: var(--avatar-icon-size-3xs); height: var(--avatar-icon-size-3xs); }
14985
+ .muka-avatar--2xs .muka-avatar__icon { width: var(--avatar-icon-size-2xs); height: var(--avatar-icon-size-2xs); }
14986
+ .muka-avatar--xs .muka-avatar__icon { width: var(--avatar-icon-size-xs); height: var(--avatar-icon-size-xs); }
14987
+ .muka-avatar--sm .muka-avatar__icon { width: var(--avatar-icon-size-sm); height: var(--avatar-icon-size-sm); }
14988
+ .muka-avatar--md .muka-avatar__icon { width: var(--avatar-icon-size-md); height: var(--avatar-icon-size-md); }
14989
+ .muka-avatar--lg .muka-avatar__icon { width: var(--avatar-icon-size-lg); height: var(--avatar-icon-size-lg); }
14990
+ .muka-avatar--xl .muka-avatar__icon { width: var(--avatar-icon-size-xl); height: var(--avatar-icon-size-xl); }
14991
+
14992
+ /* A Muka Icon fills the slot and takes its colour (its own `color` prop still wins) */
14993
+ .muka-avatar__icon .muka-icon {
14994
+ width: 100%;
14995
+ height: 100%;
14996
+ color: inherit;
14744
14997
  }
14745
14998
 
14746
14999
  .muka-avatar__icon svg {