@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
@@ -0,0 +1,666 @@
1
+ import { FxElement } from "../../core/base.js";
2
+ import { css } from "../../core/css.js";
3
+ import { defineElement } from "../../core/define.js";
4
+ const _FxOrderList = class _FxOrderList extends FxElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this._data = [];
8
+ this._filteredData = null;
9
+ this._selection = [];
10
+ this._filterValue = "";
11
+ this._draggedIndex = null;
12
+ this._listenersAttached = false;
13
+ this._optionTemplate = null;
14
+ }
15
+ static get observedAttributes() {
16
+ return [
17
+ "data",
18
+ "data-key",
19
+ "filter",
20
+ "filter-by",
21
+ "filter-placeholder",
22
+ "breakpoint",
23
+ "controls-location",
24
+ "dragdrop",
25
+ "striped",
26
+ "selection-mode",
27
+ "show-select-all"
28
+ ];
29
+ }
30
+ set data(value) {
31
+ this._data = value;
32
+ this._filteredData = null;
33
+ this.render();
34
+ }
35
+ get data() {
36
+ return this._data;
37
+ }
38
+ set selection(value) {
39
+ this._selection = value;
40
+ this.render();
41
+ }
42
+ get selection() {
43
+ return this._selection;
44
+ }
45
+ get dataKey() {
46
+ return this.getAttr("data-key", "");
47
+ }
48
+ set dataKey(v) {
49
+ this.setAttribute("data-key", v);
50
+ }
51
+ get filter() {
52
+ return this.hasAttr("filter");
53
+ }
54
+ set filter(v) {
55
+ this.toggleAttr("filter", v);
56
+ }
57
+ get filterBy() {
58
+ return this.getAttr("filter-by", "label");
59
+ }
60
+ set filterBy(v) {
61
+ this.setAttribute("filter-by", v);
62
+ }
63
+ get filterPlaceholder() {
64
+ return this.getAttr("filter-placeholder", "Buscar...");
65
+ }
66
+ set filterPlaceholder(v) {
67
+ this.setAttribute("filter-placeholder", v);
68
+ }
69
+ get breakpoint() {
70
+ return this.getAttr("breakpoint", "960px");
71
+ }
72
+ set breakpoint(v) {
73
+ this.setAttribute("breakpoint", v);
74
+ }
75
+ get dragdrop() {
76
+ return this.hasAttr("dragdrop");
77
+ }
78
+ set dragdrop(v) {
79
+ this.toggleAttr("dragdrop", v);
80
+ }
81
+ get striped() {
82
+ return this.hasAttr("striped");
83
+ }
84
+ set striped(v) {
85
+ this.toggleAttr("striped", v);
86
+ }
87
+ get selectionMode() {
88
+ const s = this.getAttr("selection-mode", "");
89
+ return s === "single" || s === "multiple" ? s : "";
90
+ }
91
+ set selectionMode(v) {
92
+ this.setAttribute("selection-mode", v);
93
+ }
94
+ get showSelectAll() {
95
+ return this.hasAttr("show-select-all");
96
+ }
97
+ set showSelectAll(v) {
98
+ this.toggleAttr("show-select-all", v);
99
+ }
100
+ get filterValue() {
101
+ return this._filterValue;
102
+ }
103
+ set filterValue(v) {
104
+ this._filterValue = v;
105
+ this._applyFilter();
106
+ this._updateListDisplay();
107
+ }
108
+ setOptionTemplate(template) {
109
+ this._optionTemplate = template;
110
+ this.render();
111
+ }
112
+ connectedCallback() {
113
+ this._parseDataAttribute();
114
+ super.connectedCallback();
115
+ }
116
+ attributeChangedCallback() {
117
+ if (this.getAttr("data", "") !== "") {
118
+ this._parseDataAttribute();
119
+ }
120
+ super.attributeChangedCallback();
121
+ }
122
+ _parseDataAttribute() {
123
+ const dataAttr = this.getAttr("data", "");
124
+ if (dataAttr) {
125
+ try {
126
+ this._data = JSON.parse(dataAttr);
127
+ this._filteredData = null;
128
+ } catch {
129
+ this._data = [];
130
+ }
131
+ }
132
+ }
133
+ _applyFilter() {
134
+ if (!this._filterValue) {
135
+ this._filteredData = null;
136
+ return;
137
+ }
138
+ const filterFields = this.filterBy.split(",").map((f) => f.trim());
139
+ this._filteredData = this._data.filter((item) => {
140
+ return filterFields.some((field) => {
141
+ const value = item[field];
142
+ if (value == null) return false;
143
+ return String(value).toLowerCase().includes(this._filterValue.toLowerCase());
144
+ });
145
+ });
146
+ }
147
+ _getDisplayData() {
148
+ return this._filteredData || this._data;
149
+ }
150
+ _getItemKey(item, index) {
151
+ if (this.dataKey && item[this.dataKey] != null) {
152
+ return String(item[this.dataKey]);
153
+ }
154
+ if (item["id"] != null) return String(item["id"]);
155
+ if (item["key"] != null) return String(item["key"]);
156
+ if (item["label"] != null) return String(item["label"]);
157
+ if (item["name"] != null) return String(item["name"]);
158
+ if (item["value"] != null) return String(item["value"]);
159
+ return String(index);
160
+ }
161
+ _getItemLabel(item) {
162
+ const fields = ["label", "name", "title", "text", "value"];
163
+ for (const field of fields) {
164
+ if (item[field] != null) {
165
+ return String(item[field]);
166
+ }
167
+ }
168
+ return JSON.stringify(item);
169
+ }
170
+ _isSelected(item) {
171
+ return this._selection.some((s) => this._getItemKey(s, -1) === this._getItemKey(item, -1));
172
+ }
173
+ _moveItem(fromIndex, toIndex) {
174
+ const actualFrom = this._getActualIndex(fromIndex);
175
+ const actualTo = this._getActualIndex(toIndex);
176
+ if (actualFrom === -1 || actualTo === -1) return;
177
+ const item = this._data.splice(actualFrom, 1)[0];
178
+ this._data.splice(actualTo, 0, item);
179
+ this._applyFilter();
180
+ this._updateListDisplay();
181
+ this._updateControlsState();
182
+ this._emitReorder();
183
+ }
184
+ _getActualIndex(displayIndex) {
185
+ if (this._filteredData) {
186
+ const item = this._filteredData[displayIndex];
187
+ return this._data.findIndex((d) => this._getItemKey(d, -1) === this._getItemKey(item, -1));
188
+ }
189
+ return displayIndex;
190
+ }
191
+ _emitReorder() {
192
+ this.dispatchEvent(new CustomEvent("reorder", {
193
+ bubbles: true,
194
+ composed: true,
195
+ detail: { items: [...this._data] }
196
+ }));
197
+ }
198
+ _emitSelectionChange() {
199
+ this.dispatchEvent(new CustomEvent("selection-change", {
200
+ bubbles: true,
201
+ composed: true,
202
+ detail: { selection: [...this._selection] }
203
+ }));
204
+ }
205
+ _toggleSelection(item) {
206
+ const key = this._getItemKey(item, -1);
207
+ const index = this._selection.findIndex((s) => this._getItemKey(s, -1) === key);
208
+ if (index >= 0) {
209
+ this._selection.splice(index, 1);
210
+ } else if (this.selectionMode === "multiple") {
211
+ this._selection.push(item);
212
+ } else {
213
+ this._selection = [item];
214
+ }
215
+ this._emitSelectionChange();
216
+ this._updateListDisplay();
217
+ this._updateControlsState();
218
+ }
219
+ _selectAll() {
220
+ const displayData = this._getDisplayData();
221
+ this._selection = [...displayData];
222
+ this._emitSelectionChange();
223
+ this._updateListDisplay();
224
+ this._updateControlsState();
225
+ }
226
+ _deselectAll() {
227
+ this._selection = [];
228
+ this._emitSelectionChange();
229
+ this._updateListDisplay();
230
+ this._updateControlsState();
231
+ }
232
+ _toggleSelectAll() {
233
+ const displayData = this._getDisplayData();
234
+ if (this._selection.length === displayData.length) {
235
+ this._deselectAll();
236
+ } else {
237
+ this._selectAll();
238
+ }
239
+ }
240
+ render() {
241
+ const displayData = this._getDisplayData();
242
+ const hasSelection = this.selectionMode;
243
+ const hasMultipleSelection = this.selectionMode === "multiple";
244
+ const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;
245
+ this.setTemplate(`
246
+ <div class="container" part="container">
247
+ ${this.filter ? `
248
+ <div class="filter-wrapper" part="filter-wrapper">
249
+ <input type="text" class="filter-input" part="filter-input"
250
+ placeholder="${this.filterPlaceholder}"
251
+ value="${esc(this._filterValue)}"
252
+ aria-label="Filtrar lista" />
253
+ </div>
254
+ ` : ""}
255
+ <div class="main-row" part="main-row">
256
+ <div class="controls-bar" part="controls-bar">
257
+ <div class="control-group">
258
+ <button class="control-btn" data-action="top" part="control-btn" aria-label="Mover para o inicio">
259
+ <span class="control-btn-icon">«</span>
260
+ </button>
261
+ <button class="control-btn" data-action="up" part="control-btn" aria-label="Mover para cima">
262
+ <span class="control-btn-icon">↑</span>
263
+ </button>
264
+ </div>
265
+ <div class="control-group">
266
+ <button class="control-btn" data-action="down" part="control-btn" aria-label="Mover para baixo">
267
+ <span class="control-btn-icon">↓</span>
268
+ </button>
269
+ <button class="control-btn" data-action="bottom" part="control-btn" aria-label="Mover para o fim">
270
+ <span class="control-btn-icon">»</span>
271
+ </button>
272
+ </div>
273
+ </div>
274
+ <div class="list-wrapper" part="list-wrapper">
275
+ ${hasMultipleSelection && this.showSelectAll ? `
276
+ <div class="select-all-bar" part="select-all-bar">
277
+ <label>
278
+ <input type="checkbox" class="select-all-checkbox"
279
+ ${allSelected ? "checked" : ""}
280
+ aria-label="Selecionar todos" />
281
+ Selecionar Todos
282
+ </label>
283
+ <span class="selection-count">${this._selection.length} selecionado(s)</span>
284
+ </div>
285
+ ` : ""}
286
+ <ul class="list" part="list" role="listbox"
287
+ aria-multiselectable="${hasMultipleSelection}"
288
+ tabindex="0">
289
+ ${displayData.length === 0 ? `
290
+ <li class="empty-message" part="empty-message">
291
+ ${this.filter ? "Nenhum resultado encontrado" : "Nenhum item disponivel"}
292
+ </li>
293
+ ` : displayData.map((item, index) => {
294
+ const key = this._getItemKey(item, index);
295
+ const label = this._getItemLabel(item);
296
+ const isSelected = this._isSelected(item);
297
+ const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);
298
+ return `
299
+ <li class="list-item${isSelected ? " selected" : ""}" part="list-item"
300
+ data-index="${index}" data-key="${esc(key)}"
301
+ role="option" aria-selected="${isSelected}"
302
+ ${this.dragdrop ? 'draggable="true"' : ""}
303
+ tabindex="0">
304
+ ${this.dragdrop ? '<span class="drag-handle" part="drag-handle" aria-label="Arrastar">⋮⋮</span>' : ""}
305
+ ${hasSelection ? `
306
+ <input type="checkbox" class="checkbox" part="checkbox"
307
+ ${isSelected ? "checked" : ""}
308
+ aria-label="Selecionar ${esc(label)}" />
309
+ ` : ""}
310
+ <span class="item-content" part="item-content">${content}</span>
311
+ </li>
312
+ `;
313
+ }).join("")}
314
+ </ul>
315
+ </div>
316
+ </div>
317
+ </div>
318
+ `);
319
+ this._attachListeners();
320
+ this._attachItemListeners(this.root.querySelector(".list"));
321
+ this._updateControlsState();
322
+ }
323
+ _attachListeners() {
324
+ if (this._listenersAttached) return;
325
+ this._listenersAttached = true;
326
+ const root = this.root;
327
+ root.addEventListener("input", (e) => {
328
+ const t = e.target;
329
+ if (t.classList.contains("filter-input")) {
330
+ this.filterValue = t.value;
331
+ }
332
+ });
333
+ root.addEventListener("change", (e) => {
334
+ const t = e.target;
335
+ if (t.classList.contains("select-all-checkbox")) {
336
+ this._toggleSelectAll();
337
+ }
338
+ });
339
+ root.addEventListener("click", (e) => {
340
+ const target = e.target;
341
+ const btn = target.closest(".control-btn");
342
+ if (btn) {
343
+ this._handleMoveAction(btn.dataset.action);
344
+ }
345
+ });
346
+ let dragOverElement = null;
347
+ root.addEventListener("dragstart", (e) => {
348
+ const target = e.target.closest(".list-item");
349
+ if (!target) return;
350
+ this._draggedIndex = Number(target.dataset.index);
351
+ target.classList.add("dragging");
352
+ e.dataTransfer.effectAllowed = "move";
353
+ });
354
+ root.addEventListener("dragend", (e) => {
355
+ const target = e.target;
356
+ target.classList.remove("dragging");
357
+ this._draggedIndex = null;
358
+ root.querySelectorAll(".drag-over").forEach((el) => el.classList.remove("drag-over"));
359
+ dragOverElement = null;
360
+ });
361
+ root.addEventListener("dragover", (e) => {
362
+ e.preventDefault();
363
+ const target = e.target.closest(".list-item");
364
+ if (!target || target.classList.contains("dragging")) return;
365
+ if (dragOverElement) dragOverElement.classList.remove("drag-over");
366
+ target.classList.add("drag-over");
367
+ dragOverElement = target;
368
+ });
369
+ root.addEventListener("drop", (e) => {
370
+ e.preventDefault();
371
+ if (this._draggedIndex === null) return;
372
+ const target = e.target.closest(".list-item");
373
+ if (!target) return;
374
+ const toIndex = Number(target.dataset.index);
375
+ target.classList.remove("drag-over");
376
+ dragOverElement = null;
377
+ this._moveItem(this._draggedIndex, toIndex);
378
+ this._draggedIndex = null;
379
+ });
380
+ this._updateControlsState();
381
+ }
382
+ _attachItemListeners(list) {
383
+ if (!list) return;
384
+ list.addEventListener("click", (e) => {
385
+ const target = e.target;
386
+ const itemEl = target.closest(".list-item");
387
+ if (!itemEl) return;
388
+ if (target.classList.contains("checkbox")) {
389
+ e.stopPropagation();
390
+ const idxC = Number(itemEl.dataset.index);
391
+ this._toggleSelection(this._getDisplayData()[idxC]);
392
+ return;
393
+ }
394
+ const idxI = Number(itemEl.dataset.index);
395
+ this._toggleSelection(this._getDisplayData()[idxI]);
396
+ });
397
+ list.addEventListener("keydown", (e) => {
398
+ const target = e.target;
399
+ if (!target.classList.contains("list-item")) return;
400
+ const items = Array.from(list.querySelectorAll(".list-item"));
401
+ const currentIndex = items.indexOf(target);
402
+ const ke = e;
403
+ switch (ke.key) {
404
+ case "ArrowUp":
405
+ e.preventDefault();
406
+ if (currentIndex > 0) items[currentIndex - 1].focus();
407
+ break;
408
+ case "ArrowDown":
409
+ e.preventDefault();
410
+ if (currentIndex < items.length - 1) items[currentIndex + 1].focus();
411
+ break;
412
+ case " ":
413
+ case "Enter":
414
+ e.preventDefault();
415
+ if (this.selectionMode) {
416
+ const index = Number(target.dataset.index);
417
+ this._toggleSelection(this._getDisplayData()[index]);
418
+ }
419
+ break;
420
+ }
421
+ });
422
+ }
423
+ _updateListDisplay() {
424
+ const listWrapper = this.root.querySelector(".list-wrapper");
425
+ if (!listWrapper) {
426
+ this.render();
427
+ return;
428
+ }
429
+ const displayData = this._getDisplayData();
430
+ const hasSelection = this.selectionMode;
431
+ const hasMultipleSelection = this.selectionMode === "multiple";
432
+ const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;
433
+ listWrapper.innerHTML = `
434
+ ${hasMultipleSelection && this.showSelectAll ? `
435
+ <div class="select-all-bar" part="select-all-bar">
436
+ <label>
437
+ <input type="checkbox" class="select-all-checkbox"
438
+ ${allSelected ? "checked" : ""}
439
+ aria-label="Selecionar todos" />
440
+ Selecionar Todos
441
+ </label>
442
+ <span class="selection-count">${this._selection.length} selecionado(s)</span>
443
+ </div>
444
+ ` : ""}
445
+ <ul class="list" part="list" role="listbox"
446
+ aria-multiselectable="${hasMultipleSelection}"
447
+ tabindex="0">
448
+ ${displayData.length === 0 ? `
449
+ <li class="empty-message" part="empty-message">
450
+ ${this.filter ? "Nenhum resultado encontrado" : "Nenhum item disponivel"}
451
+ </li>
452
+ ` : displayData.map((item, index) => {
453
+ const key = this._getItemKey(item, index);
454
+ const label = this._getItemLabel(item);
455
+ const isSelected = this._isSelected(item);
456
+ const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);
457
+ return `
458
+ <li class="list-item${isSelected ? " selected" : ""}" part="list-item"
459
+ data-index="${index}" data-key="${esc(key)}"
460
+ role="option" aria-selected="${isSelected}"
461
+ ${this.dragdrop ? 'draggable="true"' : ""}
462
+ tabindex="0">
463
+ ${this.dragdrop ? '<span class="drag-handle" part="drag-handle" aria-label="Arrastar">⋮⋮</span>' : ""}
464
+ ${hasSelection ? `
465
+ <input type="checkbox" class="checkbox" part="checkbox"
466
+ ${isSelected ? "checked" : ""}
467
+ aria-label="Selecionar ${esc(label)}" />
468
+ ` : ""}
469
+ <span class="item-content" part="item-content">${content}</span>
470
+ </li>
471
+ `;
472
+ }).join("")}
473
+ </ul>
474
+ `;
475
+ this._attachListeners();
476
+ this._attachItemListeners(this.root.querySelector(".list"));
477
+ }
478
+ _handleMoveAction(action) {
479
+ if (!this._selection.length) return;
480
+ const displayData = this._getDisplayData();
481
+ const selectedIndices = this._selection.map((s) => displayData.findIndex((d) => this._getItemKey(d, -1) === this._getItemKey(s, -1))).filter((i) => i >= 0).sort((a, b) => a - b);
482
+ if (selectedIndices.length === 0) return;
483
+ switch (action) {
484
+ case "top":
485
+ this._moveSelectedToStart(selectedIndices);
486
+ break;
487
+ case "up":
488
+ this._moveSelectedByOne(selectedIndices, -1);
489
+ break;
490
+ case "down":
491
+ this._moveSelectedByOne(selectedIndices, 1);
492
+ break;
493
+ case "bottom":
494
+ this._moveSelectedToEnd(selectedIndices);
495
+ break;
496
+ }
497
+ }
498
+ _moveSelectedToStart(indices) {
499
+ const items = [];
500
+ const actualIndices = [];
501
+ for (const idx of indices) {
502
+ const actualIdx = this._getActualIndex(idx);
503
+ items.push(this._data[actualIdx]);
504
+ actualIndices.push(actualIdx);
505
+ }
506
+ actualIndices.sort((a, b) => b - a).forEach((i) => this._data.splice(i, 1));
507
+ const insertIdx = this._getActualIndex(0);
508
+ this._data.splice(insertIdx, 0, ...items);
509
+ this._applyFilter();
510
+ this._updateListDisplay();
511
+ this._updateControlsState();
512
+ this._emitReorder();
513
+ }
514
+ _moveSelectedToEnd(indices) {
515
+ const items = [];
516
+ const actualIndices = [];
517
+ for (const idx of indices) {
518
+ const actualIdx = this._getActualIndex(idx);
519
+ items.push(this._data[actualIdx]);
520
+ actualIndices.push(actualIdx);
521
+ }
522
+ actualIndices.sort((a, b) => b - a).forEach((i) => this._data.splice(i, 1));
523
+ const displayData = this._getDisplayData();
524
+ const insertIdx = this._getActualIndex(displayData.length - 1);
525
+ this._data.splice(insertIdx + 1, 0, ...items);
526
+ this._applyFilter();
527
+ this._updateListDisplay();
528
+ this._updateControlsState();
529
+ this._emitReorder();
530
+ }
531
+ _moveSelectedByOne(indices, delta) {
532
+ const displayData = this._getDisplayData();
533
+ if (displayData.length === 0) return;
534
+ const actualIndices = indices.map((idx) => this._getActualIndex(idx)).filter((idx) => idx >= 0).sort((a, b) => a - b);
535
+ if (actualIndices.length === 0) return;
536
+ if (delta < 0 && actualIndices[0] <= 0) return;
537
+ if (delta > 0 && actualIndices[actualIndices.length - 1] >= this._data.length - 1) return;
538
+ const selectedItems = actualIndices.map((idx) => this._data[idx]);
539
+ for (let i = actualIndices.length - 1; i >= 0; i--) {
540
+ this._data.splice(actualIndices[i], 1);
541
+ }
542
+ let insertIndex;
543
+ if (delta < 0) {
544
+ insertIndex = actualIndices[0] - 1;
545
+ } else {
546
+ insertIndex = actualIndices[actualIndices.length - 1] - actualIndices.length + 1 + 1;
547
+ }
548
+ insertIndex = Math.max(0, Math.min(insertIndex, this._data.length));
549
+ this._data.splice(insertIndex, 0, ...selectedItems);
550
+ this._applyFilter();
551
+ this._updateListDisplay();
552
+ this._updateControlsState();
553
+ this._emitReorder();
554
+ }
555
+ _updateControlsState() {
556
+ const displayData = this._getDisplayData();
557
+ const selectedIndices = this._selection.map((s) => displayData.findIndex((d) => this._getItemKey(d, -1) === this._getItemKey(s, -1))).filter((i) => i >= 0);
558
+ const buttons = this.root.querySelectorAll(".control-btn");
559
+ buttons.forEach((btn) => {
560
+ const action = btn.dataset.action;
561
+ let disabled = selectedIndices.length === 0;
562
+ if (!disabled) {
563
+ switch (action) {
564
+ case "top":
565
+ case "up":
566
+ disabled = selectedIndices[0] === 0;
567
+ break;
568
+ case "bottom":
569
+ case "down":
570
+ disabled = selectedIndices[selectedIndices.length - 1] === displayData.length - 1;
571
+ break;
572
+ }
573
+ }
574
+ btn.disabled = disabled;
575
+ });
576
+ }
577
+ };
578
+ _FxOrderList.styles = css`
579
+
580
+ :host {
581
+ display: block;
582
+ font-family: var(--fx-font-family);
583
+ font-size: var(--fx-font-size);
584
+ --orderlist-primary: var(--fx-color-primary, #3b82f6);
585
+ --orderlist-border: var(--fx-border-default, #e2e8f0);
586
+ --orderlist-bg: var(--fx-surface-background, #ffffff);
587
+ --orderlist-bg-hover: var(--fx-surface-surface-hover, #f1f5f9);
588
+ --orderlist-text: var(--fx-text-default, #1e293b);
589
+ --orderlist-text-muted: var(--fx-text-muted, #64748b);
590
+ --orderlist-radius: var(--fx-radius-md, 8px);
591
+ --orderlist-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
592
+ --orderlist-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
593
+ }
594
+ * { box-sizing: border-box; }
595
+ .container { display: flex; flex-direction: column; gap: var(--fx-space-md, 16px); }
596
+ .list-wrapper { display: flex; flex-direction: column; gap: var(--fx-space-sm, 8px); flex: 1; min-width: 0; }
597
+ .select-all-bar { display: flex; align-items: center; justify-content: space-between; padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); background: linear-gradient(135deg, var(--orderlist-bg), var(--orderlist-bg-hover)); border: 1px solid var(--orderlist-border); border-radius: var(--orderlist-radius); font-size: 0.9em; font-weight: 500; }
598
+ .select-all-bar label { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); cursor: pointer; user-select: none; color: var(--orderlist-text); }
599
+ .select-all-bar input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; }
600
+ .filter-wrapper { margin-bottom: var(--fx-space-xs, 4px); }
601
+ .filter-input { width: 100%; padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); padding-left: 42px; border: 1.5px solid var(--orderlist-border); border-radius: var(--orderlist-radius); font-family: inherit; font-size: inherit; color: var(--orderlist-text); background: var(--orderlist-bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E") no-repeat 14px center; transition: var(--orderlist-transition); }
602
+ .filter-input:focus { outline: none; border-color: var(--orderlist-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--orderlist-primary) 20%, transparent); }
603
+ .filter-input::placeholder { color: var(--orderlist-text-muted); }
604
+ .main-row { display: flex; align-items: stretch; gap: var(--fx-space-sm, 8px); }
605
+ .list { list-style: none; margin: 0; padding: 0; border: 1px solid var(--orderlist-border); border-radius: var(--orderlist-radius); overflow: hidden; box-shadow: var(--orderlist-shadow); max-height: 450px; overflow-y: auto; flex: 1; }
606
+ .list::-webkit-scrollbar { width: 6px; }
607
+ .list::-webkit-scrollbar-track { background: transparent; }
608
+ .list::-webkit-scrollbar-thumb { background: var(--orderlist-border); border-radius: 3px; }
609
+ .list::-webkit-scrollbar-thumb:hover { background: var(--orderlist-text-muted); }
610
+ .selection-count { font-size: 0.85em; color: var(--orderlist-primary); background: color-mix(in srgb, var(--orderlist-primary) 12%, transparent); padding: 4px 12px; border-radius: 20px; font-weight: 600; }
611
+ :host([striped]) .list-item:nth-child(even) { background: var(--fx-surface-surface, #f8fafc); }
612
+ .list-item { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); padding: var(--fx-space-sm, 10px) var(--fx-space-md, 14px); background: var(--orderlist-bg); border-bottom: 1px solid var(--orderlist-border); cursor: pointer; user-select: none; transition: var(--orderlist-transition); }
613
+ .list-item:last-child { border-bottom: none; }
614
+ .list-item:hover { background: var(--orderlist-bg-hover); }
615
+ .list-item.selected { background: color-mix(in srgb, var(--orderlist-primary) 8%, transparent); border-left: 3px solid var(--orderlist-primary); padding-left: 11px; }
616
+ .list-item:focus-visible { outline: none; background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }
617
+ .list-item.dragging { opacity: 0.5; background: var(--orderlist-bg-hover); }
618
+ .list-item.drag-over { border-top: 2px solid var(--orderlist-primary); }
619
+ .drag-handle { color: var(--orderlist-text-muted); cursor: grab; flex-shrink: 0; font-size: 1.2em; opacity: 0.6; transition: var(--orderlist-transition); }
620
+ .drag-handle:hover { opacity: 1; }
621
+ .drag-handle:active { cursor: grabbing; }
622
+ .item-content { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
623
+ .checkbox { flex-shrink: 0; width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; transition: var(--orderlist-transition); }
624
+ .checkbox:hover { transform: scale(1.1); }
625
+ .empty-message { padding: var(--fx-space-xl, 32px); text-align: center; color: var(--orderlist-text-muted); font-style: italic; }
626
+ .controls-bar {
627
+ display: flex;
628
+ flex-direction: column;
629
+ gap: 4px;
630
+ padding: var(--fx-space-xs, 6px);
631
+ background: var(--orderlist-bg);
632
+ border: 1px solid var(--orderlist-border);
633
+ border-radius: var(--orderlist-radius);
634
+ box-shadow: var(--orderlist-shadow);
635
+ height: fit-content;
636
+ position: sticky;
637
+ top: 0;
638
+ align-self: flex-start;
639
+ }
640
+ .control-group { display: flex; flex-direction: column; gap: 3px; }
641
+ .control-group + .control-group { margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--orderlist-border); }
642
+ button.control-btn { display: flex; align-items: center; justify-content: center; width: 42px; height: 38px; padding: 0; border: none; border-radius: 8px; background: transparent; color: var(--orderlist-text-muted); cursor: pointer; font-size: 16px; line-height: 1; transition: var(--orderlist-transition); position: relative; }
643
+ button.control-btn:hover:not(:disabled) { background: var(--orderlist-bg-hover); color: var(--orderlist-primary); transform: scale(1.1); }
644
+ button.control-btn:active:not(:disabled) { transform: scale(0.92); background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }
645
+ button.control-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--orderlist-primary) 30%, transparent); }
646
+ button.control-btn:disabled { opacity: 0.3; cursor: not-allowed; transform: none; }
647
+ .control-btn-icon { font-size: 18px; line-height: 1; }
648
+ /* Tooltip nos botoes */
649
+ button.control-btn:hover::after { opacity: 1; transform: translateY(-50%) translateX(0); }
650
+ @media (max-width: 640px) { .main-row { flex-direction: column; } .controls-bar { flex-direction: row; flex-wrap: wrap; justify-content: center; position: relative; } .control-group { flex-direction: row; } .control-group + .control-group { margin-top: 0; margin-left: 4px; padding-top: 0; padding-left: 4px; border-top: none; border-left: 1px solid var(--orderlist-border); } button.control-btn { width: 44px; height: 40px; } button.control-btn::after { display: none; } .list { max-height: 300px; } }
651
+ @keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }
652
+ .list-item { animation: slideIn 0.2s ease-out; }
653
+ @media (prefers-color-scheme: light) { :host { --orderlist-border: #334155; --orderlist-bg: #1e293b; --orderlist-bg-hover: #334155; --orderlist-text: #f1f5f9; --orderlist-text-muted: #94a3b8; --orderlist-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); } }
654
+ `;
655
+ let FxOrderList = _FxOrderList;
656
+ function esc(s) {
657
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
658
+ }
659
+ function defineFxOrderList() {
660
+ return defineElement("fx-orderlist", FxOrderList);
661
+ }
662
+ export {
663
+ FxOrderList,
664
+ defineFxOrderList
665
+ };
666
+ //# sourceMappingURL=orderlist.js.map