@vadem/ui 0.0.0-stage → 0.0.1

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 (289) hide show
  1. package/LICENSE-lucide.txt +43 -0
  2. package/README.md +19 -2
  3. package/fesm2022/vadem-ui-accordion.mjs +139 -0
  4. package/fesm2022/vadem-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/vadem-ui-active-filters.mjs +355 -0
  6. package/fesm2022/vadem-ui-active-filters.mjs.map +1 -0
  7. package/fesm2022/vadem-ui-alert-dialog.mjs +433 -0
  8. package/fesm2022/vadem-ui-alert-dialog.mjs.map +1 -0
  9. package/fesm2022/vadem-ui-alert.mjs +266 -0
  10. package/fesm2022/vadem-ui-alert.mjs.map +1 -0
  11. package/fesm2022/vadem-ui-autocomplete.mjs +715 -0
  12. package/fesm2022/vadem-ui-autocomplete.mjs.map +1 -0
  13. package/fesm2022/vadem-ui-avatar.mjs +219 -0
  14. package/fesm2022/vadem-ui-avatar.mjs.map +1 -0
  15. package/fesm2022/vadem-ui-badge.mjs +86 -0
  16. package/fesm2022/vadem-ui-badge.mjs.map +1 -0
  17. package/fesm2022/vadem-ui-breadcrumbs.mjs +61 -0
  18. package/fesm2022/vadem-ui-breadcrumbs.mjs.map +1 -0
  19. package/fesm2022/vadem-ui-button.mjs +220 -0
  20. package/fesm2022/vadem-ui-button.mjs.map +1 -0
  21. package/fesm2022/vadem-ui-calendar.mjs +1314 -0
  22. package/fesm2022/vadem-ui-calendar.mjs.map +1 -0
  23. package/fesm2022/vadem-ui-card.mjs +271 -0
  24. package/fesm2022/vadem-ui-card.mjs.map +1 -0
  25. package/fesm2022/vadem-ui-character-count.mjs +269 -0
  26. package/fesm2022/vadem-ui-character-count.mjs.map +1 -0
  27. package/fesm2022/vadem-ui-chart.mjs +1984 -0
  28. package/fesm2022/vadem-ui-chart.mjs.map +1 -0
  29. package/fesm2022/vadem-ui-checkbox.mjs +67 -0
  30. package/fesm2022/vadem-ui-checkbox.mjs.map +1 -0
  31. package/fesm2022/vadem-ui-color-picker.mjs +815 -0
  32. package/fesm2022/vadem-ui-color-picker.mjs.map +1 -0
  33. package/fesm2022/vadem-ui-command.mjs +735 -0
  34. package/fesm2022/vadem-ui-command.mjs.map +1 -0
  35. package/fesm2022/vadem-ui-copy-button.mjs +375 -0
  36. package/fesm2022/vadem-ui-copy-button.mjs.map +1 -0
  37. package/fesm2022/vadem-ui-date-range-picker.mjs +1011 -0
  38. package/fesm2022/vadem-ui-date-range-picker.mjs.map +1 -0
  39. package/fesm2022/vadem-ui-description-list.mjs +59 -0
  40. package/fesm2022/vadem-ui-description-list.mjs.map +1 -0
  41. package/fesm2022/vadem-ui-dialog.mjs +587 -0
  42. package/fesm2022/vadem-ui-dialog.mjs.map +1 -0
  43. package/fesm2022/vadem-ui-dropzone.mjs +176 -0
  44. package/fesm2022/vadem-ui-dropzone.mjs.map +1 -0
  45. package/fesm2022/vadem-ui-editable-text.mjs +641 -0
  46. package/fesm2022/vadem-ui-editable-text.mjs.map +1 -0
  47. package/fesm2022/vadem-ui-empty-state.mjs +175 -0
  48. package/fesm2022/vadem-ui-empty-state.mjs.map +1 -0
  49. package/fesm2022/vadem-ui-expandable-text.mjs +244 -0
  50. package/fesm2022/vadem-ui-expandable-text.mjs.map +1 -0
  51. package/fesm2022/vadem-ui-field.mjs +583 -0
  52. package/fesm2022/vadem-ui-field.mjs.map +1 -0
  53. package/fesm2022/vadem-ui-file-preview.mjs +532 -0
  54. package/fesm2022/vadem-ui-file-preview.mjs.map +1 -0
  55. package/fesm2022/vadem-ui-file-size.mjs +83 -0
  56. package/fesm2022/vadem-ui-file-size.mjs.map +1 -0
  57. package/fesm2022/vadem-ui-form-error-summary.mjs +201 -0
  58. package/fesm2022/vadem-ui-form-error-summary.mjs.map +1 -0
  59. package/fesm2022/vadem-ui-icon.mjs +303 -0
  60. package/fesm2022/vadem-ui-icon.mjs.map +1 -0
  61. package/fesm2022/vadem-ui-input.mjs +120 -0
  62. package/fesm2022/vadem-ui-input.mjs.map +1 -0
  63. package/fesm2022/vadem-ui-kbd.mjs +286 -0
  64. package/fesm2022/vadem-ui-kbd.mjs.map +1 -0
  65. package/fesm2022/vadem-ui-keyboard.mjs +105 -0
  66. package/fesm2022/vadem-ui-keyboard.mjs.map +1 -0
  67. package/fesm2022/vadem-ui-locale.mjs +443 -0
  68. package/fesm2022/vadem-ui-locale.mjs.map +1 -0
  69. package/fesm2022/vadem-ui-menu.mjs +637 -0
  70. package/fesm2022/vadem-ui-menu.mjs.map +1 -0
  71. package/fesm2022/vadem-ui-navigation-list.mjs +130 -0
  72. package/fesm2022/vadem-ui-navigation-list.mjs.map +1 -0
  73. package/fesm2022/vadem-ui-number-input.mjs +264 -0
  74. package/fesm2022/vadem-ui-number-input.mjs.map +1 -0
  75. package/fesm2022/vadem-ui-otp-input.mjs +86 -0
  76. package/fesm2022/vadem-ui-otp-input.mjs.map +1 -0
  77. package/fesm2022/vadem-ui-pagination.mjs +353 -0
  78. package/fesm2022/vadem-ui-pagination.mjs.map +1 -0
  79. package/fesm2022/vadem-ui-password-input.mjs +213 -0
  80. package/fesm2022/vadem-ui-password-input.mjs.map +1 -0
  81. package/fesm2022/vadem-ui-popover.mjs +178 -0
  82. package/fesm2022/vadem-ui-popover.mjs.map +1 -0
  83. package/fesm2022/vadem-ui-progress.mjs +331 -0
  84. package/fesm2022/vadem-ui-progress.mjs.map +1 -0
  85. package/fesm2022/vadem-ui-radio.mjs +39 -0
  86. package/fesm2022/vadem-ui-radio.mjs.map +1 -0
  87. package/fesm2022/vadem-ui-range-slider.mjs +561 -0
  88. package/fesm2022/vadem-ui-range-slider.mjs.map +1 -0
  89. package/fesm2022/vadem-ui-rating.mjs +404 -0
  90. package/fesm2022/vadem-ui-rating.mjs.map +1 -0
  91. package/fesm2022/vadem-ui-relative-time.mjs +217 -0
  92. package/fesm2022/vadem-ui-relative-time.mjs.map +1 -0
  93. package/fesm2022/vadem-ui-reorder-list.mjs +601 -0
  94. package/fesm2022/vadem-ui-reorder-list.mjs.map +1 -0
  95. package/fesm2022/vadem-ui-scroll-area.mjs +65 -0
  96. package/fesm2022/vadem-ui-scroll-area.mjs.map +1 -0
  97. package/fesm2022/vadem-ui-search-input.mjs +307 -0
  98. package/fesm2022/vadem-ui-search-input.mjs.map +1 -0
  99. package/fesm2022/vadem-ui-segmented.mjs +297 -0
  100. package/fesm2022/vadem-ui-segmented.mjs.map +1 -0
  101. package/fesm2022/vadem-ui-select.mjs +1462 -0
  102. package/fesm2022/vadem-ui-select.mjs.map +1 -0
  103. package/fesm2022/vadem-ui-sidebar.mjs +493 -0
  104. package/fesm2022/vadem-ui-sidebar.mjs.map +1 -0
  105. package/fesm2022/vadem-ui-skeleton.mjs +106 -0
  106. package/fesm2022/vadem-ui-skeleton.mjs.map +1 -0
  107. package/fesm2022/vadem-ui-slider.mjs +60 -0
  108. package/fesm2022/vadem-ui-slider.mjs.map +1 -0
  109. package/fesm2022/vadem-ui-splitter.mjs +438 -0
  110. package/fesm2022/vadem-ui-splitter.mjs.map +1 -0
  111. package/fesm2022/vadem-ui-stat.mjs +369 -0
  112. package/fesm2022/vadem-ui-stat.mjs.map +1 -0
  113. package/fesm2022/vadem-ui-stepper.mjs +483 -0
  114. package/fesm2022/vadem-ui-stepper.mjs.map +1 -0
  115. package/fesm2022/vadem-ui-switch.mjs +45 -0
  116. package/fesm2022/vadem-ui-switch.mjs.map +1 -0
  117. package/fesm2022/vadem-ui-table.mjs +593 -0
  118. package/fesm2022/vadem-ui-table.mjs.map +1 -0
  119. package/fesm2022/vadem-ui-tabs.mjs +405 -0
  120. package/fesm2022/vadem-ui-tabs.mjs.map +1 -0
  121. package/fesm2022/vadem-ui-tag-input.mjs +685 -0
  122. package/fesm2022/vadem-ui-tag-input.mjs.map +1 -0
  123. package/fesm2022/vadem-ui-text-highlight.mjs +126 -0
  124. package/fesm2022/vadem-ui-text-highlight.mjs.map +1 -0
  125. package/fesm2022/vadem-ui-time-input.mjs +430 -0
  126. package/fesm2022/vadem-ui-time-input.mjs.map +1 -0
  127. package/fesm2022/vadem-ui-timeline.mjs +313 -0
  128. package/fesm2022/vadem-ui-timeline.mjs.map +1 -0
  129. package/fesm2022/vadem-ui-toast.mjs +397 -0
  130. package/fesm2022/vadem-ui-toast.mjs.map +1 -0
  131. package/fesm2022/vadem-ui-toolbar.mjs +396 -0
  132. package/fesm2022/vadem-ui-toolbar.mjs.map +1 -0
  133. package/fesm2022/vadem-ui-tooltip.mjs +218 -0
  134. package/fesm2022/vadem-ui-tooltip.mjs.map +1 -0
  135. package/fesm2022/vadem-ui-tree.mjs +551 -0
  136. package/fesm2022/vadem-ui-tree.mjs.map +1 -0
  137. package/fesm2022/vadem-ui-upload-list.mjs +408 -0
  138. package/fesm2022/vadem-ui-upload-list.mjs.map +1 -0
  139. package/fesm2022/vadem-ui.mjs +4 -0
  140. package/fesm2022/vadem-ui.mjs.map +1 -0
  141. package/fonts/jetbrains-mono/OFL.txt +93 -0
  142. package/fonts/jetbrains-mono/jetbrains-mono-cyrillic.woff2 +0 -0
  143. package/fonts/jetbrains-mono/jetbrains-mono-latin.woff2 +0 -0
  144. package/fonts/manrope/OFL.txt +93 -0
  145. package/fonts/manrope/manrope-cyrillic.woff2 +0 -0
  146. package/fonts/manrope/manrope-latin.woff2 +0 -0
  147. package/package.json +306 -3
  148. package/styles/base.css +160 -0
  149. package/styles/components/accordion.css +130 -0
  150. package/styles/components/active-filters.css +42 -0
  151. package/styles/components/alert-dialog.css +34 -0
  152. package/styles/components/alert.css +159 -0
  153. package/styles/components/autocomplete.css +97 -0
  154. package/styles/components/avatar.css +90 -0
  155. package/styles/components/badge.css +91 -0
  156. package/styles/components/breadcrumbs.css +94 -0
  157. package/styles/components/button.css +174 -0
  158. package/styles/components/calendar.css +186 -0
  159. package/styles/components/card.css +206 -0
  160. package/styles/components/character-count.css +41 -0
  161. package/styles/components/chart.css +308 -0
  162. package/styles/components/checkbox.css +115 -0
  163. package/styles/components/color-picker.css +158 -0
  164. package/styles/components/command.css +175 -0
  165. package/styles/components/copy-button.css +58 -0
  166. package/styles/components/date-range-picker.css +153 -0
  167. package/styles/components/description-list.css +69 -0
  168. package/styles/components/dialog.css +334 -0
  169. package/styles/components/dropzone.css +89 -0
  170. package/styles/components/editable-text.css +58 -0
  171. package/styles/components/empty-state.css +72 -0
  172. package/styles/components/expandable-text.css +24 -0
  173. package/styles/components/field.css +148 -0
  174. package/styles/components/file-preview.css +65 -0
  175. package/styles/components/form-error-summary.css +71 -0
  176. package/styles/components/icon.css +38 -0
  177. package/styles/components/index.css +80 -0
  178. package/styles/components/input.css +171 -0
  179. package/styles/components/kbd.css +42 -0
  180. package/styles/components/menu.css +168 -0
  181. package/styles/components/multi-select.css +156 -0
  182. package/styles/components/navigation-list.css +147 -0
  183. package/styles/components/number-input.css +33 -0
  184. package/styles/components/otp-input.css +26 -0
  185. package/styles/components/pagination.css +127 -0
  186. package/styles/components/password-input.css +20 -0
  187. package/styles/components/popover.css +93 -0
  188. package/styles/components/progress-ring.css +112 -0
  189. package/styles/components/progress.css +162 -0
  190. package/styles/components/radio.css +117 -0
  191. package/styles/components/range-slider.css +158 -0
  192. package/styles/components/rating.css +100 -0
  193. package/styles/components/reorder-list.css +143 -0
  194. package/styles/components/scroll-area.css +39 -0
  195. package/styles/components/search-input.css +25 -0
  196. package/styles/components/segmented.css +136 -0
  197. package/styles/components/select.css +257 -0
  198. package/styles/components/sidebar.css +105 -0
  199. package/styles/components/skeleton.css +83 -0
  200. package/styles/components/slider.css +132 -0
  201. package/styles/components/splitter.css +83 -0
  202. package/styles/components/stat.css +62 -0
  203. package/styles/components/stepper.css +236 -0
  204. package/styles/components/switch.css +107 -0
  205. package/styles/components/table.css +195 -0
  206. package/styles/components/tabs.css +198 -0
  207. package/styles/components/tag-input.css +138 -0
  208. package/styles/components/text-highlight.css +22 -0
  209. package/styles/components/time-input.css +96 -0
  210. package/styles/components/timeline.css +182 -0
  211. package/styles/components/toast.css +146 -0
  212. package/styles/components/toolbar.css +72 -0
  213. package/styles/components/tooltip.css +93 -0
  214. package/styles/components/tree.css +88 -0
  215. package/styles/components/upload-list.css +113 -0
  216. package/styles/fonts.css +67 -0
  217. package/styles/index.css +14 -0
  218. package/styles/reset.css +57 -0
  219. package/styles/tokens/primitives.css +364 -0
  220. package/styles/tokens/semantic.css +233 -0
  221. package/types/vadem-ui-accordion.d.ts +43 -0
  222. package/types/vadem-ui-active-filters.d.ts +73 -0
  223. package/types/vadem-ui-alert-dialog.d.ts +87 -0
  224. package/types/vadem-ui-alert.d.ts +64 -0
  225. package/types/vadem-ui-autocomplete.d.ts +156 -0
  226. package/types/vadem-ui-avatar.d.ts +59 -0
  227. package/types/vadem-ui-badge.d.ts +25 -0
  228. package/types/vadem-ui-breadcrumbs.d.ts +22 -0
  229. package/types/vadem-ui-button.d.ts +52 -0
  230. package/types/vadem-ui-calendar.d.ts +327 -0
  231. package/types/vadem-ui-card.d.ts +58 -0
  232. package/types/vadem-ui-character-count.d.ts +71 -0
  233. package/types/vadem-ui-chart.d.ts +452 -0
  234. package/types/vadem-ui-checkbox.d.ts +20 -0
  235. package/types/vadem-ui-color-picker.d.ts +171 -0
  236. package/types/vadem-ui-command.d.ts +145 -0
  237. package/types/vadem-ui-copy-button.d.ts +90 -0
  238. package/types/vadem-ui-date-range-picker.d.ts +216 -0
  239. package/types/vadem-ui-description-list.d.ts +15 -0
  240. package/types/vadem-ui-dialog.d.ts +174 -0
  241. package/types/vadem-ui-dropzone.d.ts +73 -0
  242. package/types/vadem-ui-editable-text.d.ts +141 -0
  243. package/types/vadem-ui-empty-state.d.ts +34 -0
  244. package/types/vadem-ui-expandable-text.d.ts +52 -0
  245. package/types/vadem-ui-field.d.ts +180 -0
  246. package/types/vadem-ui-file-preview.d.ts +108 -0
  247. package/types/vadem-ui-file-size.d.ts +18 -0
  248. package/types/vadem-ui-form-error-summary.d.ts +46 -0
  249. package/types/vadem-ui-icon.d.ts +152 -0
  250. package/types/vadem-ui-input.d.ts +31 -0
  251. package/types/vadem-ui-kbd.d.ts +66 -0
  252. package/types/vadem-ui-keyboard.d.ts +61 -0
  253. package/types/vadem-ui-locale.d.ts +241 -0
  254. package/types/vadem-ui-menu.d.ts +132 -0
  255. package/types/vadem-ui-navigation-list.d.ts +28 -0
  256. package/types/vadem-ui-number-input.d.ts +39 -0
  257. package/types/vadem-ui-otp-input.d.ts +15 -0
  258. package/types/vadem-ui-pagination.d.ts +96 -0
  259. package/types/vadem-ui-password-input.d.ts +36 -0
  260. package/types/vadem-ui-popover.d.ts +48 -0
  261. package/types/vadem-ui-progress.d.ts +95 -0
  262. package/types/vadem-ui-radio.d.ts +11 -0
  263. package/types/vadem-ui-range-slider.d.ts +136 -0
  264. package/types/vadem-ui-rating.d.ts +95 -0
  265. package/types/vadem-ui-relative-time.d.ts +58 -0
  266. package/types/vadem-ui-reorder-list.d.ts +120 -0
  267. package/types/vadem-ui-scroll-area.d.ts +13 -0
  268. package/types/vadem-ui-search-input.d.ts +58 -0
  269. package/types/vadem-ui-segmented.d.ts +76 -0
  270. package/types/vadem-ui-select.d.ts +303 -0
  271. package/types/vadem-ui-sidebar.d.ts +70 -0
  272. package/types/vadem-ui-skeleton.d.ts +28 -0
  273. package/types/vadem-ui-slider.d.ts +17 -0
  274. package/types/vadem-ui-splitter.d.ts +99 -0
  275. package/types/vadem-ui-stat.d.ts +101 -0
  276. package/types/vadem-ui-stepper.d.ts +108 -0
  277. package/types/vadem-ui-switch.d.ts +10 -0
  278. package/types/vadem-ui-table.d.ts +172 -0
  279. package/types/vadem-ui-tabs.d.ts +101 -0
  280. package/types/vadem-ui-tag-input.d.ts +170 -0
  281. package/types/vadem-ui-text-highlight.d.ts +27 -0
  282. package/types/vadem-ui-time-input.d.ts +47 -0
  283. package/types/vadem-ui-timeline.d.ts +54 -0
  284. package/types/vadem-ui-toast.d.ts +104 -0
  285. package/types/vadem-ui-toolbar.d.ts +80 -0
  286. package/types/vadem-ui-tooltip.d.ts +71 -0
  287. package/types/vadem-ui-tree.d.ts +123 -0
  288. package/types/vadem-ui-upload-list.d.ts +70 -0
  289. package/types/vadem-ui.d.ts +1 -0
@@ -0,0 +1,397 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, Injectable, ViewEncapsulation, afterRenderEffect, computed, inject, input, signal } from "@angular/core";
3
+ import { VdButton } from "@vadem/ui/button";
4
+ import { VdIcon } from "@vadem/ui/icon";
5
+ import { vdTexts } from "@vadem/ui/locale";
6
+ const VD_TOAST_DEFAULTS = {
7
+ max: 3,
8
+ duration: 5e3,
9
+ exitDuration: 300
10
+ };
11
+ var VdToastStore = class {
12
+ options;
13
+ toasts = [];
14
+ timers = /* @__PURE__ */ new Map();
15
+ listeners = /* @__PURE__ */ new Set();
16
+ nextId = 1;
17
+ paused = false;
18
+ constructor(options = VD_TOAST_DEFAULTS) {
19
+ this.options = options;
20
+ }
21
+ get snapshot() {
22
+ return this.toasts;
23
+ }
24
+ subscribe(listener) {
25
+ this.listeners.add(listener);
26
+ listener(this.toasts);
27
+ return () => this.listeners.delete(listener);
28
+ }
29
+ show(input) {
30
+ const id = this.nextId++;
31
+ const duration = input.duration ?? (input.action ? this.options.duration * 2 : this.options.duration);
32
+ const toast = {
33
+ id,
34
+ title: input.title,
35
+ description: input.description,
36
+ variant: input.variant ?? "neutral",
37
+ action: input.action,
38
+ duration,
39
+ state: "open"
40
+ };
41
+ this.toasts = [...this.toasts, toast];
42
+ this.startTimer(id, duration);
43
+ const open = this.toasts.filter((t) => t.state === "open");
44
+ for (const extra of open.slice(0, Math.max(0, open.length - this.options.max))) this.dismiss(extra.id);
45
+ this.emit();
46
+ return id;
47
+ }
48
+ dismiss(id) {
49
+ const toast = this.toasts.find((t) => t.id === id);
50
+ if (!toast || toast.state === "leaving") return;
51
+ this.clearTimer(id);
52
+ this.toasts = this.toasts.map((t) => t.id === id ? {
53
+ ...t,
54
+ state: "leaving"
55
+ } : t);
56
+ this.emit();
57
+ setTimeout(() => this.remove(id), this.options.exitDuration);
58
+ }
59
+ remove(id) {
60
+ if (!this.toasts.some((t) => t.id === id)) return;
61
+ this.clearTimer(id);
62
+ this.toasts = this.toasts.filter((t) => t.id !== id);
63
+ this.emit();
64
+ }
65
+ dismissAll() {
66
+ for (const t of this.toasts) this.dismiss(t.id);
67
+ }
68
+ pause() {
69
+ if (this.paused) return;
70
+ this.paused = true;
71
+ const now = Date.now();
72
+ for (const timer of this.timers.values()) {
73
+ clearTimeout(timer.handle);
74
+ timer.handle = void 0;
75
+ timer.remaining -= now - timer.startedAt;
76
+ }
77
+ }
78
+ resume() {
79
+ if (!this.paused) return;
80
+ this.paused = false;
81
+ for (const [id, timer] of this.timers) this.run(id, timer);
82
+ }
83
+ destroy() {
84
+ for (const id of [...this.timers.keys()]) this.clearTimer(id);
85
+ this.listeners.clear();
86
+ }
87
+ startTimer(id, duration) {
88
+ if (!Number.isFinite(duration)) return;
89
+ const timer = {
90
+ remaining: duration,
91
+ startedAt: Date.now()
92
+ };
93
+ this.timers.set(id, timer);
94
+ if (!this.paused) this.run(id, timer);
95
+ }
96
+ run(id, timer) {
97
+ timer.startedAt = Date.now();
98
+ timer.handle = setTimeout(() => this.dismiss(id), Math.max(0, timer.remaining));
99
+ }
100
+ clearTimer(id) {
101
+ clearTimeout(this.timers.get(id)?.handle);
102
+ this.timers.delete(id);
103
+ }
104
+ emit() {
105
+ for (const listener of this.listeners) listener(this.toasts);
106
+ }
107
+ };
108
+ var VdToaster = class VdToaster {
109
+ store = new VdToastStore(VD_TOAST_DEFAULTS);
110
+ list = signal([], ...ngDevMode ? [{ debugName: "list" }] : /* istanbul ignore next */ []);
111
+ toasts = this.list.asReadonly();
112
+ constructor() {
113
+ this.store.subscribe((t) => this.list.set(t));
114
+ inject(DestroyRef).onDestroy(() => this.store.destroy());
115
+ }
116
+ show(toast) {
117
+ return this.store.show(toast);
118
+ }
119
+ success(title, description) {
120
+ return this.show({
121
+ title,
122
+ description,
123
+ variant: "success"
124
+ });
125
+ }
126
+ error(title, description) {
127
+ return this.show({
128
+ title,
129
+ description,
130
+ variant: "danger"
131
+ });
132
+ }
133
+ dismiss(id) {
134
+ this.store.dismiss(id);
135
+ }
136
+ static ɵfac = i0.ɵɵngDeclareFactory({
137
+ minVersion: "12.0.0",
138
+ version: "22.2.1",
139
+ ngImport: i0,
140
+ type: VdToaster,
141
+ deps: [],
142
+ target: i0.ɵɵFactoryTarget.Injectable
143
+ });
144
+ static ɵprov = i0.ɵɵngDeclareInjectable({
145
+ minVersion: "12.0.0",
146
+ version: "22.2.1",
147
+ ngImport: i0,
148
+ type: VdToaster,
149
+ providedIn: "root"
150
+ });
151
+ };
152
+ i0.ɵɵngDeclareClassMetadata({
153
+ minVersion: "12.0.0",
154
+ version: "22.2.1",
155
+ ngImport: i0,
156
+ type: VdToaster,
157
+ decorators: [{
158
+ type: Injectable,
159
+ args: [{ providedIn: "root" }]
160
+ }],
161
+ ctorParameters: () => []
162
+ });
163
+ const ICONS = {
164
+ success: "check-circle",
165
+ danger: "alert-circle",
166
+ warning: "alert-triangle",
167
+ info: "info"
168
+ };
169
+ var VdToasterOutlet = class VdToasterOutlet {
170
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
171
+ closeLabel = input(...ngDevMode ? [void 0, { debugName: "closeLabel" }] : /* istanbul ignore next */ []);
172
+ t = vdTexts("toast", {
173
+ label: this.label,
174
+ closeLabel: this.closeLabel
175
+ });
176
+ toaster = inject(VdToaster);
177
+ icons = ICONS;
178
+ el = inject(ElementRef).nativeElement;
179
+ hasToasts = computed(() => this.toaster.toasts().length > 0, ...ngDevMode ? [{ debugName: "hasToasts" }] : /* istanbul ignore next */ []);
180
+ constructor() {
181
+ afterRenderEffect(() => {
182
+ const show = this.hasToasts();
183
+ if (!this.el.showPopover) return;
184
+ const open = this.el.matches(":popover-open");
185
+ if (show && !open) this.el.showPopover();
186
+ if (!show && open) this.el.hidePopover();
187
+ });
188
+ }
189
+ resumeUnlessFocused() {
190
+ if (!this.el.contains(this.el.ownerDocument.activeElement)) this.toaster.store.resume();
191
+ }
192
+ resumeIfLeaving(event) {
193
+ if (!this.el.contains(event.relatedTarget) && !this.el.matches(":hover")) this.toaster.store.resume();
194
+ }
195
+ static ɵfac = i0.ɵɵngDeclareFactory({
196
+ minVersion: "12.0.0",
197
+ version: "22.2.1",
198
+ ngImport: i0,
199
+ type: VdToasterOutlet,
200
+ deps: [],
201
+ target: i0.ɵɵFactoryTarget.Component
202
+ });
203
+ static ɵcmp = i0.ɵɵngDeclareComponent({
204
+ minVersion: "17.0.0",
205
+ version: "22.2.1",
206
+ type: VdToasterOutlet,
207
+ isStandalone: true,
208
+ selector: "vd-toaster",
209
+ inputs: {
210
+ label: {
211
+ classPropertyName: "label",
212
+ publicName: "label",
213
+ isSignal: true,
214
+ isRequired: false,
215
+ transformFunction: null
216
+ },
217
+ closeLabel: {
218
+ classPropertyName: "closeLabel",
219
+ publicName: "closeLabel",
220
+ isSignal: true,
221
+ isRequired: false,
222
+ transformFunction: null
223
+ }
224
+ },
225
+ host: {
226
+ attributes: {
227
+ "popover": "manual",
228
+ "role": "region"
229
+ },
230
+ listeners: {
231
+ "pointerenter": "toaster.store.pause()",
232
+ "pointerleave": "resumeUnlessFocused()",
233
+ "focusin": "toaster.store.pause()",
234
+ "focusout": "resumeIfLeaving($event)"
235
+ },
236
+ properties: { "attr.aria-label": "t().label" },
237
+ classAttribute: "vd-toaster"
238
+ },
239
+ ngImport: i0,
240
+ template: `
241
+ <ol class="vd-toaster__list" aria-live="polite" aria-relevant="additions">
242
+ @for (toast of toaster.toasts(); track toast.id) {
243
+ <li
244
+ class="vd-toast"
245
+ [attr.data-variant]="toast.variant"
246
+ [attr.data-state]="toast.state"
247
+ [attr.role]="toast.variant === 'danger' ? 'alert' : null"
248
+ aria-atomic="true"
249
+ >
250
+ @if (icons[toast.variant]; as icon) {
251
+ <vd-icon class="vd-toast__icon" [name]="icon" />
252
+ }
253
+ <div class="vd-toast__content">
254
+ <p class="vd-toast__title">{{ toast.title }}</p>
255
+ @if (toast.description) {
256
+ <p class="vd-toast__description">{{ toast.description }}</p>
257
+ }
258
+ </div>
259
+ @if (toast.action; as action) {
260
+ <button
261
+ vdButton
262
+ size="sm"
263
+ class="vd-toast__action"
264
+ (click)="action.onClick(); toaster.dismiss(toast.id)"
265
+ >
266
+ {{ action.label }}
267
+ </button>
268
+ }
269
+ <button
270
+ vdButton
271
+ variant="ghost"
272
+ size="sm"
273
+ iconOnly
274
+ class="vd-toast__close"
275
+ [attr.aria-label]="t().closeLabel"
276
+ (click)="toaster.dismiss(toast.id)"
277
+ >
278
+ <vd-icon name="x" />
279
+ </button>
280
+ </li>
281
+ }
282
+ </ol>
283
+ `,
284
+ isInline: true,
285
+ dependencies: [{
286
+ kind: "component",
287
+ type: VdButton,
288
+ selector: "button[vdButton], a[vdButton]",
289
+ inputs: [
290
+ "variant",
291
+ "size",
292
+ "disabled",
293
+ "loading",
294
+ "iconOnly",
295
+ "type"
296
+ ]
297
+ }, {
298
+ kind: "component",
299
+ type: VdIcon,
300
+ selector: "vd-icon",
301
+ inputs: ["name", "label"]
302
+ }],
303
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
304
+ encapsulation: i0.ViewEncapsulation.None
305
+ });
306
+ };
307
+ i0.ɵɵngDeclareClassMetadata({
308
+ minVersion: "12.0.0",
309
+ version: "22.2.1",
310
+ ngImport: i0,
311
+ type: VdToasterOutlet,
312
+ decorators: [{
313
+ type: Component,
314
+ args: [{
315
+ selector: "vd-toaster",
316
+ imports: [VdButton, VdIcon],
317
+ template: `
318
+ <ol class="vd-toaster__list" aria-live="polite" aria-relevant="additions">
319
+ @for (toast of toaster.toasts(); track toast.id) {
320
+ <li
321
+ class="vd-toast"
322
+ [attr.data-variant]="toast.variant"
323
+ [attr.data-state]="toast.state"
324
+ [attr.role]="toast.variant === 'danger' ? 'alert' : null"
325
+ aria-atomic="true"
326
+ >
327
+ @if (icons[toast.variant]; as icon) {
328
+ <vd-icon class="vd-toast__icon" [name]="icon" />
329
+ }
330
+ <div class="vd-toast__content">
331
+ <p class="vd-toast__title">{{ toast.title }}</p>
332
+ @if (toast.description) {
333
+ <p class="vd-toast__description">{{ toast.description }}</p>
334
+ }
335
+ </div>
336
+ @if (toast.action; as action) {
337
+ <button
338
+ vdButton
339
+ size="sm"
340
+ class="vd-toast__action"
341
+ (click)="action.onClick(); toaster.dismiss(toast.id)"
342
+ >
343
+ {{ action.label }}
344
+ </button>
345
+ }
346
+ <button
347
+ vdButton
348
+ variant="ghost"
349
+ size="sm"
350
+ iconOnly
351
+ class="vd-toast__close"
352
+ [attr.aria-label]="t().closeLabel"
353
+ (click)="toaster.dismiss(toast.id)"
354
+ >
355
+ <vd-icon name="x" />
356
+ </button>
357
+ </li>
358
+ }
359
+ </ol>
360
+ `,
361
+ host: {
362
+ class: "vd-toaster",
363
+ popover: "manual",
364
+ role: "region",
365
+ "[attr.aria-label]": "t().label",
366
+ "(pointerenter)": "toaster.store.pause()",
367
+ "(pointerleave)": "resumeUnlessFocused()",
368
+ "(focusin)": "toaster.store.pause()",
369
+ "(focusout)": "resumeIfLeaving($event)"
370
+ },
371
+ changeDetection: ChangeDetectionStrategy.OnPush,
372
+ encapsulation: ViewEncapsulation.None
373
+ }]
374
+ }],
375
+ ctorParameters: () => [],
376
+ propDecorators: {
377
+ label: [{
378
+ type: i0.Input,
379
+ args: [{
380
+ isSignal: true,
381
+ alias: "label",
382
+ required: false
383
+ }]
384
+ }],
385
+ closeLabel: [{
386
+ type: i0.Input,
387
+ args: [{
388
+ isSignal: true,
389
+ alias: "closeLabel",
390
+ required: false
391
+ }]
392
+ }]
393
+ }
394
+ });
395
+ export { VD_TOAST_DEFAULTS, VdToastStore, VdToaster, VdToasterOutlet };
396
+
397
+ //# sourceMappingURL=vadem-ui-toast.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-toast.mjs","names":[],"sources":["../../../projects/ui/toast/src/core/toast-store.ts","../../../projects/ui/toast/src/toast.ts"],"sourcesContent":["/**\n * Framework-agnostic toast queue: ids, auto-dismiss timers that pause while the user is\n * interacting (hover/focus), a cap on visible toasts, and a two-phase exit (\"leaving\" for the\n * exit animation, then removed). Adapters subscribe and render.\n */\n\nexport type VdToastVariant = 'neutral' | 'success' | 'warning' | 'danger' | 'info';\n\nexport interface VdToastAction {\n label: string;\n onClick: () => void;\n}\n\nexport interface VdToastInput {\n title: string;\n description?: string;\n variant?: VdToastVariant;\n action?: VdToastAction;\n /** Auto-dismiss after ms. `Infinity` keeps it until dismissed. Default depends on content. */\n duration?: number;\n}\n\nexport interface VdToast extends Required<Pick<VdToastInput, 'title' | 'variant'>> {\n id: number;\n description?: string;\n action?: VdToastAction;\n duration: number;\n state: 'open' | 'leaving';\n}\n\nexport interface VdToastStoreOptions {\n /** Max toasts shown at once; older ones leave first. */\n max: number;\n /** Default lifetime, ms. Toasts with an action get double, giving time to reach it. */\n duration: number;\n /** How long the exit animation may take before removal, ms. */\n exitDuration: number;\n}\n\nexport const VD_TOAST_DEFAULTS: VdToastStoreOptions = { max: 3, duration: 5000, exitDuration: 300 };\n\ninterface Timer {\n handle?: ReturnType<typeof setTimeout>;\n remaining: number;\n startedAt: number;\n}\n\nexport class VdToastStore {\n private toasts: VdToast[] = [];\n private readonly timers = new Map<number, Timer>();\n private readonly listeners = new Set<(toasts: readonly VdToast[]) => void>();\n private nextId = 1;\n private paused = false;\n\n constructor(private readonly options: VdToastStoreOptions = VD_TOAST_DEFAULTS) {}\n\n get snapshot(): readonly VdToast[] {\n return this.toasts;\n }\n\n subscribe(listener: (toasts: readonly VdToast[]) => void): () => void {\n this.listeners.add(listener);\n listener(this.toasts);\n return () => this.listeners.delete(listener);\n }\n\n show(input: VdToastInput): number {\n const id = this.nextId++;\n const duration =\n input.duration ?? (input.action ? this.options.duration * 2 : this.options.duration);\n const toast: VdToast = {\n id,\n title: input.title,\n description: input.description,\n variant: input.variant ?? 'neutral',\n action: input.action,\n duration,\n state: 'open',\n };\n this.toasts = [...this.toasts, toast];\n this.startTimer(id, duration);\n\n const open = this.toasts.filter((t) => t.state === 'open');\n for (const extra of open.slice(0, Math.max(0, open.length - this.options.max))) {\n this.dismiss(extra.id);\n }\n this.emit();\n return id;\n }\n\n /** Starts the exit; the toast is removed after the exit animation (or `exitDuration`). */\n dismiss(id: number): void {\n const toast = this.toasts.find((t) => t.id === id);\n if (!toast || toast.state === 'leaving') return;\n this.clearTimer(id);\n this.toasts = this.toasts.map((t) => (t.id === id ? { ...t, state: 'leaving' } : t));\n this.emit();\n setTimeout(() => this.remove(id), this.options.exitDuration);\n }\n\n /** Removes immediately (call when the exit animation has ended). */\n remove(id: number): void {\n if (!this.toasts.some((t) => t.id === id)) return;\n this.clearTimer(id);\n this.toasts = this.toasts.filter((t) => t.id !== id);\n this.emit();\n }\n\n dismissAll(): void {\n for (const t of this.toasts) this.dismiss(t.id);\n }\n\n /** Pause every timer (pointer or focus inside the toaster - WCAG 2.2.1). */\n pause(): void {\n if (this.paused) return;\n this.paused = true;\n const now = Date.now();\n for (const timer of this.timers.values()) {\n clearTimeout(timer.handle);\n timer.handle = undefined;\n timer.remaining -= now - timer.startedAt;\n }\n }\n\n resume(): void {\n if (!this.paused) return;\n this.paused = false;\n for (const [id, timer] of this.timers) this.run(id, timer);\n }\n\n destroy(): void {\n for (const id of [...this.timers.keys()]) this.clearTimer(id);\n this.listeners.clear();\n }\n\n private startTimer(id: number, duration: number): void {\n if (!Number.isFinite(duration)) return;\n const timer: Timer = { remaining: duration, startedAt: Date.now() };\n this.timers.set(id, timer);\n if (!this.paused) this.run(id, timer);\n }\n\n private run(id: number, timer: Timer): void {\n timer.startedAt = Date.now();\n timer.handle = setTimeout(() => this.dismiss(id), Math.max(0, timer.remaining));\n }\n\n private clearTimer(id: number): void {\n clearTimeout(this.timers.get(id)?.handle);\n this.timers.delete(id);\n }\n\n private emit(): void {\n for (const listener of this.listeners) listener(this.toasts);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injectable,\n ViewEncapsulation,\n afterRenderEffect,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { VdButton } from '@vadem/ui/button';\nimport { VdIcon, VdIconName } from '@vadem/ui/icon';\nimport {\n VD_TOAST_DEFAULTS,\n VdToast,\n VdToastInput,\n VdToastStore,\n VdToastVariant,\n} from './core/toast-store';\nimport { vdTexts } from '@vadem/ui/locale';\n\n/** App-wide toast queue. Render it once with `<vd-toaster />`. Spec: specs/toast.md */\n@Injectable({ providedIn: 'root' })\nexport class VdToaster {\n readonly store = new VdToastStore(VD_TOAST_DEFAULTS);\n private readonly list = signal<readonly VdToast[]>([]);\n readonly toasts = this.list.asReadonly();\n\n constructor() {\n this.store.subscribe((t) => this.list.set(t));\n inject(DestroyRef).onDestroy(() => this.store.destroy());\n }\n\n show(toast: VdToastInput): number {\n return this.store.show(toast);\n }\n\n success(title: string, description?: string): number {\n return this.show({ title, description, variant: 'success' });\n }\n\n error(title: string, description?: string): number {\n return this.show({ title, description, variant: 'danger' });\n }\n\n dismiss(id: number): void {\n this.store.dismiss(id);\n }\n}\n\nconst ICONS: Partial<Record<VdToastVariant, VdIconName>> = {\n success: 'check-circle',\n danger: 'alert-circle',\n warning: 'alert-triangle',\n info: 'info',\n};\n\n@Component({\n selector: 'vd-toaster',\n imports: [VdButton, VdIcon],\n template: `\n <ol class=\"vd-toaster__list\" aria-live=\"polite\" aria-relevant=\"additions\">\n @for (toast of toaster.toasts(); track toast.id) {\n <li\n class=\"vd-toast\"\n [attr.data-variant]=\"toast.variant\"\n [attr.data-state]=\"toast.state\"\n [attr.role]=\"toast.variant === 'danger' ? 'alert' : null\"\n aria-atomic=\"true\"\n >\n @if (icons[toast.variant]; as icon) {\n <vd-icon class=\"vd-toast__icon\" [name]=\"icon\" />\n }\n <div class=\"vd-toast__content\">\n <p class=\"vd-toast__title\">{{ toast.title }}</p>\n @if (toast.description) {\n <p class=\"vd-toast__description\">{{ toast.description }}</p>\n }\n </div>\n @if (toast.action; as action) {\n <button\n vdButton\n size=\"sm\"\n class=\"vd-toast__action\"\n (click)=\"action.onClick(); toaster.dismiss(toast.id)\"\n >\n {{ action.label }}\n </button>\n }\n <button\n vdButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n class=\"vd-toast__close\"\n [attr.aria-label]=\"t().closeLabel\"\n (click)=\"toaster.dismiss(toast.id)\"\n >\n <vd-icon name=\"x\" />\n </button>\n </li>\n }\n </ol>\n `,\n host: {\n class: 'vd-toaster',\n popover: 'manual',\n role: 'region',\n '[attr.aria-label]': 't().label',\n '(pointerenter)': 'toaster.store.pause()',\n '(pointerleave)': 'resumeUnlessFocused()',\n '(focusin)': 'toaster.store.pause()',\n '(focusout)': 'resumeIfLeaving($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdToasterOutlet {\n /** Landmark name for the region (localize it). */\n readonly label = input<string>();\n readonly closeLabel = input<string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly t = vdTexts('toast', { label: this.label, closeLabel: this.closeLabel });\n\n protected readonly toaster = inject(VdToaster);\n protected readonly icons = ICONS;\n private readonly el: HTMLElement = inject(ElementRef).nativeElement;\n private readonly hasToasts = computed(() => this.toaster.toasts().length > 0);\n\n constructor() {\n // Browser-only: keep the region in the top layer while it has toasts.\n afterRenderEffect(() => {\n const show = this.hasToasts();\n if (!this.el.showPopover) return;\n const open = this.el.matches(':popover-open');\n if (show && !open) this.el.showPopover();\n if (!show && open) this.el.hidePopover();\n });\n }\n\n protected resumeUnlessFocused(): void {\n if (!this.el.contains(this.el.ownerDocument.activeElement)) this.toaster.store.resume();\n }\n\n protected resumeIfLeaving(event: FocusEvent): void {\n if (!this.el.contains(event.relatedTarget as Node | null) && !this.el.matches(':hover')) {\n this.toaster.store.resume();\n }\n }\n}\n"],"mappings":"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"}