@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
@@ -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 {
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useId, useMemo, useState } from 'react';
3
+ import { useId, useMemo, useRef, useState } from 'react';
4
4
  import { Sheet } from '../Sheet';
5
5
  import { SearchInput } from '../SearchInput';
6
6
  import { ListItem } from '../ListItem';
@@ -21,10 +21,18 @@ const defaultFilter = (option, query) => {
21
21
  * by the underlying Vaul drawer's responsive behavior.
22
22
  *
23
23
  * For long lists, pass a custom `filter` to do fuzzy or async matching.
24
+ *
25
+ * @accessibility
26
+ * - Trigger is a native `<button>` with `aria-haspopup="listbox"`/`aria-expanded`
27
+ * - The `clearable` control is a sibling `<button>`, not nested in the trigger:
28
+ * it is in the tab order, operable with Enter/Space, and its label stays out
29
+ * of the trigger's accessible name
30
+ * - Clearing returns focus to the trigger, since the clear button unmounts
24
31
  */
25
32
  export 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 = '', }) => {
26
33
  const generatedId = useId();
27
34
  const triggerId = id || name || generatedId;
35
+ const triggerRef = useRef(null);
28
36
  const [open, setOpen] = useState(false);
29
37
  const [query, setQuery] = useState('');
30
38
  const selected = useMemo(() => options.find((o) => o.value === value) ?? null, [options, value]);
@@ -45,20 +53,31 @@ export const Combobox = ({ value, onChange, options, placeholder = 'Select…',
45
53
  onChange(option.value);
46
54
  handleOpenChange(false);
47
55
  };
48
- const handleClear = (e) => {
49
- e.stopPropagation();
56
+ const showClear = clearable && !!selected && !disabled;
57
+ const handleClear = () => {
50
58
  onChange(null);
59
+ // The clear button unmounts as soon as the selection goes — without this,
60
+ // focus would fall back to <body> and the keyboard user would lose their
61
+ // place. Hand it to the trigger, the control the clear belongs to.
62
+ triggerRef.current?.focus();
51
63
  };
52
64
  const triggerClasses = [
53
65
  'muka-combobox',
54
66
  `muka-combobox--${size}`,
55
67
  !selected && 'muka-combobox--placeholder',
56
68
  disabled && 'muka-combobox--disabled',
69
+ showClear && 'muka-combobox--clearable',
57
70
  className,
58
71
  ]
59
72
  .filter(Boolean)
60
73
  .join(' ');
61
- return (_jsxs(_Fragment, { children: [_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 && (_jsx("span", { className: "muka-combobox__leading", "aria-hidden": "true", children: selected.icon })), _jsx("span", { className: "muka-combobox__label", children: selected ? selected.label : placeholder }), clearable && selected && !disabled && (_jsx("span", { className: "muka-combobox__clear", onClick: handleClear, role: "button", tabIndex: -1, "aria-label": "Clear selection", children: _jsx(Icon, { name: "close", size: "xs" }) })), _jsx("span", { className: "muka-combobox__chevron", "aria-hidden": "true", children: _jsx(Icon, { name: "arrow-down-s", size: "sm" }) })] }), _jsx(Sheet, { open: open, onOpenChange: handleOpenChange, title: title || ariaLabel || placeholder, children: _jsxs("div", { className: "muka-combobox__picker", children: [title && _jsx("h2", { className: "muka-combobox__title", children: title }), searchable && (_jsx("div", { className: "muka-combobox__search", children: _jsx(SearchInput, { value: query, onChange: setQuery, placeholder: searchPlaceholder, autoFocus: true }) })), _jsx("div", { className: "muka-combobox__list", role: "listbox", "aria-label": title || placeholder, children: filtered.length === 0 ? (_jsx(EmptyState, { title: emptyText })) : (filtered.map((option) => (_jsx(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)))) })] }) })] }));
74
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "muka-combobox__trigger-group", children: [_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 && (_jsx("span", { className: "muka-combobox__leading", "aria-hidden": "true", children: selected.icon })), _jsx("span", { className: "muka-combobox__label", children: selected ? selected.label : placeholder })] }), _jsxs("span", { className: "muka-combobox__actions", children: [showClear && (_jsx("button", { type: "button", className: "muka-combobox__clear", onClick: handleClear, "aria-label": "Clear selection", children: _jsx(Icon, { name: "close", size: "xs" }) })), _jsx("span", { className: "muka-combobox__chevron", "aria-hidden": "true", children: _jsx(Icon, { name: "arrow-down-s", size: "sm" }) })] })] }), _jsx(Sheet, { open: open, onOpenChange: handleOpenChange, title: title || ariaLabel || placeholder, children: _jsxs("div", { className: "muka-combobox__picker", children: [title && _jsx("h2", { className: "muka-combobox__title", children: title }), searchable && (_jsx("div", { className: "muka-combobox__search", children: _jsx(SearchInput, { value: query, onChange: setQuery, placeholder: searchPlaceholder,
75
+ // The picker is a modal Sheet the user deliberately opened, and
76
+ // search is its primary action — focus belongs in the field on
77
+ // open. This is focus management on a modal, not a page-load
78
+ // focus steal.
79
+ // eslint-disable-next-line jsx-a11y/no-autofocus
80
+ autoFocus: true }) })), _jsx("div", { className: "muka-combobox__list", role: "listbox", "aria-label": title || placeholder, children: filtered.length === 0 ? (_jsx(EmptyState, { title: emptyText })) : (filtered.map((option) => (_jsx(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)))) })] }) })] }));
62
81
  };
63
82
  export default Combobox;
64
83
  //# sourceMappingURL=Combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","sourceRoot":"","sources":["../../../../components/Combobox/Combobox.tsx"],"names":[],"mappings":"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"}
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,50 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef } from 'react';
4
+ import { Button } from '../Button';
5
+ import './EmojiPicker.css';
6
+ /** A small default set of common Unicode emoji. Override via the `emoji` prop. */
7
+ export const DEFAULT_EMOJI = [
8
+ '😀', '😄', '😉', '😊', '😍', '😘', '😎', '🤔',
9
+ '😅', '😂', '🙃', '😴', '😇', '🥳', '😢', '😡',
10
+ '👍', '👎', '👌', '🙏', '👏', '💪', '🤝', '✌️',
11
+ '👋', '🫡', '🔥', '✅', '❌', '⚠️', '❗', '❓',
12
+ '💯', '🎉', '⭐', '❤️', '💥', '👀', '💡', '⏰',
13
+ ];
14
+ /**
15
+ * EmojiPicker — a minimal panel of Unicode emoji that inserts into a composer.
16
+ *
17
+ * Optional and dependency-free: apps may ignore it and wire only
18
+ * `ChatComposer.onEmoji`. Emoji are plain text, so once inserted they render in
19
+ * sent bubbles for free. Closes on Escape or an outside click.
20
+ */
21
+ export const EmojiPicker = ({ open, onClose, onSelect, title = 'Emoji', emoji = DEFAULT_EMOJI, className = '', }) => {
22
+ const panelRef = useRef(null);
23
+ useEffect(() => {
24
+ if (!open)
25
+ return;
26
+ const onKey = (e) => {
27
+ if (e.key === 'Escape')
28
+ onClose();
29
+ };
30
+ const onPointer = (e) => {
31
+ if (panelRef.current && !panelRef.current.contains(e.target)) {
32
+ onClose();
33
+ }
34
+ };
35
+ document.addEventListener('keydown', onKey);
36
+ // Defer so the opening click doesn't immediately close the panel.
37
+ const id = window.setTimeout(() => document.addEventListener('pointerdown', onPointer), 0);
38
+ return () => {
39
+ document.removeEventListener('keydown', onKey);
40
+ window.clearTimeout(id);
41
+ document.removeEventListener('pointerdown', onPointer);
42
+ };
43
+ }, [open, onClose]);
44
+ if (!open)
45
+ return null;
46
+ const classes = ['muka-emoji-picker', className].filter(Boolean).join(' ');
47
+ return (_jsx("div", { ref: panelRef, className: classes, role: "dialog", "aria-label": title, children: emoji.map((char) => (_jsx(Button, { variant: "ghost", size: "sm", iconOnly: true, "aria-label": char, onClick: () => onSelect(char), children: _jsx("span", { className: "muka-emoji-picker__glyph", children: char }) }, char))) }));
48
+ };
49
+ export default EmojiPicker;
50
+ //# 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,3 @@
1
+ export { EmojiPicker, DEFAULT_EMOJI, } from './EmojiPicker';
2
+ export { default } from './EmojiPicker';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/EmojiPicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAEX,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
@@ -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,32 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Button } from '../Button';
4
+ import { Icon } from '../Icon';
5
+ import { Spinner } from '../Spinner';
6
+ import { Thumbnail } from '../Thumbnail';
7
+ import './PhotoDraftStrip.css';
8
+ /**
9
+ * PhotoDraftStrip — a controlled, horizontally-scrolling strip of staged photos
10
+ * shown above the composer while they upload. Each tile is a Muka `Thumbnail`
11
+ * carrying its own upload progress / error and a remove (×) control, so a
12
+ * per-item failure never blocks sending the rest.
13
+ *
14
+ * Controlled and network-free: the app owns upload, object URLs and the cap on
15
+ * how many photos may be staged. The optional send button lives here because
16
+ * the composer only enables its own send once text is non-empty — it can't send
17
+ * a caption-less gallery. Sending is enabled once every tile has settled and at
18
+ * least one uploaded successfully.
19
+ */
20
+ export const PhotoDraftStrip = ({ photos, onRemove, onSend, sending = false, showSend = true, sendLabel = 'Send photos', removeLabel = 'Remove photo', viewLabel = 'View photo', errorCaption = 'Upload failed', className = '', }) => {
21
+ if (photos.length === 0)
22
+ return null;
23
+ // Allow sending once every tile settled (uploaded or failed) and at least one
24
+ // uploaded successfully — a failed tile shouldn't block the rest.
25
+ const anyUploading = photos.some((p) => p.status === 'uploading');
26
+ const anyReady = photos.some((p) => p.status === 'ready');
27
+ const canSend = !sending && !anyUploading && anyReady;
28
+ const classes = ['muka-photo-draft-strip', className].filter(Boolean).join(' ');
29
+ return (_jsxs("div", { className: classes, children: [_jsx("div", { className: "muka-photo-draft-strip__track", children: photos.map((photo) => (_jsx("div", { className: "muka-photo-draft-strip__item", children: _jsx(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 && (_jsx(Button, { variant: "primary", size: "lg", iconOnly: true, "aria-label": sendLabel, onClick: onSend, disabled: !canSend, children: sending ? (_jsx(Spinner, { size: "sm", variant: "inverse" })) : (_jsx(Icon, { name: "send-plane2", size: "md" })) }))] }));
30
+ };
31
+ export default PhotoDraftStrip;
32
+ //# 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,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,uBAAuB,CAAC;AA+C/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,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,eAAK,SAAS,EAAE,OAAO,aACrB,cAAK,SAAS,EAAC,+BAA+B,YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,cAAoB,SAAS,EAAC,8BAA8B,YAC1D,KAAC,SAAS,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,KAAC,MAAM,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,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,GAAG,CACxC,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,IAAI,EAAC,aAAa,EAAC,IAAI,EAAC,IAAI,GAAG,CACtC,GACM,CACV,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { PhotoDraftStrip, } from './PhotoDraftStrip';
2
+ export { default } from './PhotoDraftStrip';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/PhotoDraftStrip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAGhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /* RecordingBar Component Styles */
2
+
3
+ .muka-recording-bar {
4
+ display: flex;
5
+ align-items: center;
6
+ gap: var(--spacing-3);
7
+ width: 100%;
8
+ min-width: 0;
9
+ }
10
+
11
+ .muka-recording-bar__dot {
12
+ flex: 0 0 auto;
13
+ width: 0.625rem;
14
+ height: 0.625rem;
15
+ border-radius: var(--radius-full, 9999px);
16
+ background: var(--alert-color-error-accent, var(--color-text-default-default));
17
+ animation: muka-recording-bar-pulse 1s ease-in-out infinite;
18
+ }
19
+
20
+ .muka-recording-bar__time {
21
+ flex: 0 0 auto;
22
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
23
+ line-height: var(--text-label-sm-lineHeight, 1);
24
+ font-variant-numeric: tabular-nums;
25
+ color: var(--color-text-default-default);
26
+ }
27
+
28
+ .muka-recording-bar__wave {
29
+ flex: 1 1 auto;
30
+ min-width: 0;
31
+ }
32
+
33
+ @keyframes muka-recording-bar-pulse {
34
+ 0%,
35
+ 100% {
36
+ opacity: 1;
37
+ }
38
+ 50% {
39
+ opacity: 0.3;
40
+ }
41
+ }
42
+
43
+ @media (prefers-reduced-motion: reduce) {
44
+ .muka-recording-bar__dot {
45
+ animation: none;
46
+ }
47
+ }
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Waveform } from '../Waveform';
4
+ import { formatClock } from '../VoiceRecorder';
5
+ import './RecordingBar.css';
6
+ /**
7
+ * RecordingBar — drop-in content for `ChatComposer.recordingSlot` while a voice
8
+ * note is being recorded. A pulsing record dot, an elapsed timer, and the live
9
+ * `Waveform`. Muka delegates this slot to the app, but ships this default so
10
+ * consumers don't rebuild it. Feed it straight from `useVoiceRecorder`
11
+ * (`elapsedMs`, `livePeaks`). Tokens only; the label comes via props.
12
+ */
13
+ export const RecordingBar = ({ elapsedMs, livePeaks, recordingLabel = 'Recording', className = '', }) => {
14
+ const classes = ['muka-recording-bar', className].filter(Boolean).join(' ');
15
+ return (_jsxs("div", { className: classes, role: "status", "aria-label": recordingLabel, children: [_jsx("span", { className: "muka-recording-bar__dot", "aria-hidden": "true" }), _jsx("span", { className: "muka-recording-bar__time", children: formatClock(elapsedMs / 1000) }), _jsx("div", { className: "muka-recording-bar__wave", children: _jsx(Waveform, { peaks: livePeaks, progress: 1 }) })] }));
16
+ };
17
+ export default RecordingBar;
18
+ //# sourceMappingURL=RecordingBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordingBar.js","sourceRoot":"","sources":["../../../../components/RecordingBar/RecordingBar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,oBAAoB,CAAC;AAgB5B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EACxD,SAAS,EACT,SAAS,EACT,cAAc,GAAG,WAAW,EAC5B,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5E,OAAO,CACL,eAAK,SAAS,EAAE,OAAO,EAAE,IAAI,EAAC,QAAQ,gBAAa,cAAc,aAC/D,eAAM,SAAS,EAAC,yBAAyB,iBAAa,MAAM,GAAG,EAC/D,eAAM,SAAS,EAAC,0BAA0B,YAAE,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAQ,EACjF,cAAK,SAAS,EAAC,0BAA0B,YACvC,KAAC,QAAQ,IAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAI,GACvC,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { RecordingBar } from './RecordingBar';
2
+ export { default } from './RecordingBar';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/RecordingBar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
@@ -63,10 +63,15 @@ autoComplete = 'off', autoCorrect = 'off', spellCheck = false, onKeyDown, onFocu
63
63
  }, onBlur: (e) => {
64
64
  setFocused(false);
65
65
  onBlur?.(e);
66
- }, onKeyDown: handleKeyDown, placeholder: placeholder, disabled: disabled, autoFocus: autoFocus, "aria-label": ariaLabel || placeholder,
66
+ }, onKeyDown: handleKeyDown, placeholder: placeholder, disabled: disabled,
67
+ // Not an unconditional autofocus: this forwards the consumer's own
68
+ // opt-in `autoFocus` prop, which defaults to false. The caller
69
+ // decides, exactly as with a native <input>.
70
+ // eslint-disable-next-line jsx-a11y/no-autofocus
71
+ autoFocus: autoFocus, "aria-label": ariaLabel || placeholder,
67
72
  // The browser-supplied clear icon is hidden in CSS via the
68
73
  // `-webkit-search-cancel-button` pseudo-element — we render our own.
69
- autoComplete: autoComplete, autoCorrect: autoCorrect, spellCheck: spellCheck }), loading && (_jsx("span", { className: "muka-search-input__trailing", children: _jsx(Spinner, { size: "sm", variant: "subtle" }) })), showClear && (_jsx("button", { type: "button", className: "muka-search-input__clear", onClick: handleClear, "aria-label": "Clear search", tabIndex: -1, children: _jsx(Icon, { name: "close", variant: "line", size: "sm" }) }))] }), showCancel && (_jsx("button", { type: "button", className: "muka-search-input__cancel", onClick: handleCancel, children: cancelLabel }))] }));
74
+ autoComplete: autoComplete, autoCorrect: autoCorrect, spellCheck: spellCheck }), loading && (_jsx("span", { className: "muka-search-input__trailing", children: _jsx(Spinner, { size: "sm", variant: "subtle" }) })), showClear && (_jsx("button", { type: "button", className: "muka-search-input__clear", onClick: handleClear, "aria-label": "Clear search", children: _jsx(Icon, { name: "close", variant: "line", size: "sm" }) }))] }), showCancel && (_jsx("button", { type: "button", className: "muka-search-input__cancel", onClick: handleCancel, children: cancelLabel }))] }));
70
75
  });
71
76
  SearchInput.displayName = 'SearchInput';
72
77
  export default SearchInput;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchInput.js","sourceRoot":"","sources":["../../../../components/SearchInput/SearchInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SearchInput.js","sourceRoot":"","sources":["../../../../components/SearchInput/SearchInput.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /* TextLink Component Styles - Using Muka Design Tokens */
2
+
3
+ .muka-text-link {
4
+ display: inline;
5
+ cursor: pointer;
6
+ text-decoration: underline;
7
+ /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
8
+ text-underline-offset: 0.2em;
9
+ text-decoration-thickness: from-font;
10
+ /* Rounds the focus ring's corners; the link itself has no visible box. */
11
+ border-radius: var(--border-radius-sm);
12
+ transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
13
+ }
14
+
15
+ /* ─── Sizes ───────────────────────────────────────────────
16
+ Mirrors the body text scale so a link matches the copy it sits in. */
17
+ .muka-text-link--sm {
18
+ font-family: var(--text-body-sm-regular-fontFamily);
19
+ font-weight: var(--text-body-sm-regular-fontWeight);
20
+ font-size: var(--text-body-sm-regular-fontSize);
21
+ line-height: var(--text-body-sm-regular-lineHeight);
22
+ }
23
+
24
+ .muka-text-link--base {
25
+ font-family: var(--text-body-base-regular-fontFamily);
26
+ font-weight: var(--text-body-base-regular-fontWeight);
27
+ font-size: var(--text-body-base-regular-fontSize);
28
+ line-height: var(--text-body-base-regular-lineHeight);
29
+ }
30
+
31
+ .muka-text-link--lg {
32
+ font-family: var(--text-body-lg-regular-fontFamily);
33
+ font-weight: var(--text-body-lg-regular-fontWeight);
34
+ font-size: var(--text-body-lg-regular-fontSize);
35
+ line-height: var(--text-body-lg-regular-lineHeight);
36
+ }
37
+
38
+ /* ─── Variant: default (accent) ───────────────────────────
39
+ Visited repeats the default colour on purpose: the design treats visited and
40
+ default the same, and pinning it stops the browser's purple from showing. */
41
+ .muka-text-link--default,
42
+ .muka-text-link--default:visited {
43
+ color: var(--color-text-action-default);
44
+ }
45
+
46
+ .muka-text-link--default:hover,
47
+ .muka-text-link--default:focus-visible {
48
+ color: var(--color-text-action-hover);
49
+ }
50
+
51
+ .muka-text-link--default:active {
52
+ color: var(--color-text-action-pressed);
53
+ }
54
+
55
+ /* ─── Variant: subtle (neutral) ───────────────────────────
56
+ Hover, focus and pressed all darken to the default text colour. */
57
+ .muka-text-link--subtle,
58
+ .muka-text-link--subtle:visited {
59
+ color: var(--color-text-subtle-default);
60
+ }
61
+
62
+ .muka-text-link--subtle:hover,
63
+ .muka-text-link--subtle:focus-visible,
64
+ .muka-text-link--subtle:active {
65
+ color: var(--color-text-default-default);
66
+ }
67
+
68
+ /* ─── Focus ───────────────────────────────────────────────
69
+ Same ring as every other focusable Muka component. */
70
+ .muka-text-link:focus-visible {
71
+ outline: 2px solid var(--color-border-focus);
72
+ outline-offset: 2px;
73
+ }
74
+
75
+ @media (prefers-reduced-motion: reduce) {
76
+ .muka-text-link {
77
+ transition: none;
78
+ }
79
+ }
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import './TextLink.css';
3
+ /**
4
+ * TextLink Component
5
+ *
6
+ * An underlined inline text link. Renders a native `<a>`, so `href`, `target`,
7
+ * `rel`, `download` and the rest of the anchor attributes pass straight through.
8
+ *
9
+ * Variants: default (accent), subtle (neutral)
10
+ * Sizes: sm, base, lg
11
+ * States: hover, focus-visible, pressed. Visited is pinned to the default colour
12
+ * so the browser's purple never leaks in.
13
+ */
14
+ export const TextLink = ({ children, variant = 'default', size = 'base', className = '', ...props }) => {
15
+ const linkClasses = [
16
+ 'muka-text-link',
17
+ `muka-text-link--${variant}`,
18
+ `muka-text-link--${size}`,
19
+ className,
20
+ ].filter(Boolean).join(' ');
21
+ return (_jsx("a", { className: linkClasses, ...props, children: children }));
22
+ };
23
+ export default TextLink;
24
+ //# sourceMappingURL=TextLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextLink.js","sourceRoot":"","sources":["../../../../components/TextLink/TextLink.tsx"],"names":[],"mappings":";AACA,OAAO,gBAAgB,CAAC;AAoBxB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA4B,CAAC,EAChD,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,MAAM,EACb,SAAS,GAAG,EAAE,EACd,GAAG,KAAK,EACT,EAAE,EAAE;IACH,MAAM,WAAW,GAAG;QAClB,gBAAgB;QAChB,mBAAmB,OAAO,EAAE;QAC5B,mBAAmB,IAAI,EAAE;QACzB,SAAS;KACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5B,OAAO,CACL,YAAG,SAAS,EAAE,WAAW,KAAM,KAAK,YACjC,QAAQ,GACP,CACL,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { TextLink } from './TextLink';
2
+ export { default } from './TextLink';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/TextLink/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,29 @@
1
+ /* VoiceMessage Component Styles */
2
+
3
+ .muka-voice-message {
4
+ display: flex;
5
+ align-items: center;
6
+ gap: var(--spacing-3);
7
+ width: 100%;
8
+ min-width: min(16rem, 60vw);
9
+ }
10
+
11
+ .muka-voice-message__wave {
12
+ flex: 1 1 auto;
13
+ min-width: 0;
14
+ }
15
+
16
+ .muka-voice-message__time {
17
+ flex: 0 0 auto;
18
+ white-space: nowrap;
19
+ font-size: var(--text-label-sm-fontSize, 0.75rem);
20
+ line-height: var(--text-label-sm-lineHeight, 1);
21
+ font-variant-numeric: tabular-nums;
22
+ color: var(--color-text-subtle-default);
23
+ }
24
+
25
+ /* On the tinted own bubble the surface is the action color, so the timer flips
26
+ * to the inverse text token for contrast. */
27
+ .muka-voice-message--own .muka-voice-message__time {
28
+ color: var(--color-text-default-inverse);
29
+ }