@wrrdev/fenix-ui 1.0.16 → 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,119 @@
1
+ import { FxElement } from "../../core/base.js";
2
+ import { css } from "../../core/css.js";
3
+ import { defineElement } from "../../core/define.js";
4
+ const _FxRating = class _FxRating extends FxElement {
5
+ static get observedAttributes() {
6
+ return ["value", "max", "readonly", "disabled", "allow-half", "size"];
7
+ }
8
+ get value() {
9
+ const n = Number(this.getAttr("value", "0"));
10
+ return Number.isFinite(n) ? Math.min(this.max, Math.max(0, n)) : 0;
11
+ }
12
+ set value(v) {
13
+ this.setAttribute("value", String(Math.min(this.max, Math.max(0, v))));
14
+ this._syncVisual();
15
+ }
16
+ get max() {
17
+ const n = Number(this.getAttr("max", "5"));
18
+ const m = Number.isFinite(n) ? Math.round(n) : 5;
19
+ return Math.min(10, Math.max(1, m));
20
+ }
21
+ set max(v) {
22
+ this.setAttribute("max", String(v));
23
+ }
24
+ render() {
25
+ const stars = this.max;
26
+ const starsHtml = Array.from({ length: stars }, (_, i) => i + 1).map((n) => `<span class="star" data-n="${n}" part="star" title="${n} ${this._label(n)}">★</span>`).join("");
27
+ this.setTemplate(`
28
+ <span class="stars" part="stars" role="radiogroup">
29
+ ${starsHtml}
30
+ </span>
31
+ `);
32
+ this._bindStars();
33
+ this._syncVisual();
34
+ }
35
+ _starNodes() {
36
+ return Array.from(this.root.querySelectorAll(".star"));
37
+ }
38
+ _label(n) {
39
+ return n === 1 ? "estrella" : "estrellas";
40
+ }
41
+ _syncVisual() {
42
+ const v = this.value;
43
+ this._starNodes().forEach((star) => {
44
+ const n = Number(star.dataset.n);
45
+ star.classList.toggle("filled", v >= n);
46
+ });
47
+ }
48
+ _bindStars() {
49
+ const stars = this._starNodes();
50
+ stars.forEach((star) => {
51
+ const n = Number(star.dataset.n);
52
+ star.addEventListener("click", () => {
53
+ if (this.hasAttr("readonly") || this.hasAttr("disabled")) return;
54
+ let next = n;
55
+ if (this.hasAttr("allow-half")) next += -0.5;
56
+ this.value = next;
57
+ this.dispatchEvent(
58
+ new CustomEvent("change", { bubbles: true, composed: true, detail: { value: this.value } })
59
+ );
60
+ });
61
+ star.addEventListener("mouseenter", () => {
62
+ if (this.hasAttr("readonly") || this.hasAttr("disabled")) return;
63
+ this._hover(n);
64
+ });
65
+ star.addEventListener("mouseleave", () => this._syncVisual());
66
+ });
67
+ }
68
+ _hover(n) {
69
+ this._starNodes().forEach((star) => {
70
+ const nn = Number(star.dataset.n);
71
+ star.classList.toggle("hovered", nn <= n);
72
+ });
73
+ }
74
+ };
75
+ _FxRating.styles = css`
76
+ :host {
77
+ display: inline-flex;
78
+ font-family: var(--fx-font-family);
79
+ font-size: var(--fx-font-size);
80
+ --_star: calc(var(--fx-font-size) + 8px);
81
+ }
82
+ :host([size='sm']) { --_star: calc(var(--fx-font-size) + 4px); }
83
+ :host([size='lg']) { --_star: calc(var(--fx-font-size) + 14px); }
84
+ :host([disabled]) { opacity: 0.55; }
85
+ :host([disabled]) .stars { pointer-events: none; }
86
+ :host([readonly]) .stars { pointer-events: none; }
87
+
88
+ .stars {
89
+ display: inline-flex;
90
+ align-items: center;
91
+ gap: 2px;
92
+ cursor: pointer;
93
+ }
94
+ .star {
95
+ position: relative;
96
+ display: inline-flex;
97
+ width: var(--_star);
98
+ height: var(--_star);
99
+ font-size: var(--_star);
100
+ line-height: 1;
101
+ color: var(--fx-text-muted);
102
+ cursor: pointer;
103
+ user-select: none;
104
+ transition: transform var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);
105
+ }
106
+ .star:hover { transform: scale(1.1); }
107
+ .star[hidden] { display: none; }
108
+ .star.filled { color: var(--fx-color-warning); }
109
+ .star.hovered { color: var(--fx-color-warning); }
110
+ `;
111
+ let FxRating = _FxRating;
112
+ function defineFxRating() {
113
+ return defineElement("fx-rating", FxRating);
114
+ }
115
+ export {
116
+ FxRating,
117
+ defineFxRating
118
+ };
119
+ //# sourceMappingURL=rating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rating.js","sources":["../../../src/components/rating/rating.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-rating> — Evaluación por estrellas.\n *\n * Atributos: value (0 a max), max (número de estrellas, default 5),\n * readonly, disabled, allow-half (permite medias estrellas),\n * size (sm|md|lg).\n * Eventos (composed): `change` (detail: { value }).\n */\nexport class FxRating extends FxElement {\n static override styles = css`\n :host {\n display: inline-flex;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --_star: calc(var(--fx-font-size) + 8px);\n }\n :host([size='sm']) { --_star: calc(var(--fx-font-size) + 4px); }\n :host([size='lg']) { --_star: calc(var(--fx-font-size) + 14px); }\n :host([disabled]) { opacity: 0.55; }\n :host([disabled]) .stars { pointer-events: none; }\n :host([readonly]) .stars { pointer-events: none; }\n\n .stars {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n cursor: pointer;\n }\n .star {\n position: relative;\n display: inline-flex;\n width: var(--_star);\n height: var(--_star);\n font-size: var(--_star);\n line-height: 1;\n color: var(--fx-text-muted);\n cursor: pointer;\n user-select: none;\n transition: transform var(--fx-motion-duration-fast) var(--fx-motion-easing), color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .star:hover { transform: scale(1.1); }\n .star[hidden] { display: none; }\n .star.filled { color: var(--fx-color-warning); }\n .star.hovered { color: var(--fx-color-warning); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'max', 'readonly', 'disabled', 'allow-half', 'size'];\n }\n\n get value(): number {\n const n = Number(this.getAttr('value', '0'));\n return Number.isFinite(n) ? Math.min(this.max, Math.max(0, n)) : 0;\n }\n set value(v: number) {\n this.setAttribute('value', String(Math.min(this.max, Math.max(0, v))));\n this._syncVisual();\n }\n\n get max(): number {\n const n = Number(this.getAttr('max', '5'));\n const m = Number.isFinite(n) ? Math.round(n) : 5;\n return Math.min(10, Math.max(1, m));\n }\n set max(v: number) { this.setAttribute('max', String(v)); }\n\n protected override render(): void {\n const stars = this.max;\n const starsHtml = Array.from({ length: stars }, (_, i) => i + 1)\n .map((n) => `<span class=\"star\" data-n=\"${n}\" part=\"star\" title=\"${n} ${this._label(n)}\">★</span>`)\n .join('');\n\n this.setTemplate(`\n <span class=\"stars\" part=\"stars\" role=\"radiogroup\">\n ${starsHtml}\n </span>\n `);\n\n this._bindStars();\n this._syncVisual();\n }\n\n private _starNodes(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.star'));\n }\n\n private _label(n: number): string {\n return n === 1 ? 'estrella' : 'estrellas';\n }\n\n private _syncVisual(): void {\n const v = this.value;\n this._starNodes().forEach((star) => {\n const n = Number(star.dataset.n);\n star.classList.toggle('filled', v >= n);\n });\n }\n\n private _bindStars(): void {\n const stars = this._starNodes();\n stars.forEach((star) => {\n const n = Number(star.dataset.n);\n star.addEventListener('click', () => {\n if (this.hasAttr('readonly') || this.hasAttr('disabled')) return;\n let next = n;\n if (this.hasAttr('allow-half')) next += -0.5; // para simplificar, valor entero\n this.value = next;\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n star.addEventListener('mouseenter', () => {\n if (this.hasAttr('readonly') || this.hasAttr('disabled')) return;\n this._hover(n);\n });\n star.addEventListener('mouseleave', () => this._syncVisual());\n });\n }\n\n private _hover(n: number): void {\n this._starNodes().forEach((star) => {\n const nn = Number(star.dataset.n);\n star.classList.toggle('hovered', nn <= n);\n });\n }\n}\n\nexport function defineFxRating(): typeof FxRating {\n return defineElement('fx-rating', FxRating);\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FxSlider } from './slider';
2
+ export { FxSlider };
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'fx-slider': FxSlider;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,CAAC;AAIpB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
@@ -0,0 +1,7 @@
1
+ import { defineFxSlider } from "./slider.js";
2
+ import { FxSlider } from "./slider.js";
3
+ defineFxSlider();
4
+ export {
5
+ FxSlider
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/slider/index.ts"],"sourcesContent":["import { FxSlider, defineFxSlider } from './slider';\n\nexport { FxSlider };\n\ndefineFxSlider();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-slider': FxSlider;\n }\n}\n"],"names":[],"mappings":";;AAIA,eAAA;"}
@@ -0,0 +1,33 @@
1
+ import { FxElement } from '../../core/base';
2
+ /**
3
+ * <fx-slider> — Controle deslizante para seleção de valor numérico em um intervalo.
4
+ *
5
+ * Atributos: min, max, step, value, size (sm|md|lg), disabled, show-value,
6
+ * label (rótulo acima do trilho).
7
+ * Eventos (composed): `input` (durante o arraste) e `change` (ao soltar) —
8
+ * ambos com `detail: { value: number }`.
9
+ */
10
+ export declare class FxSlider extends FxElement {
11
+ static styles: string;
12
+ static get observedAttributes(): string[];
13
+ get min(): number;
14
+ get max(): number;
15
+ get step(): number;
16
+ get value(): number;
17
+ set value(v: number);
18
+ private _num;
19
+ private _clamp;
20
+ /** Arredonda para o múltiplo de `step` mais próximo dentro do intervalo. */
21
+ private _snap;
22
+ /** Percentual (0-100) do valor atual dentro do intervalo. */
23
+ private _pct;
24
+ protected render(): void;
25
+ private _dragging;
26
+ private _wrap;
27
+ private _bindPointer;
28
+ private _bindKeyboard;
29
+ /** Atualiza fill/thumb/tooltip/aria sem re-renderizar o template (evita perder o drag). */
30
+ private _syncVisual;
31
+ }
32
+ export declare function defineFxSlider(): typeof FxSlider;
33
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/components/slider/slider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;GAOG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAgB,MAAM,SA8EpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,GAAG,IAAI,MAAM,CAAgC;IACjD,IAAI,GAAG,IAAI,MAAM,CAAkC;IACnD,IAAI,IAAI,IAAI,MAAM,CAAiC;IAEnD,IAAI,KAAK,IAAI,MAAM,CAElB;IACD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAKlB;IAED,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,MAAM;IAId,4EAA4E;IAC5E,OAAO,CAAC,KAAK;IAMb,6DAA6D;IAC7D,OAAO,CAAC,IAAI;cAKO,MAAM,IAAI,IAAI;IAoBjC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IA8CpB,OAAO,CAAC,aAAa;IA6BrB,2FAA2F;IAC3F,OAAO,CAAC,WAAW;CAiBpB;AAED,wBAAgB,cAAc,IAAI,OAAO,QAAQ,CAEhD"}
@@ -0,0 +1,260 @@
1
+ import { FxElement } from "../../core/base.js";
2
+ import { css } from "../../core/css.js";
3
+ import { defineElement } from "../../core/define.js";
4
+ const _FxSlider = class _FxSlider extends FxElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this._dragging = false;
8
+ }
9
+ static get observedAttributes() {
10
+ return ["min", "max", "step", "size", "disabled", "show-value", "label"];
11
+ }
12
+ get min() {
13
+ return this._num("min", 0);
14
+ }
15
+ get max() {
16
+ return this._num("max", 100);
17
+ }
18
+ get step() {
19
+ return this._num("step", 1);
20
+ }
21
+ get value() {
22
+ return this._clamp(this._num("value", this.min));
23
+ }
24
+ set value(v) {
25
+ const snapped = this._snap(v);
26
+ this.setAttribute("value", String(snapped));
27
+ if (this.isConnected) this._syncVisual();
28
+ }
29
+ _num(attr, fallback) {
30
+ const raw = this.getAttribute(attr);
31
+ if (raw === null || raw === "") return fallback;
32
+ const n = Number(raw);
33
+ return Number.isFinite(n) ? n : fallback;
34
+ }
35
+ _clamp(v) {
36
+ return Math.min(this.max, Math.max(this.min, v));
37
+ }
38
+ /** Arredonda para o múltiplo de `step` mais próximo dentro do intervalo. */
39
+ _snap(v) {
40
+ const step = this.step || 1;
41
+ const snapped = Math.round((this._clamp(v) - this.min) / step) * step + this.min;
42
+ return Number(this._clamp(snapped).toFixed(10));
43
+ }
44
+ /** Percentual (0-100) do valor atual dentro do intervalo. */
45
+ _pct() {
46
+ const span = this.max - this.min;
47
+ return span <= 0 ? 0 : (this.value - this.min) / span * 100;
48
+ }
49
+ render() {
50
+ const pct = this._pct();
51
+ const label = this.getAttr("label");
52
+ const showValue = this.hasAttr("show-value");
53
+ this.setTemplate(`
54
+ ${label ? `<div class="label" part="label"><span>${label}</span>${showValue ? `<span>${this.value}</span>` : ""}</div>` : ""}
55
+ <div class="track-wrap" part="track" tabindex="0" role="slider"
56
+ aria-valuemin="${this.min}" aria-valuemax="${this.max}" aria-valuenow="${this.value}"
57
+ aria-label="${label || "Slider"}" ${this.hasAttr("disabled") ? 'aria-disabled="true"' : ""}>
58
+ <div class="track"><div class="fill" part="fill" style="width: ${pct}%"></div></div>
59
+ <div class="thumb" part="thumb" style="left: ${pct}%"></div>
60
+ ${showValue ? `<span class="value" style="left: ${pct}%">${this.value}</span>` : ""}
61
+ </div>
62
+ `);
63
+ this._bindPointer();
64
+ this._bindKeyboard();
65
+ }
66
+ _wrap() {
67
+ return this.root.querySelector(".track-wrap");
68
+ }
69
+ _bindPointer() {
70
+ const wrap = this._wrap();
71
+ if (!wrap) return;
72
+ const valueFromEvent = (e) => {
73
+ const rect = wrap.getBoundingClientRect();
74
+ const ratio = rect.width <= 0 ? 0 : (e.clientX - rect.left) / rect.width;
75
+ return this.min + ratio * (this.max - this.min);
76
+ };
77
+ const move = (e) => {
78
+ if (!this._dragging) return;
79
+ this.value = valueFromEvent(e);
80
+ this._syncVisual();
81
+ this.dispatchEvent(
82
+ new CustomEvent("input", { bubbles: true, composed: true, detail: { value: this.value } })
83
+ );
84
+ };
85
+ const up = (e) => {
86
+ if (!this._dragging) return;
87
+ this._dragging = false;
88
+ wrap.classList.remove("dragging");
89
+ window.removeEventListener("pointermove", move);
90
+ window.removeEventListener("pointerup", up);
91
+ this.value = valueFromEvent(e);
92
+ this._syncVisual();
93
+ this.dispatchEvent(
94
+ new CustomEvent("change", { bubbles: true, composed: true, detail: { value: this.value } })
95
+ );
96
+ };
97
+ wrap.addEventListener("pointerdown", (e) => {
98
+ if (this.hasAttr("disabled")) return;
99
+ this._dragging = true;
100
+ wrap.classList.add("dragging");
101
+ wrap.focus();
102
+ this.value = valueFromEvent(e);
103
+ this._syncVisual();
104
+ this.dispatchEvent(
105
+ new CustomEvent("input", { bubbles: true, composed: true, detail: { value: this.value } })
106
+ );
107
+ window.addEventListener("pointermove", move);
108
+ window.addEventListener("pointerup", up);
109
+ });
110
+ }
111
+ _bindKeyboard() {
112
+ const wrap = this._wrap();
113
+ if (!wrap) return;
114
+ wrap.addEventListener("keydown", (e) => {
115
+ if (this.hasAttr("disabled")) return;
116
+ const ev = e;
117
+ const big = (this.max - this.min) / 10;
118
+ let next = null;
119
+ switch (ev.key) {
120
+ case "ArrowRight":
121
+ case "ArrowUp":
122
+ next = this.value + this.step;
123
+ break;
124
+ case "ArrowLeft":
125
+ case "ArrowDown":
126
+ next = this.value - this.step;
127
+ break;
128
+ case "PageUp":
129
+ next = this.value + big;
130
+ break;
131
+ case "PageDown":
132
+ next = this.value - big;
133
+ break;
134
+ case "Home":
135
+ next = this.min;
136
+ break;
137
+ case "End":
138
+ next = this.max;
139
+ break;
140
+ default:
141
+ return;
142
+ }
143
+ ev.preventDefault();
144
+ this.value = next;
145
+ this._syncVisual();
146
+ this.dispatchEvent(
147
+ new CustomEvent("input", { bubbles: true, composed: true, detail: { value: this.value } })
148
+ );
149
+ this.dispatchEvent(
150
+ new CustomEvent("change", { bubbles: true, composed: true, detail: { value: this.value } })
151
+ );
152
+ });
153
+ }
154
+ /** Atualiza fill/thumb/tooltip/aria sem re-renderizar o template (evita perder o drag). */
155
+ _syncVisual() {
156
+ const pct = this._pct();
157
+ const wrap = this._wrap();
158
+ if (!wrap) return;
159
+ const fill = wrap.querySelector(".fill");
160
+ const thumb = wrap.querySelector(".thumb");
161
+ const tip = wrap.querySelector(".value");
162
+ if (fill) fill.style.width = `${pct}%`;
163
+ if (thumb) thumb.style.left = `${pct}%`;
164
+ if (tip) {
165
+ tip.style.left = `${pct}%`;
166
+ tip.textContent = String(this.value);
167
+ }
168
+ wrap.setAttribute("aria-valuenow", String(this.value));
169
+ const labelPct = this.root.querySelector(".label span:last-child");
170
+ if (labelPct) labelPct.textContent = String(this.value);
171
+ }
172
+ };
173
+ _FxSlider.styles = css`
174
+ :host {
175
+ display: block;
176
+ font-family: var(--fx-font-family);
177
+ font-size: var(--fx-font-size);
178
+ --_track-h: 6px;
179
+ --_thumb: 18px;
180
+ }
181
+ :host([size='sm']) { --_track-h: 4px; --_thumb: 14px; }
182
+ :host([size='lg']) { --_track-h: 8px; --_thumb: 22px; }
183
+ :host([disabled]) { opacity: 0.55; pointer-events: none; }
184
+
185
+ .label {
186
+ font-size: calc(var(--fx-font-size) - 2px);
187
+ color: var(--fx-text-muted);
188
+ margin-bottom: var(--fx-space-xs);
189
+ display: flex;
190
+ justify-content: space-between;
191
+ gap: var(--fx-space-md);
192
+ align-items: center;
193
+ }
194
+ .track-wrap {
195
+ position: relative;
196
+ display: flex;
197
+ align-items: center;
198
+ height: var(--_thumb);
199
+ cursor: pointer;
200
+ touch-action: none;
201
+ }
202
+ .track {
203
+ width: 100%;
204
+ height: var(--_track-h);
205
+ border-radius: var(--fx-radius-full);
206
+ background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));
207
+ overflow: hidden;
208
+ }
209
+ .fill {
210
+ height: 100%;
211
+ background: var(--fx-color-primary);
212
+ border-radius: var(--fx-radius-full);
213
+ }
214
+ .thumb {
215
+ position: absolute;
216
+ top: 50%;
217
+ width: var(--_thumb);
218
+ height: var(--_thumb);
219
+ border-radius: var(--fx-radius-full);
220
+ background: var(--fx-surface-background);
221
+ border: 2px solid var(--fx-color-primary);
222
+ box-shadow: var(--fx-shadow-sm);
223
+ transform: translate(-50%, -50%);
224
+ transition: box-shadow var(--fx-motion-duration-fast) var(--fx-motion-easing);
225
+ box-sizing: border-box;
226
+ }
227
+ .track-wrap:hover .thumb,
228
+ .track-wrap.dragging .thumb { box-shadow: var(--fx-effect-focus-ring, none); }
229
+ .track-wrap:focus-visible { outline: none; }
230
+ .track-wrap:focus-visible .thumb {
231
+ box-shadow: var(--fx-effect-focus-ring, none);
232
+ }
233
+ .value {
234
+ position: absolute;
235
+ bottom: calc(100% + 6px);
236
+ transform: translateX(-50%);
237
+ background: var(--fx-text-default, #1e293b);
238
+ color: var(--fx-surface-background, #fff);
239
+ font-size: calc(var(--fx-font-size) - 3px);
240
+ font-weight: 600;
241
+ padding: 2px var(--fx-space-xs);
242
+ border-radius: var(--fx-radius-sm);
243
+ white-space: nowrap;
244
+ pointer-events: none;
245
+ opacity: 0;
246
+ transition: opacity var(--fx-motion-duration-fast) var(--fx-motion-easing);
247
+ }
248
+ .track-wrap:hover .value,
249
+ .track-wrap.dragging .value,
250
+ .track-wrap:focus-visible .value { opacity: 1; }
251
+ `;
252
+ let FxSlider = _FxSlider;
253
+ function defineFxSlider() {
254
+ return defineElement("fx-slider", FxSlider);
255
+ }
256
+ export {
257
+ FxSlider,
258
+ defineFxSlider
259
+ };
260
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","sources":["../../../src/components/slider/slider.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-slider> — Controle deslizante para seleção de valor numérico em um intervalo.\n *\n * Atributos: min, max, step, value, size (sm|md|lg), disabled, show-value,\n * label (rótulo acima do trilho).\n * Eventos (composed): `input` (durante o arraste) e `change` (ao soltar) —\n * ambos com `detail: { value: number }`.\n */\nexport class FxSlider 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 --_track-h: 6px;\n --_thumb: 18px;\n }\n :host([size='sm']) { --_track-h: 4px; --_thumb: 14px; }\n :host([size='lg']) { --_track-h: 8px; --_thumb: 22px; }\n :host([disabled]) { opacity: 0.55; pointer-events: none; }\n\n .label {\n font-size: calc(var(--fx-font-size) - 2px);\n color: var(--fx-text-muted);\n margin-bottom: var(--fx-space-xs);\n display: flex;\n justify-content: space-between;\n gap: var(--fx-space-md);\n align-items: center;\n }\n .track-wrap {\n position: relative;\n display: flex;\n align-items: center;\n height: var(--_thumb);\n cursor: pointer;\n touch-action: none;\n }\n .track {\n width: 100%;\n height: var(--_track-h);\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n overflow: hidden;\n }\n .fill {\n height: 100%;\n background: var(--fx-color-primary);\n border-radius: var(--fx-radius-full);\n }\n .thumb {\n position: absolute;\n top: 50%;\n width: var(--_thumb);\n height: var(--_thumb);\n border-radius: var(--fx-radius-full);\n background: var(--fx-surface-background);\n border: 2px solid var(--fx-color-primary);\n box-shadow: var(--fx-shadow-sm);\n transform: translate(-50%, -50%);\n transition: box-shadow var(--fx-motion-duration-fast) var(--fx-motion-easing);\n box-sizing: border-box;\n }\n .track-wrap:hover .thumb,\n .track-wrap.dragging .thumb { box-shadow: var(--fx-effect-focus-ring, none); }\n .track-wrap:focus-visible { outline: none; }\n .track-wrap:focus-visible .thumb {\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n .value {\n position: absolute;\n bottom: calc(100% + 6px);\n transform: translateX(-50%);\n background: var(--fx-text-default, #1e293b);\n color: var(--fx-surface-background, #fff);\n font-size: calc(var(--fx-font-size) - 3px);\n font-weight: 600;\n padding: 2px var(--fx-space-xs);\n border-radius: var(--fx-radius-sm);\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .track-wrap:hover .value,\n .track-wrap.dragging .value,\n .track-wrap:focus-visible .value { opacity: 1; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['min', 'max', 'step', 'size', 'disabled', 'show-value', 'label'];\n }\n\n get min(): number { return this._num('min', 0); }\n get max(): number { return this._num('max', 100); }\n get step(): number { return this._num('step', 1); }\n\n get value(): number {\n return this._clamp(this._num('value', this.min));\n }\n set value(v: number) {\n const snapped = this._snap(v);\n this.setAttribute('value', String(snapped));\n // atualiza visual sem re-render (preserva estado de drag/foco)\n if (this.isConnected) this._syncVisual();\n }\n\n private _num(attr: string, fallback: number): number {\n const raw = this.getAttribute(attr);\n if (raw === null || raw === '') return fallback;\n const n = Number(raw);\n return Number.isFinite(n) ? n : fallback;\n }\n\n private _clamp(v: number): number {\n return Math.min(this.max, Math.max(this.min, v));\n }\n\n /** Arredonda para o múltiplo de `step` mais próximo dentro do intervalo. */\n private _snap(v: number): number {\n const step = this.step || 1;\n const snapped = Math.round((this._clamp(v) - this.min) / step) * step + this.min;\n return Number(this._clamp(snapped).toFixed(10));\n }\n\n /** Percentual (0-100) do valor atual dentro do intervalo. */\n private _pct(): number {\n const span = this.max - this.min;\n return span <= 0 ? 0 : ((this.value - this.min) / span) * 100;\n }\n\n protected override render(): void {\n const pct = this._pct();\n const label = this.getAttr('label');\n const showValue = this.hasAttr('show-value');\n\n this.setTemplate(`\n ${label ? `<div class=\"label\" part=\"label\"><span>${label}</span>${showValue ? `<span>${this.value}</span>` : ''}</div>` : ''}\n <div class=\"track-wrap\" part=\"track\" tabindex=\"0\" role=\"slider\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\" aria-valuenow=\"${this.value}\"\n aria-label=\"${label || 'Slider'}\" ${this.hasAttr('disabled') ? 'aria-disabled=\"true\"' : ''}>\n <div class=\"track\"><div class=\"fill\" part=\"fill\" style=\"width: ${pct}%\"></div></div>\n <div class=\"thumb\" part=\"thumb\" style=\"left: ${pct}%\"></div>\n ${showValue ? `<span class=\"value\" style=\"left: ${pct}%\">${this.value}</span>` : ''}\n </div>\n `);\n\n this._bindPointer();\n this._bindKeyboard();\n }\n\n private _dragging = false;\n\n private _wrap(): HTMLElement | null {\n return this.root.querySelector<HTMLElement>('.track-wrap');\n }\n\n private _bindPointer(): void {\n const wrap = this._wrap();\n if (!wrap) return;\n\n const valueFromEvent = (e: PointerEvent): number => {\n const rect = wrap.getBoundingClientRect();\n const ratio = rect.width <= 0 ? 0 : (e.clientX - rect.left) / rect.width;\n return this.min + ratio * (this.max - this.min);\n };\n\n const move = (e: PointerEvent): void => {\n if (!this._dragging) return;\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n };\n const up = (e: PointerEvent): void => {\n if (!this._dragging) return;\n this._dragging = false;\n wrap.classList.remove('dragging');\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n };\n\n wrap.addEventListener('pointerdown', (e) => {\n if (this.hasAttr('disabled')) return;\n this._dragging = true;\n wrap.classList.add('dragging');\n wrap.focus();\n this.value = valueFromEvent(e);\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n });\n }\n\n private _bindKeyboard(): void {\n const wrap = this._wrap();\n if (!wrap) return;\n wrap.addEventListener('keydown', (e) => {\n if (this.hasAttr('disabled')) return;\n const ev = e as KeyboardEvent;\n const big = (this.max - this.min) / 10;\n let next: number | null = null;\n switch (ev.key) {\n case 'ArrowRight': case 'ArrowUp': next = this.value + this.step; break;\n case 'ArrowLeft': case 'ArrowDown': next = this.value - this.step; break;\n case 'PageUp': next = this.value + big; break;\n case 'PageDown': next = this.value - big; break;\n case 'Home': next = this.min; break;\n case 'End': next = this.max; break;\n default: return;\n }\n ev.preventDefault();\n this.value = next;\n this._syncVisual();\n this.dispatchEvent(\n new CustomEvent('input', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n }\n\n /** Atualiza fill/thumb/tooltip/aria sem re-renderizar o template (evita perder o drag). */\n private _syncVisual(): void {\n const pct = this._pct();\n const wrap = this._wrap();\n if (!wrap) return;\n const fill = wrap.querySelector<HTMLElement>('.fill');\n const thumb = wrap.querySelector<HTMLElement>('.thumb');\n const tip = wrap.querySelector<HTMLElement>('.value');\n if (fill) fill.style.width = `${pct}%`;\n if (thumb) thumb.style.left = `${pct}%`;\n if (tip) {\n tip.style.left = `${pct}%`;\n tip.textContent = String(this.value);\n }\n wrap.setAttribute('aria-valuenow', String(this.value));\n const labelPct = this.root.querySelector<HTMLElement>('.label span:last-child');\n if (labelPct) labelPct.textContent = String(this.value);\n }\n}\n\nexport function defineFxSlider(): typeof FxSlider {\n return defineElement('fx-slider', FxSlider);\n}\n\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FxStepper } from './stepper';
2
+ export { FxStepper };
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'fx-stepper': FxStepper;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/stepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,CAAC;AAIrB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,SAAS,CAAC;KACzB;CACF"}
@@ -0,0 +1,7 @@
1
+ import { defineFxStepper } from "./stepper.js";
2
+ import { FxStepper } from "./stepper.js";
3
+ defineFxStepper();
4
+ export {
5
+ FxStepper
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/stepper/index.ts"],"sourcesContent":["import { FxStepper, defineFxStepper } from './stepper';\n\nexport { FxStepper };\n\ndefineFxStepper();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-stepper': FxStepper;\n }\n}"],"names":[],"mappings":";;AAIA,gBAAA;"}
@@ -0,0 +1,33 @@
1
+ import { FxElement } from '../../core/base';
2
+ /**
3
+ * <fx-stepper> — Asistente de pasos (wizard) para flujos multi-etapa.
4
+ *
5
+ * Uso declarativo: cada hijo directo con el atributo `step` define un paso.
6
+ * Uso imperativo: leer/escribir la propiedad `active` para navegar.
7
+ *
8
+ * Atributos: active (índice del paso activo), linear (solo avanzar en orden),
9
+ * show-numbers (muestra el número en el indicador).
10
+ * Slots: `header` (customiza el indicador de pasos), un slot por paso
11
+ * (slot="step-0", slot="step-1", ...).
12
+ *
13
+ * Eventos (composed): `change` (detail: { index }) y `complete` al llegar al último.
14
+ */
15
+ export declare class FxStepper extends FxElement {
16
+ static styles: string;
17
+ static get observedAttributes(): string[];
18
+ get stepCount(): number;
19
+ get active(): number;
20
+ set active(v: number);
21
+ get isLast(): boolean;
22
+ /** Navega al paso (emite change). Con linear, solo permite avanzar de a uno. */
23
+ goTo(index: number): void;
24
+ next(): void;
25
+ prev(): void;
26
+ private _titles;
27
+ private _panels;
28
+ protected render(): void;
29
+ private _bindSteps;
30
+ protected connectedCallback(): void;
31
+ }
32
+ export declare function defineFxStepper(): typeof FxStepper;
33
+ //# sourceMappingURL=stepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper.d.ts","sourceRoot":"","sources":["../../../src/components/stepper/stepper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;;;;;;;;GAYG;AACH,qBAAa,SAAU,SAAQ,SAAS;IACtC,OAAgB,MAAM,SA+DpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,SAAS,IAAI,MAAM,CAAgC;IACvD,IAAI,MAAM,IAAI,MAAM,CAGnB;IACD,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,EAEnB;IAED,IAAI,MAAM,IAAI,OAAO,CAA8C;IAEnE,gFAAgF;IAChF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUzB,IAAI,IAAI,IAAI;IACZ,IAAI,IAAI,IAAI;IAEZ,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAiB;cAEb,MAAM,IAAI,IAAI;IAkCjC,OAAO,CAAC,UAAU;cAoBC,iBAAiB,IAAI,IAAI;CAI7C;AAED,wBAAgB,eAAe,IAAI,OAAO,SAAS,CAElD"}