plain-toast 1.0.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/LICENSE +21 -0
- package/README.md +515 -0
- package/dist/plain-toast.cjs.js +359 -0
- package/dist/plain-toast.cjs.js.map +41 -0
- package/dist/plain-toast.esm.js +359 -0
- package/dist/plain-toast.esm.js.map +41 -0
- package/dist/plain-toast.iife.js +359 -0
- package/dist/plain-toast.iife.js.map +41 -0
- package/dist/types/config.d.ts +42 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/container/create-container.d.ts +17 -0
- package/dist/types/container/create-container.d.ts.map +1 -0
- package/dist/types/container/index.d.ts +3 -0
- package/dist/types/container/index.d.ts.map +1 -0
- package/dist/types/icons/debug.d.ts +2 -0
- package/dist/types/icons/debug.d.ts.map +1 -0
- package/dist/types/icons/error.d.ts +2 -0
- package/dist/types/icons/error.d.ts.map +1 -0
- package/dist/types/icons/get-icon.d.ts +2 -0
- package/dist/types/icons/get-icon.d.ts.map +1 -0
- package/dist/types/icons/index.d.ts +14 -0
- package/dist/types/icons/index.d.ts.map +1 -0
- package/dist/types/icons/info.d.ts +2 -0
- package/dist/types/icons/info.d.ts.map +1 -0
- package/dist/types/icons/progress.d.ts +2 -0
- package/dist/types/icons/progress.d.ts.map +1 -0
- package/dist/types/icons/spinner.d.ts +2 -0
- package/dist/types/icons/spinner.d.ts.map +1 -0
- package/dist/types/icons/success.d.ts +2 -0
- package/dist/types/icons/success.d.ts.map +1 -0
- package/dist/types/icons/warning.d.ts +2 -0
- package/dist/types/icons/warning.d.ts.map +1 -0
- package/dist/types/main.d.ts +61 -0
- package/dist/types/main.d.ts.map +1 -0
- package/dist/types/main.iife.d.ts +17 -0
- package/dist/types/main.iife.d.ts.map +1 -0
- package/dist/types/styles/auto.d.ts +2 -0
- package/dist/types/styles/auto.d.ts.map +1 -0
- package/dist/types/styles/base.d.ts +2 -0
- package/dist/types/styles/base.d.ts.map +1 -0
- package/dist/types/styles/dark.d.ts +2 -0
- package/dist/types/styles/dark.d.ts.map +1 -0
- package/dist/types/styles/index.d.ts +7 -0
- package/dist/types/styles/index.d.ts.map +1 -0
- package/dist/types/styles/light.d.ts +2 -0
- package/dist/types/styles/light.d.ts.map +1 -0
- package/dist/types/toast.d.ts +33 -0
- package/dist/types/toast.d.ts.map +1 -0
- package/dist/types/toasts/close-toast.d.ts +10 -0
- package/dist/types/toasts/close-toast.d.ts.map +1 -0
- package/dist/types/toasts/create-toast.d.ts +11 -0
- package/dist/types/toasts/create-toast.d.ts.map +1 -0
- package/dist/types/toasts/default-options.d.ts +7 -0
- package/dist/types/toasts/default-options.d.ts.map +1 -0
- package/dist/types/toasts/enable-click-to-close.d.ts +9 -0
- package/dist/types/toasts/enable-click-to-close.d.ts.map +1 -0
- package/dist/types/toasts/get-options.d.ts +19 -0
- package/dist/types/toasts/get-options.d.ts.map +1 -0
- package/dist/types/toasts/index.d.ts +11 -0
- package/dist/types/toasts/index.d.ts.map +1 -0
- package/dist/types/toasts/populate-toast.d.ts +14 -0
- package/dist/types/toasts/populate-toast.d.ts.map +1 -0
- package/dist/types/toasts/types.d.ts +21 -0
- package/dist/types/toasts/types.d.ts.map +1 -0
- package/dist/types/toasts/update-toast.d.ts +13 -0
- package/dist/types/toasts/update-toast.d.ts.map +1 -0
- package/dist/types/types.d.ts +45 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils/announce.d.ts +10 -0
- package/dist/types/utils/announce.d.ts.map +1 -0
- package/dist/types/utils/deep-merge.d.ts +11 -0
- package/dist/types/utils/deep-merge.d.ts.map +1 -0
- package/dist/types/utils/inject-css.d.ts +7 -0
- package/dist/types/utils/inject-css.d.ts.map +1 -0
- package/dist/types/utils/validate-and-merge-options.d.ts +19 -0
- package/dist/types/utils/validate-and-merge-options.d.ts.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
var{defineProperty:k,getOwnPropertyNames:or,getOwnPropertyDescriptor:er}=Object,ir=Object.prototype.hasOwnProperty;var P=new WeakMap,ar=(r)=>{var t=P.get(r),n;if(t)return t;if(t=k({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")or(r).map((o)=>!ir.call(t,o)&&k(t,o,{get:()=>r[o],enumerable:!(n=er(r,o))||n.enumerable}));return P.set(r,t),t};var sr=(r,t)=>{for(var n in t)k(r,n,{get:t[n],enumerable:!0,configurable:!0,set:(o)=>t[n]=()=>o})};var l=(r,t)=>()=>(r&&(t=r(r=0)),t);var S=`/* Light theme by default */
|
|
2
|
+
:root {
|
|
3
|
+
--jt-background: var(--jt-white);
|
|
4
|
+
--jt-text: var(--jt-slate-600);
|
|
5
|
+
--jt-heading: var(--jt-slate-800);
|
|
6
|
+
--jt-border: var(--jt-slate-200);
|
|
7
|
+
--jt-progress-bar: var(--jt-slate-300);
|
|
8
|
+
|
|
9
|
+
--jt-success-icon: var(--jt-green-600);
|
|
10
|
+
--jt-success-border: var(--jt-green-600);
|
|
11
|
+
|
|
12
|
+
--jt-error-icon: var(--jt-red-500);
|
|
13
|
+
--jt-error-border: var(--jt-red-500);
|
|
14
|
+
|
|
15
|
+
--jt-warning-icon: var(--jt-yellow-500);
|
|
16
|
+
--jt-warning-border: var(--jt-yellow-400);
|
|
17
|
+
|
|
18
|
+
--jt-info-icon: var(--jt-slate-500);
|
|
19
|
+
--jt-info-border: var(--jt-slate-200);
|
|
20
|
+
|
|
21
|
+
--jt-debug-icon: var(--jt-blue-600);
|
|
22
|
+
--jt-debug-border: var(--jt-blue-600);
|
|
23
|
+
|
|
24
|
+
--jt-spinner-icon: var(--jt-slate-500);
|
|
25
|
+
--jt-spinner-border: var(--jt-slate-400);
|
|
26
|
+
|
|
27
|
+
--jt-progress-icon: var(--jt-blue-600);
|
|
28
|
+
--jt-progress-border: var(--jt-blue-600);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Dark theme when user prefers dark color scheme */
|
|
32
|
+
@media (prefers-color-scheme: dark) {
|
|
33
|
+
:root {
|
|
34
|
+
--jt-background: var(--jt-slate-800);
|
|
35
|
+
--jt-text: var(--jt-slate-300);
|
|
36
|
+
--jt-heading: var(--jt-slate-50);
|
|
37
|
+
--jt-border: var(--jt-slate-700);
|
|
38
|
+
--jt-progress-bar: var(--jt-slate-500);
|
|
39
|
+
|
|
40
|
+
--jt-success-icon: var(--jt-green-500);
|
|
41
|
+
--jt-success-border: var(--jt-green-600);
|
|
42
|
+
|
|
43
|
+
--jt-error-icon: var(--jt-red-500);
|
|
44
|
+
--jt-error-border: var(--jt-red-500);
|
|
45
|
+
|
|
46
|
+
--jt-warning-icon: var(--jt-yellow-500);
|
|
47
|
+
--jt-warning-border: var(--jt-yellow-400);
|
|
48
|
+
|
|
49
|
+
--jt-info-icon: var(--jt-slate-400);
|
|
50
|
+
--jt-info-border: var(--jt-slate-700);
|
|
51
|
+
|
|
52
|
+
--jt-debug-icon: var(--jt-blue-300);
|
|
53
|
+
--jt-debug-border: var(--jt-blue-600);
|
|
54
|
+
|
|
55
|
+
--jt-spinner-icon: var(--jt-slate-400);
|
|
56
|
+
--jt-spinner-border: var(--jt-slate-400);
|
|
57
|
+
|
|
58
|
+
--jt-progress-icon: var(--jt-blue-300);
|
|
59
|
+
--jt-progress-border: var(--jt-blue-600);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
`;var T;var L=l(()=>{T=S});var y=`:root {
|
|
63
|
+
--jt-white: #ffffff;
|
|
64
|
+
--jt-slate-50: #f8fafc;
|
|
65
|
+
--jt-slate-200: #e2e8f0;
|
|
66
|
+
--jt-slate-300: #cbd5e1;
|
|
67
|
+
--jt-slate-400: #94a3b8;
|
|
68
|
+
--jt-slate-500: #64748b;
|
|
69
|
+
--jt-slate-600: #475569;
|
|
70
|
+
--jt-slate-700: #334155;
|
|
71
|
+
--jt-slate-800: #1e293b;
|
|
72
|
+
--jt-black: #000000;
|
|
73
|
+
|
|
74
|
+
--jt-green-500: #22c55e;
|
|
75
|
+
--jt-green-600: #16a34a;
|
|
76
|
+
--jt-red-500: #ef4444;
|
|
77
|
+
--jt-yellow-400: #facc15;
|
|
78
|
+
--jt-yellow-500: #eab308;
|
|
79
|
+
--jt-blue-300: #93c5fd;
|
|
80
|
+
--jt-blue-600: #2563eb;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Animations */
|
|
84
|
+
@keyframes vt-progress-bar {
|
|
85
|
+
from {
|
|
86
|
+
width: 0%;
|
|
87
|
+
}
|
|
88
|
+
to {
|
|
89
|
+
width: 100%;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@keyframes vt-spinner {
|
|
94
|
+
0% {
|
|
95
|
+
transform: rotate(0deg);
|
|
96
|
+
}
|
|
97
|
+
100% {
|
|
98
|
+
transform: rotate(360deg);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Icons */
|
|
103
|
+
[data-jt-icon] {
|
|
104
|
+
display: flex;
|
|
105
|
+
width: 1rem;
|
|
106
|
+
height: 1rem;
|
|
107
|
+
justify-content: center;
|
|
108
|
+
align-items: center;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
[data-jt-icon][data-jt-success] {
|
|
112
|
+
color: var(--jt-success-icon);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
[data-jt-icon][data-jt-warning] {
|
|
116
|
+
color: var(--jt-warning-icon);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
[data-jt-icon][data-jt-info] {
|
|
120
|
+
color: var(--jt-info-icon);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
[data-jt-icon][data-jt-error] {
|
|
124
|
+
color: var(--jt-error-icon);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
[data-jt-icon][data-jt-debug] {
|
|
128
|
+
color: var(--jt-debug-icon);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
[data-jt-icon][data-jt-spinner] {
|
|
132
|
+
width: 1rem;
|
|
133
|
+
height: 1rem;
|
|
134
|
+
border: 2px solid var(--jt-spinner-icon);
|
|
135
|
+
border-bottom-color: transparent;
|
|
136
|
+
border-radius: 50%;
|
|
137
|
+
display: inline-block;
|
|
138
|
+
box-sizing: border-box;
|
|
139
|
+
animation: vt-spinner 1s linear infinite;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
[data-jt-icon][data-jt-progress] {
|
|
143
|
+
color: var(--jt-progress-icon);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* Toast Types */
|
|
147
|
+
[data-jt-toast][data-jt-info] {
|
|
148
|
+
border-top-color: var(--jt-info-border);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
[data-jt-toast][data-jt-success] {
|
|
152
|
+
border-top-color: var(--jt-success-border);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
[data-jt-toast][data-jt-error] {
|
|
156
|
+
border-top-color: var(--jt-error-border);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
[data-jt-toast][data-jt-warning] {
|
|
160
|
+
border-top-color: var(--jt-warning-border);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
[data-jt-toast][data-jt-debug] {
|
|
164
|
+
border-top-color: var(--jt-debug-border);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
[data-jt-toast][data-jt-spinner] {
|
|
168
|
+
border-top-color: var(--jt-spinner-border);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
[data-jt-toast][data-jt-progress] {
|
|
172
|
+
border-top-color: var(--jt-progress-border);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* Toast Base */
|
|
176
|
+
[data-jt-toast] {
|
|
177
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
|
|
178
|
+
Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
179
|
+
position: relative;
|
|
180
|
+
z-index: 99999;
|
|
181
|
+
overflow: hidden;
|
|
182
|
+
display: flex;
|
|
183
|
+
flex-direction: column;
|
|
184
|
+
flex-wrap: nowrap;
|
|
185
|
+
justify-content: center;
|
|
186
|
+
align-items: flex-start;
|
|
187
|
+
gap: 1rem;
|
|
188
|
+
width: 16rem;
|
|
189
|
+
min-height: 1rem;
|
|
190
|
+
padding: 1.25rem 1.5rem 1.5rem 1.5rem;
|
|
191
|
+
pointer-events: auto;
|
|
192
|
+
transition-property: opacity;
|
|
193
|
+
transition-duration: 200ms;
|
|
194
|
+
transition-timing-function: ease;
|
|
195
|
+
box-shadow: 0rem 0.25rem 0.75rem 0rem hsla(0, 0%, 0%, 0.09);
|
|
196
|
+
border-radius: 0.375rem;
|
|
197
|
+
font-size: 1rem;
|
|
198
|
+
background-color: var(--jt-background);
|
|
199
|
+
border-color: var(--jt-border);
|
|
200
|
+
border-style: solid;
|
|
201
|
+
border-width: 1px;
|
|
202
|
+
border-top-width: 0.5rem;
|
|
203
|
+
flex: 1 0 auto;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* Focus indicator for keyboard navigation */
|
|
207
|
+
[data-jt-toast]:focus {
|
|
208
|
+
outline: 2px solid var(--jt-focus-ring, #2563eb);
|
|
209
|
+
outline-offset: 2px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
[data-jt-heading-wrapper] {
|
|
213
|
+
display: flex;
|
|
214
|
+
justify-content: flex-start;
|
|
215
|
+
align-items: center;
|
|
216
|
+
gap: 0.5rem;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
[data-jt-heading] {
|
|
220
|
+
font-weight: 500;
|
|
221
|
+
color: var(--jt-heading);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
[data-jt-body] {
|
|
225
|
+
font-weight: 400;
|
|
226
|
+
color: var(--jt-text);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
[data-jt-progress-bar] {
|
|
230
|
+
width: 0%;
|
|
231
|
+
position: absolute;
|
|
232
|
+
bottom: 0;
|
|
233
|
+
left: 0;
|
|
234
|
+
height: 0.2rem;
|
|
235
|
+
background-color: var(--jt-progress-bar);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* Container */
|
|
239
|
+
[data-jt-container] {
|
|
240
|
+
position: fixed;
|
|
241
|
+
z-index: 9998;
|
|
242
|
+
display: flex;
|
|
243
|
+
flex-direction: column;
|
|
244
|
+
flex-wrap: nowrap;
|
|
245
|
+
gap: 0.5rem;
|
|
246
|
+
pointer-events: none;
|
|
247
|
+
max-height: 100vh;
|
|
248
|
+
overflow-y: auto;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* Position variants */
|
|
252
|
+
[data-jt-container][data-jt-position='top-right'] {
|
|
253
|
+
top: 0.5rem;
|
|
254
|
+
right: 0.5rem;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
[data-jt-container][data-jt-position='top-left'] {
|
|
258
|
+
top: 0.5rem;
|
|
259
|
+
left: 0.5rem;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
[data-jt-container][data-jt-position='bottom-right'] {
|
|
263
|
+
bottom: 0.5rem;
|
|
264
|
+
right: 0.5rem;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
[data-jt-container][data-jt-position='bottom-left'] {
|
|
268
|
+
bottom: 0.5rem;
|
|
269
|
+
left: 0.5rem;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* Reduced motion support */
|
|
273
|
+
@media (prefers-reduced-motion: reduce) {
|
|
274
|
+
[data-jt-toast] {
|
|
275
|
+
animation: none;
|
|
276
|
+
transition: none;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
[data-jt-progress-bar] {
|
|
280
|
+
animation: none;
|
|
281
|
+
transition: none;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
[data-jt-icon][data-jt-spinner] {
|
|
285
|
+
animation: none;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
`;var H;var V=l(()=>{H=y});var A=`/* Dark theme colors - WCAG AA compliant (4.5:1 contrast ratio for text) */
|
|
289
|
+
:root {
|
|
290
|
+
--jt-background: var(--jt-slate-800);
|
|
291
|
+
--jt-text: var(--jt-slate-300);
|
|
292
|
+
--jt-heading: var(--jt-slate-50);
|
|
293
|
+
--jt-border: var(--jt-slate-700);
|
|
294
|
+
--jt-progress-bar: var(--jt-slate-500);
|
|
295
|
+
|
|
296
|
+
--jt-success-icon: var(--jt-green-500);
|
|
297
|
+
--jt-success-border: var(--jt-green-600);
|
|
298
|
+
|
|
299
|
+
--jt-error-icon: var(--jt-red-500);
|
|
300
|
+
--jt-error-border: var(--jt-red-500);
|
|
301
|
+
|
|
302
|
+
--jt-warning-icon: var(--jt-yellow-500);
|
|
303
|
+
--jt-warning-border: var(--jt-yellow-400);
|
|
304
|
+
|
|
305
|
+
--jt-info-icon: var(--jt-slate-400);
|
|
306
|
+
--jt-info-border: var(--jt-slate-700);
|
|
307
|
+
|
|
308
|
+
--jt-debug-icon: var(--jt-blue-300);
|
|
309
|
+
--jt-debug-border: var(--jt-blue-600);
|
|
310
|
+
|
|
311
|
+
--jt-spinner-icon: var(--jt-slate-400);
|
|
312
|
+
--jt-spinner-border: var(--jt-slate-400);
|
|
313
|
+
|
|
314
|
+
--jt-progress-icon: var(--jt-blue-300);
|
|
315
|
+
--jt-progress-border: var(--jt-blue-600);
|
|
316
|
+
}
|
|
317
|
+
`;var z;var O=l(()=>{z=A});var Z=`/* Light theme colors - WCAG AA compliant (4.5:1 contrast ratio for text) */
|
|
318
|
+
:root {
|
|
319
|
+
--jt-background: var(--jt-white);
|
|
320
|
+
--jt-text: var(--jt-slate-600);
|
|
321
|
+
--jt-heading: var(--jt-slate-800);
|
|
322
|
+
--jt-border: var(--jt-slate-200);
|
|
323
|
+
--jt-progress-bar: var(--jt-slate-300);
|
|
324
|
+
|
|
325
|
+
--jt-success-icon: var(--jt-green-600);
|
|
326
|
+
--jt-success-border: var(--jt-green-600);
|
|
327
|
+
|
|
328
|
+
--jt-error-icon: var(--jt-red-500);
|
|
329
|
+
--jt-error-border: var(--jt-red-500);
|
|
330
|
+
|
|
331
|
+
/* Using amber-600 for better contrast on white background (WCAG AA) */
|
|
332
|
+
--jt-warning-icon: #d97706;
|
|
333
|
+
--jt-warning-border: var(--jt-yellow-400);
|
|
334
|
+
|
|
335
|
+
--jt-info-icon: var(--jt-slate-500);
|
|
336
|
+
--jt-info-border: var(--jt-slate-200);
|
|
337
|
+
|
|
338
|
+
--jt-debug-icon: var(--jt-blue-600);
|
|
339
|
+
--jt-debug-border: var(--jt-blue-600);
|
|
340
|
+
|
|
341
|
+
--jt-spinner-icon: var(--jt-slate-500);
|
|
342
|
+
--jt-spinner-border: var(--jt-slate-400);
|
|
343
|
+
|
|
344
|
+
--jt-progress-icon: var(--jt-blue-600);
|
|
345
|
+
--jt-progress-border: var(--jt-blue-600);
|
|
346
|
+
}
|
|
347
|
+
`;var G;var F=l(()=>{G=Z});var h;var N=l(()=>{L();V();O();F();h={base:H,light:G,dark:z,auto:T}});function m(r,t){Object.keys(t).forEach((n)=>{if(t[n]&&typeof t[n]==="object"&&!(t[n]instanceof Array)){if(!r[n])r[n]={};m(r[n],t[n])}else r[n]=t[n]})}function v(...r){let t=document.createElement("style");t.innerHTML=r.join(""),document.head.appendChild(t)}var U='<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_2102_1592)"><path d="M12 7.5C12 5.84315 10.6569 4.5 9 4.5C7.34315 4.5 6 5.84315 6 7.5V12C6 13.6569 7.34315 15 9 15C10.6569 15 12 13.6569 12 12V7.5Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M14.25 5.25L12 6.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M3.75 5.25L6 6.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M14.25 14.25L12 12.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M3.75 14.25L6 12.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M15 9.75H12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M3 9.75H6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M7.5 3L8.25 4.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M10.5 3L9.75 4.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></g><defs><clipPath id="clip0_2102_1592"><rect width="18" height="18" fill="white"/></clipPath></defs></svg>';var J='<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_2102_1582)"><g clip-path="url(#clip1_2102_1582)"><path d="M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M11.25 6.75L6.75 11.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.75 6.75L11.25 11.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></g></g><defs><clipPath id="clip0_2102_1582"><rect width="18" height="18" fill="white"/></clipPath><clipPath id="clip1_2102_1582"><rect width="18" height="18" fill="white"/></clipPath></defs></svg>';var R="<div></div>";var K='<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_2102_1564)"><g clip-path="url(#clip1_2102_1564)"><path d="M16.5 8.30999V8.99999C16.4991 10.6173 15.9754 12.191 15.007 13.4864C14.0386 14.7817 12.6775 15.7293 11.1265 16.1879C9.57557 16.6465 7.91794 16.5914 6.40085 16.0309C4.88376 15.4704 3.58849 14.4346 2.70822 13.0778C1.82795 11.721 1.40984 10.116 1.51626 8.50223C1.62267 6.88841 2.24791 5.35223 3.29871 4.12279C4.34951 2.89335 5.76959 2.03653 7.34714 1.6801C8.92469 1.32367 10.5752 1.48674 12.0525 2.14499" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M16.5 3L9 10.5075L6.75 8.2575" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></g></g><defs><clipPath id="clip0_2102_1564"><rect width="18" height="18" fill="white"/></clipPath><clipPath id="clip1_2102_1564"><rect width="18" height="18" fill="white"/></clipPath></defs></svg>';function Q(r){let t;switch(r){case"success":t=i.icons.success;break;case"debug":t=i.icons.debug;break;case"error":t=i.icons.error;break;case"warning":t=i.icons.warning;break;case"spinner":t=i.icons.spinner;break;case"info":t=i.icons.info;break}return t}var X=l(()=>{u()});var Y='<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_2102_1587)"><path d="M16.2976 13.5L10.2976 3C10.1667 2.76915 9.97702 2.57714 9.74776 2.44355C9.5185 2.30996 9.25791 2.23958 8.99257 2.23958C8.72723 2.23958 8.46664 2.30996 8.23738 2.44355C8.00812 2.57714 7.8184 2.76915 7.68757 3L1.68757 13.5C1.55533 13.729 1.48599 13.9889 1.48658 14.2534C1.48716 14.5178 1.55765 14.7774 1.6909 15.0059C1.82416 15.2343 2.01543 15.4234 2.24534 15.5541C2.47525 15.6848 2.73562 15.7524 3.00007 15.75H15.0001C15.2632 15.7497 15.5217 15.6802 15.7495 15.5485C15.9773 15.4167 16.1665 15.2273 16.298 14.9993C16.4294 14.7714 16.4986 14.5128 16.4985 14.2496C16.4985 13.9864 16.4292 13.7279 16.2976 13.5Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M9 6.75V9.75" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M9 12.75H9.0075" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></g><defs><clipPath id="clip0_2102_1587"><rect width="18" height="18" fill="white"/></clipPath></defs></svg>';var $='<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_2102_1792)"><path d="M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M9 12V9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M9 6H9.0075" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></g><defs><clipPath id="clip0_2102_1792"><rect width="18" height="18" fill="white"/></clipPath></defs></svg>';var q=`<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
348
|
+
<g clip-path="url(#clip0_progress)">
|
|
349
|
+
<path d="M9 1.5C13.1421 1.5 16.5 4.85786 16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
350
|
+
<path d="M9 5.25V9L11.25 11.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
351
|
+
</g>
|
|
352
|
+
<defs>
|
|
353
|
+
<clipPath id="clip0_progress">
|
|
354
|
+
<rect width="18" height="18" fill="white"/>
|
|
355
|
+
</clipPath>
|
|
356
|
+
</defs>
|
|
357
|
+
</svg>`;var I={};sr(I,{icons:()=>x});var x;var C=l(()=>{X();x={get:Q,svg:{success:K,warning:Y,error:J,debug:U,spinner:R,info:$,progress:q}}});function jr(){let{icons:r}=(C(),ar(I));return{success:r.svg.success,warning:r.svg.warning,error:r.svg.error,debug:r.svg.debug,spinner:r.svg.spinner,info:r.svg.info,progress:r.svg.progress}}function W(r){if(m(i,r),!i.injectCss)return;switch(i.theme){case"none":break;case"light":v(h.light,h.base);break;case"dark":v(h.dark,h.base);break;case"auto":v(h.auto,h.base);break}}var i;var u=l(()=>{N();i={target:void 0,position:"bottom-right",injectCss:!0,theme:"auto",get icons(){if(!this._icons)this._icons=jr();return this._icons},set icons(r){this._icons=r},_icons:void 0,announceToScreenReader:!0,ariaLive:"polite"}});u();function b(r,t){let n,{toast:o,progressBar:a}=r;if(t>0)a.style.animationName="vt-progress-bar",a.style.animationDuration=`${t}ms`,a.style.animationTimingFunction="linear",a.style.animationFillMode="forwards",o.addEventListener("mouseover",()=>{a.style.animationPlayState="paused",clearTimeout(n)}),o.addEventListener("mouseout",()=>{a.style.animationPlayState="running",n=setTimeout(()=>{o.style.opacity="0",setTimeout(()=>{if(o.parentNode)o.parentNode.removeChild(o)},250)},t)});n=setTimeout(()=>{o.style.opacity="0",setTimeout(()=>{if(o.parentNode)o.parentNode.removeChild(o)},250)},t)}function B(r){let{toast:t}=r;t.style.cursor="pointer",t.setAttribute("tabindex","0"),t.setAttribute("aria-label","Toast. Press Enter or Space to close."),t.addEventListener("click",()=>{b(r,0)}),t.addEventListener("keydown",(n)=>{if(n.key==="Enter"||n.key===" ")n.preventDefault(),b(r,0)})}C();function D(r,t,n,o,a){let s=document.createElement("div");s.setAttribute("data-jt-toast",a),s.setAttribute(`data-jt-${t}`,""),s.setAttribute("role","status"),s.setAttribute("aria-atomic","true");let c=document.createElement("div");c.setAttribute("data-jt-heading-wrapper","");let p=document.createElement("div");p.setAttribute("data-jt-icon",""),p.setAttribute(`data-jt-${t}`,""),p.innerHTML=x.get(t);let j=document.createElement("div");j.setAttribute("data-jt-heading","true"),j.textContent=n,c.appendChild(p),c.appendChild(j);let w=document.createElement("div");if(w.setAttribute("data-jt-body",""),w.textContent=o,!o)w.style.display="none";let f=document.createElement("div");return f.setAttribute("data-jt-progress-bar",""),s.appendChild(c),s.appendChild(w),s.appendChild(f),r.appendChild(s),{toast:s,container:r,headingWrapper:c,iconElement:p,headingElement:j,bodyElement:w,progressBar:f}}var g={heading:"",body:"",duration:3500,clickToClose:!0};function E(r){let t={...g,...r},n=t.heading,o=t.body,a=t.duration,s=t.clickToClose;return{heading:n,body:o,duration:a,clickToClose:s}}u();function rr(r="bottom-right"){let t=document.createElement("div");if(t.setAttribute("data-jt-container",""),t.setAttribute("data-jt-position",r),t.setAttribute("role","region"),t.setAttribute("aria-label","Toasts"),i.ariaLive)t.setAttribute("aria-live",i.ariaLive);return document.body.appendChild(t),t}function _(){if(i.target){if(typeof i.target==="string"){let t=document.querySelector(i.target);if(t)return t}else if(i.target instanceof HTMLElement)return i.target}let r=document.querySelector("[data-jt-container]");if(r)return r;return rr(i.position)}function d(r,t){let{heading:n,body:o,duration:a,clickToClose:s}=E(t);if(r==="spinner")a=null,s=!1;let c=_(),p=Math.random().toString(36).substring(2,11),j=D(c,r,n,o,p);if(a)b(j,a);if(s)B(j);return j}var tr={success:(r)=>d("success",r),error:(r)=>d("error",r),warning:(r)=>d("warning",r),debug:(r)=>d("debug",r),info:(r)=>d("info",r),spinner:(r)=>d("spinner",r),progress:(r)=>d("progress",r)};function nr(r,t){let{heading:n,body:o}=t;if(n!==void 0)r.headingElement.textContent=n;if(o!==void 0)if(o)r.bodyElement.textContent=o,r.bodyElement.style.display="block";else r.bodyElement.textContent="",r.bodyElement.style.display="none"}class M{elements=null;progressOptions;type;heading;body;duration;clickToClose;constructor({type:r,heading:t,body:n="",duration:o=g.duration,clickToClose:a=g.clickToClose,progress:s}){if(this.type=r,this.heading=t,this.body=n,this.duration=o,this.clickToClose=a,r==="progress"){if(this.progressOptions={total:s?.total||100,current:s?.current||0,showPercentage:s?.showPercentage!==!1},o===g.duration)this.duration=null}if(this.elements=tr[this.type]({heading:this.heading,body:this.body,duration:this.duration,clickToClose:this.clickToClose}),r==="progress"&&this.progressOptions)this.setProgress(this.progressOptions.current)}update(r){if(!this.elements)return;nr(this.elements,r)}setProgress(r){if(!this.elements||this.type!=="progress"||!this.progressOptions)return;let{progressBar:t,bodyElement:n,toast:o}=this.elements,a=Math.min(100,Math.max(0,r/this.progressOptions.total*100));if(t.style.width=`${a}%`,t.style.transition="width 0.3s ease",this.progressOptions.showPercentage)n.textContent=`${Math.round(a)}%`,n.style.display="block";this.progressOptions.current=r,o.dispatchEvent(new CustomEvent("vt:progress",{detail:{current:r,total:this.progressOptions.total,percentage:a}}))}incrementProgress(r=1){if(!this.progressOptions)return;this.setProgress((this.progressOptions.current||0)+r)}complete(r=2000){if(!this.progressOptions)return;if(this.setProgress(this.progressOptions.total),r>0)setTimeout(()=>{this.close()},r)}close(){if(!this.elements)return;this.elements.toast.remove(),this.elements=null}}var Ct={Toast:M,configure:W,config:i};export{Ct as default,W as configure,i as config,M as Toast};
|
|
358
|
+
|
|
359
|
+
//# debugId=3503FA789B16313B64756E2164756E21
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["css-inline:/Users/briantucker/Documents/GitHub/plain-toast/src/styles/auto.css", "../src/styles/auto.ts", "css-inline:/Users/briantucker/Documents/GitHub/plain-toast/src/styles/base.css", "../src/styles/base.ts", "css-inline:/Users/briantucker/Documents/GitHub/plain-toast/src/styles/dark.css", "../src/styles/dark.ts", "css-inline:/Users/briantucker/Documents/GitHub/plain-toast/src/styles/light.css", "../src/styles/light.ts", "../src/styles/index.ts", "../src/utils/deep-merge.ts", "../src/utils/inject-css.ts", "../src/icons/debug.ts", "../src/icons/error.ts", "../src/icons/spinner.ts", "../src/icons/success.ts", "../src/icons/get-icon.ts", "../src/icons/warning.ts", "../src/icons/info.ts", "../src/icons/progress.ts", "../src/icons/index.ts", "../src/config.ts", "../src/main.ts", "../src/toasts/close-toast.ts", "../src/toasts/enable-click-to-close.ts", "../src/toasts/populate-toast.ts", "../src/toasts/default-options.ts", "../src/toasts/get-options.ts", "../src/container/create-container.ts", "../src/toasts/create-toast.ts", "../src/toasts/index.ts", "../src/toasts/update-toast.ts", "../src/toast.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export default \"/* Light theme by default */\\n:root {\\n --jt-background: var(--jt-white);\\n --jt-text: var(--jt-slate-600);\\n --jt-heading: var(--jt-slate-800);\\n --jt-border: var(--jt-slate-200);\\n --jt-progress-bar: var(--jt-slate-300);\\n\\n --jt-success-icon: var(--jt-green-600);\\n --jt-success-border: var(--jt-green-600);\\n\\n --jt-error-icon: var(--jt-red-500);\\n --jt-error-border: var(--jt-red-500);\\n\\n --jt-warning-icon: var(--jt-yellow-500);\\n --jt-warning-border: var(--jt-yellow-400);\\n\\n --jt-info-icon: var(--jt-slate-500);\\n --jt-info-border: var(--jt-slate-200);\\n\\n --jt-debug-icon: var(--jt-blue-600);\\n --jt-debug-border: var(--jt-blue-600);\\n\\n --jt-spinner-icon: var(--jt-slate-500);\\n --jt-spinner-border: var(--jt-slate-400);\\n\\n --jt-progress-icon: var(--jt-blue-600);\\n --jt-progress-border: var(--jt-blue-600);\\n}\\n\\n/* Dark theme when user prefers dark color scheme */\\n@media (prefers-color-scheme: dark) {\\n :root {\\n --jt-background: var(--jt-slate-800);\\n --jt-text: var(--jt-slate-300);\\n --jt-heading: var(--jt-slate-50);\\n --jt-border: var(--jt-slate-700);\\n --jt-progress-bar: var(--jt-slate-500);\\n\\n --jt-success-icon: var(--jt-green-500);\\n --jt-success-border: var(--jt-green-600);\\n\\n --jt-error-icon: var(--jt-red-500);\\n --jt-error-border: var(--jt-red-500);\\n\\n --jt-warning-icon: var(--jt-yellow-500);\\n --jt-warning-border: var(--jt-yellow-400);\\n\\n --jt-info-icon: var(--jt-slate-400);\\n --jt-info-border: var(--jt-slate-700);\\n\\n --jt-debug-icon: var(--jt-blue-300);\\n --jt-debug-border: var(--jt-blue-600);\\n\\n --jt-spinner-icon: var(--jt-slate-400);\\n --jt-spinner-border: var(--jt-slate-400);\\n\\n --jt-progress-icon: var(--jt-blue-300);\\n --jt-progress-border: var(--jt-blue-600);\\n }\\n}\\n\"",
|
|
6
|
+
"import autoCss from './auto.css?inline';\n\nexport const autoStyles = autoCss;\n",
|
|
7
|
+
"export default \":root {\\n --jt-white: #ffffff;\\n --jt-slate-50: #f8fafc;\\n --jt-slate-200: #e2e8f0;\\n --jt-slate-300: #cbd5e1;\\n --jt-slate-400: #94a3b8;\\n --jt-slate-500: #64748b;\\n --jt-slate-600: #475569;\\n --jt-slate-700: #334155;\\n --jt-slate-800: #1e293b;\\n --jt-black: #000000;\\n\\n --jt-green-500: #22c55e;\\n --jt-green-600: #16a34a;\\n --jt-red-500: #ef4444;\\n --jt-yellow-400: #facc15;\\n --jt-yellow-500: #eab308;\\n --jt-blue-300: #93c5fd;\\n --jt-blue-600: #2563eb;\\n}\\n\\n/* Animations */\\n@keyframes vt-progress-bar {\\n from {\\n width: 0%;\\n }\\n to {\\n width: 100%;\\n }\\n}\\n\\n@keyframes vt-spinner {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(360deg);\\n }\\n}\\n\\n/* Icons */\\n[data-jt-icon] {\\n display: flex;\\n width: 1rem;\\n height: 1rem;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n[data-jt-icon][data-jt-success] {\\n color: var(--jt-success-icon);\\n}\\n\\n[data-jt-icon][data-jt-warning] {\\n color: var(--jt-warning-icon);\\n}\\n\\n[data-jt-icon][data-jt-info] {\\n color: var(--jt-info-icon);\\n}\\n\\n[data-jt-icon][data-jt-error] {\\n color: var(--jt-error-icon);\\n}\\n\\n[data-jt-icon][data-jt-debug] {\\n color: var(--jt-debug-icon);\\n}\\n\\n[data-jt-icon][data-jt-spinner] {\\n width: 1rem;\\n height: 1rem;\\n border: 2px solid var(--jt-spinner-icon);\\n border-bottom-color: transparent;\\n border-radius: 50%;\\n display: inline-block;\\n box-sizing: border-box;\\n animation: vt-spinner 1s linear infinite;\\n}\\n\\n[data-jt-icon][data-jt-progress] {\\n color: var(--jt-progress-icon);\\n}\\n\\n/* Toast Types */\\n[data-jt-toast][data-jt-info] {\\n border-top-color: var(--jt-info-border);\\n}\\n\\n[data-jt-toast][data-jt-success] {\\n border-top-color: var(--jt-success-border);\\n}\\n\\n[data-jt-toast][data-jt-error] {\\n border-top-color: var(--jt-error-border);\\n}\\n\\n[data-jt-toast][data-jt-warning] {\\n border-top-color: var(--jt-warning-border);\\n}\\n\\n[data-jt-toast][data-jt-debug] {\\n border-top-color: var(--jt-debug-border);\\n}\\n\\n[data-jt-toast][data-jt-spinner] {\\n border-top-color: var(--jt-spinner-border);\\n}\\n\\n[data-jt-toast][data-jt-progress] {\\n border-top-color: var(--jt-progress-border);\\n}\\n\\n/* Toast Base */\\n[data-jt-toast] {\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\\n position: relative;\\n z-index: 99999;\\n overflow: hidden;\\n display: flex;\\n flex-direction: column;\\n flex-wrap: nowrap;\\n justify-content: center;\\n align-items: flex-start;\\n gap: 1rem;\\n width: 16rem;\\n min-height: 1rem;\\n padding: 1.25rem 1.5rem 1.5rem 1.5rem;\\n pointer-events: auto;\\n transition-property: opacity;\\n transition-duration: 200ms;\\n transition-timing-function: ease;\\n box-shadow: 0rem 0.25rem 0.75rem 0rem hsla(0, 0%, 0%, 0.09);\\n border-radius: 0.375rem;\\n font-size: 1rem;\\n background-color: var(--jt-background);\\n border-color: var(--jt-border);\\n border-style: solid;\\n border-width: 1px;\\n border-top-width: 0.5rem;\\n flex: 1 0 auto;\\n}\\n\\n/* Focus indicator for keyboard navigation */\\n[data-jt-toast]:focus {\\n outline: 2px solid var(--jt-focus-ring, #2563eb);\\n outline-offset: 2px;\\n}\\n\\n[data-jt-heading-wrapper] {\\n display: flex;\\n justify-content: flex-start;\\n align-items: center;\\n gap: 0.5rem;\\n}\\n\\n[data-jt-heading] {\\n font-weight: 500;\\n color: var(--jt-heading);\\n}\\n\\n[data-jt-body] {\\n font-weight: 400;\\n color: var(--jt-text);\\n}\\n\\n[data-jt-progress-bar] {\\n width: 0%;\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n height: 0.2rem;\\n background-color: var(--jt-progress-bar);\\n}\\n\\n/* Container */\\n[data-jt-container] {\\n position: fixed;\\n z-index: 9998;\\n display: flex;\\n flex-direction: column;\\n flex-wrap: nowrap;\\n gap: 0.5rem;\\n pointer-events: none;\\n max-height: 100vh;\\n overflow-y: auto;\\n}\\n\\n/* Position variants */\\n[data-jt-container][data-jt-position='top-right'] {\\n top: 0.5rem;\\n right: 0.5rem;\\n}\\n\\n[data-jt-container][data-jt-position='top-left'] {\\n top: 0.5rem;\\n left: 0.5rem;\\n}\\n\\n[data-jt-container][data-jt-position='bottom-right'] {\\n bottom: 0.5rem;\\n right: 0.5rem;\\n}\\n\\n[data-jt-container][data-jt-position='bottom-left'] {\\n bottom: 0.5rem;\\n left: 0.5rem;\\n}\\n\\n/* Reduced motion support */\\n@media (prefers-reduced-motion: reduce) {\\n [data-jt-toast] {\\n animation: none;\\n transition: none;\\n }\\n\\n [data-jt-progress-bar] {\\n animation: none;\\n transition: none;\\n }\\n\\n [data-jt-icon][data-jt-spinner] {\\n animation: none;\\n }\\n}\\n\"",
|
|
8
|
+
"// Import CSS as inline string - Vite will bundle this into the JS\nimport baseCss from './base.css?inline';\n\nexport const baseStyles = baseCss;\n",
|
|
9
|
+
"export default \"/* Dark theme colors - WCAG AA compliant (4.5:1 contrast ratio for text) */\\n:root {\\n --jt-background: var(--jt-slate-800);\\n --jt-text: var(--jt-slate-300);\\n --jt-heading: var(--jt-slate-50);\\n --jt-border: var(--jt-slate-700);\\n --jt-progress-bar: var(--jt-slate-500);\\n\\n --jt-success-icon: var(--jt-green-500);\\n --jt-success-border: var(--jt-green-600);\\n\\n --jt-error-icon: var(--jt-red-500);\\n --jt-error-border: var(--jt-red-500);\\n\\n --jt-warning-icon: var(--jt-yellow-500);\\n --jt-warning-border: var(--jt-yellow-400);\\n\\n --jt-info-icon: var(--jt-slate-400);\\n --jt-info-border: var(--jt-slate-700);\\n\\n --jt-debug-icon: var(--jt-blue-300);\\n --jt-debug-border: var(--jt-blue-600);\\n\\n --jt-spinner-icon: var(--jt-slate-400);\\n --jt-spinner-border: var(--jt-slate-400);\\n\\n --jt-progress-icon: var(--jt-blue-300);\\n --jt-progress-border: var(--jt-blue-600);\\n}\\n\"",
|
|
10
|
+
"import darkCss from './dark.css?inline';\n\nexport const darkStyles = darkCss;\n",
|
|
11
|
+
"export default \"/* Light theme colors - WCAG AA compliant (4.5:1 contrast ratio for text) */\\n:root {\\n --jt-background: var(--jt-white);\\n --jt-text: var(--jt-slate-600);\\n --jt-heading: var(--jt-slate-800);\\n --jt-border: var(--jt-slate-200);\\n --jt-progress-bar: var(--jt-slate-300);\\n\\n --jt-success-icon: var(--jt-green-600);\\n --jt-success-border: var(--jt-green-600);\\n\\n --jt-error-icon: var(--jt-red-500);\\n --jt-error-border: var(--jt-red-500);\\n\\n /* Using amber-600 for better contrast on white background (WCAG AA) */\\n --jt-warning-icon: #d97706;\\n --jt-warning-border: var(--jt-yellow-400);\\n\\n --jt-info-icon: var(--jt-slate-500);\\n --jt-info-border: var(--jt-slate-200);\\n\\n --jt-debug-icon: var(--jt-blue-600);\\n --jt-debug-border: var(--jt-blue-600);\\n\\n --jt-spinner-icon: var(--jt-slate-500);\\n --jt-spinner-border: var(--jt-slate-400);\\n\\n --jt-progress-icon: var(--jt-blue-600);\\n --jt-progress-border: var(--jt-blue-600);\\n}\\n\"",
|
|
12
|
+
"import lightCss from './light.css?inline';\n\nexport const lightStyles = lightCss;\n",
|
|
13
|
+
"import { autoStyles } from './auto';\nimport { baseStyles } from './base';\nimport { darkStyles } from './dark';\nimport { lightStyles } from './light';\n\nexport const styles = {\n base: baseStyles,\n light: lightStyles,\n dark: darkStyles,\n auto: autoStyles\n};\n",
|
|
14
|
+
"/**\n * Recursively merges properties from a source object into a target object.\n * Note: This function mutates the target object.\n *\n * @param {any} target - The target object to which properties will be merged.\n * @param {any} source - The source object from which properties will be merged.\n * If a property value is an object (excluding arrays), it will be merged into the corresponding target property.\n * Otherwise, the property value will be copied over to the target object, overwriting any existing property with the same key.\n */\nexport function deepMerge<T>(target: T, source: Partial<T>): void {\n Object.keys(source).forEach((key) => {\n if (\n source[key] &&\n typeof source[key] === 'object' &&\n !(source[key] instanceof Array)\n ) {\n if (!target[key]) {\n target[key] = {};\n }\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n });\n}\n",
|
|
15
|
+
"/**\n * Injects one or more CSS strings into the document's `<head>` as a `<style>` element.\n *\n * @param {...string} cssStrings - One or more CSS strings to be injected.\n */\nexport function injectCss(...cssStrings: string[]) {\n const style = document.createElement('style');\n style.innerHTML = cssStrings.join('');\n document.head.appendChild(style);\n}\n",
|
|
16
|
+
"export const debugIcon = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_2102_1592)\"><path d=\"M12 7.5C12 5.84315 10.6569 4.5 9 4.5C7.34315 4.5 6 5.84315 6 7.5V12C6 13.6569 7.34315 15 9 15C10.6569 15 12 13.6569 12 12V7.5Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M14.25 5.25L12 6.75\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M3.75 5.25L6 6.75\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M14.25 14.25L12 12.75\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M3.75 14.25L6 12.75\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M15 9.75H12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M3 9.75H6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 3L8.25 4.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M10.5 3L9.75 4.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g><defs><clipPath id=\"clip0_2102_1592\"><rect width=\"18\" height=\"18\" fill=\"white\"/></clipPath></defs></svg>`;\n",
|
|
17
|
+
"export const errorIcon = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_2102_1582)\"><g clip-path=\"url(#clip1_2102_1582)\"><path d=\"M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11.25 6.75L6.75 11.25\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.75 6.75L11.25 11.25\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g></g><defs><clipPath id=\"clip0_2102_1582\"><rect width=\"18\" height=\"18\" fill=\"white\"/></clipPath><clipPath id=\"clip1_2102_1582\"><rect width=\"18\" height=\"18\" fill=\"white\"/></clipPath></defs></svg>`;\n",
|
|
18
|
+
"// This one is accomplished with CSS, see `../styles/base.ts` -> `.vt-icon.is-spinner`\nexport const spinnerIcon = `<div></div>`;\n",
|
|
19
|
+
"export const successIcon = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_2102_1564)\"><g clip-path=\"url(#clip1_2102_1564)\"><path d=\"M16.5 8.30999V8.99999C16.4991 10.6173 15.9754 12.191 15.007 13.4864C14.0386 14.7817 12.6775 15.7293 11.1265 16.1879C9.57557 16.6465 7.91794 16.5914 6.40085 16.0309C4.88376 15.4704 3.58849 14.4346 2.70822 13.0778C1.82795 11.721 1.40984 10.116 1.51626 8.50223C1.62267 6.88841 2.24791 5.35223 3.29871 4.12279C4.34951 2.89335 5.76959 2.03653 7.34714 1.6801C8.92469 1.32367 10.5752 1.48674 12.0525 2.14499\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M16.5 3L9 10.5075L6.75 8.2575\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g></g><defs><clipPath id=\"clip0_2102_1564\"><rect width=\"18\" height=\"18\" fill=\"white\"/></clipPath><clipPath id=\"clip1_2102_1564\"><rect width=\"18\" height=\"18\" fill=\"white\"/></clipPath></defs></svg>`;\n",
|
|
20
|
+
"/**\n * Retrieves the HTML string for a given icon type.\n * This method allows the user to set their own icons, overwriting the default config icons.\n *\n * @param {string} type - The type of icon to retrieve. Valid types are 'success', 'debug', 'error', 'warning', and 'loading'.\n * @returns {string} The HTML string representing the requested icon.\n */\nimport { config } from '../config';\n\nexport function getIcon(type: string): string {\n let iconHTML: string;\n\n switch (type) {\n case 'success':\n iconHTML = config.icons.success;\n break;\n case 'debug':\n iconHTML = config.icons.debug;\n break;\n case 'error':\n iconHTML = config.icons.error;\n break;\n case 'warning':\n iconHTML = config.icons.warning;\n break;\n case 'spinner':\n iconHTML = config.icons.spinner;\n break;\n case 'info':\n iconHTML = config.icons.info;\n break;\n }\n\n return iconHTML;\n}\n",
|
|
21
|
+
"export const warningIcon = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_2102_1587)\"><path d=\"M16.2976 13.5L10.2976 3C10.1667 2.76915 9.97702 2.57714 9.74776 2.44355C9.5185 2.30996 9.25791 2.23958 8.99257 2.23958C8.72723 2.23958 8.46664 2.30996 8.23738 2.44355C8.00812 2.57714 7.8184 2.76915 7.68757 3L1.68757 13.5C1.55533 13.729 1.48599 13.9889 1.48658 14.2534C1.48716 14.5178 1.55765 14.7774 1.6909 15.0059C1.82416 15.2343 2.01543 15.4234 2.24534 15.5541C2.47525 15.6848 2.73562 15.7524 3.00007 15.75H15.0001C15.2632 15.7497 15.5217 15.6802 15.7495 15.5485C15.9773 15.4167 16.1665 15.2273 16.298 14.9993C16.4294 14.7714 16.4986 14.5128 16.4985 14.2496C16.4985 13.9864 16.4292 13.7279 16.2976 13.5Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 6.75V9.75\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 12.75H9.0075\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g><defs><clipPath id=\"clip0_2102_1587\"><rect width=\"18\" height=\"18\" fill=\"white\"/></clipPath></defs></svg>`;\n",
|
|
22
|
+
"export const infoIcon = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_2102_1792)\"><path d=\"M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 12V9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M9 6H9.0075\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></g><defs><clipPath id=\"clip0_2102_1792\"><rect width=\"18\" height=\"18\" fill=\"white\"/></clipPath></defs></svg>`;\n",
|
|
23
|
+
"// Progress icon - a simple circular progress indicator\nexport const progressIcon = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_progress)\">\n <path d=\"M9 1.5C13.1421 1.5 16.5 4.85786 16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M9 5.25V9L11.25 11.25\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_progress\">\n <rect width=\"18\" height=\"18\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>`;\n",
|
|
24
|
+
"import { debugIcon } from './debug';\nimport { errorIcon } from './error';\nimport { spinnerIcon } from './spinner';\nimport { successIcon } from './success';\nimport { getIcon } from './get-icon';\nimport { warningIcon } from './warning';\nimport { infoIcon } from './info';\nimport { progressIcon } from './progress';\n\n// Thank you Radix UI for the icons! <3\n\nexport let icons = {\n get: getIcon,\n svg: {\n success: successIcon,\n warning: warningIcon,\n error: errorIcon,\n debug: debugIcon,\n spinner: spinnerIcon,\n info: infoIcon,\n progress: progressIcon\n }\n};\n",
|
|
25
|
+
"import { styles } from './styles';\nimport { deepMerge } from './utils/deep-merge';\nimport { injectCss } from './utils/inject-css';\nimport type { VTConfig, VTIcons } from './types';\n\nexport type { VTConfig, VTIcons };\n\n// Lazy-load icons to avoid circular dependency\nfunction getDefaultIcons(): VTIcons {\n const { icons } = require('./icons');\n return {\n success: icons.svg.success,\n warning: icons.svg.warning,\n error: icons.svg.error,\n debug: icons.svg.debug,\n spinner: icons.svg.spinner,\n info: icons.svg.info,\n progress: icons.svg.progress\n };\n}\n\nexport const config: Required<VTConfig> & { icons: VTIcons } = {\n target: undefined as any, // Will be auto-created if not specified\n position: 'bottom-right',\n injectCss: true,\n theme: 'auto',\n get icons() {\n // Lazy getter to avoid circular dependency\n if (!this._icons) {\n this._icons = getDefaultIcons();\n }\n return this._icons;\n },\n set icons(value: VTIcons) {\n (this as any)._icons = value;\n },\n _icons: undefined as VTIcons | undefined,\n announceToScreenReader: true,\n ariaLive: 'polite'\n} as any;\n\n/**\n * Configures global settings for all toast notifications.\n *\n * @param options - Configuration options to merge with defaults\n *\n * @example\n * ```typescript\n * configure({\n * position: 'top-right',\n * theme: 'dark',\n * injectCss: true,\n * announceToScreenReader: true,\n * ariaLive: 'polite'\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Use a custom container\n * configure({\n * target: document.getElementById('toast-container')\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Customize icons\n * configure({\n * icons: {\n * success: '<svg>...</svg>',\n * error: '<svg>...</svg>'\n * }\n * });\n * ```\n */\nexport function configure(options: Partial<VTConfig>) {\n // Apply the options to config\n deepMerge(config, options);\n\n if (!config.injectCss) return;\n // Adds the appropriate styles based on the theme\n switch (config.theme) {\n case 'none':\n break;\n case 'light':\n injectCss(styles.light, styles.base);\n break;\n case 'dark':\n injectCss(styles.dark, styles.base);\n break;\n case 'auto':\n injectCss(styles.auto, styles.base);\n break;\n }\n}\n",
|
|
26
|
+
"/**\n * plain-toast - Lightweight, accessible toast notifications with zero dependencies\n *\n * @packageDocumentation\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { Toast } from 'plain-toast';\n *\n * new Toast({\n * type: 'success',\n * heading: 'Success!',\n * body: 'Operation completed successfully.'\n * });\n * ```\n *\n * @example\n * With configuration:\n * ```typescript\n * import { configure, Toast } from 'plain-toast';\n *\n * configure({\n * position: 'top-right',\n * theme: 'dark'\n * });\n *\n * new Toast({\n * type: 'info',\n * heading: 'Settings Updated'\n * });\n * ```\n *\n * @example\n * Progress tracking:\n * ```typescript\n * const toast = new Toast({\n * type: 'progress',\n * heading: 'Uploading...',\n * progress: { total: 100, showPercentage: true }\n * });\n *\n * toast.setProgress(50);\n * toast.complete();\n * ```\n */\n\nimport { configure, config } from './config';\nimport { Toast } from './toast';\n\n// Export types\nexport type { VTConfig, VTIcons } from './config';\nexport type { ToastOptions, ProgressOptions } from './toast';\nexport type { ToastType, Position, Theme } from './types';\n\n// Export the main API\nexport { Toast, configure, config };\n\nexport default {\n Toast,\n configure,\n config\n};\n",
|
|
27
|
+
"import type { ToastElements } from './types';\n\n/**\n * Closes a toast after a specified duration by fading it out and then removing it from the DOM.\n * Uses pre-queried elements for better performance.\n *\n * @param elements - The toast elements object\n * @param duration - The duration in milliseconds to wait before starting the close animation\n */\nexport function closeToast(\n elements: ToastElements,\n duration: number | null\n): void {\n let closeTimeout;\n const { toast, progressBar } = elements;\n\n if (duration > 0) {\n // Animate the progress bar to show time remaining\n progressBar.style.animationName = 'vt-progress-bar';\n progressBar.style.animationDuration = `${duration}ms`;\n progressBar.style.animationTimingFunction = 'linear';\n progressBar.style.animationFillMode = 'forwards';\n\n // Pause the animation and the closing timeout on hover\n toast.addEventListener('mouseover', () => {\n progressBar.style.animationPlayState = 'paused';\n clearTimeout(closeTimeout);\n });\n\n // Resume the animation and the closing timeout on exit\n toast.addEventListener('mouseout', () => {\n progressBar.style.animationPlayState = 'running';\n closeTimeout = setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n if (toast.parentNode) {\n toast.parentNode.removeChild(toast);\n }\n }, 250); // 250ms fade-out animation duration\n }, duration);\n });\n }\n\n // Start the closing timeout\n closeTimeout = setTimeout(() => {\n toast.style.opacity = '0';\n setTimeout(() => {\n if (toast.parentNode) {\n toast.parentNode.removeChild(toast);\n }\n }, 250); // 250ms fade-out animation duration\n }, duration);\n}\n",
|
|
28
|
+
"import { closeToast } from './close-toast';\nimport type { ToastElements } from './types';\n\n/**\n * Enables the toast to be closed by clicking on it or pressing Enter/Space.\n * Makes the toast keyboard accessible with proper ARIA attributes.\n *\n * @param elements - The toast elements object\n */\nexport function enableClickToClose(elements: ToastElements): void {\n const { toast } = elements;\n\n toast.style.cursor = 'pointer';\n\n // Make toast focusable and add ARIA label\n toast.setAttribute('tabindex', '0');\n toast.setAttribute('aria-label', 'Toast. Press Enter or Space to close.');\n\n // Close on click\n toast.addEventListener('click', () => {\n closeToast(elements, 0);\n });\n\n // Close on keyboard activation (Enter or Space)\n toast.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault(); // Prevent scrolling on Space\n closeToast(elements, 0);\n }\n });\n}\n",
|
|
29
|
+
"import { icons } from '../icons';\nimport type { ToastType } from '../types';\nimport type { ToastElements } from './types';\n\n/**\n * Creates a toast element using DOM APIs and returns an object with all important elements pre-queried.\n *\n * @param container - The container to which the toast will be appended\n * @param type - The type of the toast (e.g., 'success', 'error')\n * @param heading - The heading text of the toast\n * @param body - The body text of the toast\n * @param toastId - A unique identifier for the toast\n * @returns An object containing all the important toast elements\n */\nexport function populateToast(\n container: HTMLElement,\n type: ToastType,\n heading: string,\n body: string,\n toastId: string\n): ToastElements {\n // Create main toast element\n const toast = document.createElement('div');\n toast.setAttribute('data-jt-toast', toastId);\n toast.setAttribute(`data-jt-${type}`, '');\n\n // Add ARIA attributes for accessibility\n toast.setAttribute('role', 'status');\n toast.setAttribute('aria-atomic', 'true');\n\n // Create heading wrapper\n const headingWrapper = document.createElement('div');\n headingWrapper.setAttribute('data-jt-heading-wrapper', '');\n\n // Create icon element\n const iconElement = document.createElement('div');\n iconElement.setAttribute('data-jt-icon', '');\n iconElement.setAttribute(`data-jt-${type}`, '');\n iconElement.innerHTML = icons.get(type);\n\n // Create heading element\n const headingElement = document.createElement('div');\n headingElement.setAttribute('data-jt-heading', 'true');\n headingElement.textContent = heading;\n\n // Append icon and heading to wrapper\n headingWrapper.appendChild(iconElement);\n headingWrapper.appendChild(headingElement);\n\n // Create body element\n const bodyElement = document.createElement('div');\n bodyElement.setAttribute('data-jt-body', '');\n bodyElement.textContent = body;\n if (!body) {\n bodyElement.style.display = 'none';\n }\n\n // Create progress bar element\n const progressBar = document.createElement('div');\n progressBar.setAttribute('data-jt-progress-bar', '');\n\n // Append all elements to toast\n toast.appendChild(headingWrapper);\n toast.appendChild(bodyElement);\n toast.appendChild(progressBar);\n\n // Append toast to container\n container.appendChild(toast);\n\n // Return an object with all important elements pre-queried\n return {\n toast,\n container,\n headingWrapper,\n iconElement,\n headingElement,\n bodyElement,\n progressBar\n };\n}\n",
|
|
30
|
+
"// Default options\nexport const defaultOptions = {\n heading: '', // Required\n body: '',\n duration: 3500, // in ms, null for infinite\n clickToClose: true\n};\n",
|
|
31
|
+
"import { defaultOptions } from './default-options';\n\n/**\n * Merges user-defined options with default toast options and ensures a heading is provided.\n *\n * This function takes an object of user-defined options, merges them with the default options,\n * and validates that a heading is present, as it is required for the toast to be successful.\n * If the heading is missing, an error is thrown. The function then returns an object containing\n * the merged and validated options.\n *\n * @param {object} userOptions - The user-defined options for the toast.\n * @returns {object} An object containing the merged and validated toast options.\n * @throws {Error} If the heading is not provided in the options.\n */\nexport function getOptions(userOptions: any) {\n let options = { ...defaultOptions, ...userOptions };\n let heading = options.heading;\n let body = options.body;\n let duration = options.duration;\n let clickToClose = options.clickToClose;\n return { heading, body, duration, clickToClose };\n}\n",
|
|
32
|
+
"import { config } from '../config';\nimport type { Position } from '../types';\n\n/**\n * Creates and returns a toast container element with the specified position.\n * The container is automatically appended to the document body.\n *\n * @param position - The position where the container should appear on the screen\n * @returns The created container HTMLElement\n */\nexport function createContainer(position: Position = 'bottom-right'): HTMLElement {\n const container = document.createElement('div');\n container.setAttribute('data-jt-container', '');\n container.setAttribute('data-jt-position', position);\n container.setAttribute('role', 'region');\n container.setAttribute('aria-label', 'Toasts');\n\n if (config.ariaLive) {\n container.setAttribute('aria-live', config.ariaLive);\n }\n\n document.body.appendChild(container);\n return container;\n}\n\n/**\n * Gets an existing container or creates a new one based on config.\n * If config.target is specified, uses that; otherwise creates a new container.\n *\n * @returns The container HTMLElement\n */\nexport function getOrCreateContainer(): HTMLElement {\n // If a target is specified in config, use that\n if (config.target) {\n if (typeof config.target === 'string') {\n const existing = document.querySelector(config.target) as HTMLElement;\n if (existing) return existing;\n } else if (config.target instanceof HTMLElement) {\n return config.target;\n }\n }\n\n // Check if a container already exists\n const existing = document.querySelector('[data-jt-container]') as HTMLElement;\n if (existing) return existing;\n\n // Create a new container with the configured position\n return createContainer(config.position);\n}\n",
|
|
33
|
+
"import { closeToast } from './close-toast';\nimport { enableClickToClose } from './enable-click-to-close';\nimport { populateToast } from './populate-toast';\nimport { getOptions } from './get-options';\nimport { getOrCreateContainer } from '../container';\nimport type { ToastType, ToastCreateOptions } from '../types';\nimport type { ToastElements } from './types';\n\n/**\n * Creates and displays a toast with specified options.\n *\n * @param type - The type of the toast (e.g., 'success', 'error')\n * @param userOptions - The options for the toast\n * @returns The toast elements object with all important elements pre-queried\n */\nexport function createToast(\n type: ToastType,\n userOptions: ToastCreateOptions\n): ToastElements {\n let { heading, body, duration, clickToClose } = getOptions(userOptions);\n\n if (type === 'spinner') {\n duration = null;\n clickToClose = false;\n }\n\n // Get or create the toast container\n const container = getOrCreateContainer();\n\n // Generate a unique ID for the toast\n const toastId = Math.random().toString(36).substring(2, 11);\n\n // Create the toast and get all elements\n const elements = populateToast(container, type, heading, body, toastId);\n\n // Close the toast after a specified duration\n if (duration) closeToast(elements, duration);\n\n // Enable click-to-close functionality\n if (clickToClose) enableClickToClose(elements);\n\n // Return the toast elements for further manipulation\n return elements;\n}\n",
|
|
34
|
+
"import { createToast } from './create-toast';\nimport type { ToastCreateOptions } from '../types';\n\nexport const notify = {\n success: (options: ToastCreateOptions) => createToast('success', options),\n error: (options: ToastCreateOptions) => createToast('error', options),\n warning: (options: ToastCreateOptions) => createToast('warning', options),\n debug: (options: ToastCreateOptions) => createToast('debug', options),\n info: (options: ToastCreateOptions) => createToast('info', options),\n spinner: (options: ToastCreateOptions) => createToast('spinner', options),\n progress: (options: ToastCreateOptions) => createToast('progress', options)\n};\n",
|
|
35
|
+
"import type { ToastElements } from './types';\n\nexport interface UpdateOptions {\n heading?: string;\n body?: string;\n}\n\n/**\n * Updates the content of a toast using pre-queried elements.\n *\n * @param elements - The toast elements object\n * @param userOptions - The options to update (heading and/or body)\n */\nexport function updateToast(\n elements: ToastElements,\n userOptions: UpdateOptions\n): void {\n const { heading, body } = userOptions;\n\n // Update the heading if provided\n if (heading !== undefined) {\n elements.headingElement.textContent = heading;\n }\n\n // Update the body if provided\n if (body !== undefined) {\n if (body) {\n elements.bodyElement.textContent = body;\n elements.bodyElement.style.display = 'block';\n } else {\n elements.bodyElement.textContent = '';\n elements.bodyElement.style.display = 'none';\n }\n }\n}\n",
|
|
36
|
+
"/**\n * The Toast class is designed to create and manage custom notification elements.\n * It supports different types of notifications such as success, error, warning, and debug,\n * each with customizable properties like heading, body, duration, and click-to-close functionality.\n *\n * - `elements`: Holds references to all important toast elements for efficient manipulation.\n * - `type`: Specifies the type of notification (e.g., success, error).\n * - `heading`: The text displayed as the heading of the notification.\n * - `body`: The main content or body of the notification.\n * - `duration`: How long the notification will be displayed before automatically closing.\n * - `clickToClose`: Allows the notification to be closed on click if set to true.\n *\n * The constructor takes an object with these properties, with `duration` and `clickToClose` falling back to default values if not provided.\n * It then creates the notification element based on the specified type and properties.\n *\n * The `close` method allows for the manual removal of the notification's element from the DOM.\n */\nimport { notify } from './toasts';\nimport { defaultOptions } from './toasts/default-options';\nimport { updateToast } from './toasts/update-toast';\nimport type { ToastOptions, ProgressOptions, ToastType } from './types';\nimport type { ToastElements } from './toasts/types';\n\nexport type { ToastOptions, ProgressOptions };\n\nexport class Toast {\n private elements: ToastElements | null = null;\n private progressOptions?: ProgressOptions;\n\n type: ToastType;\n heading: string;\n body: string;\n duration: number;\n clickToClose: boolean;\n\n constructor({\n type,\n heading,\n body = '',\n duration = defaultOptions.duration,\n clickToClose = defaultOptions.clickToClose,\n progress\n }: ToastOptions) {\n this.type = type;\n this.heading = heading;\n this.body = body;\n this.duration = duration;\n this.clickToClose = clickToClose;\n\n // Handle progress type\n if (type === 'progress') {\n this.progressOptions = {\n total: progress?.total || 100,\n current: progress?.current || 0,\n showPercentage: progress?.showPercentage !== false\n };\n // Progress toasts don't auto-close by default\n if (duration === defaultOptions.duration) {\n this.duration = null;\n }\n }\n\n this.elements = notify[this.type]({\n heading: this.heading,\n body: this.body,\n duration: this.duration,\n clickToClose: this.clickToClose\n });\n\n // Initialize progress bar if this is a progress type\n if (type === 'progress' && this.progressOptions) {\n this.setProgress(this.progressOptions.current);\n }\n }\n\n update(options: { heading?: string; body?: string }): void {\n if (!this.elements) return;\n updateToast(this.elements, options);\n }\n\n /**\n * Updates the progress bar to the specified value\n * @param current - The current progress value (0 to total)\n */\n setProgress(current: number): void {\n if (!this.elements || this.type !== 'progress' || !this.progressOptions)\n return;\n\n const { progressBar, bodyElement, toast } = this.elements;\n\n // Calculate percentage\n const percentage = Math.min(\n 100,\n Math.max(0, (current / this.progressOptions.total) * 100)\n );\n\n // Update progress bar width\n progressBar.style.width = `${percentage}%`;\n progressBar.style.transition = 'width 0.3s ease';\n\n // Update body with percentage if showPercentage is true\n if (this.progressOptions.showPercentage) {\n bodyElement.textContent = `${Math.round(percentage)}%`;\n bodyElement.style.display = 'block';\n }\n\n // Update current value\n this.progressOptions.current = current;\n\n // Dispatch custom event\n toast.dispatchEvent(\n new CustomEvent('vt:progress', {\n detail: { current, total: this.progressOptions.total, percentage }\n })\n );\n }\n\n /**\n * Increments the progress by the specified amount\n * @param amount - The amount to increment by (default: 1)\n */\n incrementProgress(amount: number = 1): void {\n if (!this.progressOptions) return;\n this.setProgress((this.progressOptions.current || 0) + amount);\n }\n\n /**\n * Completes the progress (sets to 100%) and optionally auto-closes after a delay\n * @param autoCloseDelay - Delay in ms before auto-closing (default: 2000ms)\n */\n complete(autoCloseDelay: number = 2000): void {\n if (!this.progressOptions) return;\n\n this.setProgress(this.progressOptions.total);\n\n // Auto-close after delay\n if (autoCloseDelay > 0) {\n setTimeout(() => {\n this.close();\n }, autoCloseDelay);\n }\n }\n\n close() {\n if (!this.elements) return;\n this.elements.toast.remove();\n this.elements = null;\n }\n}\n"
|
|
37
|
+
],
|
|
38
|
+
"mappings": "wfAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;MCEF,iBAAa,QCFX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
|
|
39
|
+
"debugId": "3503FA789B16313B64756E2164756E21",
|
|
40
|
+
"names": []
|
|
41
|
+
}
|