@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 {
@@ -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,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,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,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,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
+ }
@@ -0,0 +1,23 @@
1
+ /* Waveform Component Styles */
2
+
3
+ /*
4
+ * A row of amplitude bars. Muka ships no audio/waveform primitive; this is
5
+ * drawn from color + spacing tokens only. Bar height (per-peak magnitude) and
6
+ * the played/unplayed color split are data-driven, so they arrive as inline
7
+ * styles from the component; everything else is tokenized here.
8
+ */
9
+ .muka-waveform {
10
+ display: flex;
11
+ align-items: center;
12
+ gap: var(--spacing-05, 2px);
13
+ width: 100%;
14
+ min-width: 0;
15
+ }
16
+
17
+ .muka-waveform__bar {
18
+ flex: 1 1 0;
19
+ min-width: 2px;
20
+ max-width: 4px;
21
+ border-radius: var(--radius-full, 9999px);
22
+ background: var(--color-border-contrast);
23
+ }