@wrrdev/fenix-ui 1.0.6 → 1.0.7

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 (129) hide show
  1. package/README.md +314 -314
  2. package/dist/.nojekyll +0 -0
  3. package/dist/components/accordion/accordion.d.ts +72 -0
  4. package/dist/components/accordion/accordion.d.ts.map +1 -0
  5. package/dist/components/accordion/accordion.js +277 -0
  6. package/dist/components/accordion/accordion.js.map +1 -0
  7. package/dist/components/accordion/index.d.ts +2 -0
  8. package/dist/components/accordion/index.d.ts.map +1 -0
  9. package/dist/components/accordion/index.js +9 -0
  10. package/dist/components/accordion/index.js.map +1 -0
  11. package/dist/components/calendar/calendar.d.ts +2 -2
  12. package/dist/components/calendar/calendar.d.ts.map +1 -1
  13. package/dist/components/calendar/calendar.js +187 -89
  14. package/dist/components/calendar/calendar.js.map +1 -1
  15. package/dist/components/dropdown/dropdown.d.ts.map +1 -1
  16. package/dist/components/dropdown/dropdown.js +1 -1
  17. package/dist/components/dropdown/dropdown.js.map +1 -1
  18. package/dist/components/knob/index.d.ts +8 -0
  19. package/dist/components/knob/index.d.ts.map +1 -0
  20. package/dist/components/knob/index.js +7 -0
  21. package/dist/components/knob/index.js.map +1 -0
  22. package/dist/components/knob/knob.d.ts +51 -0
  23. package/dist/components/knob/knob.d.ts.map +1 -0
  24. package/dist/components/knob/knob.js +323 -0
  25. package/dist/components/knob/knob.js.map +1 -0
  26. package/dist/components/orderlist/index.d.ts +3 -0
  27. package/dist/components/orderlist/index.d.ts.map +1 -0
  28. package/dist/components/orderlist/index.js +7 -0
  29. package/dist/components/orderlist/index.js.map +1 -0
  30. package/dist/components/orderlist/orderlist.d.ts +78 -0
  31. package/dist/components/orderlist/orderlist.d.ts.map +1 -0
  32. package/dist/components/orderlist/orderlist.js +666 -0
  33. package/dist/components/orderlist/orderlist.js.map +1 -0
  34. package/dist/components/picklist/index.d.ts +3 -0
  35. package/dist/components/picklist/index.d.ts.map +1 -0
  36. package/dist/components/picklist/index.js +7 -0
  37. package/dist/components/picklist/index.js.map +1 -0
  38. package/dist/components/picklist/picklist.d.ts +102 -0
  39. package/dist/components/picklist/picklist.d.ts.map +1 -0
  40. package/dist/components/picklist/picklist.js +749 -0
  41. package/dist/components/picklist/picklist.js.map +1 -0
  42. package/dist/components/tooltip/directive.d.ts +31 -0
  43. package/dist/components/tooltip/directive.d.ts.map +1 -0
  44. package/dist/components/tooltip/directive.js +294 -0
  45. package/dist/components/tooltip/directive.js.map +1 -0
  46. package/dist/components/tooltip/index.d.ts +2 -1
  47. package/dist/components/tooltip/index.d.ts.map +1 -1
  48. package/dist/components/tooltip/index.js +4 -1
  49. package/dist/components/tooltip/index.js.map +1 -1
  50. package/dist/core/presets.d.ts.map +1 -1
  51. package/dist/core/presets.js +48 -9
  52. package/dist/core/presets.js.map +1 -1
  53. package/dist/core/tokens.d.ts.map +1 -1
  54. package/dist/core/tokens.js +4 -4
  55. package/dist/core/tokens.js.map +1 -1
  56. package/dist/docs/app.d.ts +3 -25
  57. package/dist/docs/app.d.ts.map +1 -1
  58. package/dist/docs/componentes/accordion.doc.d.ts +8 -0
  59. package/dist/docs/componentes/accordion.doc.d.ts.map +1 -0
  60. package/dist/docs/componentes/alert.doc.d.ts +8 -0
  61. package/dist/docs/componentes/alert.doc.d.ts.map +1 -0
  62. package/dist/docs/componentes/autocomplete.doc.d.ts +8 -0
  63. package/dist/docs/componentes/autocomplete.doc.d.ts.map +1 -0
  64. package/dist/docs/componentes/badge.doc.d.ts +8 -0
  65. package/dist/docs/componentes/badge.doc.d.ts.map +1 -0
  66. package/dist/docs/componentes/button.doc.d.ts +8 -0
  67. package/dist/docs/componentes/button.doc.d.ts.map +1 -0
  68. package/dist/docs/componentes/calendar.doc.d.ts +8 -0
  69. package/dist/docs/componentes/calendar.doc.d.ts.map +1 -0
  70. package/dist/docs/componentes/checkbox.doc.d.ts +8 -0
  71. package/dist/docs/componentes/checkbox.doc.d.ts.map +1 -0
  72. package/dist/docs/componentes/datepicker.doc.d.ts +8 -0
  73. package/dist/docs/componentes/datepicker.doc.d.ts.map +1 -0
  74. package/dist/docs/componentes/dialog.doc.d.ts +8 -0
  75. package/dist/docs/componentes/dialog.doc.d.ts.map +1 -0
  76. package/dist/docs/componentes/drawer.doc.d.ts +8 -0
  77. package/dist/docs/componentes/drawer.doc.d.ts.map +1 -0
  78. package/dist/docs/componentes/dropdown.doc.d.ts +8 -0
  79. package/dist/docs/componentes/dropdown.doc.d.ts.map +1 -0
  80. package/dist/docs/componentes/floatlabel.doc.d.ts +8 -0
  81. package/dist/docs/componentes/floatlabel.doc.d.ts.map +1 -0
  82. package/dist/docs/componentes/index.d.ts +10 -0
  83. package/dist/docs/componentes/index.d.ts.map +1 -0
  84. package/dist/docs/componentes/input.doc.d.ts +8 -0
  85. package/dist/docs/componentes/input.doc.d.ts.map +1 -0
  86. package/dist/docs/componentes/knob.doc.d.ts +8 -0
  87. package/dist/docs/componentes/knob.doc.d.ts.map +1 -0
  88. package/dist/docs/componentes/multiselect.doc.d.ts +8 -0
  89. package/dist/docs/componentes/multiselect.doc.d.ts.map +1 -0
  90. package/dist/docs/componentes/orderlist.doc.d.ts +8 -0
  91. package/dist/docs/componentes/orderlist.doc.d.ts.map +1 -0
  92. package/dist/docs/componentes/pagination.doc.d.ts +8 -0
  93. package/dist/docs/componentes/pagination.doc.d.ts.map +1 -0
  94. package/dist/docs/componentes/picklist.doc.d.ts +8 -0
  95. package/dist/docs/componentes/picklist.doc.d.ts.map +1 -0
  96. package/dist/docs/componentes/progress.doc.d.ts +8 -0
  97. package/dist/docs/componentes/progress.doc.d.ts.map +1 -0
  98. package/dist/docs/componentes/radio.doc.d.ts +8 -0
  99. package/dist/docs/componentes/radio.doc.d.ts.map +1 -0
  100. package/dist/docs/componentes/select.doc.d.ts +8 -0
  101. package/dist/docs/componentes/select.doc.d.ts.map +1 -0
  102. package/dist/docs/componentes/skeleton.doc.d.ts +8 -0
  103. package/dist/docs/componentes/skeleton.doc.d.ts.map +1 -0
  104. package/dist/docs/componentes/spinner.doc.d.ts +8 -0
  105. package/dist/docs/componentes/spinner.doc.d.ts.map +1 -0
  106. package/dist/docs/componentes/switch.doc.d.ts +8 -0
  107. package/dist/docs/componentes/switch.doc.d.ts.map +1 -0
  108. package/dist/docs/componentes/table.doc.d.ts +8 -0
  109. package/dist/docs/componentes/table.doc.d.ts.map +1 -0
  110. package/dist/docs/componentes/tabs.doc.d.ts +8 -0
  111. package/dist/docs/componentes/tabs.doc.d.ts.map +1 -0
  112. package/dist/docs/componentes/textarea.doc.d.ts +8 -0
  113. package/dist/docs/componentes/textarea.doc.d.ts.map +1 -0
  114. package/dist/docs/componentes/toast.doc.d.ts +8 -0
  115. package/dist/docs/componentes/toast.doc.d.ts.map +1 -0
  116. package/dist/docs/componentes/tooltip.doc.d.ts +25 -0
  117. package/dist/docs/componentes/tooltip.doc.d.ts.map +1 -0
  118. package/dist/docs/shared.d.ts +9 -0
  119. package/dist/docs/shared.d.ts.map +1 -0
  120. package/dist/docs/types.d.ts +47 -0
  121. package/dist/docs/types.d.ts.map +1 -0
  122. package/dist/fenix-ui.umd.min.js +815 -157
  123. package/dist/fenix-ui2.esm.js +2522 -103
  124. package/dist/fenix-ui2.esm.js.map +1 -1
  125. package/dist/index.d.ts +4 -0
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +16 -0
  128. package/dist/index.js.map +1 -1
  129. package/package.json +212 -196
@@ -21,7 +21,18 @@ const _FxCalendar = class _FxCalendar extends FxElement {
21
21
  this.pickEnd = null;
22
22
  }
23
23
  static get observedAttributes() {
24
- return ["value", "start", "end", "min", "max", "range", "mode", "values", "locale", "disabled"];
24
+ return [
25
+ "value",
26
+ "start",
27
+ "end",
28
+ "min",
29
+ "max",
30
+ "range",
31
+ "mode",
32
+ "values",
33
+ "locale",
34
+ "disabled"
35
+ ];
25
36
  }
26
37
  /** Modo de seleção: 'single' | 'range' | 'multiple'. */
27
38
  get mode() {
@@ -89,7 +100,11 @@ const _FxCalendar = class _FxCalendar extends FxElement {
89
100
  return key(date.getFullYear(), date.getMonth() + 1, date.getDate());
90
101
  }
91
102
  keyToDate(k) {
92
- return new Date(Math.floor(k / 1e4), Math.floor(k / 100) % 100 - 1, k % 100);
103
+ return new Date(
104
+ Math.floor(k / 1e4),
105
+ Math.floor(k / 100) % 100 - 1,
106
+ k % 100
107
+ );
93
108
  }
94
109
  iso(k) {
95
110
  const d = this.keyToDate(k);
@@ -98,7 +113,9 @@ const _FxCalendar = class _FxCalendar extends FxElement {
98
113
  }
99
114
  /** Seleção atual para pintura (chaves). */
100
115
  selection() {
101
- const multi = new Set(this.values.map((iso) => parseBound(iso)?.lo ?? 0).filter(Boolean));
116
+ const multi = new Set(
117
+ this.values.map((iso) => parseBound(iso)?.lo ?? 0).filter(Boolean)
118
+ );
102
119
  if (this.mode === "range") {
103
120
  let s = this.pickStart;
104
121
  let e = this.pickEnd;
@@ -122,13 +139,31 @@ const _FxCalendar = class _FxCalendar extends FxElement {
122
139
  };
123
140
  this.setAttribute("start", detail.start);
124
141
  this.setAttribute("end", detail.end);
125
- this.dispatchEvent(new CustomEvent("change", { bubbles: true, composed: true, detail }));
142
+ this.dispatchEvent(
143
+ new CustomEvent("change", {
144
+ bubbles: true,
145
+ composed: true,
146
+ detail
147
+ })
148
+ );
126
149
  } else if (this.mode === "multiple") {
127
150
  const values = this.values;
128
- this.dispatchEvent(new CustomEvent("change", { bubbles: true, composed: true, detail: { values } }));
151
+ this.dispatchEvent(
152
+ new CustomEvent("change", {
153
+ bubbles: true,
154
+ composed: true,
155
+ detail: { values }
156
+ })
157
+ );
129
158
  } else {
130
159
  const value = this.getAttr("value");
131
- this.dispatchEvent(new CustomEvent("change", { bubbles: true, composed: true, detail: { value } }));
160
+ this.dispatchEvent(
161
+ new CustomEvent("change", {
162
+ bubbles: true,
163
+ composed: true,
164
+ detail: { value }
165
+ })
166
+ );
132
167
  }
133
168
  }
134
169
  pickDay(k) {
@@ -141,7 +176,8 @@ const _FxCalendar = class _FxCalendar extends FxElement {
141
176
  this.render();
142
177
  return;
143
178
  }
144
- if (k < this.pickStart) [this.pickStart, this.pickEnd] = [k, this.pickStart];
179
+ if (k < this.pickStart)
180
+ [this.pickStart, this.pickEnd] = [k, this.pickStart];
145
181
  else this.pickEnd = k;
146
182
  this.emit();
147
183
  } else if (this.mode === "multiple") {
@@ -173,7 +209,10 @@ const _FxCalendar = class _FxCalendar extends FxElement {
173
209
  const sel = this.selection();
174
210
  const loc = this.locale();
175
211
  const titles = {
176
- days: this.fmt({ month: "long", year: "numeric" }, new Date(this.cursor.y, this.cursor.m, 1)),
212
+ days: this.fmt(
213
+ { month: "long", year: "numeric" },
214
+ new Date(this.cursor.y, this.cursor.m, 1)
215
+ ),
177
216
  months: String(this.cursor.y),
178
217
  years: `${Math.floor(this.cursor.y / 12) * 12} – ${Math.floor(this.cursor.y / 12) * 12 + 11}`
179
218
  };
@@ -207,7 +246,10 @@ const _FxCalendar = class _FxCalendar extends FxElement {
207
246
  <div class="grid ${this.view}">${cells}</div>
208
247
  `);
209
248
  this.root.querySelectorAll("[data-nav]").forEach(
210
- (b) => b.addEventListener("click", () => this.navigate(Number(b.dataset.nav)))
249
+ (b) => b.addEventListener(
250
+ "click",
251
+ () => this.navigate(Number(b.dataset.nav))
252
+ )
211
253
  );
212
254
  const gotoBtn = this.root.querySelector("[data-goto]");
213
255
  gotoBtn?.addEventListener("click", () => {
@@ -215,7 +257,10 @@ const _FxCalendar = class _FxCalendar extends FxElement {
215
257
  this.render();
216
258
  });
217
259
  this.root.querySelectorAll("[data-day]").forEach(
218
- (b) => b.addEventListener("click", () => this.pickDay(Number(b.dataset.day)))
260
+ (b) => b.addEventListener(
261
+ "click",
262
+ () => this.pickDay(Number(b.dataset.day))
263
+ )
219
264
  );
220
265
  this.root.querySelectorAll("[data-month]").forEach(
221
266
  (b) => b.addEventListener("click", () => {
@@ -246,95 +291,148 @@ const _FxCalendar = class _FxCalendar extends FxElement {
246
291
  const k = key(y, m + 1, d);
247
292
  const isSel = sel.single === k || sel.start === k || sel.end === k || sel.multi.has(k);
248
293
  const inRange = sel.start !== null && sel.end !== null && k > sel.start && k < sel.end;
249
- const cls = ["cell", isSel ? "sel" : "", inRange ? "in-range" : "", k === todayK ? "today" : ""].filter(Boolean).join(" ");
294
+ const cls = [
295
+ "cell",
296
+ isSel ? "sel" : "",
297
+ inRange ? "in-range" : "",
298
+ k === todayK ? "today" : ""
299
+ ].filter(Boolean).join(" ");
250
300
  html += `<button type="button" class="${cls}" data-day="${k}" ${this.dayDisabled(y, m, d) ? "disabled" : ""}>${d}</button>`;
251
301
  }
252
302
  return html;
253
303
  }
254
304
  };
255
305
  _FxCalendar.styles = css`
256
- :host {
257
- display: inline-block;
258
- font-family: var(--fx-font-family);
259
- font-size: var(--fx-font-size);
260
- color: var(--fx-text-default);
261
- background: var(--fx-surface-background);
262
- border: 1px solid var(--fx-border-default);
263
- border-radius: var(--fx-radius-md);
264
- box-shadow: var(--fx-shadow-sm);
265
- padding: var(--fx-space-sm);
266
- user-select: none;
267
- }
268
- :host([disabled]) { opacity: 0.55; pointer-events: none; }
269
- .head {
306
+ :host {
307
+ display: inline-block;
308
+ font-family: var(--fx-font-family);
309
+ font-size: var(--fx-font-size);
310
+ color: var(--fx-text-default);
311
+ background: var(--fx-surface-background);
312
+ border: 1px solid var(--fx-border-default);
313
+ border-radius: var(--fx-radius-md);
314
+ box-shadow: var(--fx-shadow-sm);
315
+ padding: var(--fx-space-sm);
316
+ user-select: none;
317
+ }
318
+ :host([disabled]) {
319
+ opacity: 0.55;
320
+ pointer-events: none;
321
+ }
322
+ .head {
323
+ display: flex;
324
+ height: 48px;
325
+ align-items: center;
326
+ justify-content: space-between;
327
+ gap: var(--fx-space-xs);
328
+ margin-bottom: var(--fx-space-xs);
329
+ border-bottom: 1px solid var(--fx-border-default);
330
+ }
331
+
332
+ .title {
333
+ min-width: 24px;
334
+ border: none;
335
+ background: none;
336
+ color: var(--fx-text-default);
337
+ cursor: pointer;
338
+ font: inherit;
339
+ border-radius: var(--fx-radius-sm);
340
+ }
341
+ .nav {
270
342
  display: flex;
271
343
  align-items: center;
272
- justify-content: space-between;
273
- gap: var(--fx-space-xs);
274
- margin-bottom: var(--fx-space-xs);
275
- }
276
- .nav,
277
- .title {
278
- border: none;
279
- background: none;
280
- color: var(--fx-text-default);
281
- cursor: pointer;
282
- font: inherit;
283
- border-radius: var(--fx-radius-sm);
284
- padding: var(--fx-space-3xs, 4px) var(--fx-space-xs);
285
- }
286
- .nav:hover, .title:hover { background: var(--fx-surface-surface-hover); }
287
- .title { font-weight: var(--fx-font-weight); text-transform: capitalize; flex: 1; }
288
- .grid {
289
- display: grid;
290
- grid-template-columns: repeat(7, 34px);
291
- gap: 2px;
292
- }
293
- .grid.months, .grid.years { grid-template-columns: repeat(4, minmax(52px, 1fr)); }
294
- .wd {
295
- text-align: center;
296
- color: var(--fx-text-muted);
297
- font-size: calc(var(--fx-font-size) - 2px);
298
- padding: var(--fx-space-3xs, 4px) 0;
299
- text-transform: capitalize;
300
- }
301
- .cell {
302
- position: relative;
303
- border: none;
304
- background: none;
305
- font: inherit;
306
- color: var(--fx-text-default);
307
- height: 32px;
308
- border-radius: var(--fx-radius-sm);
309
- cursor: pointer;
310
- display: inline-flex;
311
- align-items: center;
312
344
  justify-content: center;
345
+ font-size: 20px;
346
+ border: none;
347
+ background: none;
348
+ color: var(--fx-text-muted);
349
+ cursor: pointer;
350
+ border-radius: var(--fx-radius-sm);
313
351
  }
314
- .cell:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, transparent); }
315
- .cell.muted { color: var(--fx-text-disabled); }
316
- .cell.today::after {
317
- content: '';
318
- position: absolute;
319
- bottom: 3px;
320
- width: 4px;
321
- height: 4px;
322
- border-radius: var(--fx-radius-full);
323
- background: var(--fx-color-primary);
324
- }
325
- .cell.sel {
326
- background: var(--fx-color-primary);
327
- color: #fff;
328
- font-weight: var(--fx-font-weight);
329
- }
330
- .cell.sel::after { background: #fff; }
331
- .cell.in-range {
332
- background: color-mix(in srgb, var(--fx-color-primary) 16%, transparent);
333
- border-radius: 0;
334
- }
335
- .grid.months .cell, .grid.years .cell { height: 40px; }
336
- .cell[disabled] { opacity: 0.35; cursor: not-allowed; pointer-events: none; }
337
- `;
352
+ .nav:hover,
353
+ .title:hover {
354
+ background: var(--fx-surface-surface-hover);
355
+ }
356
+ .title {
357
+ padding: var(--fx-space-3xs, 4px) var(--fx-space-xs);
358
+ font-weight: var(--fx-font-weight);
359
+ text-transform: capitalize;
360
+ flex: 1;
361
+ }
362
+ .grid {
363
+ display: grid;
364
+ grid-template-columns: repeat(7, 34px);
365
+ gap: 2px;
366
+ }
367
+ .grid.months,
368
+ .grid.years {
369
+ grid-template-columns: repeat(4, minmax(52px, 1fr));
370
+ }
371
+ .wd {
372
+ text-align: center;
373
+ color: var(--fx-text-muted);
374
+ font-size: calc(var(--fx-font-size) - 2px);
375
+ padding: var(--fx-space-3xs, 4px) 0;
376
+ text-transform: capitalize;
377
+ }
378
+ .cell {
379
+ position: relative;
380
+ border: none;
381
+ background: none;
382
+ font: inherit;
383
+ color: var(--fx-text-default);
384
+ height: 32px;
385
+ border-radius: var(--fx-radius-sm);
386
+ cursor: pointer;
387
+ display: inline-flex;
388
+ align-items: center;
389
+ justify-content: center;
390
+ }
391
+ .cell:hover {
392
+ background: color-mix(
393
+ in srgb,
394
+ var(--fx-color-primary) 12%,
395
+ transparent
396
+ );
397
+ }
398
+ .cell.muted {
399
+ color: var(--fx-text-disabled);
400
+ }
401
+ .cell.today::after {
402
+ content: "";
403
+ position: absolute;
404
+ bottom: 3px;
405
+ width: 4px;
406
+ height: 4px;
407
+ border-radius: var(--fx-radius-full);
408
+ background: var(--fx-color-primary);
409
+ }
410
+ .cell.sel {
411
+ background: var(--fx-color-primary);
412
+ color: #fff;
413
+ font-weight: var(--fx-font-weight);
414
+ }
415
+ .cell.sel::after {
416
+ background: #fff;
417
+ }
418
+ .cell.in-range {
419
+ background: color-mix(
420
+ in srgb,
421
+ var(--fx-color-primary) 16%,
422
+ transparent
423
+ );
424
+ border-radius: 0;
425
+ }
426
+ .grid.months .cell,
427
+ .grid.years .cell {
428
+ height: 40px;
429
+ }
430
+ .cell[disabled] {
431
+ opacity: 0.35;
432
+ cursor: not-allowed;
433
+ pointer-events: none;
434
+ }
435
+ `;
338
436
  let FxCalendar = _FxCalendar;
339
437
  function defineFxCalendar() {
340
438
  return defineElement("fx-calendar", FxCalendar);
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.js","sources":["../../../src/components/calendar/calendar.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-calendar> — Calendário simples ou por período (range).\n *\n * Atributos:\n * - value=\"YYYY-MM-DD\" → seleção simples\n * - range + start/end → seleção por período\n * - min/max=\"YYYY | YYYY-MM | YYYY-MM-DD\" → limites por ano, mês ou dia\n * - locale (padrão pt-BR), disabled\n *\n * Navegação : clique no cabeçalho (mês) → grade de meses;\n * clique no ano → grade de anos; ‹ › navegam conforme a visualização.\n *\n * Evento: `change` (composed):\n * - simples: detail { value }\n * - range: detail { start, end }\n */\n\ntype View = 'days' | 'months' | 'years';\ninterface Bound {\n lo: number;\n hi: number;\n}\n\nconst key = (y: number, m1: number, d: number): number => y * 10000 + m1 * 100 + d;\n\n/** Aceita \"YYYY\", \"YYYY-MM\" ou \"YYYY-MM-DD\" e devolve [menorChave, maiorChave]. */\nfunction parseBound(raw: string): Bound | null {\n const m = /^(\\d{4})(?:-(\\d{2}))?(?:-(\\d{2}))?$/.exec(raw.trim());\n if (!m) return null;\n const y = +m[1];\n const m1 = m[2] ? +m[2] : 1;\n const d = m[3] ? +m[3] : null;\n if (d !== null) return { lo: key(y, m1, d), hi: key(y, m1, d) };\n if (m[2]) return { lo: key(y, m1, 1), hi: key(y, m1, 31) };\n return { lo: key(y, 1, 1), hi: key(y, 12, 31) };\n}\n\nexport class FxCalendar extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\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-sm);\n padding: var(--fx-space-sm);\n user-select: none;\n }\n :host([disabled]) { opacity: 0.55; pointer-events: none; }\n .head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--fx-space-xs);\n margin-bottom: var(--fx-space-xs);\n }\n .nav,\n .title {\n border: none;\n background: none;\n color: var(--fx-text-default);\n cursor: pointer;\n font: inherit;\n border-radius: var(--fx-radius-sm);\n padding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\n }\n .nav:hover, .title:hover { background: var(--fx-surface-surface-hover); }\n .title { font-weight: var(--fx-font-weight); text-transform: capitalize; flex: 1; }\n .grid {\n display: grid;\n grid-template-columns: repeat(7, 34px);\n gap: 2px;\n }\n .grid.months, .grid.years { grid-template-columns: repeat(4, minmax(52px, 1fr)); }\n .wd {\n text-align: center;\n color: var(--fx-text-muted);\n font-size: calc(var(--fx-font-size) - 2px);\n padding: var(--fx-space-3xs, 4px) 0;\n text-transform: capitalize;\n }\n .cell {\n position: relative;\n border: none;\n background: none;\n font: inherit;\n color: var(--fx-text-default);\n height: 32px;\n border-radius: var(--fx-radius-sm);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .cell:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, transparent); }\n .cell.muted { color: var(--fx-text-disabled); }\n .cell.today::after {\n content: '';\n position: absolute;\n bottom: 3px;\n width: 4px;\n height: 4px;\n border-radius: var(--fx-radius-full);\n background: var(--fx-color-primary);\n }\n .cell.sel {\n background: var(--fx-color-primary);\n color: #fff;\n font-weight: var(--fx-font-weight);\n }\n .cell.sel::after { background: #fff; }\n .cell.in-range {\n background: color-mix(in srgb, var(--fx-color-primary) 16%, transparent);\n border-radius: 0;\n }\n .grid.months .cell, .grid.years .cell { height: 40px; }\n .cell[disabled] { opacity: 0.35; cursor: not-allowed; pointer-events: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value', 'start', 'end', 'min', 'max', 'range', 'mode', 'values', 'locale', 'disabled'];\n }\n\n private view: View = 'days';\n private cursor = { y: new Date().getFullYear(), m: new Date().getMonth() };\n /** Período em construção (chaves numéricas). */\n private pickStart: number | null = null;\n private pickEnd: number | null = null;\n\n /** Modo de seleção: 'single' | 'range' | 'multiple'. */\n get mode(): 'single' | 'range' | 'multiple' {\n const m = this.getAttr('mode');\n if (m === 'range' || m === 'multiple') return m;\n return this.hasAttr('range') ? 'range' : 'single';\n }\n set mode(m: 'single' | 'range' | 'multiple') {\n this.setAttribute('mode', m);\n }\n\n get range(): boolean {\n return this.mode === 'range';\n }\n set range(value: boolean) {\n this.toggleAttr('range', Boolean(value));\n }\n\n /** Datas selecionadas no modo multiple (CSV no atributo). */\n get values(): string[] {\n const csv = this.getAttr('values');\n return csv ? csv.split(',').map((v) => v.trim()).filter(Boolean) : [];\n }\n set values(list: string[]) {\n this.setAttribute('values', list.join(','));\n }\n\n get value(): string {\n return this.getAttr('value');\n }\n set value(v: string) {\n this.setAttribute('value', v);\n }\n\n private bounds(): { min: Bound | null; max: Bound | null } {\n return {\n min: parseBound(this.getAttr('min', '')),\n max: parseBound(this.getAttr('max', '')),\n };\n }\n\n private locale(): string {\n return this.getAttr('locale', 'pt-BR');\n }\n\n private fmt(opts: Intl.DateTimeFormatOptions, d: Date): string {\n try {\n return new Intl.DateTimeFormat(this.locale(), opts).format(d);\n } catch {\n return new Intl.DateTimeFormat('pt-BR', opts).format(d);\n }\n }\n\n private dayDisabled(y: number, m: number, d: number): boolean {\n const { min, max } = this.bounds();\n const k = key(y, m + 1, d);\n return (min !== null && k < min.lo) || (max !== null && k > max.hi);\n }\n\n private monthDisabled(y: number, m1: number): boolean {\n const { min, max } = this.bounds();\n const lo = key(y, m1, 1);\n const hi = key(y, m1, 31);\n return (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n }\n\n private yearDisabled(y: number): boolean {\n const { min, max } = this.bounds();\n const lo = key(y, 1, 1);\n const hi = key(y, 12, 31);\n return (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n }\n\n private dayKeyOf(date: Date): number {\n return key(date.getFullYear(), date.getMonth() + 1, date.getDate());\n }\n\n private keyToDate(k: number): Date {\n return new Date(Math.floor(k / 10000), (Math.floor(k / 100) % 100) - 1, k % 100);\n }\n\n private iso(k: number): string {\n const d = this.keyToDate(k);\n const p = (n: number): string => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n }\n\n /** Seleção atual para pintura (chaves). */\n private selection(): {\n start: number | null;\n end: number | null;\n single: number | null;\n multi: Set<number>;\n } {\n const multi = new Set(this.values.map((iso) => parseBound(iso)?.lo ?? 0).filter(Boolean));\n if (this.mode === 'range') {\n let s = this.pickStart;\n let e = this.pickEnd;\n const attrS = parseBound(this.getAttr('start', ''));\n const attrE = parseBound(this.getAttr('end', ''));\n if (s === null && attrS) s = attrS.lo;\n if (e === null && attrE) e = attrE.lo;\n return { start: s, end: e, single: null, multi };\n }\n if (this.mode === 'multiple') {\n return { start: null, end: null, single: null, multi };\n }\n const v = parseBound(this.getAttr('value', ''));\n return { start: null, end: null, single: v ? v.lo : null, multi };\n }\n\n private emit(): void {\n if (this.mode === 'range') {\n const detail = {\n start: this.pickStart !== null ? this.iso(this.pickStart) : this.getAttr('start', ''),\n end: this.pickEnd !== null ? this.iso(this.pickEnd) : this.getAttr('end', ''),\n };\n this.setAttribute('start', detail.start);\n this.setAttribute('end', detail.end);\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail }));\n } else if (this.mode === 'multiple') {\n const values = this.values;\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { values } }));\n } else {\n const value = this.getAttr('value');\n this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: { value } }));\n }\n }\n\n private pickDay(k: number): void {\n if (this.mode === 'range') {\n if (this.pickStart === null || this.pickEnd !== null) {\n this.pickStart = k;\n this.pickEnd = null;\n this.setAttribute('start', this.iso(k));\n this.removeAttribute('end');\n this.render();\n return; // emite só ao completar o período\n }\n if (k < this.pickStart) [this.pickStart, this.pickEnd] = [k, this.pickStart];\n else this.pickEnd = k;\n this.emit();\n } else if (this.mode === 'multiple') {\n const set = new Set(this.values);\n const iso = this.iso(k);\n if (set.has(iso)) set.delete(iso);\n else set.add(iso);\n this.values = [...set].sort();\n this.emit();\n } else {\n this.value = this.iso(k);\n this.emit();\n }\n this.render();\n }\n\n private navigate(dir: -1 | 1): void {\n if (this.view === 'days') {\n const d = new Date(this.cursor.y, this.cursor.m + dir, 1);\n this.cursor = { y: d.getFullYear(), m: d.getMonth() };\n } else if (this.view === 'months') {\n this.cursor.y += dir;\n } else {\n this.cursor.y += dir * 12;\n }\n this.render();\n }\n\n protected override render(): void {\n const todayK = this.dayKeyOf(new Date());\n const sel = this.selection();\n const loc = this.locale();\n\n const titles: Record<View, string> = {\n days: this.fmt({ month: 'long', year: 'numeric' }, new Date(this.cursor.y, this.cursor.m, 1)),\n months: String(this.cursor.y),\n years: `${Math.floor(this.cursor.y / 12) * 12} – ${Math.floor(this.cursor.y / 12) * 12 + 11}`,\n };\n\n let cells = '';\n if (this.view === 'days') {\n const wds = [...Array(7)].map((_, i) =>\n this.fmt({ weekday: 'short' }, new Date(2024, 8, 1 + i)), // 01/09/2024 foi domingo\n );\n cells =\n wds.map((w) => `<span class=\"wd\">${w}</span>`).join('') +\n this.daysHtml(todayK, sel, loc);\n } else if (this.view === 'months') {\n cells = [...Array(12)]\n .map((_, i) => {\n const dis = this.monthDisabled(this.cursor.y, i + 1);\n return `<button type=\"button\" class=\"cell\" data-month=\"${i}\" ${dis ? 'disabled' : ''}>${this.fmt({ month: 'short' }, new Date(this.cursor.y, i, 1))}</button>`;\n })\n .join('');\n } else {\n const base = Math.floor(this.cursor.y / 12) * 12;\n cells = [...Array(12)]\n .map((_, i) => {\n const y = base + i;\n const dis = this.yearDisabled(y);\n return `<button type=\"button\" class=\"cell\" data-year=\"${y}\" ${dis ? 'disabled' : ''}>${y}</button>`;\n })\n .join('');\n }\n\n const titleAction =\n this.view === 'days'\n ? `data-goto=\"months\"`\n : this.view === 'months'\n ? `data-goto=\"years\"`\n : '';\n\n this.setTemplate(`\n <div class=\"head\">\n <button type=\"button\" class=\"nav\" data-nav=\"-1\" aria-label=\"Anterior\">‹</button>\n <button type=\"button\" class=\"title\" part=\"title\" ${titleAction}>${titles[this.view]}</button>\n <button type=\"button\" class=\"nav\" data-nav=\"1\" aria-label=\"Próximo\">›</button>\n </div>\n <div class=\"grid ${this.view}\">${cells}</div>\n `);\n\n this.root.querySelectorAll<HTMLButtonElement>('[data-nav]').forEach((b) =>\n b.addEventListener('click', () => this.navigate(Number(b.dataset.nav) as -1 | 1)),\n );\n const gotoBtn = this.root.querySelector<HTMLElement>('[data-goto]');\n gotoBtn?.addEventListener('click', () => {\n this.view = gotoBtn.dataset.goto as View;\n this.render();\n });\n\n this.root.querySelectorAll<HTMLButtonElement>('[data-day]').forEach((b) =>\n b.addEventListener('click', () => this.pickDay(Number(b.dataset.day!))),\n );\n this.root.querySelectorAll<HTMLButtonElement>('[data-month]').forEach((b) =>\n b.addEventListener('click', () => {\n this.cursor.m = Number(b.dataset.month!);\n this.view = 'days';\n this.render();\n }),\n );\n this.root.querySelectorAll<HTMLButtonElement>('[data-year]').forEach((b) =>\n b.addEventListener('click', () => {\n this.cursor.y = Number(b.dataset.year!);\n this.view = 'months';\n this.render();\n }),\n );\n }\n\n /** Grade de dias com preenchimento do mês anterior. */\n private daysHtml(todayK: number, sel: ReturnType<FxCalendar['selection']>, _loc: string): string {\n const { y, m } = this.cursor;\n const first = new Date(y, m, 1).getDay(); // 0=domingo\n const total = new Date(y, m + 1, 0).getDate();\n const prevTotal = new Date(y, m, 0).getDate();\n\n let html = '';\n for (let i = first - 1; i >= 0; i--) {\n html += `<span class=\"cell muted\">${prevTotal - i}</span>`;\n }\n for (let d = 1; d <= total; d++) {\n const k = key(y, m + 1, d);\n const isSel =\n sel.single === k || sel.start === k || sel.end === k || sel.multi.has(k);\n const inRange =\n sel.start !== null && sel.end !== null && k > sel.start && k < sel.end;\n const cls = ['cell', isSel ? 'sel' : '', inRange ? 'in-range' : '', k === todayK ? 'today' : '']\n .filter(Boolean)\n .join(' ');\n html += `<button type=\"button\" class=\"${cls}\" data-day=\"${k}\" ${this.dayDisabled(y, m, d) ? 'disabled' : ''}>${d}</button>`;\n }\n return html;\n }\n}\n\nexport function defineFxCalendar(): typeof FxCalendar {\n return defineElement('fx-calendar', FxCalendar);\n}\n\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"calendar.js","sources":["../../../src/components/calendar/calendar.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-calendar> — Calendário simples ou por período (range).\n *\n * Atributos:\n * - value=\"YYYY-MM-DD\" → seleção simples\n * - range + start/end → seleção por período\n * - min/max=\"YYYY | YYYY-MM | YYYY-MM-DD\" → limites por ano, mês ou dia\n * - locale (padrão pt-BR), disabled\n *\n * Navegação : clique no cabeçalho (mês) → grade de meses;\n * clique no ano → grade de anos; ‹ › navegam conforme a visualização.\n *\n * Evento: `change` (composed):\n * - simples: detail { value }\n * - range: detail { start, end }\n */\n\ntype View = 'days' | 'months' | 'years';\ninterface Bound {\n lo: number;\n hi: number;\n}\n\nconst key = (y: number, m1: number, d: number): number => y * 10000 + m1 * 100 + d;\n\n/** Aceita \"YYYY\", \"YYYY-MM\" ou \"YYYY-MM-DD\" e devolve [menorChave, maiorChave]. */\nfunction parseBound(raw: string): Bound | null {\n const m = /^(\\d{4})(?:-(\\d{2}))?(?:-(\\d{2}))?$/.exec(raw.trim());\n if (!m) return null;\n const y = +m[1];\n const m1 = m[2] ? +m[2] : 1;\n const d = m[3] ? +m[3] : null;\n if (d !== null) return { lo: key(y, m1, d), hi: key(y, m1, d) };\n if (m[2]) return { lo: key(y, m1, 1), hi: key(y, m1, 31) };\n return { lo: key(y, 1, 1), hi: key(y, 12, 31) };\n}\n\nexport class FxCalendar extends FxElement {\n\tstatic override styles = css`\n\t\t:host {\n\t\t\tdisplay: inline-block;\n\t\t\tfont-family: var(--fx-font-family);\n\t\t\tfont-size: var(--fx-font-size);\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tbackground: var(--fx-surface-background);\n\t\t\tborder: 1px solid var(--fx-border-default);\n\t\t\tborder-radius: var(--fx-radius-md);\n\t\t\tbox-shadow: var(--fx-shadow-sm);\n\t\t\tpadding: var(--fx-space-sm);\n\t\t\tuser-select: none;\n\t\t}\n\t\t:host([disabled]) {\n\t\t\topacity: 0.55;\n\t\t\tpointer-events: none;\n\t\t}\n\t\t.head {\n\t\t\tdisplay: flex;\n\t\t\theight: 48px;\n\t\t\talign-items: center;\n\t\t\tjustify-content: space-between;\n\t\t\tgap: var(--fx-space-xs);\n\t\t\tmargin-bottom: var(--fx-space-xs);\n\t\t\tborder-bottom: 1px solid var(--fx-border-default);\n\t\t}\n\n\t\t.title {\n\t\t\tmin-width: 24px;\n\t\t\tborder: none;\n\t\t\tbackground: none;\n\t\t\tcolor: var(--fx-text-default);\n\t\t\tcursor: pointer;\n\t\t\tfont: inherit;\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t}\n .nav {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n border: none;\n\t\t\tbackground: none;\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tcursor: pointer;\n\t\t\tborder-radius: var(--fx-radius-sm);\n }\n\t\t.nav:hover,\n\t\t.title:hover {\n\t\t\tbackground: var(--fx-surface-surface-hover);\n\t\t}\n\t\t.title {\n \tpadding: var(--fx-space-3xs, 4px) var(--fx-space-xs);\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t\ttext-transform: capitalize;\n\t\t\tflex: 1;\n\t\t}\n\t\t.grid {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: repeat(7, 34px);\n\t\t\tgap: 2px;\n\t\t}\n\t\t.grid.months,\n\t\t.grid.years {\n\t\t\tgrid-template-columns: repeat(4, minmax(52px, 1fr));\n\t\t}\n\t\t.wd {\n\t\t\ttext-align: center;\n\t\t\tcolor: var(--fx-text-muted);\n\t\t\tfont-size: calc(var(--fx-font-size) - 2px);\n\t\t\tpadding: var(--fx-space-3xs, 4px) 0;\n\t\t\ttext-transform: capitalize;\n\t\t}\n\t\t.cell {\n\t\t\tposition: relative;\n\t\t\tborder: none;\n\t\t\tbackground: none;\n\t\t\tfont: inherit;\n\t\t\tcolor: var(--fx-text-default);\n\t\t\theight: 32px;\n\t\t\tborder-radius: var(--fx-radius-sm);\n\t\t\tcursor: pointer;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t}\n\t\t.cell:hover {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 12%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t}\n\t\t.cell.muted {\n\t\t\tcolor: var(--fx-text-disabled);\n\t\t}\n\t\t.cell.today::after {\n\t\t\tcontent: \"\";\n\t\t\tposition: absolute;\n\t\t\tbottom: 3px;\n\t\t\twidth: 4px;\n\t\t\theight: 4px;\n\t\t\tborder-radius: var(--fx-radius-full);\n\t\t\tbackground: var(--fx-color-primary);\n\t\t}\n\t\t.cell.sel {\n\t\t\tbackground: var(--fx-color-primary);\n\t\t\tcolor: #fff;\n\t\t\tfont-weight: var(--fx-font-weight);\n\t\t}\n\t\t.cell.sel::after {\n\t\t\tbackground: #fff;\n\t\t}\n\t\t.cell.in-range {\n\t\t\tbackground: color-mix(\n\t\t\t\tin srgb,\n\t\t\t\tvar(--fx-color-primary) 16%,\n\t\t\t\ttransparent\n\t\t\t);\n\t\t\tborder-radius: 0;\n\t\t}\n\t\t.grid.months .cell,\n\t\t.grid.years .cell {\n\t\t\theight: 40px;\n\t\t}\n\t\t.cell[disabled] {\n\t\t\topacity: 0.35;\n\t\t\tcursor: not-allowed;\n\t\t\tpointer-events: none;\n\t\t}\n\t`;\n\n\tstatic override get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t\"value\",\n\t\t\t\"start\",\n\t\t\t\"end\",\n\t\t\t\"min\",\n\t\t\t\"max\",\n\t\t\t\"range\",\n\t\t\t\"mode\",\n\t\t\t\"values\",\n\t\t\t\"locale\",\n\t\t\t\"disabled\",\n\t\t];\n\t}\n\n\tprivate view: View = \"days\";\n\tprivate cursor = { y: new Date().getFullYear(), m: new Date().getMonth() };\n\t/** Período em construção (chaves numéricas). */\n\tprivate pickStart: number | null = null;\n\tprivate pickEnd: number | null = null;\n\n\t/** Modo de seleção: 'single' | 'range' | 'multiple'. */\n\tget mode(): \"single\" | \"range\" | \"multiple\" {\n\t\tconst m = this.getAttr(\"mode\");\n\t\tif (m === \"range\" || m === \"multiple\") return m;\n\t\treturn this.hasAttr(\"range\") ? \"range\" : \"single\";\n\t}\n\tset mode(m: \"single\" | \"range\" | \"multiple\") {\n\t\tthis.setAttribute(\"mode\", m);\n\t}\n\n\tget range(): boolean {\n\t\treturn this.mode === \"range\";\n\t}\n\tset range(value: boolean) {\n\t\tthis.toggleAttr(\"range\", Boolean(value));\n\t}\n\n\t/** Datas selecionadas no modo multiple (CSV no atributo). */\n\tget values(): string[] {\n\t\tconst csv = this.getAttr(\"values\");\n\t\treturn csv\n\t\t\t? csv\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((v) => v.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t: [];\n\t}\n\tset values(list: string[]) {\n\t\tthis.setAttribute(\"values\", list.join(\",\"));\n\t}\n\n\tget value(): string {\n\t\treturn this.getAttr(\"value\");\n\t}\n\tset value(v: string) {\n\t\tthis.setAttribute(\"value\", v);\n\t}\n\n\tprivate bounds(): { min: Bound | null; max: Bound | null } {\n\t\treturn {\n\t\t\tmin: parseBound(this.getAttr(\"min\", \"\")),\n\t\t\tmax: parseBound(this.getAttr(\"max\", \"\")),\n\t\t};\n\t}\n\n\tprivate locale(): string {\n\t\treturn this.getAttr(\"locale\", \"pt-BR\");\n\t}\n\n\tprivate fmt(opts: Intl.DateTimeFormatOptions, d: Date): string {\n\t\ttry {\n\t\t\treturn new Intl.DateTimeFormat(this.locale(), opts).format(d);\n\t\t} catch {\n\t\t\treturn new Intl.DateTimeFormat(\"pt-BR\", opts).format(d);\n\t\t}\n\t}\n\n\tprivate dayDisabled(y: number, m: number, d: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst k = key(y, m + 1, d);\n\t\treturn (min !== null && k < min.lo) || (max !== null && k > max.hi);\n\t}\n\n\tprivate monthDisabled(y: number, m1: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst lo = key(y, m1, 1);\n\t\tconst hi = key(y, m1, 31);\n\t\treturn (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n\t}\n\n\tprivate yearDisabled(y: number): boolean {\n\t\tconst { min, max } = this.bounds();\n\t\tconst lo = key(y, 1, 1);\n\t\tconst hi = key(y, 12, 31);\n\t\treturn (min !== null && hi < min.lo) || (max !== null && lo > max.hi);\n\t}\n\n\tprivate dayKeyOf(date: Date): number {\n\t\treturn key(date.getFullYear(), date.getMonth() + 1, date.getDate());\n\t}\n\n\tprivate keyToDate(k: number): Date {\n\t\treturn new Date(\n\t\t\tMath.floor(k / 10000),\n\t\t\t(Math.floor(k / 100) % 100) - 1,\n\t\t\tk % 100,\n\t\t);\n\t}\n\n\tprivate iso(k: number): string {\n\t\tconst d = this.keyToDate(k);\n\t\tconst p = (n: number): string => String(n).padStart(2, \"0\");\n\t\treturn `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n\t}\n\n\t/** Seleção atual para pintura (chaves). */\n\tprivate selection(): {\n\t\tstart: number | null;\n\t\tend: number | null;\n\t\tsingle: number | null;\n\t\tmulti: Set<number>;\n\t} {\n\t\tconst multi = new Set(\n\t\t\tthis.values.map((iso) => parseBound(iso)?.lo ?? 0).filter(Boolean),\n\t\t);\n\t\tif (this.mode === \"range\") {\n\t\t\tlet s = this.pickStart;\n\t\t\tlet e = this.pickEnd;\n\t\t\tconst attrS = parseBound(this.getAttr(\"start\", \"\"));\n\t\t\tconst attrE = parseBound(this.getAttr(\"end\", \"\"));\n\t\t\tif (s === null && attrS) s = attrS.lo;\n\t\t\tif (e === null && attrE) e = attrE.lo;\n\t\t\treturn { start: s, end: e, single: null, multi };\n\t\t}\n\t\tif (this.mode === \"multiple\") {\n\t\t\treturn { start: null, end: null, single: null, multi };\n\t\t}\n\t\tconst v = parseBound(this.getAttr(\"value\", \"\"));\n\t\treturn { start: null, end: null, single: v ? v.lo : null, multi };\n\t}\n\n\tprivate emit(): void {\n\t\tif (this.mode === \"range\") {\n\t\t\tconst detail = {\n\t\t\t\tstart:\n\t\t\t\t\tthis.pickStart !== null\n\t\t\t\t\t\t? this.iso(this.pickStart)\n\t\t\t\t\t\t: this.getAttr(\"start\", \"\"),\n\t\t\t\tend:\n\t\t\t\t\tthis.pickEnd !== null\n\t\t\t\t\t\t? this.iso(this.pickEnd)\n\t\t\t\t\t\t: this.getAttr(\"end\", \"\"),\n\t\t\t};\n\t\t\tthis.setAttribute(\"start\", detail.start);\n\t\t\tthis.setAttribute(\"end\", detail.end);\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (this.mode === \"multiple\") {\n\t\t\tconst values = this.values;\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { values },\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tconst value = this.getAttr(\"value\");\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"change\", {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { value },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate pickDay(k: number): void {\n\t\tif (this.mode === \"range\") {\n\t\t\tif (this.pickStart === null || this.pickEnd !== null) {\n\t\t\t\tthis.pickStart = k;\n\t\t\t\tthis.pickEnd = null;\n\t\t\t\tthis.setAttribute(\"start\", this.iso(k));\n\t\t\t\tthis.removeAttribute(\"end\");\n\t\t\t\tthis.render();\n\t\t\t\treturn; // emite só ao completar o período\n\t\t\t}\n\t\t\tif (k < this.pickStart)\n\t\t\t\t[this.pickStart, this.pickEnd] = [k, this.pickStart];\n\t\t\telse this.pickEnd = k;\n\t\t\tthis.emit();\n\t\t} else if (this.mode === \"multiple\") {\n\t\t\tconst set = new Set(this.values);\n\t\t\tconst iso = this.iso(k);\n\t\t\tif (set.has(iso)) set.delete(iso);\n\t\t\telse set.add(iso);\n\t\t\tthis.values = [...set].sort();\n\t\t\tthis.emit();\n\t\t} else {\n\t\t\tthis.value = this.iso(k);\n\t\t\tthis.emit();\n\t\t}\n\t\tthis.render();\n\t}\n\n\tprivate navigate(dir: -1 | 1): void {\n\t\tif (this.view === \"days\") {\n\t\t\tconst d = new Date(this.cursor.y, this.cursor.m + dir, 1);\n\t\t\tthis.cursor = { y: d.getFullYear(), m: d.getMonth() };\n\t\t} else if (this.view === \"months\") {\n\t\t\tthis.cursor.y += dir;\n\t\t} else {\n\t\t\tthis.cursor.y += dir * 12;\n\t\t}\n\t\tthis.render();\n\t}\n\n\tprotected override render(): void {\n\t\tconst todayK = this.dayKeyOf(new Date());\n\t\tconst sel = this.selection();\n\t\tconst loc = this.locale();\n\n\t\tconst titles: Record<View, string> = {\n\t\t\tdays: this.fmt(\n\t\t\t\t{ month: \"long\", year: \"numeric\" },\n\t\t\t\tnew Date(this.cursor.y, this.cursor.m, 1),\n\t\t\t),\n\t\t\tmonths: String(this.cursor.y),\n\t\t\tyears: `${Math.floor(this.cursor.y / 12) * 12} – ${Math.floor(this.cursor.y / 12) * 12 + 11}`,\n\t\t};\n\n\t\tlet cells = \"\";\n\t\tif (this.view === \"days\") {\n\t\t\tconst wds = [...Array(7)].map(\n\t\t\t\t(_, i) => this.fmt({ weekday: \"short\" }, new Date(2024, 8, 1 + i)), // 01/09/2024 foi domingo\n\t\t\t);\n\t\t\tcells =\n\t\t\t\twds.map((w) => `<span class=\"wd\">${w}</span>`).join(\"\") +\n\t\t\t\tthis.daysHtml(todayK, sel, loc);\n\t\t} else if (this.view === \"months\") {\n\t\t\tcells = [...Array(12)]\n\t\t\t\t.map((_, i) => {\n\t\t\t\t\tconst dis = this.monthDisabled(this.cursor.y, i + 1);\n\t\t\t\t\treturn `<button type=\"button\" class=\"cell\" data-month=\"${i}\" ${dis ? \"disabled\" : \"\"}>${this.fmt({ month: \"short\" }, new Date(this.cursor.y, i, 1))}</button>`;\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\tconst base = Math.floor(this.cursor.y / 12) * 12;\n\t\t\tcells = [...Array(12)]\n\t\t\t\t.map((_, i) => {\n\t\t\t\t\tconst y = base + i;\n\t\t\t\t\tconst dis = this.yearDisabled(y);\n\t\t\t\t\treturn `<button type=\"button\" class=\"cell\" data-year=\"${y}\" ${dis ? \"disabled\" : \"\"}>${y}</button>`;\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t}\n\n\t\tconst titleAction =\n\t\t\tthis.view === \"days\"\n\t\t\t\t? `data-goto=\"months\"`\n\t\t\t\t: this.view === \"months\"\n\t\t\t\t\t? `data-goto=\"years\"`\n\t\t\t\t\t: \"\";\n\n\t\tthis.setTemplate(`\n <div class=\"head\">\n <button type=\"button\" class=\"nav\" data-nav=\"-1\" aria-label=\"Anterior\">‹</button>\n <button type=\"button\" class=\"title\" part=\"title\" ${titleAction}>${titles[this.view]}</button>\n <button type=\"button\" class=\"nav\" data-nav=\"1\" aria-label=\"Próximo\">›</button>\n </div>\n <div class=\"grid ${this.view}\">${cells}</div>\n `);\n\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-nav]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () =>\n\t\t\t\t\tthis.navigate(Number(b.dataset.nav) as -1 | 1),\n\t\t\t\t),\n\t\t\t);\n\t\tconst gotoBtn = this.root.querySelector<HTMLElement>(\"[data-goto]\");\n\t\tgotoBtn?.addEventListener(\"click\", () => {\n\t\t\tthis.view = gotoBtn.dataset.goto as View;\n\t\t\tthis.render();\n\t\t});\n\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-day]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () =>\n\t\t\t\t\tthis.pickDay(Number(b.dataset.day!)),\n\t\t\t\t),\n\t\t\t);\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-month]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.cursor.m = Number(b.dataset.month!);\n\t\t\t\t\tthis.view = \"days\";\n\t\t\t\t\tthis.render();\n\t\t\t\t}),\n\t\t\t);\n\t\tthis.root\n\t\t\t.querySelectorAll<HTMLButtonElement>(\"[data-year]\")\n\t\t\t.forEach((b) =>\n\t\t\t\tb.addEventListener(\"click\", () => {\n\t\t\t\t\tthis.cursor.y = Number(b.dataset.year!);\n\t\t\t\t\tthis.view = \"months\";\n\t\t\t\t\tthis.render();\n\t\t\t\t}),\n\t\t\t);\n\t}\n\n\t/** Grade de dias com preenchimento do mês anterior. */\n\tprivate daysHtml(\n\t\ttodayK: number,\n\t\tsel: ReturnType<FxCalendar[\"selection\"]>,\n\t\t_loc: string,\n\t): string {\n\t\tconst { y, m } = this.cursor;\n\t\tconst first = new Date(y, m, 1).getDay(); // 0=domingo\n\t\tconst total = new Date(y, m + 1, 0).getDate();\n\t\tconst prevTotal = new Date(y, m, 0).getDate();\n\n\t\tlet html = \"\";\n\t\tfor (let i = first - 1; i >= 0; i--) {\n\t\t\thtml += `<span class=\"cell muted\">${prevTotal - i}</span>`;\n\t\t}\n\t\tfor (let d = 1; d <= total; d++) {\n\t\t\tconst k = key(y, m + 1, d);\n\t\t\tconst isSel =\n\t\t\t\tsel.single === k ||\n\t\t\t\tsel.start === k ||\n\t\t\t\tsel.end === k ||\n\t\t\t\tsel.multi.has(k);\n\t\t\tconst inRange =\n\t\t\t\tsel.start !== null &&\n\t\t\t\tsel.end !== null &&\n\t\t\t\tk > sel.start &&\n\t\t\t\tk < sel.end;\n\t\t\tconst cls = [\n\t\t\t\t\"cell\",\n\t\t\t\tisSel ? \"sel\" : \"\",\n\t\t\t\tinRange ? \"in-range\" : \"\",\n\t\t\t\tk === todayK ? \"today\" : \"\",\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" \");\n\t\t\thtml += `<button type=\"button\" class=\"${cls}\" data-day=\"${k}\" ${this.dayDisabled(y, m, d) ? \"disabled\" : \"\"}>${d}</button>`;\n\t\t}\n\t\treturn html;\n\t}\n}\n\nexport function defineFxCalendar(): typeof FxCalendar {\n return defineElement('fx-calendar', FxCalendar);\n}\n\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown/dropdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,SAiCpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,IAAI,IAAI,OAAO,CAAiC;IACpD,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAqC;cAEzC,MAAM,IAAI,IAAI;CAwClC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAgB,MAAM,SAqBpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAAsB;IAExE,IAAI,KAAK,IAAI,MAAM,CAAkC;IACrD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAAoC;cAEpC,MAAM,IAAI,IAAI;CAGlC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,UAAU,CAEpD;AACD,wBAAgB,oBAAoB,IAAI,OAAO,cAAc,CAE5D"}
1
+ {"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown/dropdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,SAiCpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,IAAI,IAAI,OAAO,CAAiC;IACpD,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAqC;cAEzC,MAAM,IAAI,IAAI;CAsClC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAgB,MAAM,SAqBpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAAsB;IAExE,IAAI,KAAK,IAAI,MAAM,CAAkC;IACrD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAAoC;cAEpC,MAAM,IAAI,IAAI;CAGlC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,UAAU,CAEpD;AACD,wBAAgB,oBAAoB,IAAI,OAAO,cAAc,CAE5D"}
@@ -20,7 +20,7 @@ const _FxDropdown = class _FxDropdown extends FxElement {
20
20
  ${label} ▾
21
21
  </span>
22
22
  <div class="panel" role="menu" part="panel">
23
- ${items.length ? items.map((i) => `<div class="item-slot"><slot name="_${i.getAttribute("value") ?? ""}"></slot></div>`) : '<div class="empty">Nenhuma ação</div>'}
23
+ ${items.length ? "" : '<div class="empty">Nenhuma ação</div>'}
24
24
  <slot></slot>
25
25
  </div>
26
26
  `);
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.js","sources":["../../../src/components/dropdown/dropdown.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-dropdown> — Menu de ações em popover.\n *\n * Atributos: label (texto do trigger), position (bottom-left padrão | bottom-right).\n * Itens: <fx-dropdown-item value=\"x\">Texto</fx-dropdown-item>\n * Evento: `select` (composed, detail: { value }).\n */\nexport class FxDropdown extends FxElement {\n static override styles = css`\n :host {\n position: relative;\n display: inline-block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .trigger { min-height: var(--fx-size-md); }\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n min-width: 180px;\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-xs);\n z-index: var(--fx-z-dropdown, 1000);\n display: none;\n }\n :host([open]) .panel { display: block; }\n /* left = alinhado à esquerda do trigger; right = à direita; center = centrado */\n :host([position='left']) .panel,\n :host([position='bottom-left']) .panel { left: 0; right: auto; }\n :host([position='center']) .panel {\n left: 50%;\n transform: translateX(-50%);\n }\n :host([position='right']) .panel,\n :host([position='bottom-right']) .panel { right: 0; left: auto; }\n :host(:not([position])) .panel { left: 0; right: auto; }\n ::slotted(fx-dropdown-item) { display: block; }\n .empty { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); padding: var(--fx-space-sm); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['label', 'position', 'open'];\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 label = this.getAttr('label', 'Ações');\n const items = Array.from(this.querySelectorAll<HTMLElement>('fx-dropdown-item'));\n\n this.setTemplate(`\n <span class=\"trigger\" role=\"button\" tabindex=\"0\" part=\"trigger\"\n aria-haspopup=\"menu\" aria-expanded=\"${this.open}\">\n ${label} ▾\n </span>\n <div class=\"panel\" role=\"menu\" part=\"panel\">\n ${items.length\n ? items.map((i) => `<div class=\"item-slot\"><slot name=\"_${i.getAttribute('value') ?? ''}\"></slot></div>`)\n : '<div class=\"empty\">Nenhuma ação</div>'}\n <slot></slot>\n </div>\n `);\n\n const trigger = this.root.querySelector<HTMLElement>('.trigger');\n trigger?.addEventListener('click', (e) => {\n e.stopPropagation();\n // Fecha outros dropdowns abertos\n document.querySelectorAll('fx-dropdown[open]').forEach((d) => {\n if (d !== this) (d as FxDropdown).open = false;\n });\n this.open = !this.open;\n });\n trigger?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.open = !this.open; }\n });\n\n items.forEach((item) => {\n item.addEventListener('click', () => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true,\n detail: { value: item.getAttribute('value') ?? '' },\n }));\n });\n });\n }\n}\n\n/**\n * <fx-dropdown-item> — Item de menu.\n */\nexport class FxDropdownItem 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 }\n .item {\n display: block;\n width: 100%;\n text-align: left;\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n color: var(--fx-text-default);\n padding: var(--fx-space-sm) var(--fx-space-md);\n cursor: pointer;\n border-radius: var(--fx-radius-sm);\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .item:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, var(--fx-surface-background)); color: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] { return ['value']; }\n\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n protected override render(): void {\n this.setTemplate('<button type=\"button\" class=\"item\" part=\"item\" role=\"menuitem\"><slot></slot></button>');\n }\n}\n\nexport function defineFxDropdown(): typeof FxDropdown {\n return defineElement('fx-dropdown', FxDropdown);\n}\nexport function defineFxDropdownItem(): typeof FxDropdownItem {\n return defineElement('fx-dropdown-item', FxDropdownItem);\n}\n"],"names":[],"mappings":";;;AAWO,MAAM,cAAN,MAAM,oBAAmB,UAAU;AAAA,EAoCxC,WAAoB,qBAA+B;AACjD,WAAO,CAAC,SAAS,YAAY,MAAM;AAAA,EACrC;AAAA,EAEA,IAAI,OAAgB;AAAE,WAAO,KAAK,QAAQ,MAAM;AAAA,EAAG;AAAA,EACnD,IAAI,KAAK,OAAgB;AAAE,SAAK,WAAW,QAAQ,KAAK;AAAA,EAAG;AAAA,EAExC,SAAe;AAChC,UAAM,QAAQ,KAAK,QAAQ,SAAS,OAAO;AAC3C,UAAM,QAAQ,MAAM,KAAK,KAAK,iBAA8B,kBAAkB,CAAC;AAE/E,SAAK,YAAY;AAAA;AAAA,8CAEyB,KAAK,IAAI;AAAA,UAC7C,KAAK;AAAA;AAAA;AAAA,UAGL,MAAM,SACJ,MAAM,IAAI,CAAC,MAAM,uCAAuC,EAAE,aAAa,OAAO,KAAK,EAAE,iBAAiB,IACtG,uCAAuC;AAAA;AAAA;AAAA,KAG9C;AAED,UAAM,UAAU,KAAK,KAAK,cAA2B,UAAU;AAC/D,aAAS,iBAAiB,SAAS,CAAC,MAAM;AACxC,QAAE,gBAAA;AAEF,eAAS,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,MAAM;AAC5D,YAAI,MAAM,KAAO,GAAiB,OAAO;AAAA,MAC3C,CAAC;AACD,WAAK,OAAO,CAAC,KAAK;AAAA,IACpB,CAAC;AACD,aAAS,iBAAiB,WAAW,CAAC,MAAM;AAC1C,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AAAE,UAAE,eAAA;AAAkB,aAAK,OAAO,CAAC,KAAK;AAAA,MAAM;AAAA,IACxF,CAAC;AAED,UAAM,QAAQ,CAAC,SAAS;AACtB,WAAK,iBAAiB,SAAS,MAAM;AACnC,aAAK,OAAO;AACZ,aAAK,cAAc,IAAI,YAAY,UAAU;AAAA,UAC3C,SAAS;AAAA,UAAM,UAAU;AAAA,UACzB,QAAQ,EAAE,OAAO,KAAK,aAAa,OAAO,KAAK,GAAA;AAAA,QAAG,CACnD,CAAC;AAAA,MACJ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAlFE,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;AADpB,IAAM,aAAN;AAwFA,MAAM,kBAAN,MAAM,wBAAuB,UAAU;AAAA,EAwB5C,WAAoB,qBAA+B;AAAE,WAAO,CAAC,OAAO;AAAA,EAAG;AAAA,EAEvE,IAAI,QAAgB;AAAE,WAAO,KAAK,QAAQ,OAAO;AAAA,EAAG;AAAA,EACpD,IAAI,MAAM,GAAW;AAAE,SAAK,aAAa,SAAS,CAAC;AAAA,EAAG;AAAA,EAEnC,SAAe;AAChC,SAAK,YAAY,uFAAuF;AAAA,EAC1G;AACF;AA/BE,gBAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADpB,IAAM,iBAAN;AAkCA,SAAS,mBAAsC;AACpD,SAAO,cAAc,eAAe,UAAU;AAChD;AACO,SAAS,uBAA8C;AAC5D,SAAO,cAAc,oBAAoB,cAAc;AACzD;"}
1
+ {"version":3,"file":"dropdown.js","sources":["../../../src/components/dropdown/dropdown.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-dropdown> — Menu de ações em popover.\n *\n * Atributos: label (texto do trigger), position (bottom-left padrão | bottom-right).\n * Itens: <fx-dropdown-item value=\"x\">Texto</fx-dropdown-item>\n * Evento: `select` (composed, detail: { value }).\n */\nexport class FxDropdown extends FxElement {\n static override styles = css`\n :host {\n position: relative;\n display: inline-block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n .trigger { min-height: var(--fx-size-md); }\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n min-width: 180px;\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-xs);\n z-index: var(--fx-z-dropdown, 1000);\n display: none;\n }\n :host([open]) .panel { display: block; }\n /* left = alinhado à esquerda do trigger; right = à direita; center = centrado */\n :host([position='left']) .panel,\n :host([position='bottom-left']) .panel { left: 0; right: auto; }\n :host([position='center']) .panel {\n left: 50%;\n transform: translateX(-50%);\n }\n :host([position='right']) .panel,\n :host([position='bottom-right']) .panel { right: 0; left: auto; }\n :host(:not([position])) .panel { left: 0; right: auto; }\n ::slotted(fx-dropdown-item) { display: block; }\n .empty { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); padding: var(--fx-space-sm); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['label', 'position', 'open'];\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 label = this.getAttr('label', 'Ações');\n const items = Array.from(this.querySelectorAll<HTMLElement>('fx-dropdown-item'));\n\n this.setTemplate(`\n <span class=\"trigger\" role=\"button\" tabindex=\"0\" part=\"trigger\"\n aria-haspopup=\"menu\" aria-expanded=\"${this.open}\">\n ${label} ▾\n </span>\n <div class=\"panel\" role=\"menu\" part=\"panel\">\n ${items.length ? '' : '<div class=\"empty\">Nenhuma ação</div>'}\n <slot></slot>\n </div>\n `);\n\n const trigger = this.root.querySelector<HTMLElement>('.trigger');\n trigger?.addEventListener('click', (e) => {\n e.stopPropagation();\n // Fecha outros dropdowns abertos\n document.querySelectorAll('fx-dropdown[open]').forEach((d) => {\n if (d !== this) (d as FxDropdown).open = false;\n });\n this.open = !this.open;\n });\n trigger?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.open = !this.open; }\n });\n\n items.forEach((item) => {\n item.addEventListener('click', () => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true,\n detail: { value: item.getAttribute('value') ?? '' },\n }));\n });\n });\n }\n}\n\n/**\n * <fx-dropdown-item> — Item de menu.\n */\nexport class FxDropdownItem 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 }\n .item {\n display: block;\n width: 100%;\n text-align: left;\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n color: var(--fx-text-default);\n padding: var(--fx-space-sm) var(--fx-space-md);\n cursor: pointer;\n border-radius: var(--fx-radius-sm);\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .item:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, var(--fx-surface-background)); color: var(--fx-color-primary); }\n `;\n\n static override get observedAttributes(): string[] { return ['value']; }\n\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n protected override render(): void {\n this.setTemplate('<button type=\"button\" class=\"item\" part=\"item\" role=\"menuitem\"><slot></slot></button>');\n }\n}\n\nexport function defineFxDropdown(): typeof FxDropdown {\n return defineElement('fx-dropdown', FxDropdown);\n}\nexport function defineFxDropdownItem(): typeof FxDropdownItem {\n return defineElement('fx-dropdown-item', FxDropdownItem);\n}\n"],"names":[],"mappings":";;;AAWO,MAAM,cAAN,MAAM,oBAAmB,UAAU;AAAA,EAoCxC,WAAoB,qBAA+B;AACjD,WAAO,CAAC,SAAS,YAAY,MAAM;AAAA,EACrC;AAAA,EAEA,IAAI,OAAgB;AAAE,WAAO,KAAK,QAAQ,MAAM;AAAA,EAAG;AAAA,EACnD,IAAI,KAAK,OAAgB;AAAE,SAAK,WAAW,QAAQ,KAAK;AAAA,EAAG;AAAA,EAExC,SAAe;AAChC,UAAM,QAAQ,KAAK,QAAQ,SAAS,OAAO;AAC3C,UAAM,QAAQ,MAAM,KAAK,KAAK,iBAA8B,kBAAkB,CAAC;AAE/E,SAAK,YAAY;AAAA;AAAA,8CAEyB,KAAK,IAAI;AAAA,UAC7C,KAAK;AAAA;AAAA;AAAA,UAGL,MAAM,SAAS,KAAK,uCAAuC;AAAA;AAAA;AAAA,KAGhE;AAED,UAAM,UAAU,KAAK,KAAK,cAA2B,UAAU;AAC/D,aAAS,iBAAiB,SAAS,CAAC,MAAM;AACxC,QAAE,gBAAA;AAEF,eAAS,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,MAAM;AAC5D,YAAI,MAAM,KAAO,GAAiB,OAAO;AAAA,MAC3C,CAAC;AACD,WAAK,OAAO,CAAC,KAAK;AAAA,IACpB,CAAC;AACD,aAAS,iBAAiB,WAAW,CAAC,MAAM;AAC1C,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AAAE,UAAE,eAAA;AAAkB,aAAK,OAAO,CAAC,KAAK;AAAA,MAAM;AAAA,IACxF,CAAC;AAED,UAAM,QAAQ,CAAC,SAAS;AACtB,WAAK,iBAAiB,SAAS,MAAM;AACnC,aAAK,OAAO;AACZ,aAAK,cAAc,IAAI,YAAY,UAAU;AAAA,UAC3C,SAAS;AAAA,UAAM,UAAU;AAAA,UACzB,QAAQ,EAAE,OAAO,KAAK,aAAa,OAAO,KAAK,GAAA;AAAA,QAAG,CACnD,CAAC;AAAA,MACJ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAhFE,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;AADpB,IAAM,aAAN;AAsFA,MAAM,kBAAN,MAAM,wBAAuB,UAAU;AAAA,EAwB5C,WAAoB,qBAA+B;AAAE,WAAO,CAAC,OAAO;AAAA,EAAG;AAAA,EAEvE,IAAI,QAAgB;AAAE,WAAO,KAAK,QAAQ,OAAO;AAAA,EAAG;AAAA,EACpD,IAAI,MAAM,GAAW;AAAE,SAAK,aAAa,SAAS,CAAC;AAAA,EAAG;AAAA,EAEnC,SAAe;AAChC,SAAK,YAAY,uFAAuF;AAAA,EAC1G;AACF;AA/BE,gBAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADpB,IAAM,iBAAN;AAkCA,SAAS,mBAAsC;AACpD,SAAO,cAAc,eAAe,UAAU;AAChD;AACO,SAAS,uBAA8C;AAC5D,SAAO,cAAc,oBAAoB,cAAc;AACzD;"}
@@ -0,0 +1,8 @@
1
+ import { FxKnob } from './knob';
2
+ export { FxKnob };
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'fx-knob': FxKnob;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/knob/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,CAAC;AAIlB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,MAAM,CAAC;KACnB;CACF"}
@@ -0,0 +1,7 @@
1
+ import { defineFxKnob } from "./knob.js";
2
+ import { FxKnob } from "./knob.js";
3
+ defineFxKnob();
4
+ export {
5
+ FxKnob
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/knob/index.ts"],"sourcesContent":["import { FxKnob, defineFxKnob } from './knob';\r\n\r\nexport { FxKnob };\r\n\r\ndefineFxKnob();\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'fx-knob': FxKnob;\r\n }\r\n}"],"names":[],"mappings":";;AAIA,aAAA;"}
@@ -0,0 +1,51 @@
1
+ import { FxElement } from '../../core/base';
2
+ /**
3
+ * <fx-knob> - Controle giratorio circular para ajuste de valor.
4
+ *
5
+ * Similar ao Knob do PrimeVue, permite ajustar um valor arrastando o mouse
6
+ * ou usando as setas do teclado. Exibe um arco de progresso circular com
7
+ * o valor central configuravel via valueTemplate.
8
+ *
9
+ * Atributos: value, min, max, step, size, strokeWidth, valueColor, rangeColor,
10
+ * readonly, disabled, valueTemplate.
11
+ * Evento: `change` (composed, detail: { value }).
12
+ */
13
+ export declare class FxKnob extends FxElement {
14
+ static styles: string;
15
+ static get observedAttributes(): string[];
16
+ get value(): number;
17
+ set value(v: number);
18
+ get min(): number;
19
+ set min(v: number);
20
+ get max(): number;
21
+ set max(v: number);
22
+ get step(): number;
23
+ set step(v: number);
24
+ get size(): string;
25
+ set size(v: string);
26
+ get strokeWidth(): number;
27
+ set strokeWidth(v: number);
28
+ get valueColor(): string;
29
+ set valueColor(v: string);
30
+ get rangeColor(): string;
31
+ set rangeColor(v: string);
32
+ get readonly(): boolean;
33
+ set readonly(v: boolean);
34
+ get disabled(): boolean;
35
+ set disabled(v: boolean);
36
+ get valueTemplate(): string;
37
+ set valueTemplate(v: string);
38
+ private _isDragging;
39
+ private _startY;
40
+ private _startValue;
41
+ protected render(): void;
42
+ private getSizeNum;
43
+ private clampValue;
44
+ private emitChange;
45
+ private attachListeners;
46
+ private _onMouseMove;
47
+ private _onMouseUp;
48
+ protected disconnectedCallback(): void;
49
+ }
50
+ export declare function defineFxKnob(): typeof FxKnob;
51
+ //# sourceMappingURL=knob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knob.d.ts","sourceRoot":"","sources":["../../../src/components/knob/knob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;;;;GAUG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACnC,OAAgB,MAAM,SAkEpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAcjD;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IACD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAclB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IACD,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,EAEhB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IACD,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,EAEhB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAGjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IACD,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM,EAExB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IACD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAEvB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IACD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAEvB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACD,IAAI,QAAQ,CAAC,CAAC,EAAE,OAAO,EAEtB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACD,IAAI,QAAQ,CAAC,CAAC,EAAE,OAAO,EAEtB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IACD,IAAI,aAAa,CAAC,CAAC,EAAE,MAAM,EAE1B;IAED,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,WAAW,CAAK;cAEL,MAAM,IAAI,IAAI;IAsCjC,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,eAAe;IAsEvB,OAAO,CAAC,YAAY,CAKlB;IAEF,OAAO,CAAC,UAAU,CAIhB;cAEiB,oBAAoB,IAAI,IAAI;CAKhD;AAED,wBAAgB,YAAY,IAAI,OAAO,MAAM,CAE5C"}