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