@crievo/omni 0.1.2 → 0.1.4

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 (122) hide show
  1. package/docs/onboarding.md +69 -161
  2. package/omnivideo.config.example.json +1 -1
  3. package/package.json +2 -1
  4. package/reference/learnings.md +12 -0
  5. package/reference/omnichat.md +5 -4
  6. package/reference/publish.md +9 -9
  7. package/reference/studio.md +1 -1
  8. package/studio/api/app.ts +2 -2
  9. package/studio/api/routes/sound.ts +22 -3
  10. package/studio/api/services/onboarding.ts +242 -21
  11. package/studio/api/services/settings.ts +4 -2
  12. package/studio/api/services/sound.ts +45 -0
  13. package/studio/shared/types/api.ts +26 -1
  14. package/studio/studio.ts +1 -0
  15. package/studio/web/components/AppShell.tsx +3 -1
  16. package/studio/web/components/CloneVoiceDialog/RecordStep.tsx +3 -0
  17. package/studio/web/components/CloneVoiceDialog/RecorderBar.tsx +37 -20
  18. package/studio/web/components/CloneVoiceDialog/useCloneVoice.ts +39 -12
  19. package/studio/web/components/MissingDmsPanel/BatchSend.tsx +13 -4
  20. package/studio/web/components/Omni/OmniWidget.tsx +14 -5
  21. package/studio/web/components/Omni/PendingActions.tsx +25 -6
  22. package/studio/web/components/OmnichatRulePanel/RuleConfig.tsx +13 -3
  23. package/studio/web/components/OmnichatRulePanel/RuleEnableConfirm.tsx +14 -4
  24. package/studio/web/components/ResultMessage.tsx +12 -3
  25. package/studio/web/components/Sidebar.tsx +63 -24
  26. package/studio/web/components/StageStepper.tsx +105 -34
  27. package/studio/web/components/Toaster.tsx +25 -0
  28. package/studio/web/components/VoiceCarousel.tsx +19 -16
  29. package/studio/web/components/VoiceProfilesSettings.tsx +8 -3
  30. package/studio/web/components/bencho/ActionNode.tsx +456 -0
  31. package/studio/web/components/bencho/AssigneePicker.tsx +246 -0
  32. package/studio/web/components/bencho/BenchoScope.tsx +8 -0
  33. package/studio/web/components/bencho/Checklist.tsx +421 -0
  34. package/studio/web/components/bencho/CreateMenu.tsx +258 -0
  35. package/studio/web/components/bencho/GenerateImage.tsx +290 -0
  36. package/studio/web/components/bencho/ImageAccordion.tsx +273 -0
  37. package/studio/web/components/bencho/LiquidToggle.tsx +289 -0
  38. package/studio/web/components/bencho/MagnifyDock.tsx +200 -0
  39. package/studio/web/components/bencho/NowPlaying.tsx +403 -0
  40. package/studio/web/components/bencho/OneTimeCode.tsx +374 -0
  41. package/studio/web/components/bencho/PullToRefresh.tsx +527 -0
  42. package/studio/web/components/bencho/SlideToConfirm.tsx +385 -0
  43. package/studio/web/components/bencho/SloshSlider.tsx +394 -0
  44. package/studio/web/components/bencho/StackedBars.tsx +342 -0
  45. package/studio/web/components/bencho/ToastStack.tsx +263 -0
  46. package/studio/web/components/bencho/UploadDropzone.tsx +394 -0
  47. package/studio/web/components/bencho/VoiceNote.tsx +705 -0
  48. package/studio/web/components/icons.tsx +27 -0
  49. package/studio/web/components/ui/slider.tsx +34 -1
  50. package/studio/web/components/ui/switch.tsx +18 -5
  51. package/studio/web/hooks/useOnboarding.ts +24 -6
  52. package/studio/web/index.html +1 -1
  53. package/studio/web/lib/alerts.ts +10 -0
  54. package/studio/web/lib/omni-panel.ts +4 -1
  55. package/studio/web/lib/toast.ts +196 -0
  56. package/studio/web/lib/upload.ts +24 -0
  57. package/studio/web/pages/BenchoPage/index.tsx +74 -0
  58. package/studio/web/pages/BenchoPage/registry.ts +174 -0
  59. package/studio/web/pages/GettingStartedPage/components/ComputerCard.tsx +102 -0
  60. package/studio/web/pages/GettingStartedPage/index.tsx +84 -58
  61. package/studio/web/pages/NewVideoPage/index.tsx +6 -2
  62. package/studio/web/pages/ReferencesPage/index.tsx +4 -1
  63. package/studio/web/pages/SettingsPage/components/AgentAccounts.tsx +30 -3
  64. package/studio/web/pages/VideoPage/components/ChangedVoices.tsx +14 -17
  65. package/studio/web/pages/VideoPage/components/LineTextEditor.tsx +1 -1
  66. package/studio/web/pages/VideoPage/components/PublishForm.tsx +24 -17
  67. package/studio/web/pages/VideoPage/components/ScheduledInfo.tsx +2 -1
  68. package/studio/web/pages/VideoPage/components/SoundTimeline/AddSound.tsx +12 -14
  69. package/studio/web/pages/VideoPage/components/SoundTimeline/BedRow.tsx +27 -11
  70. package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionSaveBar.tsx +22 -18
  71. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineFooter.tsx +3 -4
  72. package/studio/web/pages/VideoPage/components/SoundTimeline/UploadTrack.tsx +59 -0
  73. package/studio/web/pages/VideoPage/components/SoundTimeline/useSoundTimeline.ts +1 -0
  74. package/studio/web/pages/VideoPage/components/VoicePauseBanner.tsx +4 -6
  75. package/studio/web/pages/VideoPage/index.tsx +4 -0
  76. package/studio/web/pages/VideosPage/components/VideoRow.tsx +2 -4
  77. package/studio/web/router.tsx +8 -0
  78. package/studio/web/styles/components/bencho/action-node.css +227 -0
  79. package/studio/web/styles/components/bencho/checklist.css +182 -0
  80. package/studio/web/styles/components/bencho/dock.css +188 -0
  81. package/studio/web/styles/components/bencho/gallery.css +109 -0
  82. package/studio/web/styles/components/bencho/generate.css +151 -0
  83. package/studio/web/styles/components/bencho/image-accordion.css +37 -0
  84. package/studio/web/styles/components/bencho/liq-create.css +279 -0
  85. package/studio/web/styles/components/bencho/liq-toggle.css +106 -0
  86. package/studio/web/styles/components/bencho/one-time-code.css +148 -0
  87. package/studio/web/styles/components/bencho/picker.css +204 -0
  88. package/studio/web/styles/components/bencho/pull.css +313 -0
  89. package/studio/web/styles/components/bencho/scope.css +42 -0
  90. package/studio/web/styles/components/bencho/slide-confirm.css +139 -0
  91. package/studio/web/styles/components/bencho/slosh.css +137 -0
  92. package/studio/web/styles/components/bencho/sound.css +260 -0
  93. package/studio/web/styles/components/bencho/stacked-bars.css +334 -0
  94. package/studio/web/styles/components/bencho/toast-stack.css +192 -0
  95. package/studio/web/styles/components/bencho/tokens.css +243 -0
  96. package/studio/web/styles/components/bencho/upload-dropzone.css +352 -0
  97. package/studio/web/styles/components/bencho/voice-note.css +337 -0
  98. package/studio/web/styles/components/clone-voice.css +12 -2
  99. package/studio/web/styles/components/omni.css +6 -1
  100. package/studio/web/styles/components/stepper.css +123 -7
  101. package/studio/web/styles/components/toaster.css +10 -0
  102. package/studio/web/styles/components/ui/slider.css +6 -16
  103. package/studio/web/styles/components/ui/switch.css +2 -41
  104. package/studio/web/styles/components/voice-carousel.css +46 -4
  105. package/studio/web/styles/index.css +23 -0
  106. package/studio/web/styles/pages/getting-started.css +46 -0
  107. package/studio/web/styles/pages/settings/shell.css +4 -0
  108. package/studio/web/styles/pages/video/layout.css +1 -4
  109. package/studio/web/styles/pages/video/sound-timeline.css +8 -0
  110. package/studio/web/styles/theme/identity/shell.css +10 -26
  111. package/tools/lib/agents.mjs +24 -13
  112. package/tools/lib/claude-settings.mjs +32 -3
  113. package/tools/lib/deps.mjs +24 -0
  114. package/tools/lib/platforms/instagram.mjs +1 -1
  115. package/tools/lib/up.mjs +5 -2
  116. package/tools/omni.mjs +7 -5
  117. package/tools/omnichat.mjs +5 -7
  118. package/tools/package.mjs +5 -3
  119. package/tools/publish.mjs +40 -137
  120. package/tools/reference.mjs +1 -1
  121. package/tools/setup.mjs +16 -15
  122. package/tools/sound.mjs +67 -3
@@ -0,0 +1,334 @@
1
+ /* Stacked bars (components/bencho/StackedBars.tsx), as on bencho.dev (MIT).
2
+ Colours are the reference's own: the palette in data-colour="on", or ink mixed toward the slab in Mono. Nothing
3
+ here is faded: the others step back by mixing toward the slab. */
4
+ .bn-stb {
5
+ --stb-c1: color-mix(in srgb, var(--fill-on, #17181a) 100%, var(--fill-slab, #ffffff));
6
+ --stb-c2: color-mix(in srgb, var(--fill-on, #17181a) 78%, var(--fill-slab, #ffffff));
7
+ --stb-c3: color-mix(in srgb, var(--fill-on, #17181a) 60%, var(--fill-slab, #ffffff));
8
+ --stb-c4: color-mix(in srgb, var(--fill-on, #17181a) 44%, var(--fill-slab, #ffffff));
9
+ --stb-c5: color-mix(in srgb, var(--fill-on, #17181a) 32%, var(--fill-slab, #ffffff));
10
+ --stb-c6: color-mix(in srgb, var(--fill-on, #17181a) 22%, var(--fill-slab, #ffffff));
11
+ --stb-alert: color-mix(in srgb, var(--fill-on, #17181a) 100%, var(--fill-slab, #ffffff));
12
+ --stb-soft: color-mix(in srgb, var(--fill-on, #17181a) 72%, var(--fill-slab, #ffffff));
13
+ --stb-mute: color-mix(in srgb, var(--fill-on, #17181a) 52%, var(--fill-slab, #ffffff));
14
+ --stb-faint: color-mix(in srgb, var(--fill-on, #17181a) 32%, var(--fill-slab, #ffffff));
15
+ --stb-w6: color-mix(in srgb, var(--fill-on, #17181a) 6%, transparent);
16
+ --stb-w12: color-mix(in srgb, var(--fill-on, #17181a) 12%, transparent);
17
+ position: relative;
18
+ display: flex;
19
+ flex-direction: column;
20
+ gap: 16px;
21
+ padding: 16px;
22
+ box-sizing: border-box;
23
+ border-radius: 20px;
24
+ background: var(--fill-slab, #ffffff);
25
+ color: var(--fill-on, #17181a);
26
+ font-family: var(--font-ui);
27
+ font-size: 13px;
28
+ user-select: none;
29
+ -webkit-user-select: none;
30
+ }
31
+
32
+ .bn-stb[data-colour="on"] {
33
+ --stb-c1: #9d7bf5;
34
+ --stb-c2: #5b8def;
35
+ --stb-c3: #9ab8db;
36
+ --stb-c4: #f2c46d;
37
+ --stb-c5: #74dcae;
38
+ --stb-c6: #e57bb8;
39
+ --stb-alert: #e5484d;
40
+ }
41
+
42
+ [data-stroke="on"] .bn-stb {
43
+ box-shadow: 0 0 0 1px var(--pane-edge);
44
+ }
45
+
46
+ /* header: icon tile, title, Day / Week */
47
+ .bn-stb-head {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 12px;
51
+ }
52
+
53
+ .bn-stb-titles {
54
+ flex: 1;
55
+ min-width: 0;
56
+ }
57
+
58
+ .bn-stb-title {
59
+ font-size: 14px;
60
+ font-weight: 500;
61
+ letter-spacing: -0.01em;
62
+ line-height: 18px;
63
+ }
64
+
65
+ .bn-stb-sub {
66
+ font-size: 12px;
67
+ color: var(--stb-mute);
68
+ line-height: 16px;
69
+ font-variant-numeric: tabular-nums;
70
+ }
71
+
72
+ .bn-stb-seg-ctl {
73
+ position: relative;
74
+ display: grid;
75
+ grid-template-columns: 1fr 1fr;
76
+ padding: 2px;
77
+ border-radius: 10px;
78
+ background: var(--stb-w6);
79
+ }
80
+
81
+ .bn-stb-thumb {
82
+ position: absolute;
83
+ top: 2px;
84
+ bottom: 2px;
85
+ left: 2px;
86
+ width: calc(50% - 2px);
87
+ border-radius: 8px;
88
+ background: var(--fill-slab, #ffffff);
89
+ transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1);
90
+ }
91
+
92
+ .bn-stb-seg-ctl[data-mode="Week"] .bn-stb-thumb {
93
+ transform: translateX(100%);
94
+ }
95
+
96
+ .bn-stb-tab {
97
+ position: relative;
98
+ appearance: none;
99
+ border: 0;
100
+ background: none;
101
+ padding: 0 10px;
102
+ height: 28px;
103
+ font: inherit;
104
+ font-size: 12px;
105
+ font-weight: 500;
106
+ color: var(--stb-mute);
107
+ cursor: pointer;
108
+ border-radius: 8px;
109
+ transition:
110
+ color 160ms ease,
111
+ scale 160ms cubic-bezier(0.22, 1, 0.36, 1);
112
+ }
113
+
114
+ .bn-stb-tab[data-on] {
115
+ color: var(--fill-on, #17181a);
116
+ }
117
+
118
+ .bn-stb-tab:hover:not([data-on]) {
119
+ color: var(--stb-soft);
120
+ }
121
+
122
+ .bn-stb-tab:active {
123
+ scale: 0.96;
124
+ }
125
+
126
+ .bn-stb-tab:focus-visible {
127
+ outline: 2px solid #2231dd;
128
+ outline-offset: 0;
129
+ }
130
+
131
+ /* the one figure */
132
+ .bn-stb-figure {
133
+ display: flex;
134
+ align-items: baseline;
135
+ gap: 8px;
136
+ margin-bottom: -4px;
137
+ }
138
+
139
+ .bn-stb-num {
140
+ font-size: 30px;
141
+ font-weight: 500;
142
+ letter-spacing: -0.03em;
143
+ line-height: 32px;
144
+ font-variant-numeric: tabular-nums;
145
+ }
146
+
147
+ .bn-stb-unit {
148
+ font-size: 13px;
149
+ color: var(--stb-mute);
150
+ }
151
+
152
+ /* Price flow's pop in: each character rises a touch from below, out
153
+ of a slight blur and from nothing, a hair past its mark — left to
154
+ right, 70ms apart */
155
+ .bn-stb-digit {
156
+ display: inline-block;
157
+ }
158
+
159
+ .bn-stb-digit[data-pop] {
160
+ animation: bn-stb-pop 500ms cubic-bezier(0.34, 1.45, 0.64, 1) both;
161
+ animation-delay: calc(var(--i, 0) * 70ms);
162
+ }
163
+
164
+ @media (prefers-reduced-motion: reduce) {
165
+ .bn-stb-digit[data-pop] {
166
+ animation: none;
167
+ }
168
+ }
169
+
170
+ /* the plot: absolutely placed columns, each segment its own rounded box */
171
+ .bn-stb-plot {
172
+ position: relative;
173
+ width: 100%;
174
+ touch-action: none;
175
+ cursor: crosshair;
176
+ }
177
+
178
+ .bn-stb-base {
179
+ position: absolute;
180
+ left: 0;
181
+ right: 0;
182
+ height: 1px;
183
+ background: var(--stb-w12);
184
+ }
185
+
186
+ .bn-stb-col {
187
+ position: absolute;
188
+ top: 0;
189
+ bottom: 0;
190
+ }
191
+
192
+ .bn-stb-bar,
193
+ .bn-stb-esc {
194
+ position: absolute;
195
+ left: 0;
196
+ right: 0;
197
+ border-radius: var(--stb-r);
198
+ transition:
199
+ height 600ms cubic-bezier(0.22, 1, 0.36, 1) calc(var(--i) * 14ms),
200
+ bottom 600ms cubic-bezier(0.22, 1, 0.36, 1) calc(var(--i) * 14ms),
201
+ background-color 160ms ease;
202
+ }
203
+
204
+ .bn-stb-bar {
205
+ background-color: var(--c);
206
+ }
207
+
208
+ .bn-stb-esc {
209
+ background-color: var(--stb-alert);
210
+ }
211
+
212
+ /* Mono: escalated is full ink, hatched, so it never reads as Identity */
213
+ .bn-stb[data-colour="off"] .bn-stb-esc {
214
+ background-image: repeating-linear-gradient(-45deg, transparent 0 1.5px, var(--fill-slab, #ffffff) 1.5px 3px);
215
+ }
216
+
217
+ /* scrubbing: the others step back by mixing toward the slab */
218
+ .bn-stb[data-scrub] .bn-stb-col:not([data-on]) .bn-stb-bar {
219
+ background-color: color-mix(in srgb, var(--c) 38%, var(--fill-slab, #ffffff));
220
+ }
221
+
222
+ .bn-stb[data-scrub] .bn-stb-col:not([data-on]) .bn-stb-esc {
223
+ background-color: color-mix(in srgb, var(--stb-alert) 38%, var(--fill-slab, #ffffff));
224
+ }
225
+
226
+ .bn-stb-ring {
227
+ position: absolute;
228
+ top: 0;
229
+ left: 0;
230
+ box-sizing: border-box;
231
+ border: 1.5px solid var(--stb-mute);
232
+ border-radius: var(--stb-rr);
233
+ pointer-events: none;
234
+ opacity: 0;
235
+ transition: opacity 160ms ease;
236
+ }
237
+
238
+ .bn-stb[data-scrub] .bn-stb-ring {
239
+ opacity: 1;
240
+ }
241
+
242
+ /* the tooltip: beside the column, gliding on a spring */
243
+ .bn-stb-tip {
244
+ position: absolute;
245
+ top: 0;
246
+ left: 0;
247
+ box-sizing: border-box;
248
+ display: flex;
249
+ flex-direction: column;
250
+ gap: 4px;
251
+ padding: 8px 10px;
252
+ border-radius: 10px;
253
+ background: var(--fill-slab, #ffffff);
254
+ /* filled like the card, parted from the bars by a soft grey hairline */
255
+ border: 1px solid color-mix(in srgb, var(--fill-on, #17181a) 10%, var(--fill-slab, #ffffff));
256
+ font-size: 12px;
257
+ line-height: 16px;
258
+ pointer-events: none;
259
+ opacity: 0;
260
+ transition: opacity 160ms ease;
261
+ }
262
+
263
+ .bn-stb[data-scrub] .bn-stb-tip {
264
+ opacity: 1;
265
+ }
266
+
267
+ .bn-stb-tip-head,
268
+ .bn-stb-tip-row {
269
+ display: flex;
270
+ align-items: center;
271
+ gap: 6px;
272
+ white-space: nowrap;
273
+ }
274
+
275
+ .bn-stb-tip-head {
276
+ justify-content: space-between;
277
+ color: var(--stb-mute);
278
+ margin-bottom: 2px;
279
+ }
280
+
281
+ .bn-stb-tip b {
282
+ font-weight: 500;
283
+ font-variant-numeric: tabular-nums;
284
+ color: var(--fill-on, #17181a);
285
+ }
286
+
287
+ .bn-stb-tip-row span {
288
+ flex: 1;
289
+ color: var(--stb-soft);
290
+ }
291
+
292
+ .bn-stb-tip-row b {
293
+ font-weight: 400;
294
+ }
295
+
296
+ .bn-stb-tip-row i {
297
+ flex: none;
298
+ width: 8px;
299
+ height: 8px;
300
+ border-radius: 2px;
301
+ background-color: var(--c);
302
+ }
303
+
304
+ .bn-stb-tip-row[data-esc] i {
305
+ background-color: var(--stb-alert);
306
+ }
307
+
308
+ .bn-stb[data-colour="off"] .bn-stb-tip-row[data-esc] i {
309
+ background-image: repeating-linear-gradient(-45deg, transparent 0 1.5px, var(--fill-slab, #ffffff) 1.5px 3px);
310
+ }
311
+
312
+ /* one tiny footer: first and last date */
313
+ .bn-stb-axis {
314
+ display: flex;
315
+ justify-content: space-between;
316
+ margin-top: -8px;
317
+ font-size: 11px;
318
+ line-height: 14px;
319
+ color: var(--stb-faint);
320
+ font-variant-numeric: tabular-nums;
321
+ }
322
+
323
+ @keyframes bn-stb-pop {
324
+ from {
325
+ transform: translateY(0.18em);
326
+ opacity: 0;
327
+ filter: blur(2px);
328
+ }
329
+ to {
330
+ transform: none;
331
+ opacity: 1;
332
+ filter: blur(0);
333
+ }
334
+ }
@@ -0,0 +1,192 @@
1
+ /* Toast stack (components/bencho/ToastStack.tsx), as on bencho.dev.
2
+ Three toasts stacked, fanning into a list on hover. Tones are the
3
+ reference's: the front one white, the tucked ones a barely-there
4
+ 2% grey — both the same, so they read as paper behind paper rather
5
+ than a darkening ramp. Where the reference separates them with a
6
+ soft shadow, this uses a faint hairline (no drop shadows on the
7
+ bench). Status icons are their own solid colours, never faded.
8
+
9
+ The frame takes no clicks of its own: the toasts hang from its bottom edge and the open list grows up past it, so
10
+ only the toasts (and, while open, the gap above each one) are hit. That is what lets the real stack sit in a corner
11
+ of the screen without blocking what is under its empty part. */
12
+ .bn-tst {
13
+ position: relative;
14
+ pointer-events: none;
15
+ font-family: var(--font-ui);
16
+ color: var(--fill-on, var(--ink));
17
+ --tst-mute: color-mix(in srgb, var(--fill-on, #17181a) 52%, var(--fill-slab, #ffffff));
18
+ --tst-wash: color-mix(in srgb, var(--fill-on, #17181a) 6%, var(--fill-slab, #ffffff));
19
+ }
20
+
21
+ .bn-tst-toast {
22
+ position: absolute;
23
+ left: 0;
24
+ bottom: 0;
25
+ width: 100%;
26
+ pointer-events: auto;
27
+ box-sizing: border-box;
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 12px;
31
+ padding: 0 12px 0 16px;
32
+ border-radius: var(--tst-r);
33
+ background: var(--fill-slab, #ffffff);
34
+ transform-origin: 50% 0;
35
+ transition:
36
+ background-color 220ms ease,
37
+ box-shadow 220ms ease;
38
+ }
39
+
40
+ /* open, the gap above a toast is part of it, so the pointer crossing from one to the next never leaves the stack */
41
+ .bn-tst[data-open] .bn-tst-toast::before {
42
+ content: "";
43
+ position: absolute;
44
+ left: 0;
45
+ right: 0;
46
+ bottom: 100%;
47
+ height: var(--tst-gap, 10px);
48
+ }
49
+
50
+ /* floating over a page, a toast needs an edge and a lift the gallery's card gives it for free */
51
+ .bn-tst[data-floating] .bn-tst-toast {
52
+ box-shadow:
53
+ 0 0 0 1px color-mix(in srgb, var(--fill-on, #17181a) 8%, transparent),
54
+ 0 10px 28px rgba(var(--shadow-rgb, 23, 24, 26), 0.16);
55
+ }
56
+
57
+ /* tucked: the same near-white for both, and a faint edge so each
58
+ sliver has a line to read by */
59
+ .bn-tst:not([data-open]) .bn-tst-toast:not([data-front]) {
60
+ background: color-mix(in srgb, var(--fill-on, #17181a) 6%, var(--fill-slab, #ffffff));
61
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--fill-on, #17181a) 6%, transparent);
62
+ }
63
+
64
+ [data-stroke="on"] .bn-tst-toast {
65
+ box-shadow: 0 0 0 1px var(--pane-edge);
66
+ }
67
+
68
+ /* only the front one is read while stacked; the rest are slivers */
69
+ .bn-tst-toast > * {
70
+ transition: opacity 220ms ease;
71
+ }
72
+
73
+ .bn-tst:not([data-open]) .bn-tst-toast:not([data-front]) > * {
74
+ opacity: 0;
75
+ }
76
+
77
+ .bn-tst-icon {
78
+ flex: none;
79
+ display: grid;
80
+ place-items: center;
81
+ }
82
+
83
+ .bn-tst-toast[data-kind="success"] .bn-tst-icon {
84
+ color: #1f9d55;
85
+ }
86
+
87
+ .bn-tst-toast[data-kind="error"] .bn-tst-icon {
88
+ color: #e5484d;
89
+ }
90
+
91
+ .bn-tst-toast[data-kind="warning"] .bn-tst-icon {
92
+ color: #e09a12;
93
+ }
94
+
95
+ .bn-tst-toast[data-kind="info"] .bn-tst-icon {
96
+ color: var(--tst-mute);
97
+ }
98
+
99
+ .bn-tst-text {
100
+ flex: 1;
101
+ min-width: 0;
102
+ display: flex;
103
+ flex-direction: column;
104
+ gap: 2px;
105
+ }
106
+
107
+ .bn-tst-text b {
108
+ font-size: 14px;
109
+ font-weight: 500;
110
+ line-height: 18px;
111
+ white-space: nowrap;
112
+ overflow: hidden;
113
+ text-overflow: ellipsis;
114
+ letter-spacing: -0.01em;
115
+ }
116
+
117
+ .bn-tst-text span {
118
+ font-size: 13px;
119
+ line-height: 17px;
120
+ color: var(--tst-mute);
121
+ white-space: nowrap;
122
+ overflow: hidden;
123
+ text-overflow: ellipsis;
124
+ letter-spacing: 0em;
125
+ }
126
+
127
+ /* a real message is longer than a demo's line: the body gets two (18 + 2 + 34 still fits the 64px toast) and a longer
128
+ one is cut with an ellipsis */
129
+ .bn-tst[data-floating] .bn-tst-text span {
130
+ display: -webkit-box;
131
+ -webkit-box-orient: vertical;
132
+ -webkit-line-clamp: 2;
133
+ line-clamp: 2;
134
+ white-space: normal;
135
+ overflow-wrap: anywhere;
136
+ }
137
+
138
+ .bn-tst-act {
139
+ flex: none;
140
+ height: 28px;
141
+ padding: 0 12px;
142
+ border: 0;
143
+ border-radius: 999px;
144
+ background: var(--tst-wash);
145
+ color: inherit;
146
+ font: inherit;
147
+ font-size: 13px;
148
+ font-weight: 500;
149
+ cursor: pointer;
150
+ transition: scale 160ms cubic-bezier(0.22, 1, 0.36, 1);
151
+ letter-spacing: 0em;
152
+ }
153
+
154
+ .bn-tst-act:active {
155
+ scale: 0.96;
156
+ }
157
+
158
+ .bn-tst-x {
159
+ flex: none;
160
+ width: 28px;
161
+ height: 28px;
162
+ display: grid;
163
+ place-items: center;
164
+ border: 0;
165
+ border-radius: 999px;
166
+ background: none;
167
+ color: var(--tst-mute);
168
+ cursor: pointer;
169
+ transition:
170
+ background-color 160ms ease,
171
+ color 160ms ease;
172
+ }
173
+
174
+ .bn-tst-x:hover {
175
+ background: var(--tst-wash);
176
+ color: var(--fill-on, var(--ink));
177
+ }
178
+
179
+ .bn-tst-act:focus-visible,
180
+ .bn-tst-x:focus-visible {
181
+ outline: none;
182
+ box-shadow: 0 0 0 2px var(--signal, #2231dd);
183
+ }
184
+
185
+ @media (prefers-reduced-motion: reduce) {
186
+ .bn-tst-toast,
187
+ .bn-tst-toast > *,
188
+ .bn-tst-act,
189
+ .bn-tst-x {
190
+ transition: none;
191
+ }
192
+ }