@revikornmann/muka-ui 0.15.0 → 0.17.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 (167) hide show
  1. package/build/manifest.json +10 -0
  2. package/dist/cjs/components/BottomBar/BottomBar.css +19 -4
  3. package/dist/cjs/components/ChatComposer/ChatComposer.js +12 -4
  4. package/dist/cjs/components/ChatComposer/ChatComposer.js.map +1 -1
  5. package/dist/cjs/components/ChatMessage/ChatMessage.css +7 -1
  6. package/dist/cjs/components/ChatMessage/ChatMessage.js.map +1 -1
  7. package/dist/cjs/components/ChatMessageList/ChatMessageList.css +1 -1
  8. package/dist/cjs/components/Combobox/Combobox.css +59 -1
  9. package/dist/cjs/components/Combobox/Combobox.js +22 -3
  10. package/dist/cjs/components/Combobox/Combobox.js.map +1 -1
  11. package/dist/cjs/components/EmojiPicker/EmojiPicker.css +19 -0
  12. package/dist/cjs/components/EmojiPicker/EmojiPicker.js +54 -0
  13. package/dist/cjs/components/EmojiPicker/EmojiPicker.js.map +1 -0
  14. package/dist/cjs/components/EmojiPicker/index.js +12 -0
  15. package/dist/cjs/components/EmojiPicker/index.js.map +1 -0
  16. package/dist/cjs/components/PhotoDraftStrip/PhotoDraftStrip.css +27 -0
  17. package/dist/cjs/components/PhotoDraftStrip/PhotoDraftStrip.js +36 -0
  18. package/dist/cjs/components/PhotoDraftStrip/PhotoDraftStrip.js.map +1 -0
  19. package/dist/cjs/components/PhotoDraftStrip/index.js +11 -0
  20. package/dist/cjs/components/PhotoDraftStrip/index.js.map +1 -0
  21. package/dist/cjs/components/RecordingBar/RecordingBar.css +47 -0
  22. package/dist/cjs/components/RecordingBar/RecordingBar.js +22 -0
  23. package/dist/cjs/components/RecordingBar/RecordingBar.js.map +1 -0
  24. package/dist/cjs/components/RecordingBar/index.js +11 -0
  25. package/dist/cjs/components/RecordingBar/index.js.map +1 -0
  26. package/dist/cjs/components/SearchInput/SearchInput.js +7 -2
  27. package/dist/cjs/components/SearchInput/SearchInput.js.map +1 -1
  28. package/dist/cjs/components/TextLink/TextLink.css +79 -0
  29. package/dist/cjs/components/TextLink/TextLink.js +28 -0
  30. package/dist/cjs/components/TextLink/TextLink.js.map +1 -0
  31. package/dist/cjs/components/TextLink/index.js +11 -0
  32. package/dist/cjs/components/TextLink/index.js.map +1 -0
  33. package/dist/cjs/components/VoiceMessage/VoiceMessage.css +29 -0
  34. package/dist/cjs/components/VoiceMessage/VoiceMessage.js +85 -0
  35. package/dist/cjs/components/VoiceMessage/VoiceMessage.js.map +1 -0
  36. package/dist/cjs/components/VoiceMessage/index.js +11 -0
  37. package/dist/cjs/components/VoiceMessage/index.js.map +1 -0
  38. package/dist/cjs/components/VoiceRecorder/audio.js +61 -0
  39. package/dist/cjs/components/VoiceRecorder/audio.js.map +1 -0
  40. package/dist/cjs/components/VoiceRecorder/index.js +16 -0
  41. package/dist/cjs/components/VoiceRecorder/index.js.map +1 -0
  42. package/dist/cjs/components/VoiceRecorder/useVoiceRecorder.js +213 -0
  43. package/dist/cjs/components/VoiceRecorder/useVoiceRecorder.js.map +1 -0
  44. package/dist/cjs/components/Waveform/Waveform.css +23 -0
  45. package/dist/cjs/components/Waveform/Waveform.js +36 -0
  46. package/dist/cjs/components/Waveform/Waveform.js.map +1 -0
  47. package/dist/cjs/components/Waveform/index.js +11 -0
  48. package/dist/cjs/components/Waveform/index.js.map +1 -0
  49. package/dist/cjs/components/index.js +20 -1
  50. package/dist/cjs/components/index.js.map +1 -1
  51. package/dist/esm/components/BottomBar/BottomBar.css +19 -4
  52. package/dist/esm/components/ChatComposer/ChatComposer.js +12 -4
  53. package/dist/esm/components/ChatComposer/ChatComposer.js.map +1 -1
  54. package/dist/esm/components/ChatMessage/ChatMessage.css +7 -1
  55. package/dist/esm/components/ChatMessage/ChatMessage.js.map +1 -1
  56. package/dist/esm/components/ChatMessageList/ChatMessageList.css +1 -1
  57. package/dist/esm/components/Combobox/Combobox.css +59 -1
  58. package/dist/esm/components/Combobox/Combobox.js +23 -4
  59. package/dist/esm/components/Combobox/Combobox.js.map +1 -1
  60. package/dist/esm/components/EmojiPicker/EmojiPicker.css +19 -0
  61. package/dist/esm/components/EmojiPicker/EmojiPicker.js +50 -0
  62. package/dist/esm/components/EmojiPicker/EmojiPicker.js.map +1 -0
  63. package/dist/esm/components/EmojiPicker/index.js +3 -0
  64. package/dist/esm/components/EmojiPicker/index.js.map +1 -0
  65. package/dist/esm/components/PhotoDraftStrip/PhotoDraftStrip.css +27 -0
  66. package/dist/esm/components/PhotoDraftStrip/PhotoDraftStrip.js +32 -0
  67. package/dist/esm/components/PhotoDraftStrip/PhotoDraftStrip.js.map +1 -0
  68. package/dist/esm/components/PhotoDraftStrip/index.js +3 -0
  69. package/dist/esm/components/PhotoDraftStrip/index.js.map +1 -0
  70. package/dist/esm/components/RecordingBar/RecordingBar.css +47 -0
  71. package/dist/esm/components/RecordingBar/RecordingBar.js +18 -0
  72. package/dist/esm/components/RecordingBar/RecordingBar.js.map +1 -0
  73. package/dist/esm/components/RecordingBar/index.js +3 -0
  74. package/dist/esm/components/RecordingBar/index.js.map +1 -0
  75. package/dist/esm/components/SearchInput/SearchInput.js +7 -2
  76. package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
  77. package/dist/esm/components/TextLink/TextLink.css +79 -0
  78. package/dist/esm/components/TextLink/TextLink.js +24 -0
  79. package/dist/esm/components/TextLink/TextLink.js.map +1 -0
  80. package/dist/esm/components/TextLink/index.js +3 -0
  81. package/dist/esm/components/TextLink/index.js.map +1 -0
  82. package/dist/esm/components/VoiceMessage/VoiceMessage.css +29 -0
  83. package/dist/esm/components/VoiceMessage/VoiceMessage.js +81 -0
  84. package/dist/esm/components/VoiceMessage/VoiceMessage.js.map +1 -0
  85. package/dist/esm/components/VoiceMessage/index.js +3 -0
  86. package/dist/esm/components/VoiceMessage/index.js.map +1 -0
  87. package/dist/esm/components/VoiceRecorder/audio.js +55 -0
  88. package/dist/esm/components/VoiceRecorder/audio.js.map +1 -0
  89. package/dist/esm/components/VoiceRecorder/index.js +4 -0
  90. package/dist/esm/components/VoiceRecorder/index.js.map +1 -0
  91. package/dist/esm/components/VoiceRecorder/useVoiceRecorder.js +210 -0
  92. package/dist/esm/components/VoiceRecorder/useVoiceRecorder.js.map +1 -0
  93. package/dist/esm/components/Waveform/Waveform.css +23 -0
  94. package/dist/esm/components/Waveform/Waveform.js +32 -0
  95. package/dist/esm/components/Waveform/Waveform.js.map +1 -0
  96. package/dist/esm/components/Waveform/index.js +3 -0
  97. package/dist/esm/components/Waveform/index.js.map +1 -0
  98. package/dist/esm/components/index.js +7 -0
  99. package/dist/esm/components/index.js.map +1 -1
  100. package/dist/styles/components/BottomBar.css +19 -4
  101. package/dist/styles/components/ChatMessage.css +7 -1
  102. package/dist/styles/components/ChatMessageList.css +1 -1
  103. package/dist/styles/components/Combobox.css +59 -1
  104. package/dist/styles/components/EmojiPicker.css +19 -0
  105. package/dist/styles/components/PhotoDraftStrip.css +27 -0
  106. package/dist/styles/components/RecordingBar.css +47 -0
  107. package/dist/styles/components/TextLink.css +79 -0
  108. package/dist/styles/components/VoiceMessage.css +29 -0
  109. package/dist/styles/components/Waveform.css +23 -0
  110. package/dist/styles/index.css +373 -50
  111. package/dist/styles/muka-dark.css +373 -50
  112. package/dist/styles/muka-light.css +373 -50
  113. package/dist/styles/tokens-bouwplan-dark.css +4 -2
  114. package/dist/styles/tokens-bouwplan-light.css +4 -2
  115. package/dist/styles/tokens-fscl-dark.css +4 -2
  116. package/dist/styles/tokens-fscl-light.css +4 -2
  117. package/dist/styles/tokens-grip-dark.css +4 -2
  118. package/dist/styles/tokens-grip-light.css +4 -2
  119. package/dist/styles/tokens-muka-dark.css +4 -2
  120. package/dist/styles/tokens-muka-light.css +4 -2
  121. package/dist/styles/tokens-wireframe-dark.css +4 -2
  122. package/dist/styles/tokens-wireframe-light.css +4 -2
  123. package/dist/styles/wireframe-dark.css +373 -50
  124. package/dist/styles/wireframe-light.css +373 -50
  125. package/dist/types/components/ChatComposer/ChatComposer.d.ts +7 -0
  126. package/dist/types/components/ChatComposer/ChatComposer.d.ts.map +1 -1
  127. package/dist/types/components/ChatMessage/ChatMessage.d.ts +4 -1
  128. package/dist/types/components/ChatMessage/ChatMessage.d.ts.map +1 -1
  129. package/dist/types/components/Combobox/Combobox.d.ts +7 -0
  130. package/dist/types/components/Combobox/Combobox.d.ts.map +1 -1
  131. package/dist/types/components/EmojiPicker/EmojiPicker.d.ts +28 -0
  132. package/dist/types/components/EmojiPicker/EmojiPicker.d.ts.map +1 -0
  133. package/dist/types/components/EmojiPicker/index.d.ts +3 -0
  134. package/dist/types/components/EmojiPicker/index.d.ts.map +1 -0
  135. package/dist/types/components/PhotoDraftStrip/PhotoDraftStrip.d.ts +51 -0
  136. package/dist/types/components/PhotoDraftStrip/PhotoDraftStrip.d.ts.map +1 -0
  137. package/dist/types/components/PhotoDraftStrip/index.d.ts +3 -0
  138. package/dist/types/components/PhotoDraftStrip/index.d.ts.map +1 -0
  139. package/dist/types/components/RecordingBar/RecordingBar.d.ts +22 -0
  140. package/dist/types/components/RecordingBar/RecordingBar.d.ts.map +1 -0
  141. package/dist/types/components/RecordingBar/index.d.ts +3 -0
  142. package/dist/types/components/RecordingBar/index.d.ts.map +1 -0
  143. package/dist/types/components/SearchInput/SearchInput.d.ts.map +1 -1
  144. package/dist/types/components/TextLink/TextLink.d.ts +30 -0
  145. package/dist/types/components/TextLink/TextLink.d.ts.map +1 -0
  146. package/dist/types/components/TextLink/index.d.ts +3 -0
  147. package/dist/types/components/TextLink/index.d.ts.map +1 -0
  148. package/dist/types/components/VoiceMessage/VoiceMessage.d.ts +34 -0
  149. package/dist/types/components/VoiceMessage/VoiceMessage.d.ts.map +1 -0
  150. package/dist/types/components/VoiceMessage/index.d.ts +3 -0
  151. package/dist/types/components/VoiceMessage/index.d.ts.map +1 -0
  152. package/dist/types/components/VoiceRecorder/audio.d.ts +20 -0
  153. package/dist/types/components/VoiceRecorder/audio.d.ts.map +1 -0
  154. package/dist/types/components/VoiceRecorder/index.d.ts +4 -0
  155. package/dist/types/components/VoiceRecorder/index.d.ts.map +1 -0
  156. package/dist/types/components/VoiceRecorder/useVoiceRecorder.d.ts +48 -0
  157. package/dist/types/components/VoiceRecorder/useVoiceRecorder.d.ts.map +1 -0
  158. package/dist/types/components/Waveform/Waveform.d.ts +31 -0
  159. package/dist/types/components/Waveform/Waveform.d.ts.map +1 -0
  160. package/dist/types/components/Waveform/index.d.ts +3 -0
  161. package/dist/types/components/Waveform/index.d.ts.map +1 -0
  162. package/dist/types/components/index.d.ts +7 -0
  163. package/dist/types/components/index.d.ts.map +1 -1
  164. package/package.json +2 -1
  165. package/tokens/t4-components/bottombar.json +2 -1
  166. package/tokens/t4-components/chat.json +15 -0
  167. package/tokens/t4-components/chatbubble.json +7 -1
@@ -1694,7 +1694,9 @@ body {
1694
1694
  --card-border-hover: 0.0625rem solid #d0cdd7;
1695
1695
  --card-border-pressed: 0.125rem solid #3e63dd;
1696
1696
  --card-border-selected: 0.125rem solid #3e63dd;
1697
- --chatbubble-max-width: 640px;
1697
+ --chat-column-max-width: 768px;
1698
+ --chatbubble-max-width: 37rem;
1699
+ --chatbubble-max-width-ratio: 77%;
1698
1700
  --chatbubble-radius: 0.75rem;
1699
1701
  --chatbubble-padding-block: 0.75rem;
1700
1702
  --chatbubble-padding-inline: 1rem;
@@ -2117,7 +2119,7 @@ body {
2117
2119
  --bottombar-floating-backdrop-start: transparent;
2118
2120
  --bottombar-floating-backdrop-end: rgba(0, 0, 0, 0.027);
2119
2121
  --bottombar-floating-padding-top: 2rem;
2120
- --bottombar-chat-max-width: 1024px;
2122
+ --bottombar-chat-max-width: 768px;
2121
2123
  --bottombar-chat-padding: 0.75rem;
2122
2124
  --bottombar-tab-icon-size: 24px;
2123
2125
  --bottombar-tab-gap: 0.25rem;
@@ -2389,6 +2391,64 @@ body {
2389
2391
 
2390
2392
 
2391
2393
  /* ========== Component Styles ========== */
2394
+ /* Waveform */
2395
+ /* Waveform Component Styles */
2396
+
2397
+ /*
2398
+ * A row of amplitude bars. Muka ships no audio/waveform primitive; this is
2399
+ * drawn from color + spacing tokens only. Bar height (per-peak magnitude) and
2400
+ * the played/unplayed color split are data-driven, so they arrive as inline
2401
+ * styles from the component; everything else is tokenized here.
2402
+ */
2403
+ .muka-waveform {
2404
+ display: flex;
2405
+ align-items: center;
2406
+ gap: var(--spacing-05, 2px);
2407
+ width: 100%;
2408
+ min-width: 0;
2409
+ }
2410
+
2411
+ .muka-waveform__bar {
2412
+ flex: 1 1 0;
2413
+ min-width: 2px;
2414
+ max-width: 4px;
2415
+ border-radius: var(--radius-full, 9999px);
2416
+ background: var(--color-border-contrast);
2417
+ }
2418
+
2419
+
2420
+ /* VoiceMessage */
2421
+ /* VoiceMessage Component Styles */
2422
+
2423
+ .muka-voice-message {
2424
+ display: flex;
2425
+ align-items: center;
2426
+ gap: var(--spacing-3);
2427
+ width: 100%;
2428
+ min-width: min(16rem, 60vw);
2429
+ }
2430
+
2431
+ .muka-voice-message__wave {
2432
+ flex: 1 1 auto;
2433
+ min-width: 0;
2434
+ }
2435
+
2436
+ .muka-voice-message__time {
2437
+ flex: 0 0 auto;
2438
+ white-space: nowrap;
2439
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
2440
+ line-height: var(--text-label-sm-lineHeight, 1);
2441
+ font-variant-numeric: tabular-nums;
2442
+ color: var(--color-text-subtle-default);
2443
+ }
2444
+
2445
+ /* On the tinted own bubble the surface is the action color, so the timer flips
2446
+ * to the inverse text token for contrast. */
2447
+ .muka-voice-message--own .muka-voice-message__time {
2448
+ color: var(--color-text-default-inverse);
2449
+ }
2450
+
2451
+
2392
2452
  /* View */
2393
2453
  /* View Component Styles */
2394
2454
 
@@ -3809,6 +3869,88 @@ body {
3809
3869
  }
3810
3870
 
3811
3871
 
3872
+ /* TextLink */
3873
+ /* TextLink Component Styles - Using Muka Design Tokens */
3874
+
3875
+ .muka-text-link {
3876
+ display: inline;
3877
+ cursor: pointer;
3878
+ text-decoration: underline;
3879
+ /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
3880
+ text-underline-offset: 0.2em;
3881
+ text-decoration-thickness: from-font;
3882
+ /* Rounds the focus ring's corners; the link itself has no visible box. */
3883
+ border-radius: var(--border-radius-sm);
3884
+ transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
3885
+ }
3886
+
3887
+ /* ─── Sizes ───────────────────────────────────────────────
3888
+ Mirrors the body text scale so a link matches the copy it sits in. */
3889
+ .muka-text-link--sm {
3890
+ font-family: var(--text-body-sm-regular-fontFamily);
3891
+ font-weight: var(--text-body-sm-regular-fontWeight);
3892
+ font-size: var(--text-body-sm-regular-fontSize);
3893
+ line-height: var(--text-body-sm-regular-lineHeight);
3894
+ }
3895
+
3896
+ .muka-text-link--base {
3897
+ font-family: var(--text-body-base-regular-fontFamily);
3898
+ font-weight: var(--text-body-base-regular-fontWeight);
3899
+ font-size: var(--text-body-base-regular-fontSize);
3900
+ line-height: var(--text-body-base-regular-lineHeight);
3901
+ }
3902
+
3903
+ .muka-text-link--lg {
3904
+ font-family: var(--text-body-lg-regular-fontFamily);
3905
+ font-weight: var(--text-body-lg-regular-fontWeight);
3906
+ font-size: var(--text-body-lg-regular-fontSize);
3907
+ line-height: var(--text-body-lg-regular-lineHeight);
3908
+ }
3909
+
3910
+ /* ─── Variant: default (accent) ───────────────────────────
3911
+ Visited repeats the default colour on purpose: the design treats visited and
3912
+ default the same, and pinning it stops the browser's purple from showing. */
3913
+ .muka-text-link--default,
3914
+ .muka-text-link--default:visited {
3915
+ color: var(--color-text-action-default);
3916
+ }
3917
+
3918
+ .muka-text-link--default:hover,
3919
+ .muka-text-link--default:focus-visible {
3920
+ color: var(--color-text-action-hover);
3921
+ }
3922
+
3923
+ .muka-text-link--default:active {
3924
+ color: var(--color-text-action-pressed);
3925
+ }
3926
+
3927
+ /* ─── Variant: subtle (neutral) ───────────────────────────
3928
+ Hover, focus and pressed all darken to the default text colour. */
3929
+ .muka-text-link--subtle,
3930
+ .muka-text-link--subtle:visited {
3931
+ color: var(--color-text-subtle-default);
3932
+ }
3933
+
3934
+ .muka-text-link--subtle:hover,
3935
+ .muka-text-link--subtle:focus-visible,
3936
+ .muka-text-link--subtle:active {
3937
+ color: var(--color-text-default-default);
3938
+ }
3939
+
3940
+ /* ─── Focus ───────────────────────────────────────────────
3941
+ Same ring as every other focusable Muka component. */
3942
+ .muka-text-link:focus-visible {
3943
+ outline: 2px solid var(--color-border-focus);
3944
+ outline-offset: 2px;
3945
+ }
3946
+
3947
+ @media (prefers-reduced-motion: reduce) {
3948
+ .muka-text-link {
3949
+ transition: none;
3950
+ }
3951
+ }
3952
+
3953
+
3812
3954
  /* Tabs */
3813
3955
  /* Tabs Component Styles - Clean underline style tabs matching Figma */
3814
3956
 
@@ -5520,6 +5662,56 @@ body {
5520
5662
  }
5521
5663
 
5522
5664
 
5665
+ /* RecordingBar */
5666
+ /* RecordingBar Component Styles */
5667
+
5668
+ .muka-recording-bar {
5669
+ display: flex;
5670
+ align-items: center;
5671
+ gap: var(--spacing-3);
5672
+ width: 100%;
5673
+ min-width: 0;
5674
+ }
5675
+
5676
+ .muka-recording-bar__dot {
5677
+ flex: 0 0 auto;
5678
+ width: 0.625rem;
5679
+ height: 0.625rem;
5680
+ border-radius: var(--radius-full, 9999px);
5681
+ background: var(--alert-color-error-accent, var(--color-text-default-default));
5682
+ animation: muka-recording-bar-pulse 1s ease-in-out infinite;
5683
+ }
5684
+
5685
+ .muka-recording-bar__time {
5686
+ flex: 0 0 auto;
5687
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
5688
+ line-height: var(--text-label-sm-lineHeight, 1);
5689
+ font-variant-numeric: tabular-nums;
5690
+ color: var(--color-text-default-default);
5691
+ }
5692
+
5693
+ .muka-recording-bar__wave {
5694
+ flex: 1 1 auto;
5695
+ min-width: 0;
5696
+ }
5697
+
5698
+ @keyframes muka-recording-bar-pulse {
5699
+ 0%,
5700
+ 100% {
5701
+ opacity: 1;
5702
+ }
5703
+ 50% {
5704
+ opacity: 0.3;
5705
+ }
5706
+ }
5707
+
5708
+ @media (prefers-reduced-motion: reduce) {
5709
+ .muka-recording-bar__dot {
5710
+ animation: none;
5711
+ }
5712
+ }
5713
+
5714
+
5523
5715
  /* RangeSlider */
5524
5716
  /* RangeSlider Component Styles - Using Muka Design Tokens */
5525
5717
 
@@ -7072,33 +7264,33 @@ body {
7072
7264
  }
7073
7265
 
7074
7266
 
7075
- /* NumberInput */
7076
- /* NumberInput — reuses Input field styles (../Input/Input.css). */
7077
- /* Only the prefix/suffix affixes are NumberInput-specific. */
7267
+ /* PhotoDraftStrip */
7268
+ /* PhotoDraftStrip Component Styles */
7078
7269
 
7079
- .muka-numberinput__addon {
7080
- display: inline-flex;
7270
+ .muka-photo-draft-strip {
7271
+ display: flex;
7081
7272
  align-items: center;
7082
- flex: none;
7083
- color: var(--color-text-subtle-default);
7084
- font-family: var(--text-input-md-fontFamily);
7085
- font-size: var(--text-input-md-fontSize);
7086
- line-height: var(--text-input-md-lineHeight);
7087
- user-select: none;
7088
- pointer-events: none;
7089
- white-space: nowrap;
7273
+ gap: var(--spacing-3);
7274
+ width: 100%;
7275
+ padding: var(--spacing-2) 0;
7090
7276
  }
7091
7277
 
7092
- /* Hide the native number spinners — affixes/step API replace them. */
7093
- .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
7094
- .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
7095
- -webkit-appearance: none;
7096
- margin: 0;
7278
+ .muka-photo-draft-strip__track {
7279
+ display: flex;
7280
+ gap: var(--spacing-2);
7281
+ flex: 1 1 auto;
7282
+ min-width: 0;
7283
+ overflow-x: auto;
7284
+ scroll-behavior: smooth;
7285
+ scrollbar-width: none;
7097
7286
  }
7098
7287
 
7099
- .muka-numberinput__field .muka-input__native {
7100
- -moz-appearance: textfield;
7101
- appearance: textfield;
7288
+ .muka-photo-draft-strip__track::-webkit-scrollbar {
7289
+ display: none;
7290
+ }
7291
+
7292
+ .muka-photo-draft-strip__item {
7293
+ flex: 0 0 auto;
7102
7294
  }
7103
7295
 
7104
7296
 
@@ -7204,6 +7396,36 @@ body {
7204
7396
  }
7205
7397
 
7206
7398
 
7399
+ /* NumberInput */
7400
+ /* NumberInput — reuses Input field styles (../Input/Input.css). */
7401
+ /* Only the prefix/suffix affixes are NumberInput-specific. */
7402
+
7403
+ .muka-numberinput__addon {
7404
+ display: inline-flex;
7405
+ align-items: center;
7406
+ flex: none;
7407
+ color: var(--color-text-subtle-default);
7408
+ font-family: var(--text-input-md-fontFamily);
7409
+ font-size: var(--text-input-md-fontSize);
7410
+ line-height: var(--text-input-md-lineHeight);
7411
+ user-select: none;
7412
+ pointer-events: none;
7413
+ white-space: nowrap;
7414
+ }
7415
+
7416
+ /* Hide the native number spinners — affixes/step API replace them. */
7417
+ .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
7418
+ .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
7419
+ -webkit-appearance: none;
7420
+ margin: 0;
7421
+ }
7422
+
7423
+ .muka-numberinput__field .muka-input__native {
7424
+ -moz-appearance: textfield;
7425
+ appearance: textfield;
7426
+ }
7427
+
7428
+
7207
7429
  /* NavigationTransition */
7208
7430
  /* NavigationTransition Component Styles */
7209
7431
 
@@ -8159,26 +8381,6 @@ li.muka-listitem {
8159
8381
  }
8160
8382
 
8161
8383
 
8162
- /* Form */
8163
- .muka-form {
8164
- display: flex;
8165
- flex-direction: column;
8166
- width: 100%;
8167
- }
8168
-
8169
- .muka-form--gap-sm {
8170
- gap: var(--size-sm);
8171
- }
8172
-
8173
- .muka-form--gap-md {
8174
- gap: var(--size-md);
8175
- }
8176
-
8177
- .muka-form--gap-lg {
8178
- gap: var(--size-lg);
8179
- }
8180
-
8181
-
8182
8384
  /* Icon */
8183
8385
  /* Icon Component Styles - Using Muka Design Tokens */
8184
8386
 
@@ -8233,6 +8435,26 @@ li.muka-listitem {
8233
8435
  }
8234
8436
 
8235
8437
 
8438
+ /* Form */
8439
+ .muka-form {
8440
+ display: flex;
8441
+ flex-direction: column;
8442
+ width: 100%;
8443
+ }
8444
+
8445
+ .muka-form--gap-sm {
8446
+ gap: var(--size-sm);
8447
+ }
8448
+
8449
+ .muka-form--gap-md {
8450
+ gap: var(--size-md);
8451
+ }
8452
+
8453
+ .muka-form--gap-lg {
8454
+ gap: var(--size-lg);
8455
+ }
8456
+
8457
+
8236
8458
  /* FileUpload */
8237
8459
  /* FileUpload Component Styles */
8238
8460
 
@@ -8777,6 +8999,28 @@ li.muka-listitem {
8777
8999
  }
8778
9000
 
8779
9001
 
9002
+ /* EmojiPicker */
9003
+ /* EmojiPicker Component Styles */
9004
+
9005
+ .muka-emoji-picker {
9006
+ display: grid;
9007
+ grid-template-columns: repeat(8, 1fr);
9008
+ gap: var(--spacing-1);
9009
+ padding: var(--spacing-2);
9010
+ max-height: 12rem;
9011
+ overflow-y: auto;
9012
+ background: var(--color-surface-level2);
9013
+ border: var(--border-width-regular, 1px) solid var(--color-border-default);
9014
+ border-radius: var(--radius-lg);
9015
+ box-shadow: var(--menu-content-shadow, 0 4px 12px rgba(0, 0, 0, 0.12));
9016
+ }
9017
+
9018
+ .muka-emoji-picker__glyph {
9019
+ font-size: 1.25rem;
9020
+ line-height: 1;
9021
+ }
9022
+
9023
+
8780
9024
  /* Drawer */
8781
9025
  /* Drawer Component Styles */
8782
9026
 
@@ -10153,6 +10397,19 @@ li.muka-listitem {
10153
10397
  /* Combobox */
10154
10398
  /* Combobox Component Styles */
10155
10399
 
10400
+ /* ─── Trigger group (positioning context for the trailing controls) ── */
10401
+
10402
+ /*
10403
+ * The clear control is a sibling of the trigger, not a child (a <button> may
10404
+ * not contain interactive content), so it is overlaid on the trigger's trailing
10405
+ * padding. The trigger reserves that space with padding-right below.
10406
+ */
10407
+ .muka-combobox__trigger-group {
10408
+ position: relative;
10409
+ display: block;
10410
+ width: 100%;
10411
+ }
10412
+
10156
10413
  /* ─── Trigger (looks like an Input field, behaves like a button) ── */
10157
10414
 
10158
10415
  .muka-combobox {
@@ -10160,7 +10417,7 @@ li.muka-listitem {
10160
10417
  align-items: center;
10161
10418
  gap: var(--spacing-2);
10162
10419
  width: 100%;
10163
- padding: 0 var(--input-field-padding-x);
10420
+ padding: 0 var(--muka-combobox-trailing-space) 0 var(--input-field-padding-x);
10164
10421
  background-color: var(--input-field-color-default-background);
10165
10422
  border: var(--border-width-regular) solid var(--input-field-color-default-border);
10166
10423
  color: var(--color-text-default-default);
@@ -10172,6 +10429,19 @@ li.muka-listitem {
10172
10429
  line-height: var(--text-body-md-regular-lineHeight);
10173
10430
  -webkit-tap-highlight-color: transparent;
10174
10431
  transition: border-color 0.12s ease;
10432
+
10433
+ /* Room for the chevron overlaid on the trailing edge. */
10434
+ --muka-combobox-trailing-space: calc(
10435
+ var(--input-field-padding-x) + var(--icon-size-sm) + var(--spacing-2)
10436
+ );
10437
+ }
10438
+
10439
+ /* …and for the clear button next to it, when one is rendered. */
10440
+ .muka-combobox--clearable {
10441
+ --muka-combobox-trailing-space: calc(
10442
+ var(--input-field-padding-x) + var(--icon-size-sm) + var(--spacing-2) +
10443
+ var(--icon-size-xs) + var(--spacing-1) * 2 + var(--spacing-2)
10444
+ );
10175
10445
  }
10176
10446
 
10177
10447
  .muka-combobox--sm {
@@ -10224,6 +10494,23 @@ li.muka-listitem {
10224
10494
  text-overflow: ellipsis;
10225
10495
  }
10226
10496
 
10497
+ /* ─── Trailing controls (clear + chevron) ─────────────── */
10498
+
10499
+ .muka-combobox__actions {
10500
+ position: absolute;
10501
+ top: 0;
10502
+ right: var(--input-field-padding-x);
10503
+ height: 100%;
10504
+ display: flex;
10505
+ align-items: center;
10506
+ gap: var(--spacing-2);
10507
+ /*
10508
+ * The strip sits on top of the trigger, so it must not swallow taps meant to
10509
+ * open the picker. Only the clear button takes pointer events back.
10510
+ */
10511
+ pointer-events: none;
10512
+ }
10513
+
10227
10514
  .muka-combobox__clear,
10228
10515
  .muka-combobox__chevron {
10229
10516
  display: inline-flex;
@@ -10234,9 +10521,13 @@ li.muka-listitem {
10234
10521
  }
10235
10522
 
10236
10523
  .muka-combobox__clear {
10524
+ pointer-events: auto;
10237
10525
  cursor: pointer;
10238
10526
  padding: var(--spacing-1);
10527
+ border: none;
10528
+ background: none;
10239
10529
  border-radius: var(--radius-sm);
10530
+ -webkit-tap-highlight-color: transparent;
10240
10531
  }
10241
10532
 
10242
10533
  .muka-combobox__clear:hover {
@@ -10244,6 +10535,17 @@ li.muka-listitem {
10244
10535
  background-color: var(--color-surface-level1);
10245
10536
  }
10246
10537
 
10538
+ .muka-combobox__clear:focus-visible {
10539
+ outline: 2px solid var(--color-border-focus);
10540
+ outline-offset: 2px;
10541
+ color: var(--color-text-default-default);
10542
+ }
10543
+
10544
+ .muka-combobox--disabled ~ .muka-combobox__actions,
10545
+ .muka-combobox:disabled ~ .muka-combobox__actions {
10546
+ opacity: 0.5;
10547
+ }
10548
+
10247
10549
  /* ─── Picker sheet body ───────────────────────────────── */
10248
10550
 
10249
10551
  .muka-combobox__picker {
@@ -11053,7 +11355,7 @@ button.muka-chat-photo-grid__tile:focus-visible {
11053
11355
  align-items: stretch;
11054
11356
  gap: var(--spacing-8);
11055
11357
  width: 100%;
11056
- max-width: var(--container-max-width-sm);
11358
+ max-width: var(--chat-column-max-width);
11057
11359
  margin: 0 auto;
11058
11360
  }
11059
11361
 
@@ -11139,7 +11441,13 @@ button.muka-chat-photo-grid__tile:focus-visible {
11139
11441
  * no length measuring needed (Figma `Text length` on 5355:44091).
11140
11442
  */
11141
11443
  width: fit-content;
11142
- max-width: var(--chatbubble-max-width);
11444
+ /*
11445
+ * Stops short of the far edge at every width: the fixed cap once the
11446
+ * conversation column reaches its own cap, the ratio below that, where the
11447
+ * column runs full-bleed. Without that gap a long `own` bubble spans the
11448
+ * column and reads no differently from a `peer` one.
11449
+ */
11450
+ max-width: min(var(--chatbubble-max-width), var(--chatbubble-max-width-ratio));
11143
11451
  position: relative;
11144
11452
  display: flex;
11145
11453
  flex-direction: column;
@@ -12262,19 +12570,34 @@ button.muka-chat-photo-grid__tile:focus-visible {
12262
12570
 
12263
12571
  .muka-bottombar--chat .muka-bottombar__content {
12264
12572
  flex-direction: row;
12265
- max-width: var(--bottombar-chat-max-width);
12266
12573
  width: 100%;
12267
12574
  margin: 0 auto;
12268
12575
  }
12269
12576
 
12270
- /* Docked chat pads its content; the floating card supplies its own padding. */
12577
+ /*
12578
+ * `--bottombar-chat-max-width` is the conversation column (it derives from
12579
+ * `chat.column.max-width`, the same token `ChatMessageList` caps its column
12580
+ * with). The cap here carries the padding on top of it, so it is the
12581
+ * composer's own edges — not the padding around it — that land on the column.
12582
+ */
12583
+
12584
+ /*
12585
+ * Docked chat pads its content; the floating card supplies its own padding.
12586
+ * The inline half is the section gutter `ChatMessageList` pads its scroller
12587
+ * with, so below the cap — where the column runs full-bleed — the composer
12588
+ * keeps to the same gutters as the messages.
12589
+ */
12271
12590
  .muka-bottombar--chat:not(.muka-bottombar--floating) .muka-bottombar__content {
12272
- padding: var(--bottombar-chat-padding);
12591
+ padding: var(--bottombar-chat-padding)
12592
+ var(--section-padding-horizontal-default, var(--spacing-4));
12593
+ max-width: calc(
12594
+ var(--bottombar-chat-max-width) + 2 * var(--section-padding-horizontal-default, var(--spacing-4))
12595
+ );
12273
12596
  }
12274
12597
 
12275
12598
  /* Floating chat card widens to the chat cap (overrides the md default below). */
12276
12599
  .muka-bottombar--chat.muka-bottombar--floating .muka-bottombar__content {
12277
- max-width: var(--bottombar-chat-max-width);
12600
+ max-width: calc(var(--bottombar-chat-max-width) + 2 * var(--bottombar-floating-padding));
12278
12601
  }
12279
12602
 
12280
12603
  /* ─── Tab item ────────────────────────────────────────── */