@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.
- package/build/manifest.json +10 -0
- package/dist/cjs/components/BottomBar/BottomBar.css +19 -4
- package/dist/cjs/components/ChatComposer/ChatComposer.js +12 -4
- package/dist/cjs/components/ChatComposer/ChatComposer.js.map +1 -1
- package/dist/cjs/components/ChatMessage/ChatMessage.css +7 -1
- package/dist/cjs/components/ChatMessage/ChatMessage.js.map +1 -1
- package/dist/cjs/components/ChatMessageList/ChatMessageList.css +1 -1
- package/dist/cjs/components/Combobox/Combobox.css +59 -1
- package/dist/cjs/components/Combobox/Combobox.js +22 -3
- package/dist/cjs/components/Combobox/Combobox.js.map +1 -1
- package/dist/cjs/components/EmojiPicker/EmojiPicker.css +19 -0
- package/dist/cjs/components/EmojiPicker/EmojiPicker.js +54 -0
- package/dist/cjs/components/EmojiPicker/EmojiPicker.js.map +1 -0
- package/dist/cjs/components/EmojiPicker/index.js +12 -0
- package/dist/cjs/components/EmojiPicker/index.js.map +1 -0
- package/dist/cjs/components/PhotoDraftStrip/PhotoDraftStrip.css +27 -0
- package/dist/cjs/components/PhotoDraftStrip/PhotoDraftStrip.js +36 -0
- package/dist/cjs/components/PhotoDraftStrip/PhotoDraftStrip.js.map +1 -0
- package/dist/cjs/components/PhotoDraftStrip/index.js +11 -0
- package/dist/cjs/components/PhotoDraftStrip/index.js.map +1 -0
- package/dist/cjs/components/RecordingBar/RecordingBar.css +47 -0
- package/dist/cjs/components/RecordingBar/RecordingBar.js +22 -0
- package/dist/cjs/components/RecordingBar/RecordingBar.js.map +1 -0
- package/dist/cjs/components/RecordingBar/index.js +11 -0
- package/dist/cjs/components/RecordingBar/index.js.map +1 -0
- package/dist/cjs/components/SearchInput/SearchInput.js +7 -2
- package/dist/cjs/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/cjs/components/TextLink/TextLink.css +79 -0
- package/dist/cjs/components/TextLink/TextLink.js +28 -0
- package/dist/cjs/components/TextLink/TextLink.js.map +1 -0
- package/dist/cjs/components/TextLink/index.js +11 -0
- package/dist/cjs/components/TextLink/index.js.map +1 -0
- package/dist/cjs/components/VoiceMessage/VoiceMessage.css +29 -0
- package/dist/cjs/components/VoiceMessage/VoiceMessage.js +85 -0
- package/dist/cjs/components/VoiceMessage/VoiceMessage.js.map +1 -0
- package/dist/cjs/components/VoiceMessage/index.js +11 -0
- package/dist/cjs/components/VoiceMessage/index.js.map +1 -0
- package/dist/cjs/components/VoiceRecorder/audio.js +61 -0
- package/dist/cjs/components/VoiceRecorder/audio.js.map +1 -0
- package/dist/cjs/components/VoiceRecorder/index.js +16 -0
- package/dist/cjs/components/VoiceRecorder/index.js.map +1 -0
- package/dist/cjs/components/VoiceRecorder/useVoiceRecorder.js +213 -0
- package/dist/cjs/components/VoiceRecorder/useVoiceRecorder.js.map +1 -0
- package/dist/cjs/components/Waveform/Waveform.css +23 -0
- package/dist/cjs/components/Waveform/Waveform.js +36 -0
- package/dist/cjs/components/Waveform/Waveform.js.map +1 -0
- package/dist/cjs/components/Waveform/index.js +11 -0
- package/dist/cjs/components/Waveform/index.js.map +1 -0
- package/dist/cjs/components/index.js +20 -1
- package/dist/cjs/components/index.js.map +1 -1
- package/dist/esm/components/BottomBar/BottomBar.css +19 -4
- package/dist/esm/components/ChatComposer/ChatComposer.js +12 -4
- package/dist/esm/components/ChatComposer/ChatComposer.js.map +1 -1
- package/dist/esm/components/ChatMessage/ChatMessage.css +7 -1
- package/dist/esm/components/ChatMessage/ChatMessage.js.map +1 -1
- package/dist/esm/components/ChatMessageList/ChatMessageList.css +1 -1
- package/dist/esm/components/Combobox/Combobox.css +59 -1
- package/dist/esm/components/Combobox/Combobox.js +23 -4
- package/dist/esm/components/Combobox/Combobox.js.map +1 -1
- package/dist/esm/components/EmojiPicker/EmojiPicker.css +19 -0
- package/dist/esm/components/EmojiPicker/EmojiPicker.js +50 -0
- package/dist/esm/components/EmojiPicker/EmojiPicker.js.map +1 -0
- package/dist/esm/components/EmojiPicker/index.js +3 -0
- package/dist/esm/components/EmojiPicker/index.js.map +1 -0
- package/dist/esm/components/PhotoDraftStrip/PhotoDraftStrip.css +27 -0
- package/dist/esm/components/PhotoDraftStrip/PhotoDraftStrip.js +32 -0
- package/dist/esm/components/PhotoDraftStrip/PhotoDraftStrip.js.map +1 -0
- package/dist/esm/components/PhotoDraftStrip/index.js +3 -0
- package/dist/esm/components/PhotoDraftStrip/index.js.map +1 -0
- package/dist/esm/components/RecordingBar/RecordingBar.css +47 -0
- package/dist/esm/components/RecordingBar/RecordingBar.js +18 -0
- package/dist/esm/components/RecordingBar/RecordingBar.js.map +1 -0
- package/dist/esm/components/RecordingBar/index.js +3 -0
- package/dist/esm/components/RecordingBar/index.js.map +1 -0
- package/dist/esm/components/SearchInput/SearchInput.js +7 -2
- package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/esm/components/TextLink/TextLink.css +79 -0
- package/dist/esm/components/TextLink/TextLink.js +24 -0
- package/dist/esm/components/TextLink/TextLink.js.map +1 -0
- package/dist/esm/components/TextLink/index.js +3 -0
- package/dist/esm/components/TextLink/index.js.map +1 -0
- package/dist/esm/components/VoiceMessage/VoiceMessage.css +29 -0
- package/dist/esm/components/VoiceMessage/VoiceMessage.js +81 -0
- package/dist/esm/components/VoiceMessage/VoiceMessage.js.map +1 -0
- package/dist/esm/components/VoiceMessage/index.js +3 -0
- package/dist/esm/components/VoiceMessage/index.js.map +1 -0
- package/dist/esm/components/VoiceRecorder/audio.js +55 -0
- package/dist/esm/components/VoiceRecorder/audio.js.map +1 -0
- package/dist/esm/components/VoiceRecorder/index.js +4 -0
- package/dist/esm/components/VoiceRecorder/index.js.map +1 -0
- package/dist/esm/components/VoiceRecorder/useVoiceRecorder.js +210 -0
- package/dist/esm/components/VoiceRecorder/useVoiceRecorder.js.map +1 -0
- package/dist/esm/components/Waveform/Waveform.css +23 -0
- package/dist/esm/components/Waveform/Waveform.js +32 -0
- package/dist/esm/components/Waveform/Waveform.js.map +1 -0
- package/dist/esm/components/Waveform/index.js +3 -0
- package/dist/esm/components/Waveform/index.js.map +1 -0
- package/dist/esm/components/index.js +7 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/styles/components/BottomBar.css +19 -4
- package/dist/styles/components/ChatMessage.css +7 -1
- package/dist/styles/components/ChatMessageList.css +1 -1
- package/dist/styles/components/Combobox.css +59 -1
- package/dist/styles/components/EmojiPicker.css +19 -0
- package/dist/styles/components/PhotoDraftStrip.css +27 -0
- package/dist/styles/components/RecordingBar.css +47 -0
- package/dist/styles/components/TextLink.css +79 -0
- package/dist/styles/components/VoiceMessage.css +29 -0
- package/dist/styles/components/Waveform.css +23 -0
- package/dist/styles/index.css +373 -50
- package/dist/styles/muka-dark.css +373 -50
- package/dist/styles/muka-light.css +373 -50
- package/dist/styles/tokens-bouwplan-dark.css +4 -2
- package/dist/styles/tokens-bouwplan-light.css +4 -2
- package/dist/styles/tokens-fscl-dark.css +4 -2
- package/dist/styles/tokens-fscl-light.css +4 -2
- package/dist/styles/tokens-grip-dark.css +4 -2
- package/dist/styles/tokens-grip-light.css +4 -2
- package/dist/styles/tokens-muka-dark.css +4 -2
- package/dist/styles/tokens-muka-light.css +4 -2
- package/dist/styles/tokens-wireframe-dark.css +4 -2
- package/dist/styles/tokens-wireframe-light.css +4 -2
- package/dist/styles/wireframe-dark.css +373 -50
- package/dist/styles/wireframe-light.css +373 -50
- package/dist/types/components/ChatComposer/ChatComposer.d.ts +7 -0
- package/dist/types/components/ChatComposer/ChatComposer.d.ts.map +1 -1
- package/dist/types/components/ChatMessage/ChatMessage.d.ts +4 -1
- package/dist/types/components/ChatMessage/ChatMessage.d.ts.map +1 -1
- package/dist/types/components/Combobox/Combobox.d.ts +7 -0
- package/dist/types/components/Combobox/Combobox.d.ts.map +1 -1
- package/dist/types/components/EmojiPicker/EmojiPicker.d.ts +28 -0
- package/dist/types/components/EmojiPicker/EmojiPicker.d.ts.map +1 -0
- package/dist/types/components/EmojiPicker/index.d.ts +3 -0
- package/dist/types/components/EmojiPicker/index.d.ts.map +1 -0
- package/dist/types/components/PhotoDraftStrip/PhotoDraftStrip.d.ts +51 -0
- package/dist/types/components/PhotoDraftStrip/PhotoDraftStrip.d.ts.map +1 -0
- package/dist/types/components/PhotoDraftStrip/index.d.ts +3 -0
- package/dist/types/components/PhotoDraftStrip/index.d.ts.map +1 -0
- package/dist/types/components/RecordingBar/RecordingBar.d.ts +22 -0
- package/dist/types/components/RecordingBar/RecordingBar.d.ts.map +1 -0
- package/dist/types/components/RecordingBar/index.d.ts +3 -0
- package/dist/types/components/RecordingBar/index.d.ts.map +1 -0
- package/dist/types/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/types/components/TextLink/TextLink.d.ts +30 -0
- package/dist/types/components/TextLink/TextLink.d.ts.map +1 -0
- package/dist/types/components/TextLink/index.d.ts +3 -0
- package/dist/types/components/TextLink/index.d.ts.map +1 -0
- package/dist/types/components/VoiceMessage/VoiceMessage.d.ts +34 -0
- package/dist/types/components/VoiceMessage/VoiceMessage.d.ts.map +1 -0
- package/dist/types/components/VoiceMessage/index.d.ts +3 -0
- package/dist/types/components/VoiceMessage/index.d.ts.map +1 -0
- package/dist/types/components/VoiceRecorder/audio.d.ts +20 -0
- package/dist/types/components/VoiceRecorder/audio.d.ts.map +1 -0
- package/dist/types/components/VoiceRecorder/index.d.ts +4 -0
- package/dist/types/components/VoiceRecorder/index.d.ts.map +1 -0
- package/dist/types/components/VoiceRecorder/useVoiceRecorder.d.ts +48 -0
- package/dist/types/components/VoiceRecorder/useVoiceRecorder.d.ts.map +1 -0
- package/dist/types/components/Waveform/Waveform.d.ts +31 -0
- package/dist/types/components/Waveform/Waveform.d.ts.map +1 -0
- package/dist/types/components/Waveform/index.d.ts +3 -0
- package/dist/types/components/Waveform/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +7 -0
- package/dist/types/components/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/tokens/t4-components/bottombar.json +2 -1
- package/tokens/t4-components/chat.json +15 -0
- package/tokens/t4-components/chatbubble.json +7 -1
package/build/manifest.json
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"tokens/t3-semantics/ui.json",
|
|
12
12
|
"tokens/t4-components/button.json",
|
|
13
13
|
"tokens/t4-components/card.json",
|
|
14
|
+
"tokens/t4-components/chat.json",
|
|
14
15
|
"tokens/t4-components/chatbubble.json",
|
|
15
16
|
"tokens/t4-components/chatphotogrid.json",
|
|
16
17
|
"tokens/t4-components/container.json",
|
|
@@ -74,6 +75,7 @@
|
|
|
74
75
|
"tokens/t3-semantics/ui.json",
|
|
75
76
|
"tokens/t4-components/button.json",
|
|
76
77
|
"tokens/t4-components/card.json",
|
|
78
|
+
"tokens/t4-components/chat.json",
|
|
77
79
|
"tokens/t4-components/chatbubble.json",
|
|
78
80
|
"tokens/t4-components/chatphotogrid.json",
|
|
79
81
|
"tokens/t4-components/container.json",
|
|
@@ -136,6 +138,7 @@
|
|
|
136
138
|
"tokens/t3-semantics/ui.json",
|
|
137
139
|
"tokens/t4-components/button.json",
|
|
138
140
|
"tokens/t4-components/card.json",
|
|
141
|
+
"tokens/t4-components/chat.json",
|
|
139
142
|
"tokens/t4-components/chatbubble.json",
|
|
140
143
|
"tokens/t4-components/chatphotogrid.json",
|
|
141
144
|
"tokens/t4-components/container.json",
|
|
@@ -198,6 +201,7 @@
|
|
|
198
201
|
"tokens/t3-semantics/ui.json",
|
|
199
202
|
"tokens/t4-components/button.json",
|
|
200
203
|
"tokens/t4-components/card.json",
|
|
204
|
+
"tokens/t4-components/chat.json",
|
|
201
205
|
"tokens/t4-components/chatbubble.json",
|
|
202
206
|
"tokens/t4-components/chatphotogrid.json",
|
|
203
207
|
"tokens/t4-components/container.json",
|
|
@@ -260,6 +264,7 @@
|
|
|
260
264
|
"tokens/t3-semantics/ui.json",
|
|
261
265
|
"tokens/t4-components/button.json",
|
|
262
266
|
"tokens/t4-components/card.json",
|
|
267
|
+
"tokens/t4-components/chat.json",
|
|
263
268
|
"tokens/t4-components/chatbubble.json",
|
|
264
269
|
"tokens/t4-components/chatphotogrid.json",
|
|
265
270
|
"tokens/t4-components/container.json",
|
|
@@ -322,6 +327,7 @@
|
|
|
322
327
|
"tokens/t3-semantics/ui.json",
|
|
323
328
|
"tokens/t4-components/button.json",
|
|
324
329
|
"tokens/t4-components/card.json",
|
|
330
|
+
"tokens/t4-components/chat.json",
|
|
325
331
|
"tokens/t4-components/chatbubble.json",
|
|
326
332
|
"tokens/t4-components/chatphotogrid.json",
|
|
327
333
|
"tokens/t4-components/container.json",
|
|
@@ -384,6 +390,7 @@
|
|
|
384
390
|
"tokens/t3-semantics/ui.json",
|
|
385
391
|
"tokens/t4-components/button.json",
|
|
386
392
|
"tokens/t4-components/card.json",
|
|
393
|
+
"tokens/t4-components/chat.json",
|
|
387
394
|
"tokens/t4-components/chatbubble.json",
|
|
388
395
|
"tokens/t4-components/chatphotogrid.json",
|
|
389
396
|
"tokens/t4-components/container.json",
|
|
@@ -446,6 +453,7 @@
|
|
|
446
453
|
"tokens/t3-semantics/ui.json",
|
|
447
454
|
"tokens/t4-components/button.json",
|
|
448
455
|
"tokens/t4-components/card.json",
|
|
456
|
+
"tokens/t4-components/chat.json",
|
|
449
457
|
"tokens/t4-components/chatbubble.json",
|
|
450
458
|
"tokens/t4-components/chatphotogrid.json",
|
|
451
459
|
"tokens/t4-components/container.json",
|
|
@@ -508,6 +516,7 @@
|
|
|
508
516
|
"tokens/t3-semantics/ui.json",
|
|
509
517
|
"tokens/t4-components/button.json",
|
|
510
518
|
"tokens/t4-components/card.json",
|
|
519
|
+
"tokens/t4-components/chat.json",
|
|
511
520
|
"tokens/t4-components/chatbubble.json",
|
|
512
521
|
"tokens/t4-components/chatphotogrid.json",
|
|
513
522
|
"tokens/t4-components/container.json",
|
|
@@ -570,6 +579,7 @@
|
|
|
570
579
|
"tokens/t3-semantics/ui.json",
|
|
571
580
|
"tokens/t4-components/button.json",
|
|
572
581
|
"tokens/t4-components/card.json",
|
|
582
|
+
"tokens/t4-components/chat.json",
|
|
573
583
|
"tokens/t4-components/chatbubble.json",
|
|
574
584
|
"tokens/t4-components/chatphotogrid.json",
|
|
575
585
|
"tokens/t4-components/container.json",
|
|
@@ -66,19 +66,34 @@
|
|
|
66
66
|
|
|
67
67
|
.muka-bottombar--chat .muka-bottombar__content {
|
|
68
68
|
flex-direction: row;
|
|
69
|
-
max-width: var(--bottombar-chat-max-width);
|
|
70
69
|
width: 100%;
|
|
71
70
|
margin: 0 auto;
|
|
72
71
|
}
|
|
73
72
|
|
|
74
|
-
/*
|
|
73
|
+
/*
|
|
74
|
+
* `--bottombar-chat-max-width` is the conversation column (it derives from
|
|
75
|
+
* `chat.column.max-width`, the same token `ChatMessageList` caps its column
|
|
76
|
+
* with). The cap here carries the padding on top of it, so it is the
|
|
77
|
+
* composer's own edges — not the padding around it — that land on the column.
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
* Docked chat pads its content; the floating card supplies its own padding.
|
|
82
|
+
* The inline half is the section gutter `ChatMessageList` pads its scroller
|
|
83
|
+
* with, so below the cap — where the column runs full-bleed — the composer
|
|
84
|
+
* keeps to the same gutters as the messages.
|
|
85
|
+
*/
|
|
75
86
|
.muka-bottombar--chat:not(.muka-bottombar--floating) .muka-bottombar__content {
|
|
76
|
-
padding: var(--bottombar-chat-padding)
|
|
87
|
+
padding: var(--bottombar-chat-padding)
|
|
88
|
+
var(--section-padding-horizontal-default, var(--spacing-4));
|
|
89
|
+
max-width: calc(
|
|
90
|
+
var(--bottombar-chat-max-width) + 2 * var(--section-padding-horizontal-default, var(--spacing-4))
|
|
91
|
+
);
|
|
77
92
|
}
|
|
78
93
|
|
|
79
94
|
/* Floating chat card widens to the chat cap (overrides the md default below). */
|
|
80
95
|
.muka-bottombar--chat.muka-bottombar--floating .muka-bottombar__content {
|
|
81
|
-
max-width: var(--bottombar-chat-max-width);
|
|
96
|
+
max-width: calc(var(--bottombar-chat-max-width) + 2 * var(--bottombar-floating-padding));
|
|
82
97
|
}
|
|
83
98
|
|
|
84
99
|
/* ─── Tab item ────────────────────────────────────────── */
|
|
@@ -17,7 +17,7 @@ require("./ChatComposer.css");
|
|
|
17
17
|
* strip. Submits on Enter (Shift+Enter for a newline). Designed to live in a
|
|
18
18
|
* `BottomBar`.
|
|
19
19
|
*/
|
|
20
|
-
exports.ChatComposer = (0, react_1.forwardRef)(({ value, onChange, onSubmit, placeholder = 'Reply...', onLeadingClick, leadingIcon = 'add', leadingLabel = 'Add attachment', onEmoji, showEmoji = true, emojiLabel = 'Add emoji', onRecordStart, micLabel = 'Record voice message', sendLabel = 'Send message', recording = false, recordingSlot, onRecordPause, onRecordDiscard, pauseLabel = 'Pause recording', discardLabel = 'Discard recording', attachments, attachmentsOverflowLabel = 'Show more attachments', loading = false, disabled = false, maxLines = 10, autoFocus = false, className = '', }, forwardedRef) => {
|
|
20
|
+
exports.ChatComposer = (0, react_1.forwardRef)(({ value, onChange, onSubmit, placeholder = 'Reply...', onLeadingClick, leadingIcon = 'add', leadingLabel = 'Add attachment', onEmoji, showEmoji = true, emojiLabel = 'Add emoji', onRecordStart, micLabel = 'Record voice message', sendLabel = 'Send message', canSubmit: canSubmitProp, recording = false, recordingSlot, onRecordPause, onRecordDiscard, pauseLabel = 'Pause recording', discardLabel = 'Discard recording', attachments, attachmentsOverflowLabel = 'Show more attachments', loading = false, disabled = false, maxLines = 10, autoFocus = false, className = '', }, forwardedRef) => {
|
|
21
21
|
const textareaRef = (0, react_1.useRef)(null);
|
|
22
22
|
const attachmentsRef = (0, react_1.useRef)(null);
|
|
23
23
|
(0, react_1.useImperativeHandle)(forwardedRef, () => textareaRef.current);
|
|
@@ -33,9 +33,12 @@ exports.ChatComposer = (0, react_1.forwardRef)(({ value, onChange, onSubmit, pla
|
|
|
33
33
|
el.style.height = `${next}px`;
|
|
34
34
|
el.style.overflowY = el.scrollHeight > maxHeight ? 'auto' : 'hidden';
|
|
35
35
|
}, [value, maxLines, recording]);
|
|
36
|
+
// `canSubmit` overrides the default "text is non-empty" rule when provided,
|
|
37
|
+
// so a caption-less gallery send can be enabled from staged attachments.
|
|
38
|
+
const textEnabled = canSubmitProp ?? value.trim().length > 0;
|
|
36
39
|
const canSubmit = recording
|
|
37
40
|
? !disabled && !loading
|
|
38
|
-
: !disabled && !loading &&
|
|
41
|
+
: !disabled && !loading && textEnabled;
|
|
39
42
|
const handleSubmit = () => {
|
|
40
43
|
if (!canSubmit)
|
|
41
44
|
return;
|
|
@@ -54,8 +57,13 @@ exports.ChatComposer = (0, react_1.forwardRef)(({ value, onChange, onSubmit, pla
|
|
|
54
57
|
el.scrollBy({ left: el.clientWidth * 0.8, behavior: 'smooth' });
|
|
55
58
|
};
|
|
56
59
|
// Trailing button is a mic only when the field is empty, not recording, and
|
|
57
|
-
// a record handler is supplied; otherwise it is the send button.
|
|
58
|
-
|
|
60
|
+
// a record handler is supplied; otherwise it is the send button. When send
|
|
61
|
+
// enablement is controlled (`canSubmit`), always show send so a caption-less
|
|
62
|
+
// gallery can be sent from an empty field.
|
|
63
|
+
const showMic = !recording &&
|
|
64
|
+
onRecordStart &&
|
|
65
|
+
canSubmitProp === undefined &&
|
|
66
|
+
value.trim().length === 0;
|
|
59
67
|
const classes = [
|
|
60
68
|
'muka-chat-composer',
|
|
61
69
|
recording && 'muka-chat-composer--recording',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatComposer.js","sourceRoot":"","sources":["../../../../components/ChatComposer/ChatComposer.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;AAEb,iCAKe;AACf,sCAAmC;AACnC,kCAA8C;AAC9C,wCAAqC;AACrC,8BAA4B;
|
|
1
|
+
{"version":3,"file":"ChatComposer.js","sourceRoot":"","sources":["../../../../components/ChatComposer/ChatComposer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -62,7 +62,13 @@
|
|
|
62
62
|
* no length measuring needed (Figma `Text length` on 5355:44091).
|
|
63
63
|
*/
|
|
64
64
|
width: fit-content;
|
|
65
|
-
|
|
65
|
+
/*
|
|
66
|
+
* Stops short of the far edge at every width: the fixed cap once the
|
|
67
|
+
* conversation column reaches its own cap, the ratio below that, where the
|
|
68
|
+
* column runs full-bleed. Without that gap a long `own` bubble spans the
|
|
69
|
+
* column and reads no differently from a `peer` one.
|
|
70
|
+
*/
|
|
71
|
+
max-width: min(var(--chatbubble-max-width), var(--chatbubble-max-width-ratio));
|
|
66
72
|
position: relative;
|
|
67
73
|
display: flex;
|
|
68
74
|
flex-direction: column;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../../../components/ChatMessage/ChatMessage.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;AAEb,iCAAoF;AACpF,sCAAmC;AACnC,kCAA+B;AAC/B,kCAAqF;AACrF,gDAA6C;AAC7C,2DAAwD;AACxD,6BAA2B;AAI3B;;;GAGG;AACU,QAAA,yBAAyB,GAAG,IAAA,qBAAa,EAA4B,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../../../components/ChatMessage/ChatMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
/* Combobox Component Styles */
|
|
2
2
|
|
|
3
|
+
/* ─── Trigger group (positioning context for the trailing controls) ── */
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* The clear control is a sibling of the trigger, not a child (a <button> may
|
|
7
|
+
* not contain interactive content), so it is overlaid on the trigger's trailing
|
|
8
|
+
* padding. The trigger reserves that space with padding-right below.
|
|
9
|
+
*/
|
|
10
|
+
.muka-combobox__trigger-group {
|
|
11
|
+
position: relative;
|
|
12
|
+
display: block;
|
|
13
|
+
width: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
3
16
|
/* ─── Trigger (looks like an Input field, behaves like a button) ── */
|
|
4
17
|
|
|
5
18
|
.muka-combobox {
|
|
@@ -7,7 +20,7 @@
|
|
|
7
20
|
align-items: center;
|
|
8
21
|
gap: var(--spacing-2);
|
|
9
22
|
width: 100%;
|
|
10
|
-
padding: 0 var(--input-field-padding-x);
|
|
23
|
+
padding: 0 var(--muka-combobox-trailing-space) 0 var(--input-field-padding-x);
|
|
11
24
|
background-color: var(--input-field-color-default-background);
|
|
12
25
|
border: var(--border-width-regular) solid var(--input-field-color-default-border);
|
|
13
26
|
color: var(--color-text-default-default);
|
|
@@ -19,6 +32,19 @@
|
|
|
19
32
|
line-height: var(--text-body-md-regular-lineHeight);
|
|
20
33
|
-webkit-tap-highlight-color: transparent;
|
|
21
34
|
transition: border-color 0.12s ease;
|
|
35
|
+
|
|
36
|
+
/* Room for the chevron overlaid on the trailing edge. */
|
|
37
|
+
--muka-combobox-trailing-space: calc(
|
|
38
|
+
var(--input-field-padding-x) + var(--icon-size-sm) + var(--spacing-2)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* …and for the clear button next to it, when one is rendered. */
|
|
43
|
+
.muka-combobox--clearable {
|
|
44
|
+
--muka-combobox-trailing-space: calc(
|
|
45
|
+
var(--input-field-padding-x) + var(--icon-size-sm) + var(--spacing-2) +
|
|
46
|
+
var(--icon-size-xs) + var(--spacing-1) * 2 + var(--spacing-2)
|
|
47
|
+
);
|
|
22
48
|
}
|
|
23
49
|
|
|
24
50
|
.muka-combobox--sm {
|
|
@@ -71,6 +97,23 @@
|
|
|
71
97
|
text-overflow: ellipsis;
|
|
72
98
|
}
|
|
73
99
|
|
|
100
|
+
/* ─── Trailing controls (clear + chevron) ─────────────── */
|
|
101
|
+
|
|
102
|
+
.muka-combobox__actions {
|
|
103
|
+
position: absolute;
|
|
104
|
+
top: 0;
|
|
105
|
+
right: var(--input-field-padding-x);
|
|
106
|
+
height: 100%;
|
|
107
|
+
display: flex;
|
|
108
|
+
align-items: center;
|
|
109
|
+
gap: var(--spacing-2);
|
|
110
|
+
/*
|
|
111
|
+
* The strip sits on top of the trigger, so it must not swallow taps meant to
|
|
112
|
+
* open the picker. Only the clear button takes pointer events back.
|
|
113
|
+
*/
|
|
114
|
+
pointer-events: none;
|
|
115
|
+
}
|
|
116
|
+
|
|
74
117
|
.muka-combobox__clear,
|
|
75
118
|
.muka-combobox__chevron {
|
|
76
119
|
display: inline-flex;
|
|
@@ -81,9 +124,13 @@
|
|
|
81
124
|
}
|
|
82
125
|
|
|
83
126
|
.muka-combobox__clear {
|
|
127
|
+
pointer-events: auto;
|
|
84
128
|
cursor: pointer;
|
|
85
129
|
padding: var(--spacing-1);
|
|
130
|
+
border: none;
|
|
131
|
+
background: none;
|
|
86
132
|
border-radius: var(--radius-sm);
|
|
133
|
+
-webkit-tap-highlight-color: transparent;
|
|
87
134
|
}
|
|
88
135
|
|
|
89
136
|
.muka-combobox__clear:hover {
|
|
@@ -91,6 +138,17 @@
|
|
|
91
138
|
background-color: var(--color-surface-level1);
|
|
92
139
|
}
|
|
93
140
|
|
|
141
|
+
.muka-combobox__clear:focus-visible {
|
|
142
|
+
outline: 2px solid var(--color-border-focus);
|
|
143
|
+
outline-offset: 2px;
|
|
144
|
+
color: var(--color-text-default-default);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.muka-combobox--disabled ~ .muka-combobox__actions,
|
|
148
|
+
.muka-combobox:disabled ~ .muka-combobox__actions {
|
|
149
|
+
opacity: 0.5;
|
|
150
|
+
}
|
|
151
|
+
|
|
94
152
|
/* ─── Picker sheet body ───────────────────────────────── */
|
|
95
153
|
|
|
96
154
|
.muka-combobox__picker {
|
|
@@ -24,10 +24,18 @@ const defaultFilter = (option, query) => {
|
|
|
24
24
|
* by the underlying Vaul drawer's responsive behavior.
|
|
25
25
|
*
|
|
26
26
|
* For long lists, pass a custom `filter` to do fuzzy or async matching.
|
|
27
|
+
*
|
|
28
|
+
* @accessibility
|
|
29
|
+
* - Trigger is a native `<button>` with `aria-haspopup="listbox"`/`aria-expanded`
|
|
30
|
+
* - The `clearable` control is a sibling `<button>`, not nested in the trigger:
|
|
31
|
+
* it is in the tab order, operable with Enter/Space, and its label stays out
|
|
32
|
+
* of the trigger's accessible name
|
|
33
|
+
* - Clearing returns focus to the trigger, since the clear button unmounts
|
|
27
34
|
*/
|
|
28
35
|
const Combobox = ({ value, onChange, options, placeholder = 'Select…', title, searchable = true, searchPlaceholder = 'Search', emptyText = 'No results', clearable = false, disabled = false, size = 'md', filter = defaultFilter, 'aria-label': ariaLabel, name, id, className = '', }) => {
|
|
29
36
|
const generatedId = (0, react_1.useId)();
|
|
30
37
|
const triggerId = id || name || generatedId;
|
|
38
|
+
const triggerRef = (0, react_1.useRef)(null);
|
|
31
39
|
const [open, setOpen] = (0, react_1.useState)(false);
|
|
32
40
|
const [query, setQuery] = (0, react_1.useState)('');
|
|
33
41
|
const selected = (0, react_1.useMemo)(() => options.find((o) => o.value === value) ?? null, [options, value]);
|
|
@@ -48,20 +56,31 @@ const Combobox = ({ value, onChange, options, placeholder = 'Select…', title,
|
|
|
48
56
|
onChange(option.value);
|
|
49
57
|
handleOpenChange(false);
|
|
50
58
|
};
|
|
51
|
-
const
|
|
52
|
-
|
|
59
|
+
const showClear = clearable && !!selected && !disabled;
|
|
60
|
+
const handleClear = () => {
|
|
53
61
|
onChange(null);
|
|
62
|
+
// The clear button unmounts as soon as the selection goes — without this,
|
|
63
|
+
// focus would fall back to <body> and the keyboard user would lose their
|
|
64
|
+
// place. Hand it to the trigger, the control the clear belongs to.
|
|
65
|
+
triggerRef.current?.focus();
|
|
54
66
|
};
|
|
55
67
|
const triggerClasses = [
|
|
56
68
|
'muka-combobox',
|
|
57
69
|
`muka-combobox--${size}`,
|
|
58
70
|
!selected && 'muka-combobox--placeholder',
|
|
59
71
|
disabled && 'muka-combobox--disabled',
|
|
72
|
+
showClear && 'muka-combobox--clearable',
|
|
60
73
|
className,
|
|
61
74
|
]
|
|
62
75
|
.filter(Boolean)
|
|
63
76
|
.join(' ');
|
|
64
|
-
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", id: triggerId, name: name, className: triggerClasses, onClick: () => !disabled && setOpen(true), disabled: disabled, "aria-haspopup": "listbox", "aria-expanded": open, "aria-label": ariaLabel, children: [selected?.icon && ((0, jsx_runtime_1.jsx)("span", { className: "muka-combobox__leading", "aria-hidden": "true", children: selected.icon })), (0, jsx_runtime_1.jsx)("span", { className: "muka-combobox__label", children: selected ? selected.label : placeholder }),
|
|
77
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "muka-combobox__trigger-group", children: [(0, jsx_runtime_1.jsxs)("button", { ref: triggerRef, type: "button", id: triggerId, name: name, className: triggerClasses, onClick: () => !disabled && setOpen(true), disabled: disabled, "aria-haspopup": "listbox", "aria-expanded": open, "aria-label": ariaLabel, children: [selected?.icon && ((0, jsx_runtime_1.jsx)("span", { className: "muka-combobox__leading", "aria-hidden": "true", children: selected.icon })), (0, jsx_runtime_1.jsx)("span", { className: "muka-combobox__label", children: selected ? selected.label : placeholder })] }), (0, jsx_runtime_1.jsxs)("span", { className: "muka-combobox__actions", children: [showClear && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "muka-combobox__clear", onClick: handleClear, "aria-label": "Clear selection", children: (0, jsx_runtime_1.jsx)(Icon_1.Icon, { name: "close", size: "xs" }) })), (0, jsx_runtime_1.jsx)("span", { className: "muka-combobox__chevron", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)(Icon_1.Icon, { name: "arrow-down-s", size: "sm" }) })] })] }), (0, jsx_runtime_1.jsx)(Sheet_1.Sheet, { open: open, onOpenChange: handleOpenChange, title: title || ariaLabel || placeholder, children: (0, jsx_runtime_1.jsxs)("div", { className: "muka-combobox__picker", children: [title && (0, jsx_runtime_1.jsx)("h2", { className: "muka-combobox__title", children: title }), searchable && ((0, jsx_runtime_1.jsx)("div", { className: "muka-combobox__search", children: (0, jsx_runtime_1.jsx)(SearchInput_1.SearchInput, { value: query, onChange: setQuery, placeholder: searchPlaceholder,
|
|
78
|
+
// The picker is a modal Sheet the user deliberately opened, and
|
|
79
|
+
// search is its primary action — focus belongs in the field on
|
|
80
|
+
// open. This is focus management on a modal, not a page-load
|
|
81
|
+
// focus steal.
|
|
82
|
+
// eslint-disable-next-line jsx-a11y/no-autofocus
|
|
83
|
+
autoFocus: true }) })), (0, jsx_runtime_1.jsx)("div", { className: "muka-combobox__list", role: "listbox", "aria-label": title || placeholder, children: filtered.length === 0 ? ((0, jsx_runtime_1.jsx)(EmptyState_1.EmptyState, { title: emptyText })) : (filtered.map((option) => ((0, jsx_runtime_1.jsx)(ListItem_1.ListItem, { label: option.label, caption: option.caption, leadingIcon: option.icon, selected: option.value === value, "aria-selected": option.value === value, disabled: option.disabled, onClick: () => handleSelect(option) }, option.value)))) })] }) })] }));
|
|
65
84
|
};
|
|
66
85
|
exports.Combobox = Combobox;
|
|
67
86
|
exports.default = exports.Combobox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.js","sourceRoot":"","sources":["../../../../components/Combobox/Combobox.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;AAEb,
|
|
1
|
+
{"version":3,"file":"Combobox.js","sourceRoot":"","sources":["../../../../components/Combobox/Combobox.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* EmojiPicker Component Styles */
|
|
2
|
+
|
|
3
|
+
.muka-emoji-picker {
|
|
4
|
+
display: grid;
|
|
5
|
+
grid-template-columns: repeat(8, 1fr);
|
|
6
|
+
gap: var(--spacing-1);
|
|
7
|
+
padding: var(--spacing-2);
|
|
8
|
+
max-height: 12rem;
|
|
9
|
+
overflow-y: auto;
|
|
10
|
+
background: var(--color-surface-level2);
|
|
11
|
+
border: var(--border-width-regular, 1px) solid var(--color-border-default);
|
|
12
|
+
border-radius: var(--radius-lg);
|
|
13
|
+
box-shadow: var(--menu-content-shadow, 0 4px 12px rgba(0, 0, 0, 0.12));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.muka-emoji-picker__glyph {
|
|
17
|
+
font-size: 1.25rem;
|
|
18
|
+
line-height: 1;
|
|
19
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.EmojiPicker = exports.DEFAULT_EMOJI = void 0;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const Button_1 = require("../Button");
|
|
8
|
+
require("./EmojiPicker.css");
|
|
9
|
+
/** A small default set of common Unicode emoji. Override via the `emoji` prop. */
|
|
10
|
+
exports.DEFAULT_EMOJI = [
|
|
11
|
+
'😀', '😄', '😉', '😊', '😍', '😘', '😎', '🤔',
|
|
12
|
+
'😅', '😂', '🙃', '😴', '😇', '🥳', '😢', '😡',
|
|
13
|
+
'👍', '👎', '👌', '🙏', '👏', '💪', '🤝', '✌️',
|
|
14
|
+
'👋', '🫡', '🔥', '✅', '❌', '⚠️', '❗', '❓',
|
|
15
|
+
'💯', '🎉', '⭐', '❤️', '💥', '👀', '💡', '⏰',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* EmojiPicker — a minimal panel of Unicode emoji that inserts into a composer.
|
|
19
|
+
*
|
|
20
|
+
* Optional and dependency-free: apps may ignore it and wire only
|
|
21
|
+
* `ChatComposer.onEmoji`. Emoji are plain text, so once inserted they render in
|
|
22
|
+
* sent bubbles for free. Closes on Escape or an outside click.
|
|
23
|
+
*/
|
|
24
|
+
const EmojiPicker = ({ open, onClose, onSelect, title = 'Emoji', emoji = exports.DEFAULT_EMOJI, className = '', }) => {
|
|
25
|
+
const panelRef = (0, react_1.useRef)(null);
|
|
26
|
+
(0, react_1.useEffect)(() => {
|
|
27
|
+
if (!open)
|
|
28
|
+
return;
|
|
29
|
+
const onKey = (e) => {
|
|
30
|
+
if (e.key === 'Escape')
|
|
31
|
+
onClose();
|
|
32
|
+
};
|
|
33
|
+
const onPointer = (e) => {
|
|
34
|
+
if (panelRef.current && !panelRef.current.contains(e.target)) {
|
|
35
|
+
onClose();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
document.addEventListener('keydown', onKey);
|
|
39
|
+
// Defer so the opening click doesn't immediately close the panel.
|
|
40
|
+
const id = window.setTimeout(() => document.addEventListener('pointerdown', onPointer), 0);
|
|
41
|
+
return () => {
|
|
42
|
+
document.removeEventListener('keydown', onKey);
|
|
43
|
+
window.clearTimeout(id);
|
|
44
|
+
document.removeEventListener('pointerdown', onPointer);
|
|
45
|
+
};
|
|
46
|
+
}, [open, onClose]);
|
|
47
|
+
if (!open)
|
|
48
|
+
return null;
|
|
49
|
+
const classes = ['muka-emoji-picker', className].filter(Boolean).join(' ');
|
|
50
|
+
return ((0, jsx_runtime_1.jsx)("div", { ref: panelRef, className: classes, role: "dialog", "aria-label": title, children: emoji.map((char) => ((0, jsx_runtime_1.jsx)(Button_1.Button, { variant: "ghost", size: "sm", iconOnly: true, "aria-label": char, onClick: () => onSelect(char), children: (0, jsx_runtime_1.jsx)("span", { className: "muka-emoji-picker__glyph", children: char }) }, char))) }));
|
|
51
|
+
};
|
|
52
|
+
exports.EmojiPicker = EmojiPicker;
|
|
53
|
+
exports.default = exports.EmojiPicker;
|
|
54
|
+
//# sourceMappingURL=EmojiPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPicker.js","sourceRoot":"","sources":["../../../../components/EmojiPicker/EmojiPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = exports.DEFAULT_EMOJI = exports.EmojiPicker = void 0;
|
|
7
|
+
var EmojiPicker_1 = require("./EmojiPicker");
|
|
8
|
+
Object.defineProperty(exports, "EmojiPicker", { enumerable: true, get: function () { return EmojiPicker_1.EmojiPicker; } });
|
|
9
|
+
Object.defineProperty(exports, "DEFAULT_EMOJI", { enumerable: true, get: function () { return EmojiPicker_1.DEFAULT_EMOJI; } });
|
|
10
|
+
var EmojiPicker_2 = require("./EmojiPicker");
|
|
11
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(EmojiPicker_2).default; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/EmojiPicker/index.ts"],"names":[],"mappings":";;;;;;AAAA,6CAIuB;AAHrB,0GAAA,WAAW,OAAA;AAEX,4GAAA,aAAa,OAAA;AAEf,6CAAwC;AAA/B,uHAAA,OAAO,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* PhotoDraftStrip Component Styles */
|
|
2
|
+
|
|
3
|
+
.muka-photo-draft-strip {
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: var(--spacing-3);
|
|
7
|
+
width: 100%;
|
|
8
|
+
padding: var(--spacing-2) 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.muka-photo-draft-strip__track {
|
|
12
|
+
display: flex;
|
|
13
|
+
gap: var(--spacing-2);
|
|
14
|
+
flex: 1 1 auto;
|
|
15
|
+
min-width: 0;
|
|
16
|
+
overflow-x: auto;
|
|
17
|
+
scroll-behavior: smooth;
|
|
18
|
+
scrollbar-width: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.muka-photo-draft-strip__track::-webkit-scrollbar {
|
|
22
|
+
display: none;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.muka-photo-draft-strip__item {
|
|
26
|
+
flex: 0 0 auto;
|
|
27
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PhotoDraftStrip = void 0;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const Button_1 = require("../Button");
|
|
7
|
+
const Icon_1 = require("../Icon");
|
|
8
|
+
const Spinner_1 = require("../Spinner");
|
|
9
|
+
const Thumbnail_1 = require("../Thumbnail");
|
|
10
|
+
require("./PhotoDraftStrip.css");
|
|
11
|
+
/**
|
|
12
|
+
* PhotoDraftStrip — a controlled, horizontally-scrolling strip of staged photos
|
|
13
|
+
* shown above the composer while they upload. Each tile is a Muka `Thumbnail`
|
|
14
|
+
* carrying its own upload progress / error and a remove (×) control, so a
|
|
15
|
+
* per-item failure never blocks sending the rest.
|
|
16
|
+
*
|
|
17
|
+
* Controlled and network-free: the app owns upload, object URLs and the cap on
|
|
18
|
+
* how many photos may be staged. The optional send button lives here because
|
|
19
|
+
* the composer only enables its own send once text is non-empty — it can't send
|
|
20
|
+
* a caption-less gallery. Sending is enabled once every tile has settled and at
|
|
21
|
+
* least one uploaded successfully.
|
|
22
|
+
*/
|
|
23
|
+
const PhotoDraftStrip = ({ photos, onRemove, onSend, sending = false, showSend = true, sendLabel = 'Send photos', removeLabel = 'Remove photo', viewLabel = 'View photo', errorCaption = 'Upload failed', className = '', }) => {
|
|
24
|
+
if (photos.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
// Allow sending once every tile settled (uploaded or failed) and at least one
|
|
27
|
+
// uploaded successfully — a failed tile shouldn't block the rest.
|
|
28
|
+
const anyUploading = photos.some((p) => p.status === 'uploading');
|
|
29
|
+
const anyReady = photos.some((p) => p.status === 'ready');
|
|
30
|
+
const canSend = !sending && !anyUploading && anyReady;
|
|
31
|
+
const classes = ['muka-photo-draft-strip', className].filter(Boolean).join(' ');
|
|
32
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: classes, children: [(0, jsx_runtime_1.jsx)("div", { className: "muka-photo-draft-strip__track", children: photos.map((photo) => ((0, jsx_runtime_1.jsx)("div", { className: "muka-photo-draft-strip__item", children: (0, jsx_runtime_1.jsx)(Thumbnail_1.Thumbnail, { src: photo.previewUrl, alt: photo.fileName, shape: "1:1", processing: photo.status === 'uploading' && photo.progress <= 0, loading: photo.status === 'uploading' && photo.progress > 0, progress: photo.progress, error: photo.status === 'error', caption: photo.status === 'error' ? errorCaption : undefined, onRemove: () => onRemove(photo.id), removeLabel: removeLabel, viewLabel: viewLabel }) }, photo.id))) }), showSend && ((0, jsx_runtime_1.jsx)(Button_1.Button, { variant: "primary", size: "lg", iconOnly: true, "aria-label": sendLabel, onClick: onSend, disabled: !canSend, children: sending ? ((0, jsx_runtime_1.jsx)(Spinner_1.Spinner, { size: "sm", variant: "inverse" })) : ((0, jsx_runtime_1.jsx)(Icon_1.Icon, { name: "send-plane2", size: "md" })) }))] }));
|
|
33
|
+
};
|
|
34
|
+
exports.PhotoDraftStrip = PhotoDraftStrip;
|
|
35
|
+
exports.default = exports.PhotoDraftStrip;
|
|
36
|
+
//# sourceMappingURL=PhotoDraftStrip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhotoDraftStrip.js","sourceRoot":"","sources":["../../../../components/PhotoDraftStrip/PhotoDraftStrip.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;AAGb,sCAAmC;AACnC,kCAA+B;AAC/B,wCAAqC;AACrC,4CAAyC;AACzC,iCAA+B;AA+C/B;;;;;;;;;;;GAWG;AACI,MAAM,eAAe,GAAmC,CAAC,EAC9D,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,IAAI,EACf,SAAS,GAAG,aAAa,EACzB,WAAW,GAAG,cAAc,EAC5B,SAAS,GAAG,YAAY,EACxB,YAAY,GAAG,eAAe,EAC9B,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC;IAEtD,MAAM,OAAO,GAAG,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhF,OAAO,CACL,iCAAK,SAAS,EAAE,OAAO,aACrB,gCAAK,SAAS,EAAC,+BAA+B,YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,gCAAoB,SAAS,EAAC,8BAA8B,YAC1D,uBAAC,qBAAS,IACR,GAAG,EAAE,KAAK,CAAC,UAAU,EACrB,GAAG,EAAE,KAAK,CAAC,QAAQ,EACnB,KAAK,EAAC,KAAK,EACX,UAAU,EAAE,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAC/D,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAC3D,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,EAC/B,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAC5D,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAClC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,GACpB,IAbM,KAAK,CAAC,EAAE,CAcZ,CACP,CAAC,GACE,EAEL,QAAQ,IAAI,CACX,uBAAC,eAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,QAAQ,sBACI,SAAS,EACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,OAAO,YAEjB,OAAO,CAAC,CAAC,CAAC,CACT,uBAAC,iBAAO,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,GAAG,CACxC,CAAC,CAAC,CAAC,CACF,uBAAC,WAAI,IAAC,IAAI,EAAC,aAAa,EAAC,IAAI,EAAC,IAAI,GAAG,CACtC,GACM,CACV,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AA9DW,QAAA,eAAe,mBA8D1B;AAEF,kBAAe,uBAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = exports.PhotoDraftStrip = void 0;
|
|
7
|
+
var PhotoDraftStrip_1 = require("./PhotoDraftStrip");
|
|
8
|
+
Object.defineProperty(exports, "PhotoDraftStrip", { enumerable: true, get: function () { return PhotoDraftStrip_1.PhotoDraftStrip; } });
|
|
9
|
+
var PhotoDraftStrip_2 = require("./PhotoDraftStrip");
|
|
10
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(PhotoDraftStrip_2).default; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/PhotoDraftStrip/index.ts"],"names":[],"mappings":";;;;;;AAAA,qDAI2B;AAHzB,kHAAA,eAAe,OAAA;AAIjB,qDAA4C;AAAnC,2HAAA,OAAO,OAAA"}
|