@wrrdev/fenix-ui 1.0.17 → 1.1.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 (227) hide show
  1. package/README.md +2 -2
  2. package/dist/_virtual/preload-helper.js +76 -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/assets/fenix-icons-DmgotBzD.woff2 +0 -0
  7. package/dist/components/alert/alert.d.ts +2 -1
  8. package/dist/components/alert/alert.d.ts.map +1 -1
  9. package/dist/components/alert/alert.js +10 -2
  10. package/dist/components/alert/alert.js.map +1 -1
  11. package/dist/components/avatar/avatar.d.ts +21 -0
  12. package/dist/components/avatar/avatar.d.ts.map +1 -0
  13. package/dist/components/avatar/avatar.js +91 -0
  14. package/dist/components/avatar/avatar.js.map +1 -0
  15. package/dist/components/avatar/index.d.ts +8 -0
  16. package/dist/components/avatar/index.d.ts.map +1 -0
  17. package/dist/components/avatar/index.js +7 -0
  18. package/dist/components/avatar/index.js.map +1 -0
  19. package/dist/components/breadcrumb/breadcrumb.d.ts +35 -0
  20. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -0
  21. package/dist/components/breadcrumb/breadcrumb.js +113 -0
  22. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  23. package/dist/components/breadcrumb/index.d.ts +8 -0
  24. package/dist/components/breadcrumb/index.d.ts.map +1 -0
  25. package/dist/components/breadcrumb/index.js +7 -0
  26. package/dist/components/breadcrumb/index.js.map +1 -0
  27. package/dist/components/card/card.d.ts +15 -0
  28. package/dist/components/card/card.d.ts.map +1 -0
  29. package/dist/components/card/card.js +80 -0
  30. package/dist/components/card/card.js.map +1 -0
  31. package/dist/components/card/index.d.ts +8 -0
  32. package/dist/components/card/index.d.ts.map +1 -0
  33. package/dist/components/card/index.js +7 -0
  34. package/dist/components/card/index.js.map +1 -0
  35. package/dist/components/carousel/carousel.d.ts +28 -0
  36. package/dist/components/carousel/carousel.d.ts.map +1 -0
  37. package/dist/components/carousel/carousel.js +176 -0
  38. package/dist/components/carousel/carousel.js.map +1 -0
  39. package/dist/components/carousel/index.d.ts +8 -0
  40. package/dist/components/carousel/index.d.ts.map +1 -0
  41. package/dist/components/carousel/index.js +7 -0
  42. package/dist/components/carousel/index.js.map +1 -0
  43. package/dist/components/chip/chip.d.ts +19 -0
  44. package/dist/components/chip/chip.d.ts.map +1 -0
  45. package/dist/components/chip/chip.js +126 -0
  46. package/dist/components/chip/chip.js.map +1 -0
  47. package/dist/components/chip/index.d.ts +8 -0
  48. package/dist/components/chip/index.d.ts.map +1 -0
  49. package/dist/components/chip/index.js +7 -0
  50. package/dist/components/chip/index.js.map +1 -0
  51. package/dist/components/confirmpopup/confirmpopup.d.ts +44 -0
  52. package/dist/components/confirmpopup/confirmpopup.d.ts.map +1 -0
  53. package/dist/components/confirmpopup/confirmpopup.js +233 -0
  54. package/dist/components/confirmpopup/confirmpopup.js.map +1 -0
  55. package/dist/components/confirmpopup/index.d.ts +8 -0
  56. package/dist/components/confirmpopup/index.d.ts.map +1 -0
  57. package/dist/components/confirmpopup/index.js +7 -0
  58. package/dist/components/confirmpopup/index.js.map +1 -0
  59. package/dist/components/empty-state/empty-state.d.ts +14 -0
  60. package/dist/components/empty-state/empty-state.d.ts.map +1 -0
  61. package/dist/components/empty-state/empty-state.js +71 -0
  62. package/dist/components/empty-state/empty-state.js.map +1 -0
  63. package/dist/components/empty-state/index.d.ts +8 -0
  64. package/dist/components/empty-state/index.d.ts.map +1 -0
  65. package/dist/components/empty-state/index.js +7 -0
  66. package/dist/components/empty-state/index.js.map +1 -0
  67. package/dist/components/fileupload/fileupload.d.ts +42 -0
  68. package/dist/components/fileupload/fileupload.d.ts.map +1 -0
  69. package/dist/components/fileupload/fileupload.js +284 -0
  70. package/dist/components/fileupload/fileupload.js.map +1 -0
  71. package/dist/components/fileupload/index.d.ts +8 -0
  72. package/dist/components/fileupload/index.d.ts.map +1 -0
  73. package/dist/components/fileupload/index.js +7 -0
  74. package/dist/components/fileupload/index.js.map +1 -0
  75. package/dist/components/menu/index.d.ts +8 -0
  76. package/dist/components/menu/index.d.ts.map +1 -0
  77. package/dist/components/menu/index.js +7 -0
  78. package/dist/components/menu/index.js.map +1 -0
  79. package/dist/components/menu/menu.d.ts +23 -0
  80. package/dist/components/menu/menu.d.ts.map +1 -0
  81. package/dist/components/menu/menu.js +155 -0
  82. package/dist/components/menu/menu.js.map +1 -0
  83. package/dist/components/orderlist/orderlist.d.ts +1 -1
  84. package/dist/components/orderlist/orderlist.d.ts.map +1 -1
  85. package/dist/components/orderlist/orderlist.js +2 -2
  86. package/dist/components/orderlist/orderlist.js.map +1 -1
  87. package/dist/components/password-strength/index.d.ts +8 -0
  88. package/dist/components/password-strength/index.d.ts.map +1 -0
  89. package/dist/components/password-strength/index.js +7 -0
  90. package/dist/components/password-strength/index.js.map +1 -0
  91. package/dist/components/password-strength/password-strength.d.ts +23 -0
  92. package/dist/components/password-strength/password-strength.d.ts.map +1 -0
  93. package/dist/components/password-strength/password-strength.js +109 -0
  94. package/dist/components/password-strength/password-strength.js.map +1 -0
  95. package/dist/components/picklist/picklist.d.ts +1 -1
  96. package/dist/components/picklist/picklist.d.ts.map +1 -1
  97. package/dist/components/picklist/picklist.js +2 -2
  98. package/dist/components/picklist/picklist.js.map +1 -1
  99. package/dist/components/popover/index.d.ts +8 -0
  100. package/dist/components/popover/index.d.ts.map +1 -0
  101. package/dist/components/popover/index.js +7 -0
  102. package/dist/components/popover/index.js.map +1 -0
  103. package/dist/components/popover/popover.d.ts +39 -0
  104. package/dist/components/popover/popover.d.ts.map +1 -0
  105. package/dist/components/popover/popover.js +228 -0
  106. package/dist/components/popover/popover.js.map +1 -0
  107. package/dist/components/rating/index.d.ts +8 -0
  108. package/dist/components/rating/index.d.ts.map +1 -0
  109. package/dist/components/rating/index.js +7 -0
  110. package/dist/components/rating/index.js.map +1 -0
  111. package/dist/components/rating/rating.d.ts +25 -0
  112. package/dist/components/rating/rating.d.ts.map +1 -0
  113. package/dist/components/rating/rating.js +119 -0
  114. package/dist/components/rating/rating.js.map +1 -0
  115. package/dist/components/slider/index.d.ts +8 -0
  116. package/dist/components/slider/index.d.ts.map +1 -0
  117. package/dist/components/slider/index.js +7 -0
  118. package/dist/components/slider/index.js.map +1 -0
  119. package/dist/components/slider/slider.d.ts +33 -0
  120. package/dist/components/slider/slider.d.ts.map +1 -0
  121. package/dist/components/slider/slider.js +260 -0
  122. package/dist/components/slider/slider.js.map +1 -0
  123. package/dist/components/stepper/index.d.ts +8 -0
  124. package/dist/components/stepper/index.d.ts.map +1 -0
  125. package/dist/components/stepper/index.js +7 -0
  126. package/dist/components/stepper/index.js.map +1 -0
  127. package/dist/components/stepper/stepper.d.ts +33 -0
  128. package/dist/components/stepper/stepper.d.ts.map +1 -0
  129. package/dist/components/stepper/stepper.js +162 -0
  130. package/dist/components/stepper/stepper.js.map +1 -0
  131. package/dist/components/timeline/index.d.ts +8 -0
  132. package/dist/components/timeline/index.d.ts.map +1 -0
  133. package/dist/components/timeline/index.js +7 -0
  134. package/dist/components/timeline/index.js.map +1 -0
  135. package/dist/components/timeline/timeline.d.ts +30 -0
  136. package/dist/components/timeline/timeline.d.ts.map +1 -0
  137. package/dist/components/timeline/timeline.js +146 -0
  138. package/dist/components/timeline/timeline.js.map +1 -0
  139. package/dist/components/toast/toast.d.ts.map +1 -1
  140. package/dist/components/toast/toast.js +21 -2
  141. package/dist/components/toast/toast.js.map +1 -1
  142. package/dist/components/toggle-button-group/index.d.ts +8 -0
  143. package/dist/components/toggle-button-group/index.d.ts.map +1 -0
  144. package/dist/components/toggle-button-group/index.js +7 -0
  145. package/dist/components/toggle-button-group/index.js.map +1 -0
  146. package/dist/components/toggle-button-group/toggle-button-group.d.ts +21 -0
  147. package/dist/components/toggle-button-group/toggle-button-group.d.ts.map +1 -0
  148. package/dist/components/toggle-button-group/toggle-button-group.js +103 -0
  149. package/dist/components/toggle-button-group/toggle-button-group.js.map +1 -0
  150. package/dist/components/tree/index.d.ts +8 -0
  151. package/dist/components/tree/index.d.ts.map +1 -0
  152. package/dist/components/tree/index.js +7 -0
  153. package/dist/components/tree/index.js.map +1 -0
  154. package/dist/components/tree/tree.d.ts +34 -0
  155. package/dist/components/tree/tree.d.ts.map +1 -0
  156. package/dist/components/tree/tree.js +149 -0
  157. package/dist/components/tree/tree.js.map +1 -0
  158. package/dist/core/base.d.ts +1 -1
  159. package/dist/core/base.d.ts.map +1 -1
  160. package/dist/core/base.js +1 -1
  161. package/dist/core/base.js.map +1 -1
  162. package/dist/docs/app.d.ts.map +1 -1
  163. package/dist/docs/componentes/avatar.doc.d.ts +6 -0
  164. package/dist/docs/componentes/avatar.doc.d.ts.map +1 -0
  165. package/dist/docs/componentes/breadcrumb.doc.d.ts +6 -0
  166. package/dist/docs/componentes/breadcrumb.doc.d.ts.map +1 -0
  167. package/dist/docs/componentes/card.doc.d.ts +6 -0
  168. package/dist/docs/componentes/card.doc.d.ts.map +1 -0
  169. package/dist/docs/componentes/carousel.doc.d.ts +6 -0
  170. package/dist/docs/componentes/carousel.doc.d.ts.map +1 -0
  171. package/dist/docs/componentes/chip.doc.d.ts +6 -0
  172. package/dist/docs/componentes/chip.doc.d.ts.map +1 -0
  173. package/dist/docs/componentes/confirmpopup.doc.d.ts +6 -0
  174. package/dist/docs/componentes/confirmpopup.doc.d.ts.map +1 -0
  175. package/dist/docs/componentes/empty-state.doc.d.ts +6 -0
  176. package/dist/docs/componentes/empty-state.doc.d.ts.map +1 -0
  177. package/dist/docs/componentes/fileupload.doc.d.ts +6 -0
  178. package/dist/docs/componentes/fileupload.doc.d.ts.map +1 -0
  179. package/dist/docs/componentes/index.d.ts.map +1 -1
  180. package/dist/docs/componentes/menu.doc.d.ts +6 -0
  181. package/dist/docs/componentes/menu.doc.d.ts.map +1 -0
  182. package/dist/docs/componentes/password-strength.doc.d.ts +6 -0
  183. package/dist/docs/componentes/password-strength.doc.d.ts.map +1 -0
  184. package/dist/docs/componentes/popover.doc.d.ts +6 -0
  185. package/dist/docs/componentes/popover.doc.d.ts.map +1 -0
  186. package/dist/docs/componentes/rating.doc.d.ts +6 -0
  187. package/dist/docs/componentes/rating.doc.d.ts.map +1 -0
  188. package/dist/docs/componentes/slider.doc.d.ts +6 -0
  189. package/dist/docs/componentes/slider.doc.d.ts.map +1 -0
  190. package/dist/docs/componentes/stepper.doc.d.ts +6 -0
  191. package/dist/docs/componentes/stepper.doc.d.ts.map +1 -0
  192. package/dist/docs/componentes/timeline.doc.d.ts +6 -0
  193. package/dist/docs/componentes/timeline.doc.d.ts.map +1 -0
  194. package/dist/docs/componentes/toggle-button-group.doc.d.ts +6 -0
  195. package/dist/docs/componentes/toggle-button-group.doc.d.ts.map +1 -0
  196. package/dist/docs/componentes/tree.doc.d.ts +6 -0
  197. package/dist/docs/componentes/tree.doc.d.ts.map +1 -0
  198. package/dist/fenix-icons.woff2 +0 -0
  199. package/dist/fenix-ui.umd.min.js +1317 -160
  200. package/dist/fenix-ui2.esm.js +4316 -7816
  201. package/dist/fenix-ui2.esm.js.map +1 -1
  202. package/dist/fenix-ui3.esm.js +10404 -84
  203. package/dist/fenix-ui3.esm.js.map +1 -1
  204. package/dist/fenix-ui4.esm.js +110 -0
  205. package/dist/fenix-ui4.esm.js.map +1 -0
  206. package/dist/icons/base-css.d.ts +21 -0
  207. package/dist/icons/base-css.d.ts.map +1 -0
  208. package/dist/icons/base-css.js +32 -0
  209. package/dist/icons/base-css.js.map +1 -0
  210. package/dist/icons/fenix-icons.woff2 +0 -0
  211. package/dist/icons/index.d.ts +31 -0
  212. package/dist/icons/index.d.ts.map +1 -0
  213. package/dist/icons/index.js +46 -0
  214. package/dist/icons/index.js.map +1 -0
  215. package/dist/icons/names.d.ts +11 -0
  216. package/dist/icons/names.d.ts.map +1 -0
  217. package/dist/icons/names.js +4283 -0
  218. package/dist/icons/names.js.map +1 -0
  219. package/dist/index.d.ts +17 -0
  220. package/dist/index.d.ts.map +1 -1
  221. package/dist/index.js +51 -0
  222. package/dist/index.js.map +1 -1
  223. package/dist/plugins/auto-import.d.ts +2 -0
  224. package/dist/plugins/auto-import.d.ts.map +1 -1
  225. package/dist/plugins/auto-import.js +23 -0
  226. package/dist/plugins/auto-import.js.map +1 -1
  227. package/package.json +74 -1
@@ -0,0 +1,233 @@
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]);
2
+ import { __vitePreload } from "../../_virtual/preload-helper.js";
3
+ import { FxElement } from "../../core/base.js";
4
+ import { css } from "../../core/css.js";
5
+ import { defineElement } from "../../core/define.js";
6
+ import { esc } from "../../core/sanitize.js";
7
+ import { FENIX_ICON_BASE_CSS, isFenixIconName } from "../../icons/base-css.js";
8
+ const _FxConfirmPopup = class _FxConfirmPopup extends FxElement {
9
+ constructor() {
10
+ super(...arguments);
11
+ this._previouslyFocused = null;
12
+ this._onReposition = () => {
13
+ if (!this.open) return;
14
+ const popup = this.root.querySelector(".popup");
15
+ if (popup && !popup.hidden) this._position(popup);
16
+ };
17
+ }
18
+ static get observedAttributes() {
19
+ return ["open", "target", "message", "icon", "accept-label", "reject-label", "position"];
20
+ }
21
+ get open() {
22
+ return this.hasAttr("open");
23
+ }
24
+ set open(value) {
25
+ this.toggleAttr("open", value);
26
+ }
27
+ render() {
28
+ const message = this.getAttr("message");
29
+ const icon = this.getAttr("icon");
30
+ const iconIsFx = isFenixIconName(icon);
31
+ if (iconIsFx) void __vitePreload(() => import("../../icons/index.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url);
32
+ const acceptLabel = this.getAttr("accept-label", "Sim");
33
+ const rejectLabel = this.getAttr("reject-label", "Não");
34
+ this.setTemplate(`
35
+ <div class="popup" part="popup" role="alertdialog" aria-modal="false" ${this.open ? "" : "hidden"}>
36
+ <div class="message" part="message">
37
+ ${icon ? `<span class="icon${iconIsFx ? " fx-icon" : ""}" aria-hidden="true">${esc(icon)}</span>` : ""}
38
+ <p class="text"><slot>${esc(message)}</slot></p>
39
+ </div>
40
+ <footer part="footer">
41
+ <slot name="reject">
42
+ <button type="button" class="reject" part="reject-button">${esc(rejectLabel)}</button>
43
+ </slot>
44
+ <slot name="accept">
45
+ <button type="button" class="accept" part="accept-button">${esc(acceptLabel)}</button>
46
+ </slot>
47
+ </footer>
48
+ </div>
49
+ `);
50
+ if (!this.open) return;
51
+ const popup = this.root.querySelector(".popup");
52
+ if (!popup) return;
53
+ const close = (event) => {
54
+ this.open = false;
55
+ this._cleanup?.();
56
+ this._cleanup = void 0;
57
+ this._restoreFocus();
58
+ this.dispatchEvent(new CustomEvent(event, { bubbles: true, composed: true }));
59
+ };
60
+ this.root.querySelector(".reject")?.addEventListener("click", () => close("reject"));
61
+ this.root.querySelector(".accept")?.addEventListener("click", () => close("accept"));
62
+ const onKey = (e) => {
63
+ if (e.key === "Escape") {
64
+ e.stopPropagation();
65
+ close("reject");
66
+ }
67
+ };
68
+ const onPointerDown = (e) => {
69
+ const path = e.composedPath();
70
+ const anchor = this._anchor();
71
+ const hitAnchor = anchor ? path.includes(anchor) : false;
72
+ if (!path.includes(popup) && !hitAnchor) close("reject");
73
+ };
74
+ document.addEventListener("keydown", onKey);
75
+ document.addEventListener("pointerdown", onPointerDown, true);
76
+ this._cleanup = () => {
77
+ document.removeEventListener("keydown", onKey);
78
+ document.removeEventListener("pointerdown", onPointerDown, true);
79
+ };
80
+ this._position(popup);
81
+ this._previouslyFocused = document.activeElement;
82
+ requestAnimationFrame(() => {
83
+ this.root.querySelector("button.accept")?.focus();
84
+ });
85
+ }
86
+ _anchor() {
87
+ const selector = this.getAttr("target");
88
+ if (!selector) return null;
89
+ try {
90
+ return document.querySelector(selector);
91
+ } catch {
92
+ return null;
93
+ }
94
+ }
95
+ /**
96
+ * Posiciona o popup fixo junto ao âncora, acima ou abaixo dinamicamente:
97
+ * `position="auto"` (padrão) prefere abaixo e faz flip para cima quando
98
+ * não há espaço; `top`/`bottom` forçam o lado.
99
+ */
100
+ _position(popup) {
101
+ const anchor = this._anchor();
102
+ if (!anchor) return;
103
+ popup.hidden = false;
104
+ const a = anchor.getBoundingClientRect();
105
+ const p = popup.getBoundingClientRect();
106
+ const gap = 8;
107
+ const margin = 8;
108
+ let side;
109
+ const pos = this.getAttr("position", "auto");
110
+ if (pos === "top") side = "top";
111
+ else if (pos === "bottom") side = "bottom";
112
+ else side = a.bottom + gap + p.height <= window.innerHeight - margin ? "bottom" : "top";
113
+ const left = Math.min(
114
+ Math.max(margin, a.left + a.width / 2 - p.width / 2),
115
+ window.innerWidth - p.width - margin
116
+ );
117
+ const top = side === "bottom" ? a.bottom + gap : a.top - gap - p.height;
118
+ popup.dataset.side = side;
119
+ popup.style.left = `${Math.round(left)}px`;
120
+ popup.style.top = `${Math.round(Math.max(margin, top))}px`;
121
+ const arrowX = Math.min(Math.max(a.left + a.width / 2 - left, 16), p.width - 16);
122
+ popup.style.setProperty("--fxcp-arrow-x", `${Math.round(arrowX)}px`);
123
+ }
124
+ _restoreFocus() {
125
+ if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();
126
+ this._previouslyFocused = null;
127
+ }
128
+ connectedCallback() {
129
+ super.connectedCallback();
130
+ window.addEventListener("scroll", this._onReposition, true);
131
+ window.addEventListener("resize", this._onReposition);
132
+ }
133
+ disconnectedCallback() {
134
+ super.disconnectedCallback();
135
+ window.removeEventListener("scroll", this._onReposition, true);
136
+ window.removeEventListener("resize", this._onReposition);
137
+ this._cleanup?.();
138
+ this._cleanup = void 0;
139
+ this._restoreFocus();
140
+ }
141
+ };
142
+ _FxConfirmPopup.styles = css`
143
+ :host { display: contents; }
144
+ .popup {
145
+ position: fixed;
146
+ margin: 0;
147
+ background: var(--fx-surface-background);
148
+ border: 1px solid var(--fx-border-default);
149
+ border-radius: var(--fx-radius-md);
150
+ box-shadow: var(--fx-shadow-lg);
151
+ padding: var(--fx-space-md) var(--fx-space-lg);
152
+ min-width: 220px;
153
+ max-width: min(380px, calc(100vw - 24px));
154
+ font-family: var(--fx-font-family);
155
+ font-size: var(--fx-font-size);
156
+ color: var(--fx-text-default);
157
+ z-index: var(--fx-z-modal, 1100);
158
+ animation: fxcp-pop var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);
159
+ }
160
+ .popup[hidden] { display: none; }
161
+ @keyframes fxcp-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }
162
+ /* seta indicadora */
163
+ .popup::before {
164
+ content: '';
165
+ position: absolute;
166
+ left: var(--fxcp-arrow-x, 50%);
167
+ border: 7px solid transparent;
168
+ }
169
+ .popup[data-side='bottom']::before {
170
+ top: -14px;
171
+ border-bottom-color: var(--fx-border-default);
172
+ }
173
+ .popup[data-side='top']::before {
174
+ bottom: -14px;
175
+ border-top-color: var(--fx-border-default);
176
+ }
177
+ .popup::after {
178
+ content: '';
179
+ position: absolute;
180
+ left: var(--fxcp-arrow-x, 50%);
181
+ border: 6px solid transparent;
182
+ }
183
+ .popup[data-side='bottom']::after {
184
+ top: -12px;
185
+ border-bottom-color: var(--fx-surface-background);
186
+ }
187
+ .popup[data-side='top']::after {
188
+ bottom: -12px;
189
+ border-top-color: var(--fx-surface-background);
190
+ }
191
+ .message {
192
+ display: flex;
193
+ align-items: flex-start;
194
+ gap: var(--fx-space-sm);
195
+ }
196
+ .icon { font-size: calc(var(--fx-font-size) + 4px); line-height: 1.2; }
197
+ ${FENIX_ICON_BASE_CSS}
198
+ .icon.fx-icon { font-size: calc(var(--fx-font-size) + 6px); color: var(--fx-color-primary); }
199
+ .text { margin: 0; }
200
+ footer {
201
+ display: flex;
202
+ justify-content: flex-end;
203
+ gap: var(--fx-space-sm);
204
+ margin-top: var(--fx-space-md);
205
+ }
206
+ footer button {
207
+ font-family: var(--fx-font-family);
208
+ font-size: calc(var(--fx-font-size) - 2px);
209
+ padding: var(--fx-space-xs) var(--fx-space-md);
210
+ border-radius: var(--fx-radius-sm);
211
+ border: 1px solid var(--fx-border-default);
212
+ background: var(--fx-surface-background);
213
+ color: var(--fx-text-default);
214
+ cursor: pointer;
215
+ transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);
216
+ }
217
+ footer button:hover { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }
218
+ footer button.accept {
219
+ background: var(--fx-color-primary);
220
+ border-color: var(--fx-color-primary);
221
+ color: #fff;
222
+ }
223
+ footer button.accept:hover { filter: brightness(0.92); background: var(--fx-color-primary); }
224
+ `;
225
+ let FxConfirmPopup = _FxConfirmPopup;
226
+ function defineFxConfirmPopup() {
227
+ return defineElement("fx-confirmpopup", FxConfirmPopup);
228
+ }
229
+ export {
230
+ FxConfirmPopup,
231
+ defineFxConfirmPopup
232
+ };
233
+ //# sourceMappingURL=confirmpopup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/components/confirmpopup/confirmpopup.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, isFenixIconName } from '../../icons/base-css';\n\n/**\n * <fx-confirmpopup> — Popup de confirmação não-modal ancorado em um elemento,\n * exibido acima ou abaixo dinamicamente (com flip automático quando não há\n * espaço na viewport), no estilo ConfirmPopup do PrimeVue.\n *\n * Atributos:\n * - target (seletor CSS do elemento âncora — obrigatório para abrir);\n * - message (texto da mensagem, quando o slot padrão não é usado);\n * - icon (emoji/glifo exibido antes da mensagem; se for um nome da Fenix Icons,\n * ex.: icon=\"help\", é renderizado com a fonte de ícones);\n * - accept-label / reject-label (textos dos botões padrão);\n * - position (top|bottom|auto — padrão `auto`, que faz flip conforme o espaço);\n * - open (exibe o popup).\n *\n * Slots:\n * - padrão: corpo da mensagem (template \"message\");\n * - `accept`: conteúdo do botão de confirmação (template \"accept\");\n * - `reject`: conteúdo do botão de rejeição (template \"reject\").\n *\n * Eventos (composed): `accept` e `reject` — ambos fecham o popup.\n */\nexport class FxConfirmPopup extends FxElement {\n static override styles = css`\n :host { display: contents; }\n .popup {\n position: fixed;\n margin: 0;\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-lg);\n padding: var(--fx-space-md) var(--fx-space-lg);\n min-width: 220px;\n max-width: min(380px, calc(100vw - 24px));\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n z-index: var(--fx-z-modal, 1100);\n animation: fxcp-pop var(--fx-motion-duration-fast, 150ms) var(--fx-motion-easing, ease);\n }\n .popup[hidden] { display: none; }\n @keyframes fxcp-pop { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }\n /* seta indicadora */\n .popup::before {\n content: '';\n position: absolute;\n left: var(--fxcp-arrow-x, 50%);\n border: 7px solid transparent;\n }\n .popup[data-side='bottom']::before {\n top: -14px;\n border-bottom-color: var(--fx-border-default);\n }\n .popup[data-side='top']::before {\n bottom: -14px;\n border-top-color: var(--fx-border-default);\n }\n .popup::after {\n content: '';\n position: absolute;\n left: var(--fxcp-arrow-x, 50%);\n border: 6px solid transparent;\n }\n .popup[data-side='bottom']::after {\n top: -12px;\n border-bottom-color: var(--fx-surface-background);\n }\n .popup[data-side='top']::after {\n bottom: -12px;\n border-top-color: var(--fx-surface-background);\n }\n .message {\n display: flex;\n align-items: flex-start;\n gap: var(--fx-space-sm);\n }\n .icon { font-size: calc(var(--fx-font-size) + 4px); line-height: 1.2; }\n ${FENIX_ICON_BASE_CSS}\n .icon.fx-icon { font-size: calc(var(--fx-font-size) + 6px); color: var(--fx-color-primary); }\n .text { margin: 0; }\n footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--fx-space-sm);\n margin-top: var(--fx-space-md);\n }\n footer button {\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-md);\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 footer button:hover { background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.04)); }\n footer button.accept {\n background: var(--fx-color-primary);\n border-color: var(--fx-color-primary);\n color: #fff;\n }\n footer button.accept:hover { filter: brightness(0.92); background: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['open', 'target', 'message', 'icon', 'accept-label', 'reject-label', 'position'];\n }\n\n get open(): boolean { return this.hasAttr('open'); }\n set open(value: boolean) { this.toggleAttr('open', value); }\n\n protected override render(): void {\n const message = this.getAttr('message');\n const icon = this.getAttr('icon');\n const iconIsFx = isFenixIconName(icon);\n if (iconIsFx) void import('../../icons');\n const acceptLabel = this.getAttr('accept-label', 'Sim');\n const rejectLabel = this.getAttr('reject-label', 'Não');\n\n this.setTemplate(`\n <div class=\"popup\" part=\"popup\" role=\"alertdialog\" aria-modal=\"false\" ${this.open ? '' : 'hidden'}>\n <div class=\"message\" part=\"message\">\n ${icon ? `<span class=\"icon${iconIsFx ? ' fx-icon' : ''}\" aria-hidden=\"true\">${esc(icon)}</span>` : ''}\n <p class=\"text\"><slot>${esc(message)}</slot></p>\n </div>\n <footer part=\"footer\">\n <slot name=\"reject\">\n <button type=\"button\" class=\"reject\" part=\"reject-button\">${esc(rejectLabel)}</button>\n </slot>\n <slot name=\"accept\">\n <button type=\"button\" class=\"accept\" part=\"accept-button\">${esc(acceptLabel)}</button>\n </slot>\n </footer>\n </div>\n `);\n\n if (!this.open) return;\n\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (!popup) return;\n\n const close = (event: 'accept' | 'reject'): void => {\n this.open = false;\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n this.dispatchEvent(new CustomEvent(event, { bubbles: true, composed: true }));\n };\n\n this.root.querySelector('.reject')?.addEventListener('click', () => close('reject'));\n this.root.querySelector('.accept')?.addEventListener('click', () => close('accept'));\n\n // ESC fecha (reject) — clique fora fecha (reject)\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') { e.stopPropagation(); close('reject'); }\n };\n const onPointerDown = (e: MouseEvent): void => {\n const path = e.composedPath();\n const anchor = this._anchor();\n const hitAnchor = anchor ? path.includes(anchor) : false;\n if (!path.includes(popup) && !hitAnchor) close('reject');\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, true);\n this._cleanup = () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n\n this._position(popup);\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n requestAnimationFrame(() => {\n this.root.querySelector<HTMLElement>('button.accept')?.focus();\n });\n }\n\n private _cleanup?: () => void;\n private _previouslyFocused: HTMLElement | null = null;\n\n private _anchor(): HTMLElement | null {\n const selector = this.getAttr('target');\n if (!selector) return null;\n try {\n return document.querySelector<HTMLElement>(selector);\n } catch {\n return null;\n }\n }\n\n /**\n * Posiciona o popup fixo junto ao âncora, acima ou abaixo dinamicamente:\n * `position=\"auto\"` (padrão) prefere abaixo e faz flip para cima quando\n * não há espaço; `top`/`bottom` forçam o lado.\n */\n private _position(popup: HTMLElement): void {\n const anchor = this._anchor();\n if (!anchor) return;\n popup.hidden = false;\n\n const a = anchor.getBoundingClientRect();\n const p = popup.getBoundingClientRect();\n const gap = 8;\n const margin = 8;\n\n let side: 'top' | 'bottom';\n const pos = this.getAttr('position', 'auto');\n if (pos === 'top') side = 'top';\n else if (pos === 'bottom') side = 'bottom';\n else side = a.bottom + gap + p.height <= window.innerHeight - margin ? 'bottom' : 'top';\n\n // clamp horizontal para nunca sair da viewport\n const left = Math.min(\n Math.max(margin, a.left + a.width / 2 - p.width / 2),\n window.innerWidth - p.width - margin,\n );\n const top = side === 'bottom' ? a.bottom + gap : a.top - gap - p.height;\n\n popup.dataset.side = side;\n popup.style.left = `${Math.round(left)}px`;\n popup.style.top = `${Math.round(Math.max(margin, top))}px`;\n // posição da seta relativa ao popup\n const arrowX = Math.min(Math.max(a.left + a.width / 2 - left, 16), p.width - 16);\n popup.style.setProperty('--fxcp-arrow-x', `${Math.round(arrowX)}px`);\n }\n\n private _restoreFocus(): void {\n if (this._previouslyFocused?.isConnected) this._previouslyFocused.focus();\n this._previouslyFocused = null;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // reposiciona em scroll/resize enquanto aberto\n window.addEventListener('scroll', this._onReposition, true);\n window.addEventListener('resize', this._onReposition);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener('scroll', this._onReposition, true);\n window.removeEventListener('resize', this._onReposition);\n this._cleanup?.();\n this._cleanup = undefined;\n this._restoreFocus();\n }\n\n private _onReposition = (): void => {\n if (!this.open) return;\n const popup = this.root.querySelector<HTMLElement>('.popup');\n if (popup && !popup.hidden) this._position(popup);\n };\n}\n\nexport function defineFxConfirmPopup(): typeof FxConfirmPopup {\n return defineElement('fx-confirmpopup', FxConfirmPopup);\n}\n\n"],"file":"components/confirmpopup/confirmpopup.js"}
@@ -0,0 +1,8 @@
1
+ import { FxConfirmPopup } from './confirmpopup';
2
+ export { FxConfirmPopup };
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'fx-confirmpopup': FxConfirmPopup;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/confirmpopup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,cAAc,CAAC;KACnC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { defineFxConfirmPopup } from "./confirmpopup.js";
2
+ import { FxConfirmPopup } from "./confirmpopup.js";
3
+ defineFxConfirmPopup();
4
+ export {
5
+ FxConfirmPopup
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/confirmpopup/index.ts"],"sourcesContent":["import { FxConfirmPopup, defineFxConfirmPopup } from './confirmpopup';\n\nexport { FxConfirmPopup };\n\ndefineFxConfirmPopup();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-confirmpopup': FxConfirmPopup;\n }\n}\n"],"names":[],"mappings":";;AAIA,qBAAA;"}
@@ -0,0 +1,14 @@
1
+ import { FxElement } from '../../core/base';
2
+ /**
3
+ * <fx-empty-state> — Estado vazio/ilustrativo para listas e telas sem dados.
4
+ *
5
+ * Atributos: icon (glifo/emoji), heading (título), description (texto de apoio).
6
+ * Slots: `icon` (customiza o ícone), `action` (botão/chamada para ação).
7
+ */
8
+ export declare class FxEmptyState extends FxElement {
9
+ static styles: string;
10
+ static get observedAttributes(): string[];
11
+ protected render(): void;
12
+ }
13
+ export declare function defineFxEmptyState(): typeof FxEmptyState;
14
+ //# sourceMappingURL=empty-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-state.d.ts","sourceRoot":"","sources":["../../../src/components/empty-state/empty-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC,OAAgB,MAAM,SAsCpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;cAEkB,MAAM,IAAI,IAAI;CAelC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,YAAY,CAExD"}
@@ -0,0 +1,71 @@
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 _FxEmptyState = class _FxEmptyState extends FxElement {
6
+ static get observedAttributes() {
7
+ return ["icon", "heading", "description"];
8
+ }
9
+ render() {
10
+ const icon = this.getAttr("icon", "📭");
11
+ const heading = this.getAttr("heading");
12
+ const description = this.getAttr("description");
13
+ this.setTemplate(`
14
+ <div class="wrap" part="wrap">
15
+ <span class="icon" part="icon" aria-hidden="true">${esc(icon)}</span>
16
+ <h4 part="heading" ${heading ? "" : "hidden"}>${esc(heading)}</h4>
17
+ <p part="description" ${description ? "" : "hidden"}>${esc(description)}</p>
18
+ <slot name="icon"></slot>
19
+ <span class="action"><slot name="action"></slot></span>
20
+ </div>
21
+ `);
22
+ }
23
+ };
24
+ _FxEmptyState.styles = css`
25
+ :host {
26
+ display: flex;
27
+ justify-content: center;
28
+ font-family: var(--fx-font-family);
29
+ font-size: var(--fx-font-size);
30
+ }
31
+ .wrap {
32
+ display: flex;
33
+ flex-direction: column;
34
+ align-items: center;
35
+ gap: var(--fx-space-sm);
36
+ padding: var(--fx-space-2xl, 48px) var(--fx-space-xl);
37
+ text-align: center;
38
+ max-width: 420px;
39
+ }
40
+ .icon {
41
+ font-size: calc(var(--fx-font-size) + 28px);
42
+ line-height: 1;
43
+ color: var(--fx-text-muted);
44
+ }
45
+ .icon[hidden] { display: none; }
46
+ h4 {
47
+ margin: 0;
48
+ font-size: calc(var(--fx-font-size) + 3px);
49
+ font-weight: 600;
50
+ color: var(--fx-text-default);
51
+ }
52
+ h4[hidden] { display: none; }
53
+ p {
54
+ margin: 0;
55
+ font-size: calc(var(--fx-font-size) - 1px);
56
+ color: var(--fx-text-muted);
57
+ line-height: 1.5;
58
+ }
59
+ p[hidden] { display: none; }
60
+ .action { margin-top: var(--fx-space-sm); }
61
+ .action:empty { display: none; }
62
+ `;
63
+ let FxEmptyState = _FxEmptyState;
64
+ function defineFxEmptyState() {
65
+ return defineElement("fx-empty-state", FxEmptyState);
66
+ }
67
+ export {
68
+ FxEmptyState,
69
+ defineFxEmptyState
70
+ };
71
+ //# sourceMappingURL=empty-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-state.js","sources":["../../../src/components/empty-state/empty-state.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-empty-state> — Estado vazio/ilustrativo para listas e telas sem dados.\n *\n * Atributos: icon (glifo/emoji), heading (título), description (texto de apoio).\n * Slots: `icon` (customiza o ícone), `action` (botão/chamada para ação).\n */\nexport class FxEmptyState extends FxElement {\n static override styles = css`\n :host {\n display: flex;\n justify-content: center;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--fx-space-sm);\n padding: var(--fx-space-2xl, 48px) var(--fx-space-xl);\n text-align: center;\n max-width: 420px;\n }\n .icon {\n font-size: calc(var(--fx-font-size) + 28px);\n line-height: 1;\n color: var(--fx-text-muted);\n }\n .icon[hidden] { display: none; }\n h4 {\n margin: 0;\n font-size: calc(var(--fx-font-size) + 3px);\n font-weight: 600;\n color: var(--fx-text-default);\n }\n h4[hidden] { display: none; }\n p {\n margin: 0;\n font-size: calc(var(--fx-font-size) - 1px);\n color: var(--fx-text-muted);\n line-height: 1.5;\n }\n p[hidden] { display: none; }\n .action { margin-top: var(--fx-space-sm); }\n .action:empty { display: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['icon', 'heading', 'description'];\n }\n\n protected override render(): void {\n const icon = this.getAttr('icon', '📭');\n const heading = this.getAttr('heading');\n const description = this.getAttr('description');\n\n this.setTemplate(`\n <div class=\"wrap\" part=\"wrap\">\n <span class=\"icon\" part=\"icon\" aria-hidden=\"true\">${esc(icon)}</span>\n <h4 part=\"heading\" ${heading ? '' : 'hidden'}>${esc(heading)}</h4>\n <p part=\"description\" ${description ? '' : 'hidden'}>${esc(description)}</p>\n <slot name=\"icon\"></slot>\n <span class=\"action\"><slot name=\"action\"></slot></span>\n </div>\n `);\n }\n}\n\nexport function defineFxEmptyState(): typeof FxEmptyState {\n return defineElement('fx-empty-state', FxEmptyState);\n}"],"names":[],"mappings":";;;;AAWO,MAAM,gBAAN,MAAM,sBAAqB,UAAU;AAAA,EAyC1C,WAAoB,qBAA+B;AACjD,WAAO,CAAC,QAAQ,WAAW,aAAa;AAAA,EAC1C;AAAA,EAEmB,SAAe;AAChC,UAAM,OAAO,KAAK,QAAQ,QAAQ,IAAI;AACtC,UAAM,UAAU,KAAK,QAAQ,SAAS;AACtC,UAAM,cAAc,KAAK,QAAQ,aAAa;AAE9C,SAAK,YAAY;AAAA;AAAA,4DAEuC,IAAI,IAAI,CAAC;AAAA,6BACxC,UAAU,KAAK,QAAQ,IAAI,IAAI,OAAO,CAAC;AAAA,gCACpC,cAAc,KAAK,QAAQ,IAAI,IAAI,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,KAI1E;AAAA,EACH;AACF;AA3DE,cAAgB,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;AADpB,IAAM,eAAN;AA8DA,SAAS,qBAA0C;AACxD,SAAO,cAAc,kBAAkB,YAAY;AACrD;"}
@@ -0,0 +1,8 @@
1
+ import { FxEmptyState } from './empty-state';
2
+ export { FxEmptyState };
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'fx-empty-state': FxEmptyState;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/empty-state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,CAAC;AAIxB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { defineFxEmptyState } from "./empty-state.js";
2
+ import { FxEmptyState } from "./empty-state.js";
3
+ defineFxEmptyState();
4
+ export {
5
+ FxEmptyState
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/empty-state/index.ts"],"sourcesContent":["import { FxEmptyState, defineFxEmptyState } from './empty-state';\n\nexport { FxEmptyState };\n\ndefineFxEmptyState();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-empty-state': FxEmptyState;\n }\n}"],"names":[],"mappings":";;AAIA,mBAAA;"}
@@ -0,0 +1,42 @@
1
+ import { FxElement } from '../../core/base';
2
+ /**
3
+ * <fx-fileupload> — Seletor de arquivos com upload e progresso (estilo FileUpload do PrimeVue).
4
+ *
5
+ * Atributos:
6
+ * - mode (basic|advanced — `basic`: botão; `advanced`: dropzone com drag & drop);
7
+ * - size (sm|md|lg, padrão md);
8
+ * - severity (primary|secondary|success|warning|danger|info — cor do botão no modo basic);
9
+ * - label (texto do botão/área, padrão 'Escolher arquivo');
10
+ * - icon (glifo/emoji exibido antes do texto — sem o atributo, sem ícone);
11
+ * - accept, multiple, disabled (como no <input type="file">);
12
+ * - show-progress (exibe barra + % de upload);
13
+ * - progress (0-100 — o consumidor atualiza durante o upload real);
14
+ * - value (nome(s) do(s) arquivo(s) carregado(s), somente leitura/espelho).
15
+ *
16
+ * Eventos (composed): `select` (detail: { files: File[] }), `remove`, `complete`.
17
+ */
18
+ export declare class FxFileUpload extends FxElement {
19
+ static styles: string;
20
+ static get observedAttributes(): string[];
21
+ get size(): string;
22
+ set size(value: string);
23
+ /** Nomes dos arquivos selecionados (espelho em `value`). */
24
+ get value(): string;
25
+ set value(v: string);
26
+ get progress(): number;
27
+ set progress(v: number);
28
+ /** Arquivos selecionados (não serializável em atributo). */
29
+ get files(): File[];
30
+ set files(files: File[]);
31
+ protected render(): void;
32
+ private _files;
33
+ private _done;
34
+ private _picker;
35
+ private _bindPicker;
36
+ private _acceptFiles;
37
+ private _fmtSize;
38
+ /** Renderiza a lista de arquivos sem re-renderizar o template (mantém estado). */
39
+ private _syncFilesArea;
40
+ }
41
+ export declare function defineFxFileUpload(): typeof FxFileUpload;
42
+ //# sourceMappingURL=fileupload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileupload.d.ts","sourceRoot":"","sources":["../../../src/components/fileupload/fileupload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC,OAAgB,MAAM,SA+HpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,IAAI,IAAI,MAAM,CAGjB;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAuC;IAE7D,4DAA4D;IAC5D,IAAI,KAAK,IAAI,MAAM,CAAkC;IACrD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAAoC;IAEvD,IAAI,QAAQ,IAAI,MAAM,CAAmF;IACzG,IAAI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAA+C;IAErE,4DAA4D;IAC5D,IAAI,KAAK,IAAI,IAAI,EAAE,CAAwB;IAC3C,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAItB;cAEkB,MAAM,IAAI,IAAI;IA6CjC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,QAAQ;IAMhB,kFAAkF;IAClF,OAAO,CAAC,cAAc;CAyBvB;AAED,wBAAgB,kBAAkB,IAAI,OAAO,YAAY,CAExD"}