@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
@@ -1661,7 +1661,9 @@ body {
1661
1661
  --card-border-hover: 0.0625rem solid #bbbbbb;
1662
1662
  --card-border-pressed: 0.125rem solid #113264;
1663
1663
  --card-border-selected: 0.125rem solid #113264;
1664
- --chatbubble-max-width: 640px;
1664
+ --chat-column-max-width: 768px;
1665
+ --chatbubble-max-width: 37rem;
1666
+ --chatbubble-max-width-ratio: 77%;
1665
1667
  --chatbubble-radius: 0px;
1666
1668
  --chatbubble-padding-block: 0.75rem;
1667
1669
  --chatbubble-padding-inline: 1rem;
@@ -2084,7 +2086,7 @@ body {
2084
2086
  --bottombar-floating-backdrop-start: transparent;
2085
2087
  --bottombar-floating-backdrop-end: rgba(0, 0, 0, 0.027);
2086
2088
  --bottombar-floating-padding-top: 2rem;
2087
- --bottombar-chat-max-width: 1024px;
2089
+ --bottombar-chat-max-width: 768px;
2088
2090
  --bottombar-chat-padding: 0.75rem;
2089
2091
  --bottombar-tab-icon-size: 24px;
2090
2092
  --bottombar-tab-gap: 0.25rem;
@@ -2356,6 +2358,64 @@ body {
2356
2358
 
2357
2359
 
2358
2360
  /* ========== Component Styles ========== */
2361
+ /* Waveform */
2362
+ /* Waveform Component Styles */
2363
+
2364
+ /*
2365
+ * A row of amplitude bars. Muka ships no audio/waveform primitive; this is
2366
+ * drawn from color + spacing tokens only. Bar height (per-peak magnitude) and
2367
+ * the played/unplayed color split are data-driven, so they arrive as inline
2368
+ * styles from the component; everything else is tokenized here.
2369
+ */
2370
+ .muka-waveform {
2371
+ display: flex;
2372
+ align-items: center;
2373
+ gap: var(--spacing-05, 2px);
2374
+ width: 100%;
2375
+ min-width: 0;
2376
+ }
2377
+
2378
+ .muka-waveform__bar {
2379
+ flex: 1 1 0;
2380
+ min-width: 2px;
2381
+ max-width: 4px;
2382
+ border-radius: var(--radius-full, 9999px);
2383
+ background: var(--color-border-contrast);
2384
+ }
2385
+
2386
+
2387
+ /* VoiceMessage */
2388
+ /* VoiceMessage Component Styles */
2389
+
2390
+ .muka-voice-message {
2391
+ display: flex;
2392
+ align-items: center;
2393
+ gap: var(--spacing-3);
2394
+ width: 100%;
2395
+ min-width: min(16rem, 60vw);
2396
+ }
2397
+
2398
+ .muka-voice-message__wave {
2399
+ flex: 1 1 auto;
2400
+ min-width: 0;
2401
+ }
2402
+
2403
+ .muka-voice-message__time {
2404
+ flex: 0 0 auto;
2405
+ white-space: nowrap;
2406
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
2407
+ line-height: var(--text-label-sm-lineHeight, 1);
2408
+ font-variant-numeric: tabular-nums;
2409
+ color: var(--color-text-subtle-default);
2410
+ }
2411
+
2412
+ /* On the tinted own bubble the surface is the action color, so the timer flips
2413
+ * to the inverse text token for contrast. */
2414
+ .muka-voice-message--own .muka-voice-message__time {
2415
+ color: var(--color-text-default-inverse);
2416
+ }
2417
+
2418
+
2359
2419
  /* View */
2360
2420
  /* View Component Styles */
2361
2421
 
@@ -3776,6 +3836,88 @@ body {
3776
3836
  }
3777
3837
 
3778
3838
 
3839
+ /* TextLink */
3840
+ /* TextLink Component Styles - Using Muka Design Tokens */
3841
+
3842
+ .muka-text-link {
3843
+ display: inline;
3844
+ cursor: pointer;
3845
+ text-decoration: underline;
3846
+ /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
3847
+ text-underline-offset: 0.2em;
3848
+ text-decoration-thickness: from-font;
3849
+ /* Rounds the focus ring's corners; the link itself has no visible box. */
3850
+ border-radius: var(--border-radius-sm);
3851
+ transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
3852
+ }
3853
+
3854
+ /* ─── Sizes ───────────────────────────────────────────────
3855
+ Mirrors the body text scale so a link matches the copy it sits in. */
3856
+ .muka-text-link--sm {
3857
+ font-family: var(--text-body-sm-regular-fontFamily);
3858
+ font-weight: var(--text-body-sm-regular-fontWeight);
3859
+ font-size: var(--text-body-sm-regular-fontSize);
3860
+ line-height: var(--text-body-sm-regular-lineHeight);
3861
+ }
3862
+
3863
+ .muka-text-link--base {
3864
+ font-family: var(--text-body-base-regular-fontFamily);
3865
+ font-weight: var(--text-body-base-regular-fontWeight);
3866
+ font-size: var(--text-body-base-regular-fontSize);
3867
+ line-height: var(--text-body-base-regular-lineHeight);
3868
+ }
3869
+
3870
+ .muka-text-link--lg {
3871
+ font-family: var(--text-body-lg-regular-fontFamily);
3872
+ font-weight: var(--text-body-lg-regular-fontWeight);
3873
+ font-size: var(--text-body-lg-regular-fontSize);
3874
+ line-height: var(--text-body-lg-regular-lineHeight);
3875
+ }
3876
+
3877
+ /* ─── Variant: default (accent) ───────────────────────────
3878
+ Visited repeats the default colour on purpose: the design treats visited and
3879
+ default the same, and pinning it stops the browser's purple from showing. */
3880
+ .muka-text-link--default,
3881
+ .muka-text-link--default:visited {
3882
+ color: var(--color-text-action-default);
3883
+ }
3884
+
3885
+ .muka-text-link--default:hover,
3886
+ .muka-text-link--default:focus-visible {
3887
+ color: var(--color-text-action-hover);
3888
+ }
3889
+
3890
+ .muka-text-link--default:active {
3891
+ color: var(--color-text-action-pressed);
3892
+ }
3893
+
3894
+ /* ─── Variant: subtle (neutral) ───────────────────────────
3895
+ Hover, focus and pressed all darken to the default text colour. */
3896
+ .muka-text-link--subtle,
3897
+ .muka-text-link--subtle:visited {
3898
+ color: var(--color-text-subtle-default);
3899
+ }
3900
+
3901
+ .muka-text-link--subtle:hover,
3902
+ .muka-text-link--subtle:focus-visible,
3903
+ .muka-text-link--subtle:active {
3904
+ color: var(--color-text-default-default);
3905
+ }
3906
+
3907
+ /* ─── Focus ───────────────────────────────────────────────
3908
+ Same ring as every other focusable Muka component. */
3909
+ .muka-text-link:focus-visible {
3910
+ outline: 2px solid var(--color-border-focus);
3911
+ outline-offset: 2px;
3912
+ }
3913
+
3914
+ @media (prefers-reduced-motion: reduce) {
3915
+ .muka-text-link {
3916
+ transition: none;
3917
+ }
3918
+ }
3919
+
3920
+
3779
3921
  /* Tabs */
3780
3922
  /* Tabs Component Styles - Clean underline style tabs matching Figma */
3781
3923
 
@@ -5487,6 +5629,56 @@ body {
5487
5629
  }
5488
5630
 
5489
5631
 
5632
+ /* RecordingBar */
5633
+ /* RecordingBar Component Styles */
5634
+
5635
+ .muka-recording-bar {
5636
+ display: flex;
5637
+ align-items: center;
5638
+ gap: var(--spacing-3);
5639
+ width: 100%;
5640
+ min-width: 0;
5641
+ }
5642
+
5643
+ .muka-recording-bar__dot {
5644
+ flex: 0 0 auto;
5645
+ width: 0.625rem;
5646
+ height: 0.625rem;
5647
+ border-radius: var(--radius-full, 9999px);
5648
+ background: var(--alert-color-error-accent, var(--color-text-default-default));
5649
+ animation: muka-recording-bar-pulse 1s ease-in-out infinite;
5650
+ }
5651
+
5652
+ .muka-recording-bar__time {
5653
+ flex: 0 0 auto;
5654
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
5655
+ line-height: var(--text-label-sm-lineHeight, 1);
5656
+ font-variant-numeric: tabular-nums;
5657
+ color: var(--color-text-default-default);
5658
+ }
5659
+
5660
+ .muka-recording-bar__wave {
5661
+ flex: 1 1 auto;
5662
+ min-width: 0;
5663
+ }
5664
+
5665
+ @keyframes muka-recording-bar-pulse {
5666
+ 0%,
5667
+ 100% {
5668
+ opacity: 1;
5669
+ }
5670
+ 50% {
5671
+ opacity: 0.3;
5672
+ }
5673
+ }
5674
+
5675
+ @media (prefers-reduced-motion: reduce) {
5676
+ .muka-recording-bar__dot {
5677
+ animation: none;
5678
+ }
5679
+ }
5680
+
5681
+
5490
5682
  /* RangeSlider */
5491
5683
  /* RangeSlider Component Styles - Using Muka Design Tokens */
5492
5684
 
@@ -7039,33 +7231,33 @@ body {
7039
7231
  }
7040
7232
 
7041
7233
 
7042
- /* NumberInput */
7043
- /* NumberInput — reuses Input field styles (../Input/Input.css). */
7044
- /* Only the prefix/suffix affixes are NumberInput-specific. */
7234
+ /* PhotoDraftStrip */
7235
+ /* PhotoDraftStrip Component Styles */
7045
7236
 
7046
- .muka-numberinput__addon {
7047
- display: inline-flex;
7237
+ .muka-photo-draft-strip {
7238
+ display: flex;
7048
7239
  align-items: center;
7049
- flex: none;
7050
- color: var(--color-text-subtle-default);
7051
- font-family: var(--text-input-md-fontFamily);
7052
- font-size: var(--text-input-md-fontSize);
7053
- line-height: var(--text-input-md-lineHeight);
7054
- user-select: none;
7055
- pointer-events: none;
7056
- white-space: nowrap;
7240
+ gap: var(--spacing-3);
7241
+ width: 100%;
7242
+ padding: var(--spacing-2) 0;
7057
7243
  }
7058
7244
 
7059
- /* Hide the native number spinners — affixes/step API replace them. */
7060
- .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
7061
- .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
7062
- -webkit-appearance: none;
7063
- margin: 0;
7245
+ .muka-photo-draft-strip__track {
7246
+ display: flex;
7247
+ gap: var(--spacing-2);
7248
+ flex: 1 1 auto;
7249
+ min-width: 0;
7250
+ overflow-x: auto;
7251
+ scroll-behavior: smooth;
7252
+ scrollbar-width: none;
7064
7253
  }
7065
7254
 
7066
- .muka-numberinput__field .muka-input__native {
7067
- -moz-appearance: textfield;
7068
- appearance: textfield;
7255
+ .muka-photo-draft-strip__track::-webkit-scrollbar {
7256
+ display: none;
7257
+ }
7258
+
7259
+ .muka-photo-draft-strip__item {
7260
+ flex: 0 0 auto;
7069
7261
  }
7070
7262
 
7071
7263
 
@@ -7171,6 +7363,36 @@ body {
7171
7363
  }
7172
7364
 
7173
7365
 
7366
+ /* NumberInput */
7367
+ /* NumberInput — reuses Input field styles (../Input/Input.css). */
7368
+ /* Only the prefix/suffix affixes are NumberInput-specific. */
7369
+
7370
+ .muka-numberinput__addon {
7371
+ display: inline-flex;
7372
+ align-items: center;
7373
+ flex: none;
7374
+ color: var(--color-text-subtle-default);
7375
+ font-family: var(--text-input-md-fontFamily);
7376
+ font-size: var(--text-input-md-fontSize);
7377
+ line-height: var(--text-input-md-lineHeight);
7378
+ user-select: none;
7379
+ pointer-events: none;
7380
+ white-space: nowrap;
7381
+ }
7382
+
7383
+ /* Hide the native number spinners — affixes/step API replace them. */
7384
+ .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
7385
+ .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
7386
+ -webkit-appearance: none;
7387
+ margin: 0;
7388
+ }
7389
+
7390
+ .muka-numberinput__field .muka-input__native {
7391
+ -moz-appearance: textfield;
7392
+ appearance: textfield;
7393
+ }
7394
+
7395
+
7174
7396
  /* NavigationTransition */
7175
7397
  /* NavigationTransition Component Styles */
7176
7398
 
@@ -8126,26 +8348,6 @@ li.muka-listitem {
8126
8348
  }
8127
8349
 
8128
8350
 
8129
- /* Form */
8130
- .muka-form {
8131
- display: flex;
8132
- flex-direction: column;
8133
- width: 100%;
8134
- }
8135
-
8136
- .muka-form--gap-sm {
8137
- gap: var(--size-sm);
8138
- }
8139
-
8140
- .muka-form--gap-md {
8141
- gap: var(--size-md);
8142
- }
8143
-
8144
- .muka-form--gap-lg {
8145
- gap: var(--size-lg);
8146
- }
8147
-
8148
-
8149
8351
  /* Icon */
8150
8352
  /* Icon Component Styles - Using Muka Design Tokens */
8151
8353
 
@@ -8200,6 +8402,26 @@ li.muka-listitem {
8200
8402
  }
8201
8403
 
8202
8404
 
8405
+ /* Form */
8406
+ .muka-form {
8407
+ display: flex;
8408
+ flex-direction: column;
8409
+ width: 100%;
8410
+ }
8411
+
8412
+ .muka-form--gap-sm {
8413
+ gap: var(--size-sm);
8414
+ }
8415
+
8416
+ .muka-form--gap-md {
8417
+ gap: var(--size-md);
8418
+ }
8419
+
8420
+ .muka-form--gap-lg {
8421
+ gap: var(--size-lg);
8422
+ }
8423
+
8424
+
8203
8425
  /* FileUpload */
8204
8426
  /* FileUpload Component Styles */
8205
8427
 
@@ -8744,6 +8966,28 @@ li.muka-listitem {
8744
8966
  }
8745
8967
 
8746
8968
 
8969
+ /* EmojiPicker */
8970
+ /* EmojiPicker Component Styles */
8971
+
8972
+ .muka-emoji-picker {
8973
+ display: grid;
8974
+ grid-template-columns: repeat(8, 1fr);
8975
+ gap: var(--spacing-1);
8976
+ padding: var(--spacing-2);
8977
+ max-height: 12rem;
8978
+ overflow-y: auto;
8979
+ background: var(--color-surface-level2);
8980
+ border: var(--border-width-regular, 1px) solid var(--color-border-default);
8981
+ border-radius: var(--radius-lg);
8982
+ box-shadow: var(--menu-content-shadow, 0 4px 12px rgba(0, 0, 0, 0.12));
8983
+ }
8984
+
8985
+ .muka-emoji-picker__glyph {
8986
+ font-size: 1.25rem;
8987
+ line-height: 1;
8988
+ }
8989
+
8990
+
8747
8991
  /* Drawer */
8748
8992
  /* Drawer Component Styles */
8749
8993
 
@@ -10120,6 +10364,19 @@ li.muka-listitem {
10120
10364
  /* Combobox */
10121
10365
  /* Combobox Component Styles */
10122
10366
 
10367
+ /* ─── Trigger group (positioning context for the trailing controls) ── */
10368
+
10369
+ /*
10370
+ * The clear control is a sibling of the trigger, not a child (a <button> may
10371
+ * not contain interactive content), so it is overlaid on the trigger's trailing
10372
+ * padding. The trigger reserves that space with padding-right below.
10373
+ */
10374
+ .muka-combobox__trigger-group {
10375
+ position: relative;
10376
+ display: block;
10377
+ width: 100%;
10378
+ }
10379
+
10123
10380
  /* ─── Trigger (looks like an Input field, behaves like a button) ── */
10124
10381
 
10125
10382
  .muka-combobox {
@@ -10127,7 +10384,7 @@ li.muka-listitem {
10127
10384
  align-items: center;
10128
10385
  gap: var(--spacing-2);
10129
10386
  width: 100%;
10130
- padding: 0 var(--input-field-padding-x);
10387
+ padding: 0 var(--muka-combobox-trailing-space) 0 var(--input-field-padding-x);
10131
10388
  background-color: var(--input-field-color-default-background);
10132
10389
  border: var(--border-width-regular) solid var(--input-field-color-default-border);
10133
10390
  color: var(--color-text-default-default);
@@ -10139,6 +10396,19 @@ li.muka-listitem {
10139
10396
  line-height: var(--text-body-md-regular-lineHeight);
10140
10397
  -webkit-tap-highlight-color: transparent;
10141
10398
  transition: border-color 0.12s ease;
10399
+
10400
+ /* Room for the chevron overlaid on the trailing edge. */
10401
+ --muka-combobox-trailing-space: calc(
10402
+ var(--input-field-padding-x) + var(--icon-size-sm) + var(--spacing-2)
10403
+ );
10404
+ }
10405
+
10406
+ /* …and for the clear button next to it, when one is rendered. */
10407
+ .muka-combobox--clearable {
10408
+ --muka-combobox-trailing-space: calc(
10409
+ var(--input-field-padding-x) + var(--icon-size-sm) + var(--spacing-2) +
10410
+ var(--icon-size-xs) + var(--spacing-1) * 2 + var(--spacing-2)
10411
+ );
10142
10412
  }
10143
10413
 
10144
10414
  .muka-combobox--sm {
@@ -10191,6 +10461,23 @@ li.muka-listitem {
10191
10461
  text-overflow: ellipsis;
10192
10462
  }
10193
10463
 
10464
+ /* ─── Trailing controls (clear + chevron) ─────────────── */
10465
+
10466
+ .muka-combobox__actions {
10467
+ position: absolute;
10468
+ top: 0;
10469
+ right: var(--input-field-padding-x);
10470
+ height: 100%;
10471
+ display: flex;
10472
+ align-items: center;
10473
+ gap: var(--spacing-2);
10474
+ /*
10475
+ * The strip sits on top of the trigger, so it must not swallow taps meant to
10476
+ * open the picker. Only the clear button takes pointer events back.
10477
+ */
10478
+ pointer-events: none;
10479
+ }
10480
+
10194
10481
  .muka-combobox__clear,
10195
10482
  .muka-combobox__chevron {
10196
10483
  display: inline-flex;
@@ -10201,9 +10488,13 @@ li.muka-listitem {
10201
10488
  }
10202
10489
 
10203
10490
  .muka-combobox__clear {
10491
+ pointer-events: auto;
10204
10492
  cursor: pointer;
10205
10493
  padding: var(--spacing-1);
10494
+ border: none;
10495
+ background: none;
10206
10496
  border-radius: var(--radius-sm);
10497
+ -webkit-tap-highlight-color: transparent;
10207
10498
  }
10208
10499
 
10209
10500
  .muka-combobox__clear:hover {
@@ -10211,6 +10502,17 @@ li.muka-listitem {
10211
10502
  background-color: var(--color-surface-level1);
10212
10503
  }
10213
10504
 
10505
+ .muka-combobox__clear:focus-visible {
10506
+ outline: 2px solid var(--color-border-focus);
10507
+ outline-offset: 2px;
10508
+ color: var(--color-text-default-default);
10509
+ }
10510
+
10511
+ .muka-combobox--disabled ~ .muka-combobox__actions,
10512
+ .muka-combobox:disabled ~ .muka-combobox__actions {
10513
+ opacity: 0.5;
10514
+ }
10515
+
10214
10516
  /* ─── Picker sheet body ───────────────────────────────── */
10215
10517
 
10216
10518
  .muka-combobox__picker {
@@ -11020,7 +11322,7 @@ button.muka-chat-photo-grid__tile:focus-visible {
11020
11322
  align-items: stretch;
11021
11323
  gap: var(--spacing-8);
11022
11324
  width: 100%;
11023
- max-width: var(--container-max-width-sm);
11325
+ max-width: var(--chat-column-max-width);
11024
11326
  margin: 0 auto;
11025
11327
  }
11026
11328
 
@@ -11106,7 +11408,13 @@ button.muka-chat-photo-grid__tile:focus-visible {
11106
11408
  * no length measuring needed (Figma `Text length` on 5355:44091).
11107
11409
  */
11108
11410
  width: fit-content;
11109
- max-width: var(--chatbubble-max-width);
11411
+ /*
11412
+ * Stops short of the far edge at every width: the fixed cap once the
11413
+ * conversation column reaches its own cap, the ratio below that, where the
11414
+ * column runs full-bleed. Without that gap a long `own` bubble spans the
11415
+ * column and reads no differently from a `peer` one.
11416
+ */
11417
+ max-width: min(var(--chatbubble-max-width), var(--chatbubble-max-width-ratio));
11110
11418
  position: relative;
11111
11419
  display: flex;
11112
11420
  flex-direction: column;
@@ -12229,19 +12537,34 @@ button.muka-chat-photo-grid__tile:focus-visible {
12229
12537
 
12230
12538
  .muka-bottombar--chat .muka-bottombar__content {
12231
12539
  flex-direction: row;
12232
- max-width: var(--bottombar-chat-max-width);
12233
12540
  width: 100%;
12234
12541
  margin: 0 auto;
12235
12542
  }
12236
12543
 
12237
- /* Docked chat pads its content; the floating card supplies its own padding. */
12544
+ /*
12545
+ * `--bottombar-chat-max-width` is the conversation column (it derives from
12546
+ * `chat.column.max-width`, the same token `ChatMessageList` caps its column
12547
+ * with). The cap here carries the padding on top of it, so it is the
12548
+ * composer's own edges — not the padding around it — that land on the column.
12549
+ */
12550
+
12551
+ /*
12552
+ * Docked chat pads its content; the floating card supplies its own padding.
12553
+ * The inline half is the section gutter `ChatMessageList` pads its scroller
12554
+ * with, so below the cap — where the column runs full-bleed — the composer
12555
+ * keeps to the same gutters as the messages.
12556
+ */
12238
12557
  .muka-bottombar--chat:not(.muka-bottombar--floating) .muka-bottombar__content {
12239
- padding: var(--bottombar-chat-padding);
12558
+ padding: var(--bottombar-chat-padding)
12559
+ var(--section-padding-horizontal-default, var(--spacing-4));
12560
+ max-width: calc(
12561
+ var(--bottombar-chat-max-width) + 2 * var(--section-padding-horizontal-default, var(--spacing-4))
12562
+ );
12240
12563
  }
12241
12564
 
12242
12565
  /* Floating chat card widens to the chat cap (overrides the md default below). */
12243
12566
  .muka-bottombar--chat.muka-bottombar--floating .muka-bottombar__content {
12244
- max-width: var(--bottombar-chat-max-width);
12567
+ max-width: calc(var(--bottombar-chat-max-width) + 2 * var(--bottombar-floating-padding));
12245
12568
  }
12246
12569
 
12247
12570
  /* ─── Tab item ────────────────────────────────────────── */
@@ -35,6 +35,13 @@ export interface ChatComposerProps {
35
35
  micLabel?: string;
36
36
  /** Send button aria-label. Default: 'Send message' */
37
37
  sendLabel?: string;
38
+ /**
39
+ * Overrides the default send-enablement rule. By default the send button is
40
+ * enabled once the trimmed text is non-empty (or while `recording`). Set this
41
+ * to enable/disable send explicitly — e.g. a caption-less gallery send driven
42
+ * by staged attachments rather than text.
43
+ */
44
+ canSubmit?: boolean;
38
45
  /** When true, the composer switches to the voice-recording layout */
39
46
  recording?: boolean;
40
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../../../components/ChatComposer/ChatComposer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAKN,MAAM,OAAO,CAAC;AAEf,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B,gEAAgE;IAChE,WAAW,CAAC,EAAE,QAAQ,CAAC;IAEvB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAE3B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEhC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAE3B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAE7B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,4EAA4E;IAC5E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,+FA2MxB,CAAC;AAIF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../../../components/ChatComposer/ChatComposer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAKN,MAAM,OAAO,CAAC;AAEf,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B,gEAAgE;IAChE,WAAW,CAAC,EAAE,QAAQ,CAAC;IAEvB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAE3B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEhC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAE3B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAE7B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,4EAA4E;IAC5E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,+FAqNxB,CAAC;AAIF,eAAe,YAAY,CAAC"}
@@ -40,7 +40,10 @@ export interface ChatMessageProps {
40
40
  /**
41
41
  * Avatar rendered in the rail beside the bubble (left of `peer`/`agent`
42
42
  * bubbles). Ignored for `own`, which never shows an avatar. Pass an
43
- * `<Avatar />` or `<ProfileBadge />`.
43
+ * `<Avatar size="sm" />`: the rail is exactly `chatbubble.avatar-size` wide
44
+ * (and half that below 1024px), so anything that carries a label of its own —
45
+ * a `<ProfileBadge />`, say — runs outside it. The author's name belongs in
46
+ * `author`, inside the bubble.
44
47
  */
45
48
  avatar?: React.ReactNode;
46
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessage.d.ts","sourceRoot":"","sources":["../../../../components/ChatMessage/ChatMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+D,MAAM,OAAO,CAAC;AAMpF,OAAO,mBAAmB,CAAC;AAE3B,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,yBAAyB,0CAAiD,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,4BAA4B;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEvB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,IAAI,CAAC;IAErB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAE7B;;;;OAIG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEzB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnD,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAEhC,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAEvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAElC,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqQlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ChatMessage.d.ts","sourceRoot":"","sources":["../../../../components/ChatMessage/ChatMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+D,MAAM,OAAO,CAAC;AAMpF,OAAO,mBAAmB,CAAC;AAE3B,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,yBAAyB,0CAAiD,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,4BAA4B;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEvB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,IAAI,CAAC;IAErB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAE7B;;;;OAIG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEzB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnD,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAEhC,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAEvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAElC,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqQlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -57,6 +57,13 @@ export interface ComboboxProps {
57
57
  * by the underlying Vaul drawer's responsive behavior.
58
58
  *
59
59
  * For long lists, pass a custom `filter` to do fuzzy or async matching.
60
+ *
61
+ * @accessibility
62
+ * - Trigger is a native `<button>` with `aria-haspopup="listbox"`/`aria-expanded`
63
+ * - The `clearable` control is a sibling `<button>`, not nested in the trigger:
64
+ * it is in the tab order, operable with Enter/Space, and its label stays out
65
+ * of the trigger's accessible name
66
+ * - Clearing returns focus to the trigger, since the clear button unmounts
60
67
  */
61
68
  export declare const Combobox: React.FC<ComboboxProps>;
62
69
  export default Combobox;
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../../../components/Combobox/Combobox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmC,MAAM,OAAO,CAAC;AAMxD,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,wEAAwE;IACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEzC,6BAA6B;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;IAE1B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,kCAAkC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAE5D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,cAAc;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA+I5C,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../../../components/Combobox/Combobox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAMhE,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,wEAAwE;IACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEzC,6BAA6B;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;IAE1B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,kCAAkC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAE5D,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,cAAc;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAsK5C,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import './EmojiPicker.css';
3
+ /** A small default set of common Unicode emoji. Override via the `emoji` prop. */
4
+ export declare const DEFAULT_EMOJI: string[];
5
+ export interface EmojiPickerProps {
6
+ /** Whether the panel is shown. */
7
+ open: boolean;
8
+ /** Called when the panel requests to close (Escape / outside click). */
9
+ onClose: () => void;
10
+ /** Called with the chosen emoji character. */
11
+ onSelect: (emoji: string) => void;
12
+ /** Accessible label for the panel. Default: 'Emoji'. */
13
+ title?: string;
14
+ /** Emoji to display. Defaults to a small built-in Unicode set. */
15
+ emoji?: string[];
16
+ /** Additional CSS classes */
17
+ className?: string;
18
+ }
19
+ /**
20
+ * EmojiPicker — a minimal panel of Unicode emoji that inserts into a composer.
21
+ *
22
+ * Optional and dependency-free: apps may ignore it and wire only
23
+ * `ChatComposer.onEmoji`. Emoji are plain text, so once inserted they render in
24
+ * sent bubbles for free. Closes on Escape or an outside click.
25
+ */
26
+ export declare const EmojiPicker: React.FC<EmojiPickerProps>;
27
+ export default EmojiPicker;
28
+ //# sourceMappingURL=EmojiPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmojiPicker.d.ts","sourceRoot":"","sources":["../../../../components/EmojiPicker/EmojiPicker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,mBAAmB,CAAC;AAE3B,kFAAkF;AAClF,eAAO,MAAM,aAAa,EAAE,MAAM,EAMjC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IAEd,wEAAwE;IACxE,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,8CAA8C;IAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqDlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { EmojiPicker, type EmojiPickerProps, DEFAULT_EMOJI, } from './EmojiPicker';
2
+ export { default } from './EmojiPicker';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/EmojiPicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}