@wrrdev/fenix-ui 1.0.17 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +2 -2
  2. package/dist/_virtual/preload-helper.js +68 -0
  3. package/dist/_virtual/preload-helper.js.map +1 -0
  4. package/dist/assets/base-css-BifSeW2H.js +31 -0
  5. package/dist/assets/base-css-BifSeW2H.js.map +1 -0
  6. package/dist/components/alert/alert.d.ts +2 -1
  7. package/dist/components/alert/alert.d.ts.map +1 -1
  8. package/dist/components/alert/alert.js +10 -2
  9. package/dist/components/alert/alert.js.map +1 -1
  10. package/dist/components/avatar/avatar.d.ts +21 -0
  11. package/dist/components/avatar/avatar.d.ts.map +1 -0
  12. package/dist/components/avatar/avatar.js +91 -0
  13. package/dist/components/avatar/avatar.js.map +1 -0
  14. package/dist/components/avatar/index.d.ts +8 -0
  15. package/dist/components/avatar/index.d.ts.map +1 -0
  16. package/dist/components/avatar/index.js +7 -0
  17. package/dist/components/avatar/index.js.map +1 -0
  18. package/dist/components/breadcrumb/breadcrumb.d.ts +35 -0
  19. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -0
  20. package/dist/components/breadcrumb/breadcrumb.js +113 -0
  21. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  22. package/dist/components/breadcrumb/index.d.ts +8 -0
  23. package/dist/components/breadcrumb/index.d.ts.map +1 -0
  24. package/dist/components/breadcrumb/index.js +7 -0
  25. package/dist/components/breadcrumb/index.js.map +1 -0
  26. package/dist/components/card/card.d.ts +15 -0
  27. package/dist/components/card/card.d.ts.map +1 -0
  28. package/dist/components/card/card.js +80 -0
  29. package/dist/components/card/card.js.map +1 -0
  30. package/dist/components/card/index.d.ts +8 -0
  31. package/dist/components/card/index.d.ts.map +1 -0
  32. package/dist/components/card/index.js +7 -0
  33. package/dist/components/card/index.js.map +1 -0
  34. package/dist/components/carousel/carousel.d.ts +28 -0
  35. package/dist/components/carousel/carousel.d.ts.map +1 -0
  36. package/dist/components/carousel/carousel.js +176 -0
  37. package/dist/components/carousel/carousel.js.map +1 -0
  38. package/dist/components/carousel/index.d.ts +8 -0
  39. package/dist/components/carousel/index.d.ts.map +1 -0
  40. package/dist/components/carousel/index.js +7 -0
  41. package/dist/components/carousel/index.js.map +1 -0
  42. package/dist/components/chip/chip.d.ts +19 -0
  43. package/dist/components/chip/chip.d.ts.map +1 -0
  44. package/dist/components/chip/chip.js +126 -0
  45. package/dist/components/chip/chip.js.map +1 -0
  46. package/dist/components/chip/index.d.ts +8 -0
  47. package/dist/components/chip/index.d.ts.map +1 -0
  48. package/dist/components/chip/index.js +7 -0
  49. package/dist/components/chip/index.js.map +1 -0
  50. package/dist/components/confirmpopup/confirmpopup.d.ts +44 -0
  51. package/dist/components/confirmpopup/confirmpopup.d.ts.map +1 -0
  52. package/dist/components/confirmpopup/confirmpopup.js +233 -0
  53. package/dist/components/confirmpopup/confirmpopup.js.map +1 -0
  54. package/dist/components/confirmpopup/index.d.ts +8 -0
  55. package/dist/components/confirmpopup/index.d.ts.map +1 -0
  56. package/dist/components/confirmpopup/index.js +7 -0
  57. package/dist/components/confirmpopup/index.js.map +1 -0
  58. package/dist/components/empty-state/empty-state.d.ts +14 -0
  59. package/dist/components/empty-state/empty-state.d.ts.map +1 -0
  60. package/dist/components/empty-state/empty-state.js +71 -0
  61. package/dist/components/empty-state/empty-state.js.map +1 -0
  62. package/dist/components/empty-state/index.d.ts +8 -0
  63. package/dist/components/empty-state/index.d.ts.map +1 -0
  64. package/dist/components/empty-state/index.js +7 -0
  65. package/dist/components/empty-state/index.js.map +1 -0
  66. package/dist/components/fileupload/fileupload.d.ts +42 -0
  67. package/dist/components/fileupload/fileupload.d.ts.map +1 -0
  68. package/dist/components/fileupload/fileupload.js +284 -0
  69. package/dist/components/fileupload/fileupload.js.map +1 -0
  70. package/dist/components/fileupload/index.d.ts +8 -0
  71. package/dist/components/fileupload/index.d.ts.map +1 -0
  72. package/dist/components/fileupload/index.js +7 -0
  73. package/dist/components/fileupload/index.js.map +1 -0
  74. package/dist/components/menu/index.d.ts +8 -0
  75. package/dist/components/menu/index.d.ts.map +1 -0
  76. package/dist/components/menu/index.js +7 -0
  77. package/dist/components/menu/index.js.map +1 -0
  78. package/dist/components/menu/menu.d.ts +23 -0
  79. package/dist/components/menu/menu.d.ts.map +1 -0
  80. package/dist/components/menu/menu.js +155 -0
  81. package/dist/components/menu/menu.js.map +1 -0
  82. package/dist/components/orderlist/orderlist.d.ts +1 -1
  83. package/dist/components/orderlist/orderlist.d.ts.map +1 -1
  84. package/dist/components/orderlist/orderlist.js +2 -2
  85. package/dist/components/orderlist/orderlist.js.map +1 -1
  86. package/dist/components/password-strength/index.d.ts +8 -0
  87. package/dist/components/password-strength/index.d.ts.map +1 -0
  88. package/dist/components/password-strength/index.js +7 -0
  89. package/dist/components/password-strength/index.js.map +1 -0
  90. package/dist/components/password-strength/password-strength.d.ts +23 -0
  91. package/dist/components/password-strength/password-strength.d.ts.map +1 -0
  92. package/dist/components/password-strength/password-strength.js +109 -0
  93. package/dist/components/password-strength/password-strength.js.map +1 -0
  94. package/dist/components/picklist/picklist.d.ts +1 -1
  95. package/dist/components/picklist/picklist.d.ts.map +1 -1
  96. package/dist/components/picklist/picklist.js +2 -2
  97. package/dist/components/picklist/picklist.js.map +1 -1
  98. package/dist/components/popover/index.d.ts +8 -0
  99. package/dist/components/popover/index.d.ts.map +1 -0
  100. package/dist/components/popover/index.js +7 -0
  101. package/dist/components/popover/index.js.map +1 -0
  102. package/dist/components/popover/popover.d.ts +39 -0
  103. package/dist/components/popover/popover.d.ts.map +1 -0
  104. package/dist/components/popover/popover.js +228 -0
  105. package/dist/components/popover/popover.js.map +1 -0
  106. package/dist/components/rating/index.d.ts +8 -0
  107. package/dist/components/rating/index.d.ts.map +1 -0
  108. package/dist/components/rating/index.js +7 -0
  109. package/dist/components/rating/index.js.map +1 -0
  110. package/dist/components/rating/rating.d.ts +25 -0
  111. package/dist/components/rating/rating.d.ts.map +1 -0
  112. package/dist/components/rating/rating.js +119 -0
  113. package/dist/components/rating/rating.js.map +1 -0
  114. package/dist/components/slider/index.d.ts +8 -0
  115. package/dist/components/slider/index.d.ts.map +1 -0
  116. package/dist/components/slider/index.js +7 -0
  117. package/dist/components/slider/index.js.map +1 -0
  118. package/dist/components/slider/slider.d.ts +33 -0
  119. package/dist/components/slider/slider.d.ts.map +1 -0
  120. package/dist/components/slider/slider.js +260 -0
  121. package/dist/components/slider/slider.js.map +1 -0
  122. package/dist/components/stepper/index.d.ts +8 -0
  123. package/dist/components/stepper/index.d.ts.map +1 -0
  124. package/dist/components/stepper/index.js +7 -0
  125. package/dist/components/stepper/index.js.map +1 -0
  126. package/dist/components/stepper/stepper.d.ts +33 -0
  127. package/dist/components/stepper/stepper.d.ts.map +1 -0
  128. package/dist/components/stepper/stepper.js +162 -0
  129. package/dist/components/stepper/stepper.js.map +1 -0
  130. package/dist/components/timeline/index.d.ts +8 -0
  131. package/dist/components/timeline/index.d.ts.map +1 -0
  132. package/dist/components/timeline/index.js +7 -0
  133. package/dist/components/timeline/index.js.map +1 -0
  134. package/dist/components/timeline/timeline.d.ts +30 -0
  135. package/dist/components/timeline/timeline.d.ts.map +1 -0
  136. package/dist/components/timeline/timeline.js +146 -0
  137. package/dist/components/timeline/timeline.js.map +1 -0
  138. package/dist/components/toast/toast.d.ts.map +1 -1
  139. package/dist/components/toast/toast.js +21 -2
  140. package/dist/components/toast/toast.js.map +1 -1
  141. package/dist/components/toggle-button-group/index.d.ts +8 -0
  142. package/dist/components/toggle-button-group/index.d.ts.map +1 -0
  143. package/dist/components/toggle-button-group/index.js +7 -0
  144. package/dist/components/toggle-button-group/index.js.map +1 -0
  145. package/dist/components/toggle-button-group/toggle-button-group.d.ts +21 -0
  146. package/dist/components/toggle-button-group/toggle-button-group.d.ts.map +1 -0
  147. package/dist/components/toggle-button-group/toggle-button-group.js +103 -0
  148. package/dist/components/toggle-button-group/toggle-button-group.js.map +1 -0
  149. package/dist/components/tree/index.d.ts +8 -0
  150. package/dist/components/tree/index.d.ts.map +1 -0
  151. package/dist/components/tree/index.js +7 -0
  152. package/dist/components/tree/index.js.map +1 -0
  153. package/dist/components/tree/tree.d.ts +34 -0
  154. package/dist/components/tree/tree.d.ts.map +1 -0
  155. package/dist/components/tree/tree.js +149 -0
  156. package/dist/components/tree/tree.js.map +1 -0
  157. package/dist/core/base.d.ts +1 -1
  158. package/dist/core/base.d.ts.map +1 -1
  159. package/dist/core/base.js +1 -1
  160. package/dist/core/base.js.map +1 -1
  161. package/dist/docs/app.d.ts.map +1 -1
  162. package/dist/docs/componentes/avatar.doc.d.ts +6 -0
  163. package/dist/docs/componentes/avatar.doc.d.ts.map +1 -0
  164. package/dist/docs/componentes/breadcrumb.doc.d.ts +6 -0
  165. package/dist/docs/componentes/breadcrumb.doc.d.ts.map +1 -0
  166. package/dist/docs/componentes/card.doc.d.ts +6 -0
  167. package/dist/docs/componentes/card.doc.d.ts.map +1 -0
  168. package/dist/docs/componentes/carousel.doc.d.ts +6 -0
  169. package/dist/docs/componentes/carousel.doc.d.ts.map +1 -0
  170. package/dist/docs/componentes/chip.doc.d.ts +6 -0
  171. package/dist/docs/componentes/chip.doc.d.ts.map +1 -0
  172. package/dist/docs/componentes/confirmpopup.doc.d.ts +6 -0
  173. package/dist/docs/componentes/confirmpopup.doc.d.ts.map +1 -0
  174. package/dist/docs/componentes/empty-state.doc.d.ts +6 -0
  175. package/dist/docs/componentes/empty-state.doc.d.ts.map +1 -0
  176. package/dist/docs/componentes/fileupload.doc.d.ts +6 -0
  177. package/dist/docs/componentes/fileupload.doc.d.ts.map +1 -0
  178. package/dist/docs/componentes/index.d.ts.map +1 -1
  179. package/dist/docs/componentes/menu.doc.d.ts +6 -0
  180. package/dist/docs/componentes/menu.doc.d.ts.map +1 -0
  181. package/dist/docs/componentes/password-strength.doc.d.ts +6 -0
  182. package/dist/docs/componentes/password-strength.doc.d.ts.map +1 -0
  183. package/dist/docs/componentes/popover.doc.d.ts +6 -0
  184. package/dist/docs/componentes/popover.doc.d.ts.map +1 -0
  185. package/dist/docs/componentes/rating.doc.d.ts +6 -0
  186. package/dist/docs/componentes/rating.doc.d.ts.map +1 -0
  187. package/dist/docs/componentes/slider.doc.d.ts +6 -0
  188. package/dist/docs/componentes/slider.doc.d.ts.map +1 -0
  189. package/dist/docs/componentes/stepper.doc.d.ts +6 -0
  190. package/dist/docs/componentes/stepper.doc.d.ts.map +1 -0
  191. package/dist/docs/componentes/timeline.doc.d.ts +6 -0
  192. package/dist/docs/componentes/timeline.doc.d.ts.map +1 -0
  193. package/dist/docs/componentes/toggle-button-group.doc.d.ts +6 -0
  194. package/dist/docs/componentes/toggle-button-group.doc.d.ts.map +1 -0
  195. package/dist/docs/componentes/tree.doc.d.ts +6 -0
  196. package/dist/docs/componentes/tree.doc.d.ts.map +1 -0
  197. package/dist/fenix-icons.woff2 +0 -0
  198. package/dist/fenix-ui.umd.min.js +1317 -160
  199. package/dist/fenix-ui2.esm.js +4317 -7816
  200. package/dist/fenix-ui2.esm.js.map +1 -1
  201. package/dist/fenix-ui3.esm.js +10396 -84
  202. package/dist/fenix-ui3.esm.js.map +1 -1
  203. package/dist/fenix-ui4.esm.js +110 -0
  204. package/dist/fenix-ui4.esm.js.map +1 -0
  205. package/dist/icons/base-css.d.ts +21 -0
  206. package/dist/icons/base-css.d.ts.map +1 -0
  207. package/dist/icons/base-css.js +32 -0
  208. package/dist/icons/base-css.js.map +1 -0
  209. package/dist/icons/fenix-icons.woff2 +0 -0
  210. package/dist/icons/index.d.ts +31 -0
  211. package/dist/icons/index.d.ts.map +1 -0
  212. package/dist/icons/index.js +47 -0
  213. package/dist/icons/index.js.map +1 -0
  214. package/dist/icons/names.d.ts +11 -0
  215. package/dist/icons/names.d.ts.map +1 -0
  216. package/dist/icons/names.js +4283 -0
  217. package/dist/icons/names.js.map +1 -0
  218. package/dist/index.d.ts +17 -0
  219. package/dist/index.d.ts.map +1 -1
  220. package/dist/index.js +51 -0
  221. package/dist/index.js.map +1 -1
  222. package/dist/plugins/auto-import.d.ts +2 -0
  223. package/dist/plugins/auto-import.d.ts.map +1 -1
  224. package/dist/plugins/auto-import.js +23 -0
  225. package/dist/plugins/auto-import.js.map +1 -1
  226. package/package.json +74 -1
@@ -0,0 +1,162 @@
1
+ import { FxElement } from "../../core/base.js";
2
+ import { css } from "../../core/css.js";
3
+ import { defineElement } from "../../core/define.js";
4
+ import { esc } from "../../core/sanitize.js";
5
+ const _FxStepper = class _FxStepper extends FxElement {
6
+ constructor() {
7
+ super(...arguments);
8
+ this._titles = [];
9
+ this._panels = [];
10
+ }
11
+ static get observedAttributes() {
12
+ return ["active", "linear", "show-numbers"];
13
+ }
14
+ get stepCount() {
15
+ return this._titles.length;
16
+ }
17
+ get active() {
18
+ const n = Number(this.getAttr("active", "0"));
19
+ return Math.min(this.stepCount - 1, Math.max(0, Number.isFinite(n) ? n : 0));
20
+ }
21
+ set active(v) {
22
+ this.setAttribute("active", String(Math.min(this.stepCount - 1, Math.max(0, v))));
23
+ }
24
+ get isLast() {
25
+ return this.active >= this.stepCount - 1;
26
+ }
27
+ /** Navega al paso (emite change). Con linear, solo permite avanzar de a uno. */
28
+ goTo(index) {
29
+ const target = Math.min(this.stepCount - 1, Math.max(0, index));
30
+ if (this.hasAttr("linear") && target > this.active + 1) return;
31
+ this.active = target;
32
+ this.dispatchEvent(new CustomEvent("change", { bubbles: true, composed: true, detail: { index: this.active } }));
33
+ if (this.isLast) {
34
+ this.dispatchEvent(new CustomEvent("complete", { bubbles: true, composed: true }));
35
+ }
36
+ }
37
+ next() {
38
+ this.goTo(this.active + 1);
39
+ }
40
+ prev() {
41
+ this.goTo(this.active - 1);
42
+ }
43
+ render() {
44
+ this._panels = Array.from(this.children).filter(
45
+ (el) => el.matches('[slot^="step-"]')
46
+ );
47
+ this._titles = this._panels.map(
48
+ (p, i) => p.getAttribute("step-title") || `Paso ${i + 1}`
49
+ );
50
+ const active = Math.min(this.active, Math.max(0, this._titles.length - 1));
51
+ const stepsHtml = this._titles.map((title, i) => {
52
+ const state = i === active ? "active" : i < active ? "done" : "";
53
+ const marker = i < active && !this.hasAttr("show-numbers") ? "✓" : String(i + 1);
54
+ return `<span class="step ${state}" part="step" data-i="${i}"><span class="num">${marker}</span>${esc(title)}</span>`;
55
+ }).join("");
56
+ const panelsHtml = this._panels.map((p, i) => `<section class="panel" part="panel" ${i === active ? "" : "hidden"}>${p.innerHTML}</section>`).join("");
57
+ this.setTemplate(`
58
+ <div class="steps" part="steps">${stepsHtml}</div>
59
+ <div class="panel-wrap">${panelsHtml}</div>
60
+ <div class="actions" part="actions">
61
+ <button type="button" class="nav-btn prev" part="prev" ${active === 0 ? "disabled" : ""}>Anterior</button>
62
+ <button type="button" class="nav-btn primary next" part="next">${active === this._titles.length - 1 ? "Concluir" : "Próximo"}</button>
63
+ </div>
64
+ `);
65
+ this._bindSteps();
66
+ }
67
+ _bindSteps() {
68
+ const steps = Array.from(this.root.querySelectorAll(".step"));
69
+ steps.forEach((step) => {
70
+ const i = Number(step.dataset.i);
71
+ step.addEventListener("click", () => {
72
+ if (this.hasAttr("linear") && i > this.active + 1) return;
73
+ this.goTo(i);
74
+ });
75
+ step.addEventListener("keydown", (e) => {
76
+ if (e.key === "Enter") {
77
+ e.preventDefault();
78
+ this.goTo(i);
79
+ }
80
+ });
81
+ });
82
+ this.root.querySelector(".nav-btn.prev")?.addEventListener("click", () => this.prev());
83
+ this.root.querySelector(".nav-btn.next")?.addEventListener("click", () => this.next());
84
+ }
85
+ connectedCallback() {
86
+ super.connectedCallback();
87
+ if (this._titles.length === 0) this.render();
88
+ }
89
+ };
90
+ _FxStepper.styles = css`
91
+ :host { display: block; font-family: var(--fx-font-family); font-size: var(--fx-font-size); }
92
+ :host([linear]) .step-num.activated { cursor: not-allowed; }
93
+
94
+ .steps {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: var(--fx-space-md);
98
+ flex-wrap: wrap;
99
+ padding: var(--fx-space-md) var(--fx-space-lg);
100
+ }
101
+ .step {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ gap: var(--fx-space-sm);
105
+ padding: var(--fx-space-xs) var(--fx-space-md);
106
+ border-radius: var(--fx-radius-full);
107
+ color: var(--fx-text-muted);
108
+ font-weight: 600;
109
+ user-select: none;
110
+ cursor: pointer;
111
+ transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);
112
+ }
113
+ .step.active { background: var(--fx-color-primary); color: #fff; }
114
+ .step.done { color: var(--fx-color-primary); }
115
+ .step[hidden] { display: none; }
116
+ .num {
117
+ display: inline-flex; align-items: center; justify-content: center;
118
+ width: 24px; height: 24px; min-width: 24px;
119
+ border: 1.5px solid currentColor;
120
+ border-radius: var(--fx-radius-full);
121
+ font-size: calc(var(--fx-font-size) - 2px);
122
+ line-height: 1;
123
+ }
124
+
125
+ .panel { padding: var(--fx-space-lg) var(--fx-space-xl); min-height: 80px; }
126
+ .actions {
127
+ display: flex;
128
+ justify-content: space-between;
129
+ gap: var(--fx-space-sm);
130
+ padding: var(--fx-space-md) var(--fx-space-lg);
131
+ border-top: 1px solid var(--fx-border-default);
132
+ }
133
+ .nav-btn {
134
+ font-family: var(--fx-font-family);
135
+ font-size: calc(var(--fx-font-size) - 2px);
136
+ padding: var(--fx-space-xs) var(--fx-space-lg);
137
+ min-height: var(--fx-size-sm);
138
+ border-radius: var(--fx-radius-sm);
139
+ border: 1px solid var(--fx-border-default);
140
+ background: var(--fx-surface-background);
141
+ color: var(--fx-text-default);
142
+ cursor: pointer;
143
+ transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);
144
+ }
145
+ .nav-btn:hover:not(:disabled) { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }
146
+ .nav-btn:disabled { opacity: 0.5; cursor: not-allowed; }
147
+ .nav-btn.primary {
148
+ background: var(--fx-color-primary);
149
+ border-color: var(--fx-color-primary);
150
+ color: #fff;
151
+ }
152
+ .nav-btn.primary:hover:not(:disabled) { filter: brightness(0.92); background: var(--fx-color-primary); }
153
+ `;
154
+ let FxStepper = _FxStepper;
155
+ function defineFxStepper() {
156
+ return defineElement("fx-stepper", FxStepper);
157
+ }
158
+ export {
159
+ FxStepper,
160
+ defineFxStepper
161
+ };
162
+ //# sourceMappingURL=stepper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper.js","sources":["../../../src/components/stepper/stepper.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-stepper> — Asistente de pasos (wizard) para flujos multi-etapa.\n *\n * Uso declarativo: cada hijo directo con el atributo `step` define un paso.\n * Uso imperativo: leer/escribir la propiedad `active` para navegar.\n *\n * Atributos: active (índice del paso activo), linear (solo avanzar en orden),\n * show-numbers (muestra el número en el indicador).\n * Slots: `header` (customiza el indicador de pasos), un slot por paso\n * (slot=\"step-0\", slot=\"step-1\", ...).\n *\n * Eventos (composed): `change` (detail: { index }) y `complete` al llegar al último.\n */\nexport class FxStepper extends FxElement {\n static override styles = css`\n :host { display: block; font-family: var(--fx-font-family); font-size: var(--fx-font-size); }\n :host([linear]) .step-num.activated { cursor: not-allowed; }\n\n .steps {\n display: flex;\n align-items: center;\n gap: var(--fx-space-md);\n flex-wrap: wrap;\n padding: var(--fx-space-md) var(--fx-space-lg);\n }\n .step {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-xs) var(--fx-space-md);\n border-radius: var(--fx-radius-full);\n color: var(--fx-text-muted);\n font-weight: 600;\n user-select: none;\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .step.active { background: var(--fx-color-primary); color: #fff; }\n .step.done { color: var(--fx-color-primary); }\n .step[hidden] { display: none; }\n .num {\n display: inline-flex; align-items: center; justify-content: center;\n width: 24px; height: 24px; min-width: 24px;\n border: 1.5px solid currentColor;\n border-radius: var(--fx-radius-full);\n font-size: calc(var(--fx-font-size) - 2px);\n line-height: 1;\n }\n\n .panel { padding: var(--fx-space-lg) var(--fx-space-xl); min-height: 80px; }\n .actions {\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-md) var(--fx-space-lg);\n border-top: 1px solid var(--fx-border-default);\n }\n .nav-btn {\n font-family: var(--fx-font-family);\n font-size: calc(var(--fx-font-size) - 2px);\n padding: var(--fx-space-xs) var(--fx-space-lg);\n min-height: var(--fx-size-sm);\n border-radius: var(--fx-radius-sm);\n border: 1px solid var(--fx-border-default);\n background: var(--fx-surface-background);\n color: var(--fx-text-default);\n cursor: pointer;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .nav-btn:hover:not(:disabled) { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }\n .nav-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .nav-btn.primary {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n .nav-btn.primary:hover:not(:disabled) { filter: brightness(0.92); background: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['active', 'linear', 'show-numbers'];\n }\n\n get stepCount(): number { return this._titles.length; }\n get active(): number {\n const n = Number(this.getAttr('active', '0'));\n return Math.min(this.stepCount - 1, Math.max(0, Number.isFinite(n) ? n : 0));\n }\n set active(v: number) {\n this.setAttribute('active', String(Math.min(this.stepCount - 1, Math.max(0, v))));\n }\n\n get isLast(): boolean { return this.active >= this.stepCount - 1; }\n\n /** Navega al paso (emite change). Con linear, solo permite avanzar de a uno. */\n goTo(index: number): void {\n const target = Math.min(this.stepCount - 1, Math.max(0, index));\n if (this.hasAttr('linear') && target > this.active + 1) return;\n this.active = target;\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { index: this.active } }));\n if (this.isLast) {\n this.dispatchEvent(new CustomEvent('complete', { bubbles: true, composed: true }));\n }\n }\n\n next(): void { this.goTo(this.active + 1); }\n prev(): void { this.goTo(this.active - 1); }\n\n private _titles: string[] = [];\n private _panels: Element[] = [];\n\n protected override render(): void {\n this._panels = Array.from(this.children).filter((el) =>\n el.matches('[slot^=\"step-\"]'),\n );\n this._titles = this._panels.map((p, i) =>\n p.getAttribute('step-title') || `Paso ${i + 1}`,\n );\n const active = Math.min(this.active, Math.max(0, this._titles.length - 1));\n\n const stepsHtml = this._titles\n .map((title, i) => {\n const state = i === active ? 'active' : i < active ? 'done' : '';\n // sem show-numbers: passos concluídos exibem ✓; com show-numbers: sempre número\n const marker = i < active && !this.hasAttr('show-numbers') ? '✓' : String(i + 1);\n return `<span class=\"step ${state}\" part=\"step\" data-i=\"${i}\"><span class=\"num\">${marker}</span>${esc(title)}</span>`;\n })\n .join('');\n\n const panelsHtml = this._panels\n .map((p, i) => `<section class=\"panel\" part=\"panel\" ${i === active ? '' : 'hidden'}>${p.innerHTML}</section>`)\n .join('');\n\n this.setTemplate(`\n <div class=\"steps\" part=\"steps\">${stepsHtml}</div>\n <div class=\"panel-wrap\">${panelsHtml}</div>\n <div class=\"actions\" part=\"actions\">\n <button type=\"button\" class=\"nav-btn prev\" part=\"prev\" ${active === 0 ? 'disabled' : ''}>Anterior</button>\n <button type=\"button\" class=\"nav-btn primary next\" part=\"next\">${active === this._titles.length - 1 ? 'Concluir' : 'Próximo'}</button>\n </div>\n `);\n\n this._bindSteps();\n }\n\n private _bindSteps(): void {\n const steps = Array.from(this.root.querySelectorAll<HTMLElement>('.step'));\n steps.forEach((step) => {\n const i = Number(step.dataset.i);\n step.addEventListener('click', () => {\n if (this.hasAttr('linear') && i > this.active + 1) return;\n this.goTo(i);\n });\n step.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Enter') {\n e.preventDefault();\n this.goTo(i);\n }\n });\n });\n\n this.root.querySelector<HTMLElement>('.nav-btn.prev')?.addEventListener('click', () => this.prev());\n this.root.querySelector<HTMLElement>('.nav-btn.next')?.addEventListener('click', () => this.next());\n }\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n if (this._titles.length === 0) this.render();\n }\n}\n\nexport function defineFxStepper(): typeof FxStepper {\n return defineElement('fx-stepper', FxStepper);\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FxTimeline } from './timeline';
2
+ export { FxTimeline };
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'fx-timeline': FxTimeline;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,CAAC;AAItB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,UAAU,CAAC;KAC3B;CACF"}
@@ -0,0 +1,7 @@
1
+ import { defineFxTimeline } from "./timeline.js";
2
+ import { FxTimeline } from "./timeline.js";
3
+ defineFxTimeline();
4
+ export {
5
+ FxTimeline
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/timeline/index.ts"],"sourcesContent":["import { FxTimeline, defineFxTimeline } from './timeline';\n\nexport { FxTimeline };\n\ndefineFxTimeline();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-timeline': FxTimeline;\n }\n}"],"names":[],"mappings":";;AAIA,iBAAA;"}
@@ -0,0 +1,30 @@
1
+ import { FxElement } from '../../core/base';
2
+ /**
3
+ * <fx-timeline> — Linha do tempo vertical com eventos.
4
+ *
5
+ * Atributos: marker (glifo do marcador, padrão '●'), size (sm|md|lg).
6
+ * Slot `item`: cada elemento com [slot="item"] vira um evento. Use os
7
+ * atributos `time` (texto do horário/data) e `title` no item.
8
+ *
9
+ * Exemplo:
10
+ * <fx-timeline>
11
+ * <div slot="item" time="09:00" title="Reunião">Detalhes…</div>
12
+ * <div slot="item" time="14:00" title="Deploy">Detalhes…</div>
13
+ * </fx-timeline>
14
+ */
15
+ export declare class FxTimeline extends FxElement {
16
+ static styles: string;
17
+ static get observedAttributes(): string[];
18
+ protected render(): void;
19
+ /**
20
+ * Monta os eventos a partir dos itens do light DOM.
21
+ * Os itens permanecem no light DOM (sem slot correspondente, não são
22
+ * renderizados) — assim a decoração é idempotente e sobrevive a re-renders.
23
+ */
24
+ private _decorate;
25
+ private _observer?;
26
+ protected connectedCallback(): void;
27
+ protected disconnectedCallback(): void;
28
+ }
29
+ export declare function defineFxTimeline(): typeof FxTimeline;
30
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,SA2FpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;cAEkB,MAAM,IAAI,IAAI;IAKjC;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,SAAS,CAAC,CAAmB;cAElB,iBAAiB,IAAI,IAAI;cAQzB,oBAAoB,IAAI,IAAI;CAKhD;AAED,wBAAgB,gBAAgB,IAAI,OAAO,UAAU,CAEpD"}
@@ -0,0 +1,146 @@
1
+ import { FxElement } from "../../core/base.js";
2
+ import { css } from "../../core/css.js";
3
+ import { defineElement } from "../../core/define.js";
4
+ import { esc } from "../../core/sanitize.js";
5
+ const _FxTimeline = class _FxTimeline extends FxElement {
6
+ static get observedAttributes() {
7
+ return ["marker", "size", "orientation"];
8
+ }
9
+ render() {
10
+ this.setTemplate(`<ol class="tl" part="timeline"></ol>`);
11
+ this._decorate();
12
+ }
13
+ /**
14
+ * Monta os eventos a partir dos itens do light DOM.
15
+ * Os itens permanecem no light DOM (sem slot correspondente, não são
16
+ * renderizados) — assim a decoração é idempotente e sobrevive a re-renders.
17
+ */
18
+ _decorate() {
19
+ const list = this.shadowRoot?.querySelector("ol");
20
+ if (!list) return;
21
+ const marker = this.getAttr("marker", "●");
22
+ const items = Array.from(this.querySelectorAll('[slot="item"]'));
23
+ if (!items.length) return;
24
+ list.innerHTML = items.map((item) => {
25
+ const time = item.getAttribute("time") ?? "";
26
+ const title = item.getAttribute("title") ?? "";
27
+ const head = [
28
+ time ? `<span class="time">${esc(time)}</span>` : "",
29
+ title ? `<span class="title">${esc(title)}</span>` : ""
30
+ ].join("");
31
+ return `<li class="event" part="event"><span class="dot" part="marker" aria-hidden="true">${esc(marker)}</span><div class="head">${head}</div><div class="content">${item.innerHTML}</div></li>`;
32
+ }).join("");
33
+ }
34
+ connectedCallback() {
35
+ super.connectedCallback();
36
+ this._observer = new MutationObserver(() => this._decorate());
37
+ this._observer.observe(this, { childList: true, subtree: false });
38
+ this._decorate();
39
+ }
40
+ disconnectedCallback() {
41
+ super.disconnectedCallback();
42
+ this._observer?.disconnect();
43
+ this._observer = void 0;
44
+ }
45
+ };
46
+ _FxTimeline.styles = css`
47
+ :host {
48
+ display: block;
49
+ font-family: var(--fx-font-family);
50
+ font-size: var(--fx-font-size);
51
+ --_marker: calc(var(--fx-font-size) - 1px);
52
+ }
53
+ :host([size='sm']) { --_marker: calc(var(--fx-font-size) - 3px); }
54
+ :host([size='lg']) { --_marker: calc(var(--fx-font-size) + 2px); }
55
+
56
+ .tl {
57
+ list-style: none;
58
+ margin: 0;
59
+ padding: 0;
60
+ position: relative;
61
+ }
62
+ /* linha vertical centralizada no eixo dos marcadores */
63
+ .tl::before {
64
+ content: '';
65
+ position: absolute;
66
+ left: calc(var(--_marker) / 2 - 1px);
67
+ top: calc(var(--_marker) / 2);
68
+ bottom: 6px;
69
+ width: 2px;
70
+ background: var(--fx-border-default);
71
+ }
72
+ .event {
73
+ position: relative;
74
+ padding: 0 0 var(--fx-space-lg) calc(var(--_marker) + var(--fx-space-lg));
75
+ }
76
+ .event:last-child { padding-bottom: 0; }
77
+ /* marcador circular centralizado no eixo da linha */
78
+ .dot {
79
+ position: absolute;
80
+ left: 0;
81
+ top: 0;
82
+ width: var(--_marker);
83
+ height: var(--_marker);
84
+ display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ font-size: calc(var(--_marker) * 0.55);
88
+ color: var(--fx-color-primary);
89
+ line-height: 1;
90
+ }
91
+ .head {
92
+ display: flex;
93
+ align-items: baseline;
94
+ gap: var(--fx-space-sm);
95
+ flex-wrap: wrap;
96
+ min-height: var(--_marker);
97
+ }
98
+ .time {
99
+ font-size: calc(var(--fx-font-size) - 2px);
100
+ color: var(--fx-text-muted);
101
+ white-space: nowrap;
102
+ }
103
+ .title {
104
+ font-weight: 600;
105
+ color: var(--fx-text-default);
106
+ }
107
+ .content {
108
+ margin-top: 2px;
109
+ color: var(--fx-text-default);
110
+ line-height: 1.5;
111
+ }
112
+ .event[hidden] { display: none; }
113
+
114
+ /* ---- modo horizontal ---- */
115
+ :host([orientation='horizontal']) .tl {
116
+ display: flex;
117
+ }
118
+ :host([orientation='horizontal']) .tl::before {
119
+ left: calc(var(--_marker) / 2 - 1px);
120
+ right: calc(var(--_marker) / 2);
121
+ top: calc(var(--_marker) / 2 - 1px);
122
+ bottom: auto;
123
+ width: auto;
124
+ height: 2px;
125
+ }
126
+ :host([orientation='horizontal']) .event {
127
+ flex: 1;
128
+ display: flex;
129
+ flex-direction: column;
130
+ padding: 0 var(--fx-space-lg) 0 0;
131
+ }
132
+ :host([orientation='horizontal']) .event:last-child { padding-right: 0; }
133
+ :host([orientation='horizontal']) .event .dot {
134
+ position: static;
135
+ margin-bottom: var(--fx-space-sm);
136
+ }
137
+ `;
138
+ let FxTimeline = _FxTimeline;
139
+ function defineFxTimeline() {
140
+ return defineElement("fx-timeline", FxTimeline);
141
+ }
142
+ export {
143
+ FxTimeline,
144
+ defineFxTimeline
145
+ };
146
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sources":["../../../src/components/timeline/timeline.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-timeline> — Linha do tempo vertical com eventos.\n *\n * Atributos: marker (glifo do marcador, padrão '●'), size (sm|md|lg).\n * Slot `item`: cada elemento com [slot=\"item\"] vira um evento. Use os\n * atributos `time` (texto do horário/data) e `title` no item.\n *\n * Exemplo:\n * <fx-timeline>\n * <div slot=\"item\" time=\"09:00\" title=\"Reunião\">Detalhes…</div>\n * <div slot=\"item\" time=\"14:00\" title=\"Deploy\">Detalhes…</div>\n * </fx-timeline>\n */\nexport class FxTimeline extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --_marker: calc(var(--fx-font-size) - 1px);\n }\n :host([size='sm']) { --_marker: calc(var(--fx-font-size) - 3px); }\n :host([size='lg']) { --_marker: calc(var(--fx-font-size) + 2px); }\n\n .tl {\n list-style: none;\n margin: 0;\n padding: 0;\n position: relative;\n }\n /* linha vertical centralizada no eixo dos marcadores */\n .tl::before {\n content: '';\n position: absolute;\n left: calc(var(--_marker) / 2 - 1px);\n top: calc(var(--_marker) / 2);\n bottom: 6px;\n width: 2px;\n background: var(--fx-border-default);\n }\n .event {\n position: relative;\n padding: 0 0 var(--fx-space-lg) calc(var(--_marker) + var(--fx-space-lg));\n }\n .event:last-child { padding-bottom: 0; }\n /* marcador circular centralizado no eixo da linha */\n .dot {\n position: absolute;\n left: 0;\n top: 0;\n width: var(--_marker);\n height: var(--_marker);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: calc(var(--_marker) * 0.55);\n color: var(--fx-color-primary);\n line-height: 1;\n }\n .head {\n display: flex;\n align-items: baseline;\n gap: var(--fx-space-sm);\n flex-wrap: wrap;\n min-height: var(--_marker);\n }\n .time {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n white-space: nowrap;\n }\n .title {\n font-weight: 600;\n color: var(--fx-text-default);\n }\n .content {\n margin-top: 2px;\n color: var(--fx-text-default);\n line-height: 1.5;\n }\n .event[hidden] { display: none; }\n\n /* ---- modo horizontal ---- */\n :host([orientation='horizontal']) .tl {\n display: flex;\n }\n :host([orientation='horizontal']) .tl::before {\n left: calc(var(--_marker) / 2 - 1px);\n right: calc(var(--_marker) / 2);\n top: calc(var(--_marker) / 2 - 1px);\n bottom: auto;\n width: auto;\n height: 2px;\n }\n :host([orientation='horizontal']) .event {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 0 var(--fx-space-lg) 0 0;\n }\n :host([orientation='horizontal']) .event:last-child { padding-right: 0; }\n :host([orientation='horizontal']) .event .dot {\n position: static;\n margin-bottom: var(--fx-space-sm);\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['marker', 'size', 'orientation'];\n }\n\n protected override render(): void {\n this.setTemplate(`<ol class=\"tl\" part=\"timeline\"></ol>`);\n this._decorate();\n }\n\n /**\n * Monta os eventos a partir dos itens do light DOM.\n * Os itens permanecem no light DOM (sem slot correspondente, não são\n * renderizados) — assim a decoração é idempotente e sobrevive a re-renders.\n */\n private _decorate(): void {\n const list = this.shadowRoot?.querySelector('ol');\n if (!list) return;\n const marker = this.getAttr('marker', '●');\n const items = Array.from(this.querySelectorAll('[slot=\"item\"]'));\n if (!items.length) return;\n\n list.innerHTML = items\n .map((item) => {\n const time = item.getAttribute('time') ?? '';\n const title = item.getAttribute('title') ?? '';\n const head = [\n time ? `<span class=\"time\">${esc(time)}</span>` : '',\n title ? `<span class=\"title\">${esc(title)}</span>` : '',\n ].join('');\n return `<li class=\"event\" part=\"event\"><span class=\"dot\" part=\"marker\" aria-hidden=\"true\">${esc(marker)}</span><div class=\"head\">${head}</div><div class=\"content\">${item.innerHTML}</div></li>`;\n })\n .join('');\n }\n\n private _observer?: MutationObserver;\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // filhos podem chegar depois (innerHTML do playground)\n this._observer = new MutationObserver(() => this._decorate());\n this._observer.observe(this, { childList: true, subtree: false });\n this._decorate();\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._observer?.disconnect();\n this._observer = undefined;\n }\n}\n\nexport function defineFxTimeline(): typeof FxTimeline {\n return defineElement('fx-timeline', FxTimeline);\n}"],"names":[],"mappings":";;;;AAkBO,MAAM,cAAN,MAAM,oBAAmB,UAAU;AAAA,EA8FxC,WAAoB,qBAA+B;AACjD,WAAO,CAAC,UAAU,QAAQ,aAAa;AAAA,EACzC;AAAA,EAEmB,SAAe;AAChC,SAAK,YAAY,sCAAsC;AACvD,SAAK,UAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAkB;AACxB,UAAM,OAAO,KAAK,YAAY,cAAc,IAAI;AAChD,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,KAAK,QAAQ,UAAU,GAAG;AACzC,UAAM,QAAQ,MAAM,KAAK,KAAK,iBAAiB,eAAe,CAAC;AAC/D,QAAI,CAAC,MAAM,OAAQ;AAEnB,SAAK,YAAY,MACd,IAAI,CAAC,SAAS;AACb,YAAM,OAAO,KAAK,aAAa,MAAM,KAAK;AAC1C,YAAM,QAAQ,KAAK,aAAa,OAAO,KAAK;AAC5C,YAAM,OAAO;AAAA,QACX,OAAO,sBAAsB,IAAI,IAAI,CAAC,YAAY;AAAA,QAClD,QAAQ,uBAAuB,IAAI,KAAK,CAAC,YAAY;AAAA,MAAA,EACrD,KAAK,EAAE;AACT,aAAO,qFAAqF,IAAI,MAAM,CAAC,4BAA4B,IAAI,8BAA8B,KAAK,SAAS;AAAA,IACrL,CAAC,EACA,KAAK,EAAE;AAAA,EACZ;AAAA,EAImB,oBAA0B;AAC3C,UAAM,kBAAA;AAEN,SAAK,YAAY,IAAI,iBAAiB,MAAM,KAAK,WAAW;AAC5D,SAAK,UAAU,QAAQ,MAAM,EAAE,WAAW,MAAM,SAAS,OAAO;AAChE,SAAK,UAAA;AAAA,EACP;AAAA,EAEmB,uBAA6B;AAC9C,UAAM,qBAAA;AACN,SAAK,WAAW,WAAA;AAChB,SAAK,YAAY;AAAA,EACnB;AACF;AA9IE,YAAgB,SAAS;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;AADpB,IAAM,aAAN;AAiJA,SAAS,mBAAsC;AACpD,SAAO,cAAc,eAAe,UAAU;AAChD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../src/components/toast/toast.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,QAAA,MAAM,SAAS,kGAGL,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,KAAK,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAqD1D,qBAAa,OAAQ,SAAQ,WAAW;;IACtC,MAAM,KAAK,kBAAkB,aAE5B;IAED,OAAO,CAAC,KAAK,CAA8C;;IAO3D,iBAAiB;IAWjB,oBAAoB;IAKpB,OAAO;CAiCR;AA+BD,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,cAAM,QAAQ;IACZ,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,GAAG,CAA8B;IAEzC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM;IAkBxG,KAAK,CAAC,EAAE,EAAE,MAAM;IAKhB,OAAO,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAmC;IACrF,KAAK,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAiC;IACjF,IAAI,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAgC;IAC/E,OAAO,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAmC;CACtF;AAED,eAAO,MAAM,UAAU,UAAiB,CAAC;AAIzC,wBAAgB,aAAa,SAE5B"}
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../src/components/toast/toast.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,QAAA,MAAM,SAAS,kGAGL,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,KAAK,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAkE1D,qBAAa,OAAQ,SAAQ,WAAW;;IACtC,MAAM,KAAK,kBAAkB,aAE5B;IAED,OAAO,CAAC,KAAK,CAA8C;;IAO3D,iBAAiB;IAWjB,oBAAoB;IAKpB,OAAO;CAqCR;AA+BD,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,cAAM,QAAQ;IACZ,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,GAAG,CAA8B;IAEzC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM;IAkBxG,KAAK,CAAC,EAAE,EAAE,MAAM;IAKhB,OAAO,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAmC;IACrF,KAAK,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAiC;IACjF,IAAI,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAgC;IAC/E,OAAO,GAAI,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,YAAY,YAAmC;CACtF;AAED,eAAO,MAAM,UAAU,UAAiB,CAAC;AAIzC,wBAAgB,aAAa,SAE5B"}
@@ -1,3 +1,4 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["icons/index.js","icons/names.js","icons/base-css.js"])))=>i.map(i=>d[i]);
1
2
  var __typeError = (msg) => {
2
3
  throw TypeError(msg);
3
4
  };
@@ -5,6 +6,7 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
5
6
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
6
7
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
7
8
  var _FxToast_instances, render_fn;
9
+ import { __vitePreload } from "../../_virtual/preload-helper.js";
8
10
  const KIND_COLOR = {
9
11
  success: "var(--fx-color-success, #10b981)",
10
12
  error: "var(--fx-color-danger, #f43f5e)",
@@ -19,6 +21,19 @@ const KIND_ICON = {
19
21
  };
20
22
  const CARD_CSS = `
21
23
  :host { display: contents; }
24
+ .fx-icon {
25
+ font-family: var(--fx-icon-font, 'Fenix Icons');
26
+ font-weight: normal;
27
+ font-style: normal;
28
+ line-height: 1;
29
+ letter-spacing: normal;
30
+ display: inline-block;
31
+ white-space: nowrap;
32
+ direction: ltr;
33
+ font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;
34
+ -webkit-font-smoothing: antialiased;
35
+ user-select: none;
36
+ }
22
37
  .card {
23
38
  display: flex; align-items: flex-start; gap: 10px;
24
39
  min-width: 260px; max-width: 360px;
@@ -60,7 +75,7 @@ class FxToast extends HTMLElement {
60
75
  this.attachShadow({ mode: "open" });
61
76
  }
62
77
  static get observedAttributes() {
63
- return ["kind", "title", "message", "duration"];
78
+ return ["kind", "title", "message", "duration", "icon"];
64
79
  }
65
80
  connectedCallback() {
66
81
  if (!this.shadowRoot.firstChild) __privateMethod(this, _FxToast_instances, render_fn).call(this);
@@ -92,10 +107,14 @@ render_fn = function() {
92
107
  const title = this.getAttribute("title") ?? "";
93
108
  const msg = this.getAttribute("message") ?? "";
94
109
  const color = KIND_COLOR[kind] ?? KIND_COLOR.info;
110
+ const iconName = this.getAttribute("icon");
111
+ const isFxIcon = !!iconName && /^[a-z][a-z0-9_]*$/.test(iconName);
112
+ if (isFxIcon) void __vitePreload(() => import("../../icons/index.js"), true ? __vite__mapDeps([0,1,2]) : void 0);
113
+ const iconContent = isFxIcon ? iconName : KIND_ICON[kind] ?? KIND_ICON.info;
95
114
  this.shadowRoot.innerHTML = `
96
115
  <style>${CARD_CSS}</style>
97
116
  <div class="card" style="--kind:${color}" role="status" part="card">
98
- <span class="icon">${KIND_ICON[kind] ?? KIND_ICON.info}</span>
117
+ <span class="icon${isFxIcon ? " fx-icon" : ""}">${iconContent}</span>
99
118
  <div class="body">
100
119
  ${title ? '<div class="title"></div>' : ""}
101
120
  ${msg ? '<div class="msg"></div>' : ""}
@@ -1 +1 @@
1
- {"version":3,"file":"toast.js","sources":["../../../src/components/toast/toast.ts"],"sourcesContent":["/**\n * <fx-toast> — notificações imperativas com posição e duração configuráveis.\n *\n * Atributos: kind (success|error|info|warning), title, message,\n * position (top-left|top-center|top-right|bottom-left|bottom-center|bottom-right),\n * duration (ms; 0 = fixo até fechar).\n */\nconst POSITIONS = [\n 'top-left', 'top-center', 'top-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n] as const;\nexport type ToastPosition = (typeof POSITIONS)[number];\ntype ToastKind = 'success' | 'error' | 'info' | 'warning';\n\nconst KIND_COLOR: Record<ToastKind, string> = {\n success: 'var(--fx-color-success, #10b981)',\n error: 'var(--fx-color-danger, #f43f5e)',\n info: 'var(--fx-color-info, #0ea5e9)',\n warning: 'var(--fx-color-warning, #f59e0b)',\n};\n\n/** Ícone exibido no lugar da bolinha, conforme a variante. */\nconst KIND_ICON: Record<ToastKind, string> = {\n success: '✓',\n error: '✕',\n warning: '!',\n info: 'i',\n};\n\nconst CARD_CSS = `\n:host { display: contents; }\n.card {\n display: flex; align-items: flex-start; gap: 10px;\n min-width: 260px; max-width: 360px;\n background: var(--fx-surface-background, #fff);\n color: var(--fx-text-default, #1e293b);\n border: 1px solid var(--fx-border-default, #e2e8f0);\n border-left: 4px solid var(--kind);\n border-radius: var(--fx-radius-md, 8px);\n box-shadow: var(--fx-shadow-lg, 0 10px 30px rgba(0,0,0,.14));\n padding: var(--fx-space-sm, 8px) var(--fx-space-md, 12px);\n font-family: inherit;\n animation: fx-toast-in .25s ease;\n}\n@keyframes fx-toast-in { from { opacity: 0; transform: translateY(-6px); } }\n.card.leaving { opacity: 0; transition: opacity .2s ease; }\n.icon {\n width: 22px; height: 22px; border-radius: 50%;\n background: var(--kind);\n color: #fff;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; font-weight: 700;\n flex: none; margin-top: 2px;\n user-select: none;\n}\n.body { flex: 1; min-width: 0; }\n.title { font-weight: 600; font-size: 14px; }\n.msg { font-size: calc(var(--fx-font-size, 14px) - 2px); color: var(--fx-text-muted, #64748b); margin-top: 2px; word-break: break-word; white-space: pre-line; }\n.close {\n all: unset; cursor: pointer; flex: none; line-height: 1;\n color: var(--fx-text-muted, #64748b); font-size: 15px; padding: 2px 4px; border-radius: 4px;\n}\n.close:hover { color: var(--fx-color-danger, #f43f5e); background: var(--fx-surface-surface-hover, rgba(0,0,0,.05)); }\n`;\n\nexport class FxToast extends HTMLElement {\n static get observedAttributes() {\n return ['kind', 'title', 'message', 'duration'];\n }\n\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (!this.shadowRoot!.firstChild) this.#render();\n const dur = Number(this.getAttribute('duration') ?? '4000');\n // Durações mínimas: valores muito baixos (ex.: digitação parcial no\n // playground) são elevados para 1s; 0 permanece fixo até fechar.\n const safe = dur === 0 ? 0 : Math.max(Number.isNaN(dur) ? 4000 : dur, 1000);\n if (!Number.isNaN(safe) && safe > 0 && !this.timer) {\n this.timer = setTimeout(() => this.dismiss(), safe);\n }\n }\n\n disconnectedCallback() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n }\n\n dismiss() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n const card = this.shadowRoot!.querySelector('.card');\n if (card) {\n card.classList.add('leaving');\n setTimeout(() => this.remove(), 200);\n } else {\n this.remove();\n }\n }\n\n #render() {\n const kind = (this.getAttribute('kind') || 'info') as ToastKind;\n const title = this.getAttribute('title') ?? '';\n const msg = this.getAttribute('message') ?? '';\n const color = KIND_COLOR[kind] ?? KIND_COLOR.info;\n this.shadowRoot!.innerHTML = `\n <style>${CARD_CSS}</style>\n <div class=\"card\" style=\"--kind:${color}\" role=\"status\" part=\"card\">\n <span class=\"icon\">${KIND_ICON[kind] ?? KIND_ICON.info}</span>\n <div class=\"body\">\n ${title ? '<div class=\"title\"></div>' : ''}\n ${msg ? '<div class=\"msg\"></div>' : ''}\n </div>\n <button class=\"close\" aria-label=\"Fechar\">✕</button>\n </div>`;\n const t = this.shadowRoot!.querySelector<HTMLElement>('.title');\n const m = this.shadowRoot!.querySelector<HTMLElement>('.msg');\n if (t) t.textContent = title;\n if (m) m.textContent = msg;\n this.shadowRoot!.querySelector('.close')!.addEventListener('click', () => this.dismiss());\n }\n}\n\n/* ---------- Regiões por posição na tela ---------- */\nfunction regionFor(position: ToastPosition): HTMLElement {\n let region = document.querySelector<HTMLElement>(`[data-fx-toast-region=\"${position}\"]`);\n if (!region) {\n region = document.createElement('div');\n region.setAttribute('data-fx-toast-region', position);\n const [vertical, horizontal] = position.split('-') as [string, string];\n const style = region.style as CSSStyleDeclaration & Record<string, string>;\n style.position = 'fixed';\n style[vertical] = '16px';\n if (horizontal === 'center') {\n style.left = '50%';\n style.transform = 'translateX(-50%)';\n } else {\n style[horizontal] = '16px';\n }\n style.display = 'flex';\n style.flexDirection = 'column';\n style.gap = '8px';\n style.zIndex = '1100';\n style.pointerEvents = 'none';\n new MutationObserver(() => {\n region!.querySelectorAll('*').forEach((c) => ((c as HTMLElement).style.pointerEvents = 'auto'));\n }).observe(region, { childList: true });\n document.body.appendChild(region);\n }\n return region;\n}\n\nexport interface ToastOptions {\n /** Texto secundário (também aceito como 2º argumento dos métodos). */\n message?: string;\n position?: ToastPosition;\n /** Tempo em ms até sumir. 0 = fixo até fechar. Padrão: 4000 */\n duration?: number;\n}\n\nclass ToastApi {\n private seq = 0;\n private map = new Map<number, FxToast>();\n\n push(kind: ToastKind, title: string, messageOrOpts?: string | ToastOptions, opts?: ToastOptions): number {\n const id = ++this.seq;\n // Assinaturas suportadas:\n // push(kind, title, options)\n // push(kind, title, message, options) <- usada pela doc e mais intuitiva\n const message = typeof messageOrOpts === 'string' ? messageOrOpts : messageOrOpts?.message;\n const o: ToastOptions = { ...(typeof messageOrOpts === 'object' && messageOrOpts ? messageOrOpts : undefined), ...opts };\n const el = document.createElement('fx-toast') as FxToast;\n el.setAttribute('kind', kind);\n el.setAttribute('title', title);\n if (message) el.setAttribute('message', message);\n el.setAttribute('position', o.position ?? 'top-right');\n el.setAttribute('duration', String(o.duration ?? 4000));\n regionFor(o.position ?? 'top-right').appendChild(el);\n this.map.set(id, el);\n return id;\n }\n\n close(id: number) {\n this.map.get(id)?.dismiss();\n this.map.delete(id);\n }\n\n success = (t: string, m?: string, o?: ToastOptions) => this.push('success', t, m, o);\n error = (t: string, m?: string, o?: ToastOptions) => this.push('error', t, m, o);\n info = (t: string, m?: string, o?: ToastOptions) => this.push('info', t, m, o);\n warning = (t: string, m?: string, o?: ToastOptions) => this.push('warning', t, m, o);\n}\n\nexport const FenixToast = new ToastApi();\n// Exposto globalmente para uso em HTML puro (onclick=\"FenixToast.success(...)\")\n(globalThis as unknown as Record<string, unknown>).FenixToast = FenixToast;\n\nexport function defineFxToast() {\n if (!customElements.get('fx-toast')) customElements.define('fx-toast', FxToast);\n}\n\n"],"names":[],"mappings":";;;;;;AAcA;AAAA,MAAM,aAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AACX;AAGA,MAAM,YAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAEA,MAAM,WAAW;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;AAoCV,MAAM,gBAAgB,YAAY;AAAA,EAOvC,cAAc;AACZ,UAAA;AARG;AAKL,SAAQ,QAA8C;AAIpD,SAAK,aAAa,EAAE,MAAM,OAAA,CAAQ;AAAA,EACpC;AAAA,EATA,WAAW,qBAAqB;AAC9B,WAAO,CAAC,QAAQ,SAAS,WAAW,UAAU;AAAA,EAChD;AAAA,EASA,oBAAoB;AAClB,QAAI,CAAC,KAAK,WAAY,kCAAiB;AACvC,UAAM,MAAM,OAAO,KAAK,aAAa,UAAU,KAAK,MAAM;AAG1D,UAAM,OAAO,QAAQ,IAAI,IAAI,KAAK,IAAI,OAAO,MAAM,GAAG,IAAI,MAAO,KAAK,GAAI;AAC1E,QAAI,CAAC,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,CAAC,KAAK,OAAO;AAClD,WAAK,QAAQ,WAAW,MAAM,KAAK,QAAA,GAAW,IAAI;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,QAAI,KAAK,MAAO,cAAa,KAAK,KAAK;AACvC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,MAAO,cAAa,KAAK,KAAK;AACvC,SAAK,QAAQ;AACb,UAAM,OAAO,KAAK,WAAY,cAAc,OAAO;AACnD,QAAI,MAAM;AACR,WAAK,UAAU,IAAI,SAAS;AAC5B,iBAAW,MAAM,KAAK,OAAA,GAAU,GAAG;AAAA,IACrC,OAAO;AACL,WAAK,OAAA;AAAA,IACP;AAAA,EACF;AAuBF;AA7DO;AAwCL,YAAA,WAAU;AACR,QAAM,OAAQ,KAAK,aAAa,MAAM,KAAK;AAC3C,QAAM,QAAQ,KAAK,aAAa,OAAO,KAAK;AAC5C,QAAM,MAAM,KAAK,aAAa,SAAS,KAAK;AAC5C,QAAM,QAAQ,WAAW,IAAI,KAAK,WAAW;AAC7C,OAAK,WAAY,YAAY;AAAA,eAClB,QAAQ;AAAA,wCACiB,KAAK;AAAA,6BAChB,UAAU,IAAI,KAAK,UAAU,IAAI;AAAA;AAAA,YAElD,QAAQ,8BAA8B,EAAE;AAAA,YACxC,MAAM,4BAA4B,EAAE;AAAA;AAAA;AAAA;AAI5C,QAAM,IAAI,KAAK,WAAY,cAA2B,QAAQ;AAC9D,QAAM,IAAI,KAAK,WAAY,cAA2B,MAAM;AAC5D,MAAI,KAAK,cAAc;AACvB,MAAI,KAAK,cAAc;AACvB,OAAK,WAAY,cAAc,QAAQ,EAAG,iBAAiB,SAAS,MAAM,KAAK,SAAS;AAC1F;AAIF,SAAS,UAAU,UAAsC;AACvD,MAAI,SAAS,SAAS,cAA2B,0BAA0B,QAAQ,IAAI;AACvF,MAAI,CAAC,QAAQ;AACX,aAAS,SAAS,cAAc,KAAK;AACrC,WAAO,aAAa,wBAAwB,QAAQ;AACpD,UAAM,CAAC,UAAU,UAAU,IAAI,SAAS,MAAM,GAAG;AACjD,UAAM,QAAQ,OAAO;AACrB,UAAM,WAAW;AACjB,UAAM,QAAQ,IAAI;AAClB,QAAI,eAAe,UAAU;AAC3B,YAAM,OAAO;AACb,YAAM,YAAY;AAAA,IACpB,OAAO;AACL,YAAM,UAAU,IAAI;AAAA,IACtB;AACA,UAAM,UAAU;AAChB,UAAM,gBAAgB;AACtB,UAAM,MAAM;AACZ,UAAM,SAAS;AACf,UAAM,gBAAgB;AACtB,QAAI,iBAAiB,MAAM;AACzB,aAAQ,iBAAiB,GAAG,EAAE,QAAQ,CAAC,MAAQ,EAAkB,MAAM,gBAAgB,MAAO;AAAA,IAChG,CAAC,EAAE,QAAQ,QAAQ,EAAE,WAAW,MAAM;AACtC,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC;AACA,SAAO;AACT;AAUA,MAAM,SAAS;AAAA,EAAf,cAAA;AACE,SAAQ,MAAM;AACd,SAAQ,0BAAU,IAAA;AAyBlB,SAAA,UAAU,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,WAAW,GAAG,GAAG,CAAC;AACnF,SAAA,QAAQ,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,SAAS,GAAG,GAAG,CAAC;AAC/E,SAAA,OAAO,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,QAAQ,GAAG,GAAG,CAAC;AAC7E,SAAA,UAAU,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,WAAW,GAAG,GAAG,CAAC;AAAA,EAAA;AAAA,EA1BnF,KAAK,MAAiB,OAAe,eAAuC,MAA6B;AACvG,UAAM,KAAK,EAAE,KAAK;AAIlB,UAAM,UAAU,OAAO,kBAAkB,WAAW,gBAAgB,eAAe;AACnF,UAAM,IAAkB,EAAE,GAAI,OAAO,kBAAkB,YAAY,gBAAgB,gBAAgB,QAAY,GAAG,KAAA;AAClH,UAAM,KAAK,SAAS,cAAc,UAAU;AAC5C,OAAG,aAAa,QAAQ,IAAI;AAC5B,OAAG,aAAa,SAAS,KAAK;AAC9B,QAAI,QAAS,IAAG,aAAa,WAAW,OAAO;AAC/C,OAAG,aAAa,YAAY,EAAE,YAAY,WAAW;AACrD,OAAG,aAAa,YAAY,OAAO,EAAE,YAAY,GAAI,CAAC;AACtD,cAAU,EAAE,YAAY,WAAW,EAAE,YAAY,EAAE;AACnD,SAAK,IAAI,IAAI,IAAI,EAAE;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAY;AAChB,SAAK,IAAI,IAAI,EAAE,GAAG,QAAA;AAClB,SAAK,IAAI,OAAO,EAAE;AAAA,EACpB;AAMF;AAEO,MAAM,aAAa,IAAI,SAAA;AAE7B,WAAkD,aAAa;AAEzD,SAAS,gBAAgB;AAC9B,MAAI,CAAC,eAAe,IAAI,UAAU,EAAG,gBAAe,OAAO,YAAY,OAAO;AAChF;"}
1
+ {"version":3,"mappings":";;;;;;;;;AAcA,MAAM,aAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AACX;AAGA,MAAM,YAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAEA,MAAM,WAAW;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;AAiDV,MAAM,gBAAgB,YAAY;AAAA,EAOvC,cAAc;AACZ;AARG;AAKL,SAAQ,QAA8C;AAIpD,SAAK,aAAa,EAAE,MAAM,QAAQ;AAAA,EACpC;AAAA,EATA,WAAW,qBAAqB;AAC9B,WAAO,CAAC,QAAQ,SAAS,WAAW,YAAY,MAAM;AAAA,EACxD;AAAA,EASA,oBAAoB;AAClB,QAAI,CAAC,KAAK,WAAY,kCAAiB;AACvC,UAAM,MAAM,OAAO,KAAK,aAAa,UAAU,KAAK,MAAM;AAG1D,UAAM,OAAO,QAAQ,IAAI,IAAI,KAAK,IAAI,OAAO,MAAM,GAAG,IAAI,MAAO,KAAK,GAAI;AAC1E,QAAI,CAAC,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,CAAC,KAAK,OAAO;AAClD,WAAK,QAAQ,WAAW,MAAM,KAAK,WAAW,IAAI;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,QAAI,KAAK,MAAO,cAAa,KAAK,KAAK;AACvC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,MAAO,cAAa,KAAK,KAAK;AACvC,SAAK,QAAQ;AACb,UAAM,OAAO,KAAK,WAAY,cAAc,OAAO;AACnD,QAAI,MAAM;AACR,WAAK,UAAU,IAAI,SAAS;AAC5B,iBAAW,MAAM,KAAK,UAAU,GAAG;AAAA,IACrC,OAAO;AACL,WAAK;AAAA,IACP;AAAA,EACF;AA2BF;AAjEO;AAwCL,uBAAU;AACR,QAAM,OAAQ,KAAK,aAAa,MAAM,KAAK;AAC3C,QAAM,QAAQ,KAAK,aAAa,OAAO,KAAK;AAC5C,QAAM,MAAM,KAAK,aAAa,SAAS,KAAK;AAC5C,QAAM,QAAQ,WAAW,IAAI,KAAK,WAAW;AAC7C,QAAM,WAAW,KAAK,aAAa,MAAM;AACzC,QAAM,WAAW,CAAC,CAAC,YAAY,oBAAoB,KAAK,QAAQ;AAChE,MAAI,SAAU,0BAAK,OAAO,sBAAa;AACvC,QAAM,cAAc,WAAW,WAAW,UAAU,IAAI,KAAK,UAAU;AACvE,OAAK,WAAY,YAAY;AAAA,eAClB,QAAQ;AAAA,wCACiB,KAAK;AAAA,2BAClB,WAAW,aAAa,EAAE,KAAK,WAAW;AAAA;AAAA,YAEzD,QAAQ,8BAA8B,EAAE;AAAA,YACxC,MAAM,4BAA4B,EAAE;AAAA;AAAA;AAAA;AAI5C,QAAM,IAAI,KAAK,WAAY,cAA2B,QAAQ;AAC9D,QAAM,IAAI,KAAK,WAAY,cAA2B,MAAM;AAC5D,MAAI,KAAK,cAAc;AACvB,MAAI,KAAK,cAAc;AACvB,OAAK,WAAY,cAAc,QAAQ,EAAG,iBAAiB,SAAS,MAAM,KAAK,SAAS;AAC1F;AAIF,SAAS,UAAU,UAAsC;AACvD,MAAI,SAAS,SAAS,cAA2B,0BAA0B,QAAQ,IAAI;AACvF,MAAI,CAAC,QAAQ;AACX,aAAS,SAAS,cAAc,KAAK;AACrC,WAAO,aAAa,wBAAwB,QAAQ;AACpD,UAAM,CAAC,UAAU,UAAU,IAAI,SAAS,MAAM,GAAG;AACjD,UAAM,QAAQ,OAAO;AACrB,UAAM,WAAW;AACjB,UAAM,QAAQ,IAAI;AAClB,QAAI,eAAe,UAAU;AAC3B,YAAM,OAAO;AACb,YAAM,YAAY;AAAA,IACpB,OAAO;AACL,YAAM,UAAU,IAAI;AAAA,IACtB;AACA,UAAM,UAAU;AAChB,UAAM,gBAAgB;AACtB,UAAM,MAAM;AACZ,UAAM,SAAS;AACf,UAAM,gBAAgB;AACtB,QAAI,iBAAiB,MAAM;AACzB,aAAQ,iBAAiB,GAAG,EAAE,QAAQ,CAAC,MAAQ,EAAkB,MAAM,gBAAgB,MAAO;AAAA,IAChG,CAAC,EAAE,QAAQ,QAAQ,EAAE,WAAW,MAAM;AACtC,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC;AACA,SAAO;AACT;AAUA,MAAM,SAAS;AAAA,EAAf;AACE,SAAQ,MAAM;AACd,SAAQ,0BAAU;AAyBlB,mBAAU,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,WAAW,GAAG,GAAG,CAAC;AACnF,iBAAQ,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,SAAS,GAAG,GAAG,CAAC;AAC/E,gBAAO,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,QAAQ,GAAG,GAAG,CAAC;AAC7E,mBAAU,CAAC,GAAW,GAAY,MAAqB,KAAK,KAAK,WAAW,GAAG,GAAG,CAAC;AAAA;AAAA,EA1BnF,KAAK,MAAiB,OAAe,eAAuC,MAA6B;AACvG,UAAM,KAAK,EAAE,KAAK;AAIlB,UAAM,UAAU,OAAO,kBAAkB,WAAW,gBAAgB,eAAe;AACnF,UAAM,IAAkB,EAAE,GAAI,OAAO,kBAAkB,YAAY,gBAAgB,gBAAgB,QAAY,GAAG;AAClH,UAAM,KAAK,SAAS,cAAc,UAAU;AAC5C,OAAG,aAAa,QAAQ,IAAI;AAC5B,OAAG,aAAa,SAAS,KAAK;AAC9B,QAAI,QAAS,IAAG,aAAa,WAAW,OAAO;AAC/C,OAAG,aAAa,YAAY,EAAE,YAAY,WAAW;AACrD,OAAG,aAAa,YAAY,OAAO,EAAE,YAAY,GAAI,CAAC;AACtD,cAAU,EAAE,YAAY,WAAW,EAAE,YAAY,EAAE;AACnD,SAAK,IAAI,IAAI,IAAI,EAAE;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAY;AAChB,SAAK,IAAI,IAAI,EAAE,GAAG;AAClB,SAAK,IAAI,OAAO,EAAE;AAAA,EACpB;AAMF;AAEO,MAAM,aAAa,IAAI;AAE7B,WAAkD,aAAa;AAEzD,SAAS,gBAAgB;AAC9B,MAAI,CAAC,eAAe,IAAI,UAAU,EAAG,gBAAe,OAAO,YAAY,OAAO;AAChF","names":[],"ignoreList":[],"sources":["../../../src/components/toast/toast.ts"],"sourcesContent":["/**\n * <fx-toast> — notificações imperativas com posição e duração configuráveis.\n *\n * Atributos: kind (success|error|info|warning), title, message,\n * position (top-left|top-center|top-right|bottom-left|bottom-center|bottom-right),\n * duration (ms; 0 = fixo até fechar).\n */\nconst POSITIONS = [\n 'top-left', 'top-center', 'top-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n] as const;\nexport type ToastPosition = (typeof POSITIONS)[number];\ntype ToastKind = 'success' | 'error' | 'info' | 'warning';\n\nconst KIND_COLOR: Record<ToastKind, string> = {\n success: 'var(--fx-color-success, #10b981)',\n error: 'var(--fx-color-danger, #f43f5e)',\n info: 'var(--fx-color-info, #0ea5e9)',\n warning: 'var(--fx-color-warning, #f59e0b)',\n};\n\n/** Ícone exibido no lugar da bolinha, conforme a variante. */\nconst KIND_ICON: Record<ToastKind, string> = {\n success: '✓',\n error: '✕',\n warning: '!',\n info: 'i',\n};\n\nconst CARD_CSS = `\n:host { display: contents; }\n.fx-icon {\n font-family: var(--fx-icon-font, 'Fenix Icons');\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n display: inline-block;\n white-space: nowrap;\n direction: ltr;\n font-variation-settings: 'FILL' 0, 'wght' 500, 'GRAD' 0, 'opsz' 24;\n -webkit-font-smoothing: antialiased;\n user-select: none;\n}\n.card {\n display: flex; align-items: flex-start; gap: 10px;\n min-width: 260px; max-width: 360px;\n background: var(--fx-surface-background, #fff);\n color: var(--fx-text-default, #1e293b);\n border: 1px solid var(--fx-border-default, #e2e8f0);\n border-left: 4px solid var(--kind);\n border-radius: var(--fx-radius-md, 8px);\n box-shadow: var(--fx-shadow-lg, 0 10px 30px rgba(0,0,0,.14));\n padding: var(--fx-space-sm, 8px) var(--fx-space-md, 12px);\n font-family: inherit;\n animation: fx-toast-in .25s ease;\n}\n@keyframes fx-toast-in { from { opacity: 0; transform: translateY(-6px); } }\n.card.leaving { opacity: 0; transition: opacity .2s ease; }\n.icon {\n width: 22px; height: 22px; border-radius: 50%;\n background: var(--kind);\n color: #fff;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; font-weight: 700;\n flex: none; margin-top: 2px;\n user-select: none;\n}\n.body { flex: 1; min-width: 0; }\n.title { font-weight: 600; font-size: 14px; }\n.msg { font-size: calc(var(--fx-font-size, 14px) - 2px); color: var(--fx-text-muted, #64748b); margin-top: 2px; word-break: break-word; white-space: pre-line; }\n.close {\n all: unset; cursor: pointer; flex: none; line-height: 1;\n color: var(--fx-text-muted, #64748b); font-size: 15px; padding: 2px 4px; border-radius: 4px;\n}\n.close:hover { color: var(--fx-color-danger, #f43f5e); background: var(--fx-surface-surface-hover, rgba(0,0,0,.05)); }\n`;\n\nexport class FxToast extends HTMLElement {\n static get observedAttributes() {\n return ['kind', 'title', 'message', 'duration', 'icon'];\n }\n\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (!this.shadowRoot!.firstChild) this.#render();\n const dur = Number(this.getAttribute('duration') ?? '4000');\n // Durações mínimas: valores muito baixos (ex.: digitação parcial no\n // playground) são elevados para 1s; 0 permanece fixo até fechar.\n const safe = dur === 0 ? 0 : Math.max(Number.isNaN(dur) ? 4000 : dur, 1000);\n if (!Number.isNaN(safe) && safe > 0 && !this.timer) {\n this.timer = setTimeout(() => this.dismiss(), safe);\n }\n }\n\n disconnectedCallback() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n }\n\n dismiss() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n const card = this.shadowRoot!.querySelector('.card');\n if (card) {\n card.classList.add('leaving');\n setTimeout(() => this.remove(), 200);\n } else {\n this.remove();\n }\n }\n\n #render() {\n const kind = (this.getAttribute('kind') || 'info') as ToastKind;\n const title = this.getAttribute('title') ?? '';\n const msg = this.getAttribute('message') ?? '';\n const color = KIND_COLOR[kind] ?? KIND_COLOR.info;\n const iconName = this.getAttribute('icon');\n const isFxIcon = !!iconName && /^[a-z][a-z0-9_]*$/.test(iconName);\n if (isFxIcon) void import('../../icons');\n const iconContent = isFxIcon ? iconName : KIND_ICON[kind] ?? KIND_ICON.info;\n this.shadowRoot!.innerHTML = `\n <style>${CARD_CSS}</style>\n <div class=\"card\" style=\"--kind:${color}\" role=\"status\" part=\"card\">\n <span class=\"icon${isFxIcon ? ' fx-icon' : ''}\">${iconContent}</span>\n <div class=\"body\">\n ${title ? '<div class=\"title\"></div>' : ''}\n ${msg ? '<div class=\"msg\"></div>' : ''}\n </div>\n <button class=\"close\" aria-label=\"Fechar\">✕</button>\n </div>`;\n const t = this.shadowRoot!.querySelector<HTMLElement>('.title');\n const m = this.shadowRoot!.querySelector<HTMLElement>('.msg');\n if (t) t.textContent = title;\n if (m) m.textContent = msg;\n this.shadowRoot!.querySelector('.close')!.addEventListener('click', () => this.dismiss());\n }\n}\n\n/* ---------- Regiões por posição na tela ---------- */\nfunction regionFor(position: ToastPosition): HTMLElement {\n let region = document.querySelector<HTMLElement>(`[data-fx-toast-region=\"${position}\"]`);\n if (!region) {\n region = document.createElement('div');\n region.setAttribute('data-fx-toast-region', position);\n const [vertical, horizontal] = position.split('-') as [string, string];\n const style = region.style as CSSStyleDeclaration & Record<string, string>;\n style.position = 'fixed';\n style[vertical] = '16px';\n if (horizontal === 'center') {\n style.left = '50%';\n style.transform = 'translateX(-50%)';\n } else {\n style[horizontal] = '16px';\n }\n style.display = 'flex';\n style.flexDirection = 'column';\n style.gap = '8px';\n style.zIndex = '1100';\n style.pointerEvents = 'none';\n new MutationObserver(() => {\n region!.querySelectorAll('*').forEach((c) => ((c as HTMLElement).style.pointerEvents = 'auto'));\n }).observe(region, { childList: true });\n document.body.appendChild(region);\n }\n return region;\n}\n\nexport interface ToastOptions {\n /** Texto secundário (também aceito como 2º argumento dos métodos). */\n message?: string;\n position?: ToastPosition;\n /** Tempo em ms até sumir. 0 = fixo até fechar. Padrão: 4000 */\n duration?: number;\n}\n\nclass ToastApi {\n private seq = 0;\n private map = new Map<number, FxToast>();\n\n push(kind: ToastKind, title: string, messageOrOpts?: string | ToastOptions, opts?: ToastOptions): number {\n const id = ++this.seq;\n // Assinaturas suportadas:\n // push(kind, title, options)\n // push(kind, title, message, options) <- usada pela doc e mais intuitiva\n const message = typeof messageOrOpts === 'string' ? messageOrOpts : messageOrOpts?.message;\n const o: ToastOptions = { ...(typeof messageOrOpts === 'object' && messageOrOpts ? messageOrOpts : undefined), ...opts };\n const el = document.createElement('fx-toast') as FxToast;\n el.setAttribute('kind', kind);\n el.setAttribute('title', title);\n if (message) el.setAttribute('message', message);\n el.setAttribute('position', o.position ?? 'top-right');\n el.setAttribute('duration', String(o.duration ?? 4000));\n regionFor(o.position ?? 'top-right').appendChild(el);\n this.map.set(id, el);\n return id;\n }\n\n close(id: number) {\n this.map.get(id)?.dismiss();\n this.map.delete(id);\n }\n\n success = (t: string, m?: string, o?: ToastOptions) => this.push('success', t, m, o);\n error = (t: string, m?: string, o?: ToastOptions) => this.push('error', t, m, o);\n info = (t: string, m?: string, o?: ToastOptions) => this.push('info', t, m, o);\n warning = (t: string, m?: string, o?: ToastOptions) => this.push('warning', t, m, o);\n}\n\nexport const FenixToast = new ToastApi();\n// Exposto globalmente para uso em HTML puro (onclick=\"FenixToast.success(...)\")\n(globalThis as unknown as Record<string, unknown>).FenixToast = FenixToast;\n\nexport function defineFxToast() {\n if (!customElements.get('fx-toast')) customElements.define('fx-toast', FxToast);\n}\n\n"],"file":"components/toast/toast.js"}
@@ -0,0 +1,8 @@
1
+ import { FxToggleButtonGroup } from './toggle-button-group';
2
+ export { FxToggleButtonGroup };
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'fx-toggle-button-group': FxToggleButtonGroup;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/toggle-button-group/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA6B,MAAM,uBAAuB,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAI/B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,wBAAwB,EAAE,mBAAmB,CAAC;KAC/C;CACF"}
@@ -0,0 +1,7 @@
1
+ import { defineFxToggleButtonGroup } from "./toggle-button-group.js";
2
+ import { FxToggleButtonGroup } from "./toggle-button-group.js";
3
+ defineFxToggleButtonGroup();
4
+ export {
5
+ FxToggleButtonGroup
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/toggle-button-group/index.ts"],"sourcesContent":["import { FxToggleButtonGroup, defineFxToggleButtonGroup } from './toggle-button-group';\n\nexport { FxToggleButtonGroup };\n\ndefineFxToggleButtonGroup();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-toggle-button-group': FxToggleButtonGroup;\n }\n}"],"names":[],"mappings":";;AAIA,0BAAA;"}
@@ -0,0 +1,21 @@
1
+ import { FxElement } from '../../core/base';
2
+ /**
3
+ * <fx-toggle-button-group> — Grupo de botones de selección múltiple o única.
4
+ *
5
+ * Atributos: multiple (permite varios seleccionados), value (lista), size.
6
+ * Slots `option`: cada botón con [slot="option" value="..."].
7
+ * Evento (composed): `change` (detail: { value: string[] }).
8
+ */
9
+ export declare class FxToggleButtonGroup extends FxElement {
10
+ static styles: string;
11
+ static get observedAttributes(): string[];
12
+ get value(): string[];
13
+ set value(v: string[]);
14
+ get multiple(): boolean;
15
+ get options(): HTMLElement[];
16
+ protected render(): void;
17
+ private _bindOptions;
18
+ private _toggle;
19
+ }
20
+ export declare function defineFxToggleButtonGroup(): typeof FxToggleButtonGroup;
21
+ //# sourceMappingURL=toggle-button-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-button-group.d.ts","sourceRoot":"","sources":["../../../src/components/toggle-button-group/toggle-button-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,OAAgB,MAAM,SA2BpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,KAAK,IAAI,MAAM,EAAE,CAGpB;IACD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAA8C;IAEnE,IAAI,QAAQ,IAAI,OAAO,CAAqC;IAE5D,IAAI,OAAO,IAAI,WAAW,EAAE,CAE3B;cAEkB,MAAM,IAAI,IAAI;IAqBjC,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,OAAO;CAmBhB;AAED,wBAAgB,yBAAyB,IAAI,OAAO,mBAAmB,CAEtE"}