@wrrdev/fenix-ui 1.0.11 → 1.0.13
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.
- package/README.md +2 -2
- package/dist/components/autocomplete/autocomplete.d.ts +4 -1
- package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/components/autocomplete/autocomplete.js +5 -0
- package/dist/components/autocomplete/autocomplete.js.map +1 -1
- package/dist/components/orderlist/orderlist.d.ts.map +1 -1
- package/dist/components/orderlist/orderlist.js +0 -1
- package/dist/components/orderlist/orderlist.js.map +1 -1
- package/dist/components/tabs/tabs.d.ts +4 -0
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/tabs/tabs.js +6 -0
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/fenix-ui.umd.min.js +8 -9
- package/dist/fenix-ui2.esm.js +11 -1
- package/dist/fenix-ui2.esm.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ import { FenixUI } from '@wrrdev/fenix-ui'; // API de tema/tokens (índice)
|
|
|
18
18
|
FenixUI.theme('dark');
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
> 📦 npm: [`@wrrdev/fenix-ui`](https://www.npmjs.com/package/@wrrdev/fenix-ui) — **v1.0.
|
|
21
|
+
> 📦 npm: [`@wrrdev/fenix-ui`](https://www.npmjs.com/package/@wrrdev/fenix-ui) — **v1.0.13**, acesso público.
|
|
22
22
|
> Subpaths disponíveis: `./theme`, `./tokens`, `./jsx`, `./vue`, `./button`, `./badge`, `./spinner`, `./select`, `./input`, `./switch`, `./textarea`, `./checkbox`, `./radio`, `./calendar`, `./datepicker`, `./multiselect`, `./table`, `./floatlabel`, `./dialog`, `./toast`, `./tooltip`, `./tabs`, `./progress`, `./skeleton`, `./alert`, `./drawer`, `./dropdown`, `./sidebar`, `./pagination`, `./autocomplete`, `./auto-import` e o curinga `./components/*`.
|
|
23
23
|
|
|
24
24
|
|
|
@@ -65,7 +65,7 @@ Carregue o bundle **UMD** único: ele registra todos os componentes e expõe os
|
|
|
65
65
|
<fx-toast></fx-toast>
|
|
66
66
|
|
|
67
67
|
<!--
|
|
68
|
-
🔗 Links diretos para CDN (versão 1.0.
|
|
68
|
+
🔗 Links diretos para CDN (versão 1.0.13):
|
|
69
69
|
• https://cdn.jsdelivr.net/npm/@wrrdev/fenix-ui@latest/dist/fenix-ui.umd.min.js
|
|
70
70
|
• https://unpkg.com/@wrrdev/fenix-ui@latest/dist/fenix-ui.umd.min.js
|
|
71
71
|
-->
|
|
@@ -13,7 +13,10 @@ export declare class FxAutocomplete extends FxElement {
|
|
|
13
13
|
set size(v: string);
|
|
14
14
|
get value(): string;
|
|
15
15
|
set value(v: string);
|
|
16
|
-
|
|
16
|
+
get source(): string[];
|
|
17
|
+
/** Setter necessário para o Vue (patchDOMProp seta `source` como
|
|
18
|
+
* propriedade, pois o getter existe no prototype). */
|
|
19
|
+
set source(value: string | string[]);
|
|
17
20
|
protected render(): void;
|
|
18
21
|
}
|
|
19
22
|
export declare function defineFxAutocomplete(): typeof FxAutocomplete;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../../src/components/autocomplete/autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAgB,MAAM,SA8DpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,IAAI,IAAI,MAAM,CAGjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAAmC;IACrD,IAAI,KAAK,IAAI,MAAM,CAAkC;IACrD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAAoC;IAEvD,
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../../src/components/autocomplete/autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAgB,MAAM,SA8DpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,IAAI,IAAI,MAAM,CAGjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAAmC;IACrD,IAAI,KAAK,IAAI,MAAM,CAAkC;IACrD,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAAoC;IAEvD,IAAI,MAAM,IAAI,MAAM,EAAE,CAOrB;IACD;2DACuD;IACvD,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAElC;cAEkB,MAAM,IAAI,IAAI;CAgDlC;AAED,wBAAgB,oBAAoB,IAAI,OAAO,cAAc,CAE5D"}
|
|
@@ -26,6 +26,11 @@ const _FxAutocomplete = class _FxAutocomplete extends FxElement {
|
|
|
26
26
|
return [];
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
/** Setter necessário para o Vue (patchDOMProp seta `source` como
|
|
30
|
+
* propriedade, pois o getter existe no prototype). */
|
|
31
|
+
set source(value) {
|
|
32
|
+
this.setAttribute("source", typeof value === "string" ? value : JSON.stringify(value));
|
|
33
|
+
}
|
|
29
34
|
render() {
|
|
30
35
|
const placeholder = this.getAttr("placeholder");
|
|
31
36
|
this.setTemplate(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.js","sources":["../../../src/components/autocomplete/autocomplete.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-autocomplete> — Campo de texto com sugestões filtradas.\n *\n * Atributos: value, size, placeholder, source (JSON array de strings),\n * disabled, min-chars (padrão 1).\n * Evento: `select` (composed, detail: { value }).\n */\nexport class FxAutocomplete 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 input {\n font-family: inherit;\n font-size: inherit;\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n background-color: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\n width: 260px;\n min-height: var(--fx-size-md);\n box-sizing: border-box;\n transition:\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n input::placeholder { color: var(--fx-text-muted); opacity: 1; }\n input:hover { border-color: var(--fx-border-hover); }\n input:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n :host([size='sm']) input { width: 220px; min-height: var(--fx-size-sm); padding: var(--fx-space-sm) var(--fx-space-md); }\n :host([size='lg']) input { width: 300px; min-height: var(--fx-size-lg); }\n .list {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-lg);\n z-index: var(--fx-z-dropdown, 1000);\n max-height: 220px;\n overflow-y: auto;\n display: none;\n }\n :host([open]) .list { display: block; }\n .opt {\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 transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .opt:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, var(--fx-surface-background)); color: var(--fx-color-primary); }\n .empty { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); padding: var(--fx-space-sm) var(--fx-space-md); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'placeholder', 'source', 'disabled', 'min-chars'];\n }\n\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(v: string) { this.setAttribute('size', v); }\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sources":["../../../src/components/autocomplete/autocomplete.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-autocomplete> — Campo de texto com sugestões filtradas.\n *\n * Atributos: value, size, placeholder, source (JSON array de strings),\n * disabled, min-chars (padrão 1).\n * Evento: `select` (composed, detail: { value }).\n */\nexport class FxAutocomplete 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 input {\n font-family: inherit;\n font-size: inherit;\n font-weight: var(--fx-font-weight);\n color: var(--fx-text-default);\n background-color: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\n width: 260px;\n min-height: var(--fx-size-md);\n box-sizing: border-box;\n transition:\n border-color var(--fx-motion-duration-normal) var(--fx-motion-easing),\n box-shadow var(--fx-motion-duration-normal) var(--fx-motion-easing);\n }\n input::placeholder { color: var(--fx-text-muted); opacity: 1; }\n input:hover { border-color: var(--fx-border-hover); }\n input:focus-visible {\n outline: none;\n border-color: var(--fx-color-primary);\n box-shadow: var(--fx-effect-focus-ring, none);\n }\n :host([size='sm']) input { width: 220px; min-height: var(--fx-size-sm); padding: var(--fx-space-sm) var(--fx-space-md); }\n :host([size='lg']) input { width: 300px; min-height: var(--fx-size-lg); }\n .list {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--fx-surface-background);\n border: 1px solid var(--fx-border-default);\n border-radius: var(--fx-radius-md);\n box-shadow: var(--fx-shadow-lg);\n z-index: var(--fx-z-dropdown, 1000);\n max-height: 220px;\n overflow-y: auto;\n display: none;\n }\n :host([open]) .list { display: block; }\n .opt {\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 transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .opt:hover { background: color-mix(in srgb, var(--fx-color-primary) 12%, var(--fx-surface-background)); color: var(--fx-color-primary); }\n .empty { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); padding: var(--fx-space-sm) var(--fx-space-md); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'placeholder', 'source', 'disabled', 'min-chars'];\n }\n\n get size(): string {\n const s = this.getAttr('size', 'md');\n return s === 'sm' || s === 'lg' ? s : 'md';\n }\n set size(v: string) { this.setAttribute('size', v); }\n get value(): string { return this.getAttr('value'); }\n set value(v: string) { this.setAttribute('value', v); }\n\n get source(): string[] {\n try {\n const raw = JSON.parse(this.getAttr('source', '[]'));\n return Array.isArray(raw) ? raw.map(String) : [];\n } catch {\n return [];\n }\n }\n /** Setter necessário para o Vue (patchDOMProp seta `source` como\n * propriedade, pois o getter existe no prototype). */\n set source(value: string | string[]) {\n this.setAttribute('source', typeof value === 'string' ? value : JSON.stringify(value));\n }\n\n protected override render(): void {\n const placeholder = this.getAttr('placeholder');\n\n this.setTemplate(`\n <input class=\"field\" part=\"input\" type=\"text\"\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''} autocomplete=\"off\"/>\n <div class=\"list\" part=\"list\" role=\"listbox\"></div>\n `);\n\n const field = this.root.querySelector<HTMLInputElement>('.field');\n if (!field) return;\n field.value = this.value;\n if (this.hasAttr('disabled')) field.setAttribute('disabled', '');\n\n const list = this.root.querySelector<HTMLElement>('.list');\n const minChars = Number(this.getAttr('min-chars', '1')) || 1;\n\n const openList = (): void => {\n if (!list) return;\n const q = field.value.toLowerCase();\n const matches = this.source.filter((s) => s.toLowerCase().includes(q)).slice(0, 8);\n list.innerHTML = matches.length\n ? matches.map((m) => `<button type=\"button\" class=\"opt\" role=\"option\" data-v=\"${m}\">${m}</button>`).join('')\n : '<div class=\"empty\">Nenhum resultado</div>';\n list.querySelectorAll<HTMLButtonElement>('.opt').forEach((btn) => {\n btn.addEventListener('click', () => {\n field.value = btn.dataset.v ?? '';\n this.value = field.value;\n this.toggleAttr('open', false);\n this.dispatchEvent(new CustomEvent('select', {\n bubbles: true, composed: true, detail: { value: this.value },\n }));\n });\n });\n this.toggleAttr('open', true);\n };\n\n // Reabrir com foco sem re-render (evita perder digitação)\n field.addEventListener('input', () => {\n this.value = field.value;\n openList();\n });\n field.addEventListener('focus', () => { if (field.value.length >= minChars) openList(); });\n\n document.addEventListener('click', (e) => {\n if (!this.contains(e.target as Node)) this.toggleAttr('open', false);\n });\n }\n}\n\nexport function defineFxAutocomplete(): typeof FxAutocomplete {\n return defineElement('fx-autocomplete', FxAutocomplete);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderlist.d.ts","sourceRoot":"","sources":["../../../src/components/orderlist/orderlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,OAAgB,MAAM,
|
|
1
|
+
{"version":3,"file":"orderlist.d.ts","sourceRoot":"","sources":["../../../src/components/orderlist/orderlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,OAAgB,MAAM,SA2ElB;IAEJ,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAc7C;IAEL,IAAI,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,EAI9B;IACD,IAAI,IAAI,IAAI,aAAa,EAAE,CAE1B;IACD,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,aAAa,CAAgC;IAErD,IAAI,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAGnC;IACD,IAAI,SAAS,IAAI,aAAa,EAAE,CAE/B;IACC,OAAO,CAAC,UAAU,CAAuB;IAE3C,IAAI,OAAO,IAAI,MAAM,CAEpB;IACD,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,EAEpB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IACC,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,EAEtB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IACD,IAAI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAErB;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IACD,IAAI,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAE9B;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,OAAO,IAAI,OAAO,CAErB;IACC,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,EAEvB;IAED,IAAI,aAAa,IAAI,MAAM,CAG1B;IACD,IAAI,aAAa,CAAC,CAAC,EAAE,MAAM,EAE1B;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IACC,IAAI,aAAa,CAAC,CAAC,EAAE,OAAO,EAE7B;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IACD,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM,EAIxB;IACD,OAAO,CAAC,YAAY,CAAM;IAE1B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,eAAe,CAAkD;IAEzE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,MAAM,GAAG,IAAI;cAK/C,iBAAiB,IAAI,IAAI;cAKzB,wBAAwB,IAAI,IAAI;IAOnD,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,gBAAgB;cASL,MAAM,IAAI,IAAI;IAsFjC,OAAO,CAAC,gBAAgB;IAqExB,OAAO,CAAC,oBAAoB;IAyC5B,OAAO,CAAC,kBAAkB;IA0D1B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,kBAAkB;IA+C1B,OAAO,CAAC,oBAAoB;CA2B7B;AAMD,wBAAgB,iBAAiB,IAAI,OAAO,WAAW,CAEtD"}
|
|
@@ -650,7 +650,6 @@ _FxOrderList.styles = css`
|
|
|
650
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
651
|
@keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }
|
|
652
652
|
.list-item { animation: slideIn 0.2s ease-out; }
|
|
653
|
-
@media (prefers-color-scheme: dark) { :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
653
|
`;
|
|
655
654
|
let FxOrderList = _FxOrderList;
|
|
656
655
|
function esc(s) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderlist.js","sources":["../../../src/components/orderlist/orderlist.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\r\nimport { css } from '../../core/css';\r\nimport { defineElement } from '../../core/define';\r\n\r\nexport interface OrderListItem {\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * <fx-orderlist> - Componente para ordenar uma colecao de itens.\r\n *\r\n * Permite reordenar itens arrastando ou usando botoes de controle.\r\n * Suporta filtro, selecao, checkbox e templates customizados.\r\n *\r\n * Atributos: data, data-key, filter, filter-by, filter-placeholder, breakpoint,\r\n * dragdrop, selection-mode, striped, show-select-all.\r\n * Evento: `reorder` (composed, detail: { items }).\r\n * Evento: `selection-change` (composed, detail: { selection }).\r\n */\r\nexport class FxOrderList extends FxElement {\r\n static override styles = css`\r\n\r\n :host {\r\n display: block;\r\n font-family: var(--fx-font-family);\r\n font-size: var(--fx-font-size);\r\n --orderlist-primary: var(--fx-color-primary, #3b82f6);\r\n --orderlist-border: var(--fx-border-default, #e2e8f0);\r\n --orderlist-bg: var(--fx-surface-background, #ffffff);\r\n --orderlist-bg-hover: var(--fx-surface-surface-hover, #f1f5f9);\r\n --orderlist-text: var(--fx-text-default, #1e293b);\r\n --orderlist-text-muted: var(--fx-text-muted, #64748b);\r\n --orderlist-radius: var(--fx-radius-md, 8px);\r\n --orderlist-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n --orderlist-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n * { box-sizing: border-box; }\r\n .container { display: flex; flex-direction: column; gap: var(--fx-space-md, 16px); }\r\n .list-wrapper { display: flex; flex-direction: column; gap: var(--fx-space-sm, 8px); flex: 1; min-width: 0; }\r\n .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; }\r\n .select-all-bar label { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); cursor: pointer; user-select: none; color: var(--orderlist-text); }\r\n .select-all-bar input[type=\"checkbox\"] { width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; }\r\n .filter-wrapper { margin-bottom: var(--fx-space-xs, 4px); }\r\n .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); }\r\n .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); }\r\n .filter-input::placeholder { color: var(--orderlist-text-muted); }\r\n .main-row { display: flex; align-items: stretch; gap: var(--fx-space-sm, 8px); }\r\n .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; }\r\n .list::-webkit-scrollbar { width: 6px; }\r\n .list::-webkit-scrollbar-track { background: transparent; }\r\n .list::-webkit-scrollbar-thumb { background: var(--orderlist-border); border-radius: 3px; }\r\n .list::-webkit-scrollbar-thumb:hover { background: var(--orderlist-text-muted); }\r\n .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; }\r\n :host([striped]) .list-item:nth-child(even) { background: var(--fx-surface-surface, #f8fafc); }\r\n .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); }\r\n .list-item:last-child { border-bottom: none; }\r\n .list-item:hover { background: var(--orderlist-bg-hover); }\r\n .list-item.selected { background: color-mix(in srgb, var(--orderlist-primary) 8%, transparent); border-left: 3px solid var(--orderlist-primary); padding-left: 11px; }\r\n .list-item:focus-visible { outline: none; background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\r\n .list-item.dragging { opacity: 0.5; background: var(--orderlist-bg-hover); }\r\n .list-item.drag-over { border-top: 2px solid var(--orderlist-primary); }\r\n .drag-handle { color: var(--orderlist-text-muted); cursor: grab; flex-shrink: 0; font-size: 1.2em; opacity: 0.6; transition: var(--orderlist-transition); }\r\n .drag-handle:hover { opacity: 1; }\r\n .drag-handle:active { cursor: grabbing; }\r\n .item-content { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .checkbox { flex-shrink: 0; width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; transition: var(--orderlist-transition); }\r\n .checkbox:hover { transform: scale(1.1); }\r\n .empty-message { padding: var(--fx-space-xl, 32px); text-align: center; color: var(--orderlist-text-muted); font-style: italic; }\r\n .controls-bar {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n padding: var(--fx-space-xs, 6px);\r\n background: var(--orderlist-bg);\r\n border: 1px solid var(--orderlist-border);\r\n border-radius: var(--orderlist-radius);\r\n box-shadow: var(--orderlist-shadow);\r\n height: fit-content;\r\n position: sticky;\r\n top: 0;\r\n align-self: flex-start;\r\n }\r\n .control-group { display: flex; flex-direction: column; gap: 3px; }\r\n .control-group + .control-group { margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--orderlist-border); }\r\n 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; }\r\n button.control-btn:hover:not(:disabled) { background: var(--orderlist-bg-hover); color: var(--orderlist-primary); transform: scale(1.1); }\r\n button.control-btn:active:not(:disabled) { transform: scale(0.92); background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\r\n button.control-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--orderlist-primary) 30%, transparent); }\r\n button.control-btn:disabled { opacity: 0.3; cursor: not-allowed; transform: none; }\r\n .control-btn-icon { font-size: 18px; line-height: 1; }\r\n /* Tooltip nos botoes */\r\n button.control-btn:hover::after { opacity: 1; transform: translateY(-50%) translateX(0); }\r\n @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; } }\r\n @keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }\r\n .list-item { animation: slideIn 0.2s ease-out; }\r\n @media (prefers-color-scheme: dark) { :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); } }\r\n `;\r\n\r\n static override get observedAttributes(): string[] {\r\n return [\r\n 'data',\r\n 'data-key',\r\n 'filter',\r\n 'filter-by',\r\n 'filter-placeholder',\r\n 'breakpoint',\r\n 'controls-location',\r\n 'dragdrop',\r\n 'striped',\r\n 'selection-mode',\r\n 'show-select-all',\r\n ]\r\n }\r\n\r\n set data(value: OrderListItem[]) {\r\n this._data = value;\r\n this._filteredData = null;\r\n this.render();\r\n }\r\n get data(): OrderListItem[] {\r\n return this._data;\r\n }\r\n private _data: OrderListItem[] = [];\r\n private _filteredData: OrderListItem[] | null = null;\r\n\r\n set selection(value: OrderListItem[]) {\r\n this._selection = value;\r\n this.render();\r\n }\r\n get selection(): OrderListItem[] {\r\n return this._selection;\r\n }\r\n private _selection: OrderListItem[] = [];\r\n\r\n get dataKey(): string {\r\n return this.getAttr('data-key', '');\r\n }\r\n set dataKey(v: string) {\r\n this.setAttribute('data-key', v);\r\n }\r\n\r\n get filter(): boolean {\r\n return this.hasAttr('filter');\r\n }\r\n set filter(v: boolean) {\r\n this.toggleAttr('filter', v);\r\n }\r\n\r\n get filterBy(): string {\r\n return this.getAttr('filter-by', 'label');\r\n }\r\n set filterBy(v: string) {\r\n this.setAttribute('filter-by', v);\r\n }\r\n\r\n get filterPlaceholder(): string {\r\n return this.getAttr('filter-placeholder', 'Buscar...');\r\n }\r\n set filterPlaceholder(v: string) {\r\n this.setAttribute('filter-placeholder', v);\r\n }\r\n\r\n get breakpoint(): string {\r\n return this.getAttr('breakpoint', '960px');\r\n }\r\n set breakpoint(v: string) {\r\n this.setAttribute('breakpoint', v);\r\n }\r\n\r\n get dragdrop(): boolean {\r\n return this.hasAttr('dragdrop');\r\n }\r\n set dragdrop(v: boolean) {\r\n this.toggleAttr('dragdrop', v);\r\n }\r\n\r\n get striped(): boolean {\r\n return this.hasAttr('striped');\r\n }\r\n set striped(v: boolean) {\r\n this.toggleAttr('striped', v);\r\n }\r\n\r\n get selectionMode(): string {\r\n const s = this.getAttr('selection-mode', '');\r\n return s === 'single' || s === 'multiple' ? s : '';\r\n }\r\n set selectionMode(v: string) {\r\n this.setAttribute('selection-mode', v);\r\n }\r\n\r\n get showSelectAll(): boolean {\r\n return this.hasAttr('show-select-all');\r\n }\r\n set showSelectAll(v: boolean) {\r\n this.toggleAttr('show-select-all', v);\r\n }\r\n\r\n get filterValue(): string {\r\n return this._filterValue;\r\n }\r\n set filterValue(v: string) {\r\n this._filterValue = v;\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n }\r\n private _filterValue = '';\r\n\r\n private _draggedIndex: number | null = null;\r\n private _listenersAttached = false;\r\n private _optionTemplate: ((item: OrderListItem) => string) | null = null;\r\n\r\n setOptionTemplate(template: (item: OrderListItem) => string): void {\r\n this._optionTemplate = template;\r\n this.render();\r\n }\r\n\r\n protected override connectedCallback(): void {\r\n this._parseDataAttribute();\r\n super.connectedCallback();\r\n }\r\n\r\n protected override attributeChangedCallback(): void {\r\n if (this.getAttr('data', '') !== '') {\r\n this._parseDataAttribute();\r\n }\r\n super.attributeChangedCallback();\r\n }\r\n\r\n private _parseDataAttribute(): void {\r\n const dataAttr = this.getAttr('data', '');\r\n if (dataAttr) {\r\n try {\r\n this._data = JSON.parse(dataAttr);\r\n this._filteredData = null;\r\n } catch {\r\n this._data = [];\r\n }\r\n }\r\n }\r\n\r\n private _applyFilter(): void {\r\n if (!this._filterValue) {\r\n this._filteredData = null;\r\n return;\r\n }\r\n const filterFields = this.filterBy.split(',').map(f => f.trim());\r\n this._filteredData = this._data.filter(item => {\r\n return filterFields.some(field => {\r\n const value = item[field];\r\n if (value == null) return false;\r\n return String(value).toLowerCase().includes(this._filterValue.toLowerCase());\r\n });\r\n });\r\n }\r\n\r\n private _getDisplayData(): OrderListItem[] {\r\n return this._filteredData || this._data;\r\n }\r\n\r\n private _getItemKey(item: OrderListItem, index: number): string {\r\n if (this.dataKey && item[this.dataKey] != null) {\r\n return String(item[this.dataKey]);\r\n }\r\n if (item['id'] != null) return String(item['id']);\r\n if (item['key'] != null) return String(item['key']);\r\n if (item['label'] != null) return String(item['label']);\r\n if (item['name'] != null) return String(item['name']);\r\n if (item['value'] != null) return String(item['value']);\r\n return String(index);\r\n }\r\n\r\n private _getItemLabel(item: OrderListItem): string {\r\n const fields = ['label', 'name', 'title', 'text', 'value'];\r\n for (const field of fields) {\r\n if (item[field] != null) {\r\n return String(item[field]);\r\n }\r\n }\r\n return JSON.stringify(item);\r\n }\r\n\r\n private _isSelected(item: OrderListItem): boolean {\r\n return this._selection.some(s => this._getItemKey(s, -1) === this._getItemKey(item, -1));\r\n }\r\n\r\n private _moveItem(fromIndex: number, toIndex: number): void {\r\n const actualFrom = this._getActualIndex(fromIndex);\r\n const actualTo = this._getActualIndex(toIndex);\r\n if (actualFrom === -1 || actualTo === -1) return;\r\n const item = this._data.splice(actualFrom, 1)[0];\r\n this._data.splice(actualTo, 0, item);\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _getActualIndex(displayIndex: number): number {\r\n if (this._filteredData) {\r\n const item = this._filteredData[displayIndex];\r\n return this._data.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(item, -1));\r\n }\r\n return displayIndex;\r\n }\r\n\r\n private _emitReorder(): void {\r\n this.dispatchEvent(new CustomEvent('reorder', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { items: [...this._data] },\r\n }));\r\n }\r\n\r\n private _emitSelectionChange(): void {\r\n this.dispatchEvent(new CustomEvent('selection-change', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { selection: [...this._selection] },\r\n }));\r\n }\r\n\r\n private _toggleSelection(item: OrderListItem): void {\r\n const key = this._getItemKey(item, -1);\r\n const index = this._selection.findIndex(s => this._getItemKey(s, -1) === key);\r\n if (index >= 0) {\r\n this._selection.splice(index, 1);\r\n } else if (this.selectionMode === 'multiple') {\r\n this._selection.push(item);\r\n } else {\r\n this._selection = [item];\r\n }\r\n this._emitSelectionChange();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n }\r\n\r\n private _selectAll(): void {\r\n const displayData = this._getDisplayData();\r\n this._selection = [...displayData];\r\n this._emitSelectionChange();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n }\r\n\r\n private _deselectAll(): void {\r\n this._selection = [];\r\n this._emitSelectionChange();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n }\r\n\r\n private _toggleSelectAll(): void {\r\n const displayData = this._getDisplayData();\r\n if (this._selection.length === displayData.length) {\r\n this._deselectAll();\r\n } else {\r\n this._selectAll();\r\n }\r\n }\r\n\r\n protected override render(): void {\r\n const displayData = this._getDisplayData();\r\n const hasSelection = this.selectionMode;\r\n const hasMultipleSelection = this.selectionMode === 'multiple';\r\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\r\n\r\n this.setTemplate(`\r\n <div class=\"container\" part=\"container\">\r\n ${this.filter ? `\r\n <div class=\"filter-wrapper\" part=\"filter-wrapper\">\r\n <input type=\"text\" class=\"filter-input\" part=\"filter-input\"\r\n placeholder=\"${this.filterPlaceholder}\"\r\n value=\"${esc(this._filterValue)}\"\r\n aria-label=\"Filtrar lista\" />\r\n </div>\r\n ` : ''}\r\n <div class=\"main-row\" part=\"main-row\">\r\n <div class=\"controls-bar\" part=\"controls-bar\">\r\n <div class=\"control-group\">\r\n <button class=\"control-btn\" data-action=\"top\" part=\"control-btn\" aria-label=\"Mover para o inicio\">\r\n <span class=\"control-btn-icon\">\\u00AB</span>\r\n </button>\r\n <button class=\"control-btn\" data-action=\"up\" part=\"control-btn\" aria-label=\"Mover para cima\">\r\n <span class=\"control-btn-icon\">\\u2191</span>\r\n </button>\r\n </div>\r\n <div class=\"control-group\">\r\n <button class=\"control-btn\" data-action=\"down\" part=\"control-btn\" aria-label=\"Mover para baixo\">\r\n <span class=\"control-btn-icon\">\\u2193</span>\r\n </button>\r\n <button class=\"control-btn\" data-action=\"bottom\" part=\"control-btn\" aria-label=\"Mover para o fim\">\r\n <span class=\"control-btn-icon\">\\u00BB</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"list-wrapper\" part=\"list-wrapper\">\r\n ${hasMultipleSelection && this.showSelectAll ? `\r\n <div class=\"select-all-bar\" part=\"select-all-bar\">\r\n <label>\r\n <input type=\"checkbox\" class=\"select-all-checkbox\"\r\n ${allSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar todos\" />\r\n Selecionar Todos\r\n </label>\r\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\r\n </div>\r\n ` : ''}\r\n <ul class=\"list\" part=\"list\" role=\"listbox\"\r\n aria-multiselectable=\"${hasMultipleSelection}\"\r\n tabindex=\"0\">\r\n ${displayData.length === 0 ? `\r\n <li class=\"empty-message\" part=\"empty-message\">\r\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\r\n </li>\r\n ` : displayData.map((item, index) => {\r\n const key = this._getItemKey(item, index);\r\n const label = this._getItemLabel(item);\r\n const isSelected = this._isSelected(item);\r\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\r\n return `\r\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\r\n data-index=\"${index}\" data-key=\"${esc(key)}\"\r\n role=\"option\" aria-selected=\"${isSelected}\"\r\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\r\n tabindex=\"0\">\r\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\r\n ${hasSelection ? `\r\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\r\n ${isSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar ${esc(label)}\" />\r\n ` : ''}\r\n <span class=\"item-content\" part=\"item-content\">${content}</span>\r\n </li>\r\n `;\r\n }).join('')}\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n `);\r\n\r\n this._attachListeners();\r\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\r\n this._updateControlsState();\r\n }\r\n\r\n private _attachListeners(): void {\r\n if (this._listenersAttached) return;\r\n this._listenersAttached = true;\r\n const root = this.root;\r\n\r\n // Filtro - delega input\r\n root.addEventListener('input', (e) => {\r\n const t = e.target as HTMLElement;\r\n if (t.classList.contains('filter-input')) {\r\n this.filterValue = (t as HTMLInputElement).value;\r\n }\r\n });\r\n\r\n // Selecionar todos - delega change\r\n root.addEventListener('change', (e) => {\r\n const t = e.target as HTMLElement;\r\n if (t.classList.contains('select-all-checkbox')) {\r\n this._toggleSelectAll();\r\n }\r\n });\r\n\r\n // Clique - delega click nos botoes (itens anexados direto em cada render)\r\n root.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n const btn = target.closest('.control-btn') as HTMLButtonElement;\r\n if (btn) {\r\n this._handleMoveAction(btn.dataset.action);\r\n }\r\n });\r\n\r\n // Drag and drop\r\n // Drag and drop - delega no root\r\n let dragOverElement: HTMLElement | null = null;\r\n root.addEventListener('dragstart', (e) => {\r\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\r\n if (!target) return;\r\n this._draggedIndex = Number(target.dataset.index);\r\n target.classList.add('dragging');\r\n (e as DragEvent).dataTransfer!.effectAllowed = 'move';\r\n });\r\n root.addEventListener('dragend', (e) => {\r\n const target = e.target as HTMLElement;\r\n target.classList.remove('dragging');\r\n this._draggedIndex = null;\r\n root.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));\r\n dragOverElement = null;\r\n });\r\n root.addEventListener('dragover', (e) => {\r\n e.preventDefault();\r\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\r\n if (!target || target.classList.contains('dragging')) return;\r\n if (dragOverElement) dragOverElement.classList.remove('drag-over');\r\n target.classList.add('drag-over');\r\n dragOverElement = target;\r\n });\r\n root.addEventListener('drop', (e) => {\r\n e.preventDefault();\r\n if (this._draggedIndex === null) return;\r\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\r\n if (!target) return;\r\n const toIndex = Number(target.dataset.index);\r\n target.classList.remove('drag-over');\r\n dragOverElement = null;\r\n this._moveItem(this._draggedIndex, toIndex);\r\n this._draggedIndex = null;\r\n });\r\n this._updateControlsState();\r\n }\r\n\r\n private _attachItemListeners(list: HTMLElement): void {\r\n if (!list) return;\r\n list.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n const itemEl = target.closest('.list-item') as HTMLElement;\r\n if (!itemEl) return;\r\n if (target.classList.contains('checkbox')) {\r\n e.stopPropagation();\r\n const idxC = Number(itemEl.dataset.index);\r\n this._toggleSelection(this._getDisplayData()[idxC]);\r\n return;\r\n }\r\n const idxI = Number(itemEl.dataset.index);\r\n this._toggleSelection(this._getDisplayData()[idxI]);\r\n });\r\n list.addEventListener('keydown', (e) => {\r\n const target = e.target as HTMLElement;\r\n if (!target.classList.contains('list-item')) return;\r\n const items = Array.from(list.querySelectorAll('.list-item')) as HTMLElement[];\r\n const currentIndex = items.indexOf(target);\r\n const ke = e as KeyboardEvent;\r\n switch (ke.key) {\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (currentIndex > 0) items[currentIndex - 1].focus();\r\n break;\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (currentIndex < items.length - 1) items[currentIndex + 1].focus();\r\n break;\r\n case ' ':\r\n case 'Enter':\r\n e.preventDefault();\r\n if (this.selectionMode) {\r\n const index = Number(target.dataset.index);\r\n this._toggleSelection(this._getDisplayData()[index]);\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n private _updateListDisplay(): void {\r\n const listWrapper = this.root.querySelector('.list-wrapper');\r\n if (!listWrapper) {\r\n this.render();\r\n return;\r\n }\r\n const displayData = this._getDisplayData();\r\n const hasSelection = this.selectionMode;\r\n const hasMultipleSelection = this.selectionMode === 'multiple';\r\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\r\n\r\n listWrapper.innerHTML = `\r\n ${hasMultipleSelection && this.showSelectAll ? `\r\n <div class=\"select-all-bar\" part=\"select-all-bar\">\r\n <label>\r\n <input type=\"checkbox\" class=\"select-all-checkbox\"\r\n ${allSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar todos\" />\r\n Selecionar Todos\r\n </label>\r\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\r\n </div>\r\n ` : ''}\r\n <ul class=\"list\" part=\"list\" role=\"listbox\"\r\n aria-multiselectable=\"${hasMultipleSelection}\"\r\n tabindex=\"0\">\r\n ${displayData.length === 0 ? `\r\n <li class=\"empty-message\" part=\"empty-message\">\r\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\r\n </li>\r\n ` : displayData.map((item, index) => {\r\n const key = this._getItemKey(item, index);\r\n const label = this._getItemLabel(item);\r\n const isSelected = this._isSelected(item);\r\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\r\n return `\r\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\r\n data-index=\"${index}\" data-key=\"${esc(key)}\"\r\n role=\"option\" aria-selected=\"${isSelected}\"\r\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\r\n tabindex=\"0\">\r\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\r\n ${hasSelection ? `\r\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\r\n ${isSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar ${esc(label)}\" />\r\n ` : ''}\r\n <span class=\"item-content\" part=\"item-content\">${content}</span>\r\n </li>\r\n `;\r\n }).join('')}\r\n </ul>\r\n `;\r\n this._attachListeners();\r\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\r\n }\r\n\r\n\r\n private _handleMoveAction(action: string | undefined): void {\r\n if (!this._selection.length) return;\r\n const displayData = this._getDisplayData();\r\n const selectedIndices = this._selection\r\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\r\n .filter(i => i >= 0)\r\n .sort((a, b) => a - b);\r\n\r\n if (selectedIndices.length === 0) return;\r\n\r\n switch (action) {\r\n case 'top':\r\n this._moveSelectedToStart(selectedIndices);\r\n break;\r\n case 'up':\r\n this._moveSelectedByOne(selectedIndices, -1);\r\n break;\r\n case 'down':\r\n this._moveSelectedByOne(selectedIndices, 1);\r\n break;\r\n case 'bottom':\r\n this._moveSelectedToEnd(selectedIndices);\r\n break;\r\n }\r\n }\r\n\r\n private _moveSelectedToStart(indices: number[]): void {\r\n const items: OrderListItem[] = [];\r\n const actualIndices: number[] = [];\r\n\r\n for (const idx of indices) {\r\n const actualIdx = this._getActualIndex(idx);\r\n items.push(this._data[actualIdx]);\r\n actualIndices.push(actualIdx);\r\n }\r\n\r\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\r\n\r\n const insertIdx = this._getActualIndex(0);\r\n this._data.splice(insertIdx, 0, ...items);\r\n\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _moveSelectedToEnd(indices: number[]): void {\r\n const items: OrderListItem[] = [];\r\n const actualIndices: number[] = [];\r\n\r\n for (const idx of indices) {\r\n const actualIdx = this._getActualIndex(idx);\r\n items.push(this._data[actualIdx]);\r\n actualIndices.push(actualIdx);\r\n }\r\n\r\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\r\n\r\n const displayData = this._getDisplayData();\r\n const insertIdx = this._getActualIndex(displayData.length - 1);\r\n this._data.splice(insertIdx + 1, 0, ...items);\r\n\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _moveSelectedByOne(indices: number[], delta: number): void {\r\n const displayData = this._getDisplayData();\r\n if (displayData.length === 0) return;\r\n\r\n // Get actual indices in _data array and sort them\r\n const actualIndices = indices\r\n .map(idx => this._getActualIndex(idx))\r\n .filter(idx => idx >= 0)\r\n .sort((a, b) => a - b);\r\n\r\n if (actualIndices.length === 0) return;\r\n\r\n // Check if movement is possible\r\n if (delta < 0 && actualIndices[0] <= 0) return;\r\n if (delta > 0 && actualIndices[actualIndices.length - 1] >= this._data.length - 1) return;\r\n\r\n // Extract selected items in order\r\n const selectedItems = actualIndices.map(idx => this._data[idx]);\r\n\r\n // Remove selected items from data (from highest to lowest to preserve indices)\r\n for (let i = actualIndices.length - 1; i >= 0; i--) {\r\n this._data.splice(actualIndices[i], 1);\r\n }\r\n\r\n // Calculate new insertion point\r\n let insertIndex: number;\r\n if (delta < 0) {\r\n // Moving up: insert before the first selected item position\r\n insertIndex = actualIndices[0] - 1;\r\n } else {\r\n // Moving down: insert after the last selected item position\r\n // Since we removed items, we need to adjust\r\n insertIndex = actualIndices[actualIndices.length - 1] - actualIndices.length + 1 + 1;\r\n }\r\n\r\n // Ensure insertIndex is within bounds\r\n insertIndex = Math.max(0, Math.min(insertIndex, this._data.length));\r\n\r\n // Insert items at new position\r\n this._data.splice(insertIndex, 0, ...selectedItems);\r\n\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _updateControlsState(): void {\r\n const displayData = this._getDisplayData();\r\n const selectedIndices = this._selection\r\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\r\n .filter(i => i >= 0);\r\n\r\n const buttons = this.root.querySelectorAll<HTMLButtonElement>('.control-btn');\r\n buttons.forEach(btn => {\r\n const action = btn.dataset.action;\r\n let disabled = selectedIndices.length === 0;\r\n\r\n if (!disabled) {\r\n switch (action) {\r\n case 'top':\r\n case 'up':\r\n disabled = selectedIndices[0] === 0;\r\n break;\r\n case 'bottom':\r\n case 'down':\r\n disabled = selectedIndices[selectedIndices.length - 1] === displayData.length - 1;\r\n break;\r\n }\r\n }\r\n\r\n btn.disabled = disabled;\r\n });\r\n }\r\n}\r\n\r\nfunction esc(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\r\n}\r\n\r\nexport function defineFxOrderList(): typeof FxOrderList {\r\n return defineElement('fx-orderlist', FxOrderList);\r\n}"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"orderlist.js","sources":["../../../src/components/orderlist/orderlist.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\r\nimport { css } from '../../core/css';\r\nimport { defineElement } from '../../core/define';\r\n\r\nexport interface OrderListItem {\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * <fx-orderlist> - Componente para ordenar uma colecao de itens.\r\n *\r\n * Permite reordenar itens arrastando ou usando botoes de controle.\r\n * Suporta filtro, selecao, checkbox e templates customizados.\r\n *\r\n * Atributos: data, data-key, filter, filter-by, filter-placeholder, breakpoint,\r\n * dragdrop, selection-mode, striped, show-select-all.\r\n * Evento: `reorder` (composed, detail: { items }).\r\n * Evento: `selection-change` (composed, detail: { selection }).\r\n */\r\nexport class FxOrderList extends FxElement {\r\n static override styles = css`\r\n\r\n :host {\r\n display: block;\r\n font-family: var(--fx-font-family);\r\n font-size: var(--fx-font-size);\r\n --orderlist-primary: var(--fx-color-primary, #3b82f6);\r\n --orderlist-border: var(--fx-border-default, #e2e8f0);\r\n --orderlist-bg: var(--fx-surface-background, #ffffff);\r\n --orderlist-bg-hover: var(--fx-surface-surface-hover, #f1f5f9);\r\n --orderlist-text: var(--fx-text-default, #1e293b);\r\n --orderlist-text-muted: var(--fx-text-muted, #64748b);\r\n --orderlist-radius: var(--fx-radius-md, 8px);\r\n --orderlist-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n --orderlist-transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n * { box-sizing: border-box; }\r\n .container { display: flex; flex-direction: column; gap: var(--fx-space-md, 16px); }\r\n .list-wrapper { display: flex; flex-direction: column; gap: var(--fx-space-sm, 8px); flex: 1; min-width: 0; }\r\n .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; }\r\n .select-all-bar label { display: flex; align-items: center; gap: var(--fx-space-sm, 10px); cursor: pointer; user-select: none; color: var(--orderlist-text); }\r\n .select-all-bar input[type=\"checkbox\"] { width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; }\r\n .filter-wrapper { margin-bottom: var(--fx-space-xs, 4px); }\r\n .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); }\r\n .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); }\r\n .filter-input::placeholder { color: var(--orderlist-text-muted); }\r\n .main-row { display: flex; align-items: stretch; gap: var(--fx-space-sm, 8px); }\r\n .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; }\r\n .list::-webkit-scrollbar { width: 6px; }\r\n .list::-webkit-scrollbar-track { background: transparent; }\r\n .list::-webkit-scrollbar-thumb { background: var(--orderlist-border); border-radius: 3px; }\r\n .list::-webkit-scrollbar-thumb:hover { background: var(--orderlist-text-muted); }\r\n .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; }\r\n :host([striped]) .list-item:nth-child(even) { background: var(--fx-surface-surface, #f8fafc); }\r\n .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); }\r\n .list-item:last-child { border-bottom: none; }\r\n .list-item:hover { background: var(--orderlist-bg-hover); }\r\n .list-item.selected { background: color-mix(in srgb, var(--orderlist-primary) 8%, transparent); border-left: 3px solid var(--orderlist-primary); padding-left: 11px; }\r\n .list-item:focus-visible { outline: none; background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\r\n .list-item.dragging { opacity: 0.5; background: var(--orderlist-bg-hover); }\r\n .list-item.drag-over { border-top: 2px solid var(--orderlist-primary); }\r\n .drag-handle { color: var(--orderlist-text-muted); cursor: grab; flex-shrink: 0; font-size: 1.2em; opacity: 0.6; transition: var(--orderlist-transition); }\r\n .drag-handle:hover { opacity: 1; }\r\n .drag-handle:active { cursor: grabbing; }\r\n .item-content { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .checkbox { flex-shrink: 0; width: 18px; height: 18px; accent-color: var(--orderlist-primary); cursor: pointer; transition: var(--orderlist-transition); }\r\n .checkbox:hover { transform: scale(1.1); }\r\n .empty-message { padding: var(--fx-space-xl, 32px); text-align: center; color: var(--orderlist-text-muted); font-style: italic; }\r\n .controls-bar {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n padding: var(--fx-space-xs, 6px);\r\n background: var(--orderlist-bg);\r\n border: 1px solid var(--orderlist-border);\r\n border-radius: var(--orderlist-radius);\r\n box-shadow: var(--orderlist-shadow);\r\n height: fit-content;\r\n position: sticky;\r\n top: 0;\r\n align-self: flex-start;\r\n }\r\n .control-group { display: flex; flex-direction: column; gap: 3px; }\r\n .control-group + .control-group { margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--orderlist-border); }\r\n 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; }\r\n button.control-btn:hover:not(:disabled) { background: var(--orderlist-bg-hover); color: var(--orderlist-primary); transform: scale(1.1); }\r\n button.control-btn:active:not(:disabled) { transform: scale(0.92); background: color-mix(in srgb, var(--orderlist-primary) 15%, transparent); }\r\n button.control-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--orderlist-primary) 30%, transparent); }\r\n button.control-btn:disabled { opacity: 0.3; cursor: not-allowed; transform: none; }\r\n .control-btn-icon { font-size: 18px; line-height: 1; }\r\n /* Tooltip nos botoes */\r\n button.control-btn:hover::after { opacity: 1; transform: translateY(-50%) translateX(0); }\r\n @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; } }\r\n @keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }\r\n .list-item { animation: slideIn 0.2s ease-out; }\r\n `;\r\n\r\n static override get observedAttributes(): string[] {\r\n return [\r\n 'data',\r\n 'data-key',\r\n 'filter',\r\n 'filter-by',\r\n 'filter-placeholder',\r\n 'breakpoint',\r\n 'controls-location',\r\n 'dragdrop',\r\n 'striped',\r\n 'selection-mode',\r\n 'show-select-all',\r\n ]\r\n }\r\n\r\n set data(value: OrderListItem[]) {\r\n this._data = value;\r\n this._filteredData = null;\r\n this.render();\r\n }\r\n get data(): OrderListItem[] {\r\n return this._data;\r\n }\r\n private _data: OrderListItem[] = [];\r\n private _filteredData: OrderListItem[] | null = null;\r\n\r\n set selection(value: OrderListItem[]) {\r\n this._selection = value;\r\n this.render();\r\n }\r\n get selection(): OrderListItem[] {\r\n return this._selection;\r\n }\r\n private _selection: OrderListItem[] = [];\r\n\r\n get dataKey(): string {\r\n return this.getAttr('data-key', '');\r\n }\r\n set dataKey(v: string) {\r\n this.setAttribute('data-key', v);\r\n }\r\n\r\n get filter(): boolean {\r\n return this.hasAttr('filter');\r\n }\r\n set filter(v: boolean) {\r\n this.toggleAttr('filter', v);\r\n }\r\n\r\n get filterBy(): string {\r\n return this.getAttr('filter-by', 'label');\r\n }\r\n set filterBy(v: string) {\r\n this.setAttribute('filter-by', v);\r\n }\r\n\r\n get filterPlaceholder(): string {\r\n return this.getAttr('filter-placeholder', 'Buscar...');\r\n }\r\n set filterPlaceholder(v: string) {\r\n this.setAttribute('filter-placeholder', v);\r\n }\r\n\r\n get breakpoint(): string {\r\n return this.getAttr('breakpoint', '960px');\r\n }\r\n set breakpoint(v: string) {\r\n this.setAttribute('breakpoint', v);\r\n }\r\n\r\n get dragdrop(): boolean {\r\n return this.hasAttr('dragdrop');\r\n }\r\n set dragdrop(v: boolean) {\r\n this.toggleAttr('dragdrop', v);\r\n }\r\n\r\n get striped(): boolean {\r\n return this.hasAttr('striped');\r\n }\r\n set striped(v: boolean) {\r\n this.toggleAttr('striped', v);\r\n }\r\n\r\n get selectionMode(): string {\r\n const s = this.getAttr('selection-mode', '');\r\n return s === 'single' || s === 'multiple' ? s : '';\r\n }\r\n set selectionMode(v: string) {\r\n this.setAttribute('selection-mode', v);\r\n }\r\n\r\n get showSelectAll(): boolean {\r\n return this.hasAttr('show-select-all');\r\n }\r\n set showSelectAll(v: boolean) {\r\n this.toggleAttr('show-select-all', v);\r\n }\r\n\r\n get filterValue(): string {\r\n return this._filterValue;\r\n }\r\n set filterValue(v: string) {\r\n this._filterValue = v;\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n }\r\n private _filterValue = '';\r\n\r\n private _draggedIndex: number | null = null;\r\n private _listenersAttached = false;\r\n private _optionTemplate: ((item: OrderListItem) => string) | null = null;\r\n\r\n setOptionTemplate(template: (item: OrderListItem) => string): void {\r\n this._optionTemplate = template;\r\n this.render();\r\n }\r\n\r\n protected override connectedCallback(): void {\r\n this._parseDataAttribute();\r\n super.connectedCallback();\r\n }\r\n\r\n protected override attributeChangedCallback(): void {\r\n if (this.getAttr('data', '') !== '') {\r\n this._parseDataAttribute();\r\n }\r\n super.attributeChangedCallback();\r\n }\r\n\r\n private _parseDataAttribute(): void {\r\n const dataAttr = this.getAttr('data', '');\r\n if (dataAttr) {\r\n try {\r\n this._data = JSON.parse(dataAttr);\r\n this._filteredData = null;\r\n } catch {\r\n this._data = [];\r\n }\r\n }\r\n }\r\n\r\n private _applyFilter(): void {\r\n if (!this._filterValue) {\r\n this._filteredData = null;\r\n return;\r\n }\r\n const filterFields = this.filterBy.split(',').map(f => f.trim());\r\n this._filteredData = this._data.filter(item => {\r\n return filterFields.some(field => {\r\n const value = item[field];\r\n if (value == null) return false;\r\n return String(value).toLowerCase().includes(this._filterValue.toLowerCase());\r\n });\r\n });\r\n }\r\n\r\n private _getDisplayData(): OrderListItem[] {\r\n return this._filteredData || this._data;\r\n }\r\n\r\n private _getItemKey(item: OrderListItem, index: number): string {\r\n if (this.dataKey && item[this.dataKey] != null) {\r\n return String(item[this.dataKey]);\r\n }\r\n if (item['id'] != null) return String(item['id']);\r\n if (item['key'] != null) return String(item['key']);\r\n if (item['label'] != null) return String(item['label']);\r\n if (item['name'] != null) return String(item['name']);\r\n if (item['value'] != null) return String(item['value']);\r\n return String(index);\r\n }\r\n\r\n private _getItemLabel(item: OrderListItem): string {\r\n const fields = ['label', 'name', 'title', 'text', 'value'];\r\n for (const field of fields) {\r\n if (item[field] != null) {\r\n return String(item[field]);\r\n }\r\n }\r\n return JSON.stringify(item);\r\n }\r\n\r\n private _isSelected(item: OrderListItem): boolean {\r\n return this._selection.some(s => this._getItemKey(s, -1) === this._getItemKey(item, -1));\r\n }\r\n\r\n private _moveItem(fromIndex: number, toIndex: number): void {\r\n const actualFrom = this._getActualIndex(fromIndex);\r\n const actualTo = this._getActualIndex(toIndex);\r\n if (actualFrom === -1 || actualTo === -1) return;\r\n const item = this._data.splice(actualFrom, 1)[0];\r\n this._data.splice(actualTo, 0, item);\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _getActualIndex(displayIndex: number): number {\r\n if (this._filteredData) {\r\n const item = this._filteredData[displayIndex];\r\n return this._data.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(item, -1));\r\n }\r\n return displayIndex;\r\n }\r\n\r\n private _emitReorder(): void {\r\n this.dispatchEvent(new CustomEvent('reorder', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { items: [...this._data] },\r\n }));\r\n }\r\n\r\n private _emitSelectionChange(): void {\r\n this.dispatchEvent(new CustomEvent('selection-change', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { selection: [...this._selection] },\r\n }));\r\n }\r\n\r\n private _toggleSelection(item: OrderListItem): void {\r\n const key = this._getItemKey(item, -1);\r\n const index = this._selection.findIndex(s => this._getItemKey(s, -1) === key);\r\n if (index >= 0) {\r\n this._selection.splice(index, 1);\r\n } else if (this.selectionMode === 'multiple') {\r\n this._selection.push(item);\r\n } else {\r\n this._selection = [item];\r\n }\r\n this._emitSelectionChange();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n }\r\n\r\n private _selectAll(): void {\r\n const displayData = this._getDisplayData();\r\n this._selection = [...displayData];\r\n this._emitSelectionChange();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n }\r\n\r\n private _deselectAll(): void {\r\n this._selection = [];\r\n this._emitSelectionChange();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n }\r\n\r\n private _toggleSelectAll(): void {\r\n const displayData = this._getDisplayData();\r\n if (this._selection.length === displayData.length) {\r\n this._deselectAll();\r\n } else {\r\n this._selectAll();\r\n }\r\n }\r\n\r\n protected override render(): void {\r\n const displayData = this._getDisplayData();\r\n const hasSelection = this.selectionMode;\r\n const hasMultipleSelection = this.selectionMode === 'multiple';\r\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\r\n\r\n this.setTemplate(`\r\n <div class=\"container\" part=\"container\">\r\n ${this.filter ? `\r\n <div class=\"filter-wrapper\" part=\"filter-wrapper\">\r\n <input type=\"text\" class=\"filter-input\" part=\"filter-input\"\r\n placeholder=\"${this.filterPlaceholder}\"\r\n value=\"${esc(this._filterValue)}\"\r\n aria-label=\"Filtrar lista\" />\r\n </div>\r\n ` : ''}\r\n <div class=\"main-row\" part=\"main-row\">\r\n <div class=\"controls-bar\" part=\"controls-bar\">\r\n <div class=\"control-group\">\r\n <button class=\"control-btn\" data-action=\"top\" part=\"control-btn\" aria-label=\"Mover para o inicio\">\r\n <span class=\"control-btn-icon\">\\u00AB</span>\r\n </button>\r\n <button class=\"control-btn\" data-action=\"up\" part=\"control-btn\" aria-label=\"Mover para cima\">\r\n <span class=\"control-btn-icon\">\\u2191</span>\r\n </button>\r\n </div>\r\n <div class=\"control-group\">\r\n <button class=\"control-btn\" data-action=\"down\" part=\"control-btn\" aria-label=\"Mover para baixo\">\r\n <span class=\"control-btn-icon\">\\u2193</span>\r\n </button>\r\n <button class=\"control-btn\" data-action=\"bottom\" part=\"control-btn\" aria-label=\"Mover para o fim\">\r\n <span class=\"control-btn-icon\">\\u00BB</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"list-wrapper\" part=\"list-wrapper\">\r\n ${hasMultipleSelection && this.showSelectAll ? `\r\n <div class=\"select-all-bar\" part=\"select-all-bar\">\r\n <label>\r\n <input type=\"checkbox\" class=\"select-all-checkbox\"\r\n ${allSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar todos\" />\r\n Selecionar Todos\r\n </label>\r\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\r\n </div>\r\n ` : ''}\r\n <ul class=\"list\" part=\"list\" role=\"listbox\"\r\n aria-multiselectable=\"${hasMultipleSelection}\"\r\n tabindex=\"0\">\r\n ${displayData.length === 0 ? `\r\n <li class=\"empty-message\" part=\"empty-message\">\r\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\r\n </li>\r\n ` : displayData.map((item, index) => {\r\n const key = this._getItemKey(item, index);\r\n const label = this._getItemLabel(item);\r\n const isSelected = this._isSelected(item);\r\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\r\n return `\r\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\r\n data-index=\"${index}\" data-key=\"${esc(key)}\"\r\n role=\"option\" aria-selected=\"${isSelected}\"\r\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\r\n tabindex=\"0\">\r\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\r\n ${hasSelection ? `\r\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\r\n ${isSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar ${esc(label)}\" />\r\n ` : ''}\r\n <span class=\"item-content\" part=\"item-content\">${content}</span>\r\n </li>\r\n `;\r\n }).join('')}\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n `);\r\n\r\n this._attachListeners();\r\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\r\n this._updateControlsState();\r\n }\r\n\r\n private _attachListeners(): void {\r\n if (this._listenersAttached) return;\r\n this._listenersAttached = true;\r\n const root = this.root;\r\n\r\n // Filtro - delega input\r\n root.addEventListener('input', (e) => {\r\n const t = e.target as HTMLElement;\r\n if (t.classList.contains('filter-input')) {\r\n this.filterValue = (t as HTMLInputElement).value;\r\n }\r\n });\r\n\r\n // Selecionar todos - delega change\r\n root.addEventListener('change', (e) => {\r\n const t = e.target as HTMLElement;\r\n if (t.classList.contains('select-all-checkbox')) {\r\n this._toggleSelectAll();\r\n }\r\n });\r\n\r\n // Clique - delega click nos botoes (itens anexados direto em cada render)\r\n root.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n const btn = target.closest('.control-btn') as HTMLButtonElement;\r\n if (btn) {\r\n this._handleMoveAction(btn.dataset.action);\r\n }\r\n });\r\n\r\n // Drag and drop\r\n // Drag and drop - delega no root\r\n let dragOverElement: HTMLElement | null = null;\r\n root.addEventListener('dragstart', (e) => {\r\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\r\n if (!target) return;\r\n this._draggedIndex = Number(target.dataset.index);\r\n target.classList.add('dragging');\r\n (e as DragEvent).dataTransfer!.effectAllowed = 'move';\r\n });\r\n root.addEventListener('dragend', (e) => {\r\n const target = e.target as HTMLElement;\r\n target.classList.remove('dragging');\r\n this._draggedIndex = null;\r\n root.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over'));\r\n dragOverElement = null;\r\n });\r\n root.addEventListener('dragover', (e) => {\r\n e.preventDefault();\r\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\r\n if (!target || target.classList.contains('dragging')) return;\r\n if (dragOverElement) dragOverElement.classList.remove('drag-over');\r\n target.classList.add('drag-over');\r\n dragOverElement = target;\r\n });\r\n root.addEventListener('drop', (e) => {\r\n e.preventDefault();\r\n if (this._draggedIndex === null) return;\r\n const target = (e.target as HTMLElement).closest('.list-item') as HTMLElement;\r\n if (!target) return;\r\n const toIndex = Number(target.dataset.index);\r\n target.classList.remove('drag-over');\r\n dragOverElement = null;\r\n this._moveItem(this._draggedIndex, toIndex);\r\n this._draggedIndex = null;\r\n });\r\n this._updateControlsState();\r\n }\r\n\r\n private _attachItemListeners(list: HTMLElement): void {\r\n if (!list) return;\r\n list.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n const itemEl = target.closest('.list-item') as HTMLElement;\r\n if (!itemEl) return;\r\n if (target.classList.contains('checkbox')) {\r\n e.stopPropagation();\r\n const idxC = Number(itemEl.dataset.index);\r\n this._toggleSelection(this._getDisplayData()[idxC]);\r\n return;\r\n }\r\n const idxI = Number(itemEl.dataset.index);\r\n this._toggleSelection(this._getDisplayData()[idxI]);\r\n });\r\n list.addEventListener('keydown', (e) => {\r\n const target = e.target as HTMLElement;\r\n if (!target.classList.contains('list-item')) return;\r\n const items = Array.from(list.querySelectorAll('.list-item')) as HTMLElement[];\r\n const currentIndex = items.indexOf(target);\r\n const ke = e as KeyboardEvent;\r\n switch (ke.key) {\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (currentIndex > 0) items[currentIndex - 1].focus();\r\n break;\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (currentIndex < items.length - 1) items[currentIndex + 1].focus();\r\n break;\r\n case ' ':\r\n case 'Enter':\r\n e.preventDefault();\r\n if (this.selectionMode) {\r\n const index = Number(target.dataset.index);\r\n this._toggleSelection(this._getDisplayData()[index]);\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n private _updateListDisplay(): void {\r\n const listWrapper = this.root.querySelector('.list-wrapper');\r\n if (!listWrapper) {\r\n this.render();\r\n return;\r\n }\r\n const displayData = this._getDisplayData();\r\n const hasSelection = this.selectionMode;\r\n const hasMultipleSelection = this.selectionMode === 'multiple';\r\n const allSelected = hasMultipleSelection && displayData.length > 0 && this._selection.length === displayData.length;\r\n\r\n listWrapper.innerHTML = `\r\n ${hasMultipleSelection && this.showSelectAll ? `\r\n <div class=\"select-all-bar\" part=\"select-all-bar\">\r\n <label>\r\n <input type=\"checkbox\" class=\"select-all-checkbox\"\r\n ${allSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar todos\" />\r\n Selecionar Todos\r\n </label>\r\n <span class=\"selection-count\">${this._selection.length} selecionado(s)</span>\r\n </div>\r\n ` : ''}\r\n <ul class=\"list\" part=\"list\" role=\"listbox\"\r\n aria-multiselectable=\"${hasMultipleSelection}\"\r\n tabindex=\"0\">\r\n ${displayData.length === 0 ? `\r\n <li class=\"empty-message\" part=\"empty-message\">\r\n ${this.filter ? 'Nenhum resultado encontrado' : 'Nenhum item disponivel'}\r\n </li>\r\n ` : displayData.map((item, index) => {\r\n const key = this._getItemKey(item, index);\r\n const label = this._getItemLabel(item);\r\n const isSelected = this._isSelected(item);\r\n const content = this._optionTemplate ? this._optionTemplate(item) : esc(label);\r\n return `\r\n <li class=\"list-item${isSelected ? ' selected' : ''}\" part=\"list-item\"\r\n data-index=\"${index}\" data-key=\"${esc(key)}\"\r\n role=\"option\" aria-selected=\"${isSelected}\"\r\n ${this.dragdrop ? 'draggable=\"true\"' : ''}\r\n tabindex=\"0\">\r\n ${this.dragdrop ? '<span class=\"drag-handle\" part=\"drag-handle\" aria-label=\"Arrastar\">\\u22EE\\u22EE</span>' : ''}\r\n ${hasSelection ? `\r\n <input type=\"checkbox\" class=\"checkbox\" part=\"checkbox\"\r\n ${isSelected ? 'checked' : ''}\r\n aria-label=\"Selecionar ${esc(label)}\" />\r\n ` : ''}\r\n <span class=\"item-content\" part=\"item-content\">${content}</span>\r\n </li>\r\n `;\r\n }).join('')}\r\n </ul>\r\n `;\r\n this._attachListeners();\r\n this._attachItemListeners(this.root.querySelector('.list') as HTMLElement);\r\n }\r\n\r\n\r\n private _handleMoveAction(action: string | undefined): void {\r\n if (!this._selection.length) return;\r\n const displayData = this._getDisplayData();\r\n const selectedIndices = this._selection\r\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\r\n .filter(i => i >= 0)\r\n .sort((a, b) => a - b);\r\n\r\n if (selectedIndices.length === 0) return;\r\n\r\n switch (action) {\r\n case 'top':\r\n this._moveSelectedToStart(selectedIndices);\r\n break;\r\n case 'up':\r\n this._moveSelectedByOne(selectedIndices, -1);\r\n break;\r\n case 'down':\r\n this._moveSelectedByOne(selectedIndices, 1);\r\n break;\r\n case 'bottom':\r\n this._moveSelectedToEnd(selectedIndices);\r\n break;\r\n }\r\n }\r\n\r\n private _moveSelectedToStart(indices: number[]): void {\r\n const items: OrderListItem[] = [];\r\n const actualIndices: number[] = [];\r\n\r\n for (const idx of indices) {\r\n const actualIdx = this._getActualIndex(idx);\r\n items.push(this._data[actualIdx]);\r\n actualIndices.push(actualIdx);\r\n }\r\n\r\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\r\n\r\n const insertIdx = this._getActualIndex(0);\r\n this._data.splice(insertIdx, 0, ...items);\r\n\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _moveSelectedToEnd(indices: number[]): void {\r\n const items: OrderListItem[] = [];\r\n const actualIndices: number[] = [];\r\n\r\n for (const idx of indices) {\r\n const actualIdx = this._getActualIndex(idx);\r\n items.push(this._data[actualIdx]);\r\n actualIndices.push(actualIdx);\r\n }\r\n\r\n actualIndices.sort((a, b) => b - a).forEach(i => this._data.splice(i, 1));\r\n\r\n const displayData = this._getDisplayData();\r\n const insertIdx = this._getActualIndex(displayData.length - 1);\r\n this._data.splice(insertIdx + 1, 0, ...items);\r\n\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _moveSelectedByOne(indices: number[], delta: number): void {\r\n const displayData = this._getDisplayData();\r\n if (displayData.length === 0) return;\r\n\r\n // Get actual indices in _data array and sort them\r\n const actualIndices = indices\r\n .map(idx => this._getActualIndex(idx))\r\n .filter(idx => idx >= 0)\r\n .sort((a, b) => a - b);\r\n\r\n if (actualIndices.length === 0) return;\r\n\r\n // Check if movement is possible\r\n if (delta < 0 && actualIndices[0] <= 0) return;\r\n if (delta > 0 && actualIndices[actualIndices.length - 1] >= this._data.length - 1) return;\r\n\r\n // Extract selected items in order\r\n const selectedItems = actualIndices.map(idx => this._data[idx]);\r\n\r\n // Remove selected items from data (from highest to lowest to preserve indices)\r\n for (let i = actualIndices.length - 1; i >= 0; i--) {\r\n this._data.splice(actualIndices[i], 1);\r\n }\r\n\r\n // Calculate new insertion point\r\n let insertIndex: number;\r\n if (delta < 0) {\r\n // Moving up: insert before the first selected item position\r\n insertIndex = actualIndices[0] - 1;\r\n } else {\r\n // Moving down: insert after the last selected item position\r\n // Since we removed items, we need to adjust\r\n insertIndex = actualIndices[actualIndices.length - 1] - actualIndices.length + 1 + 1;\r\n }\r\n\r\n // Ensure insertIndex is within bounds\r\n insertIndex = Math.max(0, Math.min(insertIndex, this._data.length));\r\n\r\n // Insert items at new position\r\n this._data.splice(insertIndex, 0, ...selectedItems);\r\n\r\n this._applyFilter();\r\n this._updateListDisplay();\r\n this._updateControlsState();\r\n this._emitReorder();\r\n }\r\n\r\n private _updateControlsState(): void {\r\n const displayData = this._getDisplayData();\r\n const selectedIndices = this._selection\r\n .map(s => displayData.findIndex(d => this._getItemKey(d, -1) === this._getItemKey(s, -1)))\r\n .filter(i => i >= 0);\r\n\r\n const buttons = this.root.querySelectorAll<HTMLButtonElement>('.control-btn');\r\n buttons.forEach(btn => {\r\n const action = btn.dataset.action;\r\n let disabled = selectedIndices.length === 0;\r\n\r\n if (!disabled) {\r\n switch (action) {\r\n case 'top':\r\n case 'up':\r\n disabled = selectedIndices[0] === 0;\r\n break;\r\n case 'bottom':\r\n case 'down':\r\n disabled = selectedIndices[selectedIndices.length - 1] === displayData.length - 1;\r\n break;\r\n }\r\n }\r\n\r\n btn.disabled = disabled;\r\n });\r\n }\r\n}\r\n\r\nfunction esc(s: string): string {\r\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\r\n}\r\n\r\nexport function defineFxOrderList(): typeof FxOrderList {\r\n return defineElement('fx-orderlist', FxOrderList);\r\n}"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,10 @@ export declare class FxTabPanel extends FxElement {
|
|
|
28
28
|
static styles: string;
|
|
29
29
|
static get observedAttributes(): string[];
|
|
30
30
|
get tab(): string;
|
|
31
|
+
/** Setter necessário: o Vue (patchDOMProp) seta `tab` como PROPRIEDADE
|
|
32
|
+
* (pois o getter existe no prototype) — sem ele o atributo nunca é
|
|
33
|
+
* aplicado e o painel nunca é exibido. */
|
|
34
|
+
set tab(value: string);
|
|
31
35
|
get visible(): boolean;
|
|
32
36
|
set visible(value: boolean);
|
|
33
37
|
protected render(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;;;;;;GAYG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACnC,OAAgB,MAAM,SAmDpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,KAAK,IAAI,MAAM,CAAkC;IACrD,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAwC;cAE5C,MAAM,IAAI,IAAI;IAwCjC,2EAA2E;IAC3E,OAAO,KAAK,MAAM,GAWjB;CACF;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,SAGpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,GAAG,IAAI,MAAM,CAAgC;
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;;;;;;GAYG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACnC,OAAgB,MAAM,SAmDpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,KAAK,IAAI,MAAM,CAAkC;IACrD,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAwC;cAE5C,MAAM,IAAI,IAAI;IAwCjC,2EAA2E;IAC3E,OAAO,KAAK,MAAM,GAWjB;CACF;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,SAGpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,GAAG,IAAI,MAAM,CAAgC;IACjD;;+CAE2C;IAC3C,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,EAAsC;IAE3D,IAAI,OAAO,IAAI,OAAO,CAAoC;IAC1D,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAwC;cAE/C,MAAM,IAAI,IAAI;IAqBjC,OAAO,CAAC,YAAY,CAAS;CAC9B;AAED,wBAAgB,YAAY,IAAI,OAAO,MAAM,CAE5C;AACD,wBAAgB,gBAAgB,IAAI,OAAO,UAAU,CAEpD"}
|
|
@@ -119,6 +119,12 @@ const _FxTabPanel = class _FxTabPanel extends FxElement {
|
|
|
119
119
|
get tab() {
|
|
120
120
|
return this.getAttr("tab");
|
|
121
121
|
}
|
|
122
|
+
/** Setter necessário: o Vue (patchDOMProp) seta `tab` como PROPRIEDADE
|
|
123
|
+
* (pois o getter existe no prototype) — sem ele o atributo nunca é
|
|
124
|
+
* aplicado e o painel nunca é exibido. */
|
|
125
|
+
set tab(value) {
|
|
126
|
+
this.setAttribute("tab", value);
|
|
127
|
+
}
|
|
122
128
|
get visible() {
|
|
123
129
|
return !this.hasAttr("hidden");
|
|
124
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sources":["../../../src/components/tabs/tabs.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-tabs> — Navegação por abas.\n *\n * Atributos: value (aba ativa, corresponde ao attr `tab` de cada fx-tab-panel).\n * Uso:\n * <fx-tabs value=\"a\">\n * <fx-tab tab=\"a\">Aba A</fx-tab>\n * <fx-tab tab=\"b\">Aba B</fx-tab>\n * </fx-tabs>\n * <fx-tab-panel tab=\"a\">…</fx-tab-panel>\n * <fx-tab-panel tab=\"b\">…</fx-tab-panel>\n * Evento: `change` (composed, detail: { value }).\n */\nexport class FxTabs extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n }\n .list {\n display: flex;\n gap: var(--fx-space-xs);\n border-bottom: 2px solid var(--fx-border-default);\n }\n .tab {\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: var(--fx-font-size);\n color: var(--fx-text-muted);\n padding: var(--fx-space-md) var(--fx-space-lg);\n cursor: pointer;\n position: relative;\n transition: color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .tab::after {\n content: '';\n position: absolute;\n left: 0; right: 0; bottom: -2px;\n height: 2px;\n background: transparent;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .tab:hover { color: var(--fx-text-default); }\n .tab[data-disabled] {\n color: var(--fx-border-default);\n cursor: not-allowed;\n opacity: 0.6;\n }\n .tab[data-disabled]:hover { color: var(--fx-border-default); }\n .tab[aria-selected='true'] {\n color: var(--fx-color-primary);\n font-weight: 600;\n }\n .tab[aria-selected='true']::after { background: var(--fx-color-primary); }\n .tab:focus-visible {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n border-radius: var(--fx-radius-sm);\n }\n /* Os <fx-tab> originais são renderizados como botões no shadow DOM.\n Sem isto, o <slot> os projetaria de novo como texto cru abaixo das abas. */\n ::slotted(fx-tab) {\n display: none !important;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value'];\n }\n\n get value(): string { return this.getAttr('value'); }\n set value(value: string) { this.setAttribute('value', value); }\n\n protected override render(): void {\n const tabs = Array.from(this.querySelectorAll<HTMLElement>('fx-tab'));\n const active = this.value || tabs[0]?.getAttribute('tab') || '';\n\n this.setTemplate(`\n <div class=\"list\" role=\"tablist\">\n ${tabs.map((t) => {\n const tabId = t.getAttribute('tab') ?? '';\n const disabled = t.hasAttribute('disabled');\n return `<button type=\"button\" class=\"tab\" role=\"tab\" part=\"tab\"\n data-tab=\"${tabId}\" aria-selected=\"${tabId === active}\"\n ${disabled ? 'aria-disabled=\"true\" data-disabled=\"true\"' : ''}>${t.textContent?.trim()}</button>`;\n }).join('')}\n </div>\n <slot></slot>\n `);\n\n // Sincroniza apenas os painéis DESTE conjunto de abas\n // (dentro do host ou irmãos seguintes — nunca global).\n // IMPORTANTE: manipula o atributo `hidden` DIRETAMENTE (nunca a\n // propriedade `.visible`), porque escrever a propriedade em um\n // elemento ainda não upgradeado cria uma own property que faz\n // shadowing dos accessors do prototype para sempre.\n this.panels.forEach((p) => {\n const show = p.getAttribute('tab') === active;\n if (show) p.removeAttribute('hidden');\n else p.setAttribute('hidden', '');\n });\n\n this.root.querySelectorAll<HTMLButtonElement>('.tab').forEach((btn) => {\n btn.addEventListener('click', () => {\n if (btn.hasAttribute('data-disabled')) return;\n this.value = btn.dataset.tab ?? '';\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n });\n }\n\n /** Painéis associados: descendentes do host ou irmãos seguintes no DOM. */\n private get panels(): FxTabPanel[] {\n const inside = Array.from(this.querySelectorAll<FxTabPanel>('fx-tab-panel'));\n if (inside.length) return inside;\n const out: FxTabPanel[] = [];\n let el = this.nextElementSibling;\n while (el && !el.matches('fx-tabs')) {\n if (el.matches('fx-tab-panel')) out.push(el as FxTabPanel);\n else out.push(...Array.from(el.querySelectorAll<FxTabPanel>(':scope > fx-tab-panel')));\n el = el.nextElementSibling;\n }\n return out;\n }\n}\n\n/**\n * <fx-tab-panel> — Painel de conteúdo associado a uma aba.\n */\nexport class FxTabPanel extends FxElement {\n static override styles = css`\n :host { display: block; padding: var(--fx-space-lg) 0; font-family: var(--fx-font-family); color: var(--fx-text-default); }\n :host([hidden]) { display: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['tab'];\n }\n\n get tab(): string { return this.getAttr('tab'); }\n\n get visible(): boolean { return !this.hasAttr('hidden'); }\n set visible(value: boolean) { this.toggleAttr('hidden', !value); }\n\n protected override render(): void {\n this.setTemplate('<slot></slot>');\n if (!this._initialized) {\n // Estado inicial: visível apenas se for a aba ativa do owner.\n // (usa atributo direto — ver comentário em FxTabs.render)\n const owner =\n (this.closest<FxTabs>('fx-tabs')) ??\n (() => {\n let el = this.previousElementSibling;\n while (el) {\n if (el.matches('fx-tabs')) return el as FxTabs;\n el = el.previousElementSibling;\n }\n return null;\n })();\n const active = owner ? (owner.getAttribute('value') || '') : '';\n if (this.getAttribute('tab') !== active) this.setAttribute('hidden', '');\n this._initialized = true;\n }\n }\n\n private _initialized = false;\n}\n\nexport function defineFxTabs(): typeof FxTabs {\n return defineElement('fx-tabs', FxTabs);\n}\nexport function defineFxTabPanel(): typeof FxTabPanel {\n return defineElement('fx-tab-panel', FxTabPanel);\n}\n"],"names":[],"mappings":";;;AAiBO,MAAM,UAAN,MAAM,gBAAe,UAAU;AAAA,EAsDpC,WAAoB,qBAA+B;AACjD,WAAO,CAAC,OAAO;AAAA,EACjB;AAAA,EAEA,IAAI,QAAgB;AAAE,WAAO,KAAK,QAAQ,OAAO;AAAA,EAAG;AAAA,EACpD,IAAI,MAAM,OAAe;AAAE,SAAK,aAAa,SAAS,KAAK;AAAA,EAAG;AAAA,EAE3C,SAAe;AAChC,UAAM,OAAO,MAAM,KAAK,KAAK,iBAA8B,QAAQ,CAAC;AACpE,UAAM,SAAS,KAAK,SAAS,KAAK,CAAC,GAAG,aAAa,KAAK,KAAK;AAE7D,SAAK,YAAY;AAAA;AAAA,UAEX,KAAK,IAAI,CAAC,MAAM;AAChB,YAAM,QAAQ,EAAE,aAAa,KAAK,KAAK;AACvC,YAAM,WAAW,EAAE,aAAa,UAAU;AAC1C,aAAO;AAAA,wBACO,KAAK,oBAAoB,UAAU,MAAM;AAAA,cACnD,WAAW,8CAA8C,EAAE,IAAI,EAAE,aAAa,MAAM;AAAA,IAC1F,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,KAGd;AAQD,SAAK,OAAO,QAAQ,CAAC,MAAM;AACzB,YAAM,OAAO,EAAE,aAAa,KAAK,MAAM;AACvC,UAAI,KAAM,GAAE,gBAAgB,QAAQ;AAAA,UAC/B,GAAE,aAAa,UAAU,EAAE;AAAA,IAClC,CAAC;AAED,SAAK,KAAK,iBAAoC,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACrE,UAAI,iBAAiB,SAAS,MAAM;AAClC,YAAI,IAAI,aAAa,eAAe,EAAG;AACvC,aAAK,QAAQ,IAAI,QAAQ,OAAO;AAChC,aAAK;AAAA,UACH,IAAI,YAAY,UAAU,EAAE,SAAS,MAAM,UAAU,MAAM,QAAQ,EAAE,OAAO,KAAK,MAAA,GAAS;AAAA,QAAA;AAAA,MAE9F,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,IAAY,SAAuB;AACjC,UAAM,SAAS,MAAM,KAAK,KAAK,iBAA6B,cAAc,CAAC;AAC3E,QAAI,OAAO,OAAQ,QAAO;AAC1B,UAAM,MAAoB,CAAA;AAC1B,QAAI,KAAK,KAAK;AACd,WAAO,MAAM,CAAC,GAAG,QAAQ,SAAS,GAAG;AACnC,UAAI,GAAG,QAAQ,cAAc,EAAG,KAAI,KAAK,EAAgB;AAAA,UACpD,KAAI,KAAK,GAAG,MAAM,KAAK,GAAG,iBAA6B,uBAAuB,CAAC,CAAC;AACrF,WAAK,GAAG;AAAA,IACV;AACA,WAAO;AAAA,EACT;AACF;AAjHE,QAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADpB,IAAM,SAAN;AAuHA,MAAM,cAAN,MAAM,oBAAmB,UAAU;AAAA,EAAnC,cAAA;AAAA,UAAA,GAAA,SAAA;
|
|
1
|
+
{"version":3,"file":"tabs.js","sources":["../../../src/components/tabs/tabs.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\n\n/**\n * <fx-tabs> — Navegação por abas.\n *\n * Atributos: value (aba ativa, corresponde ao attr `tab` de cada fx-tab-panel).\n * Uso:\n * <fx-tabs value=\"a\">\n * <fx-tab tab=\"a\">Aba A</fx-tab>\n * <fx-tab tab=\"b\">Aba B</fx-tab>\n * </fx-tabs>\n * <fx-tab-panel tab=\"a\">…</fx-tab-panel>\n * <fx-tab-panel tab=\"b\">…</fx-tab-panel>\n * Evento: `change` (composed, detail: { value }).\n */\nexport class FxTabs extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n }\n .list {\n display: flex;\n gap: var(--fx-space-xs);\n border-bottom: 2px solid var(--fx-border-default);\n }\n .tab {\n border: none;\n background: transparent;\n font-family: inherit;\n font-size: var(--fx-font-size);\n color: var(--fx-text-muted);\n padding: var(--fx-space-md) var(--fx-space-lg);\n cursor: pointer;\n position: relative;\n transition: color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .tab::after {\n content: '';\n position: absolute;\n left: 0; right: 0; bottom: -2px;\n height: 2px;\n background: transparent;\n transition: background var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n .tab:hover { color: var(--fx-text-default); }\n .tab[data-disabled] {\n color: var(--fx-border-default);\n cursor: not-allowed;\n opacity: 0.6;\n }\n .tab[data-disabled]:hover { color: var(--fx-border-default); }\n .tab[aria-selected='true'] {\n color: var(--fx-color-primary);\n font-weight: 600;\n }\n .tab[aria-selected='true']::after { background: var(--fx-color-primary); }\n .tab:focus-visible {\n outline: none;\n box-shadow: var(--fx-effect-focus-ring, none);\n border-radius: var(--fx-radius-sm);\n }\n /* Os <fx-tab> originais são renderizados como botões no shadow DOM.\n Sem isto, o <slot> os projetaria de novo como texto cru abaixo das abas. */\n ::slotted(fx-tab) {\n display: none !important;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['value'];\n }\n\n get value(): string { return this.getAttr('value'); }\n set value(value: string) { this.setAttribute('value', value); }\n\n protected override render(): void {\n const tabs = Array.from(this.querySelectorAll<HTMLElement>('fx-tab'));\n const active = this.value || tabs[0]?.getAttribute('tab') || '';\n\n this.setTemplate(`\n <div class=\"list\" role=\"tablist\">\n ${tabs.map((t) => {\n const tabId = t.getAttribute('tab') ?? '';\n const disabled = t.hasAttribute('disabled');\n return `<button type=\"button\" class=\"tab\" role=\"tab\" part=\"tab\"\n data-tab=\"${tabId}\" aria-selected=\"${tabId === active}\"\n ${disabled ? 'aria-disabled=\"true\" data-disabled=\"true\"' : ''}>${t.textContent?.trim()}</button>`;\n }).join('')}\n </div>\n <slot></slot>\n `);\n\n // Sincroniza apenas os painéis DESTE conjunto de abas\n // (dentro do host ou irmãos seguintes — nunca global).\n // IMPORTANTE: manipula o atributo `hidden` DIRETAMENTE (nunca a\n // propriedade `.visible`), porque escrever a propriedade em um\n // elemento ainda não upgradeado cria uma own property que faz\n // shadowing dos accessors do prototype para sempre.\n this.panels.forEach((p) => {\n const show = p.getAttribute('tab') === active;\n if (show) p.removeAttribute('hidden');\n else p.setAttribute('hidden', '');\n });\n\n this.root.querySelectorAll<HTMLButtonElement>('.tab').forEach((btn) => {\n btn.addEventListener('click', () => {\n if (btn.hasAttribute('data-disabled')) return;\n this.value = btn.dataset.tab ?? '';\n this.dispatchEvent(\n new CustomEvent('change', { bubbles: true, composed: true, detail: { value: this.value } }),\n );\n });\n });\n }\n\n /** Painéis associados: descendentes do host ou irmãos seguintes no DOM. */\n private get panels(): FxTabPanel[] {\n const inside = Array.from(this.querySelectorAll<FxTabPanel>('fx-tab-panel'));\n if (inside.length) return inside;\n const out: FxTabPanel[] = [];\n let el = this.nextElementSibling;\n while (el && !el.matches('fx-tabs')) {\n if (el.matches('fx-tab-panel')) out.push(el as FxTabPanel);\n else out.push(...Array.from(el.querySelectorAll<FxTabPanel>(':scope > fx-tab-panel')));\n el = el.nextElementSibling;\n }\n return out;\n }\n}\n\n/**\n * <fx-tab-panel> — Painel de conteúdo associado a uma aba.\n */\nexport class FxTabPanel extends FxElement {\n static override styles = css`\n :host { display: block; padding: var(--fx-space-lg) 0; font-family: var(--fx-font-family); color: var(--fx-text-default); }\n :host([hidden]) { display: none; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['tab'];\n }\n\n get tab(): string { return this.getAttr('tab'); }\n /** Setter necessário: o Vue (patchDOMProp) seta `tab` como PROPRIEDADE\n * (pois o getter existe no prototype) — sem ele o atributo nunca é\n * aplicado e o painel nunca é exibido. */\n set tab(value: string) { this.setAttribute('tab', value); }\n\n get visible(): boolean { return !this.hasAttr('hidden'); }\n set visible(value: boolean) { this.toggleAttr('hidden', !value); }\n\n protected override render(): void {\n this.setTemplate('<slot></slot>');\n if (!this._initialized) {\n // Estado inicial: visível apenas se for a aba ativa do owner.\n // (usa atributo direto — ver comentário em FxTabs.render)\n const owner =\n (this.closest<FxTabs>('fx-tabs')) ??\n (() => {\n let el = this.previousElementSibling;\n while (el) {\n if (el.matches('fx-tabs')) return el as FxTabs;\n el = el.previousElementSibling;\n }\n return null;\n })();\n const active = owner ? (owner.getAttribute('value') || '') : '';\n if (this.getAttribute('tab') !== active) this.setAttribute('hidden', '');\n this._initialized = true;\n }\n }\n\n private _initialized = false;\n}\n\nexport function defineFxTabs(): typeof FxTabs {\n return defineElement('fx-tabs', FxTabs);\n}\nexport function defineFxTabPanel(): typeof FxTabPanel {\n return defineElement('fx-tab-panel', FxTabPanel);\n}\n"],"names":[],"mappings":"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"}
|
package/dist/fenix-ui.umd.min.js
CHANGED
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
:host([variant='danger']) .badge { background: var(--fx-color-danger); color: #fff; border-color: transparent; }
|
|
131
131
|
:host([variant='info']) .badge { background: var(--fx-color-info); color: #fff; border-color: transparent; }
|
|
132
132
|
:host(:not([round])) .badge { border-radius: var(--fx-radius-sm); }
|
|
133
|
-
`;let D=dt;function
|
|
133
|
+
`;let D=dt;function Jt(){return b("fx-badge",D)}Jt();const ht=class ht extends f{static get observedAttributes(){return["size"]}get size(){const t=this.getAttr("size","md");return t==="sm"||t==="lg"?t:"md"}set size(t){this.setAttribute("size",t)}render(){this.setTemplate('<span class="spinner" part="spinner" role="status" aria-label="Carregando"></span>')}};ht.styles=p`
|
|
134
134
|
:host {
|
|
135
135
|
display: inline-block;
|
|
136
136
|
vertical-align: middle;
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
@media (prefers-reduced-motion: reduce) {
|
|
152
152
|
.spinner { animation-duration: 2.5s; }
|
|
153
153
|
}
|
|
154
|
-
`;let M=ht;function
|
|
154
|
+
`;let M=ht;function Ut(){return b("fx-spinner",M)}Ut();const ut=class ut extends f{static get observedAttributes(){return["size","disabled","placeholder","searchable","clearable","error","success"]}get size(){const t=this.getAttr("size","md");return t==="sm"||t==="lg"?t:"md"}set size(t){this.setAttribute("size",t)}get value(){return this.getAttr("value")}set value(t){this.setAttribute("value",t)}get disabled(){return this.hasAttr("disabled")}set disabled(t){this.toggleAttr("disabled",!!t)}get options(){return[...this.querySelectorAll("option")].map(t=>{var e,r,s,i,a;return{value:(s=(r=t.getAttribute("value"))!=null?r:(e=t.textContent)==null?void 0:e.trim())!=null?s:"",label:(a=(i=t.textContent)==null?void 0:i.trim())!=null?a:""}})}connectedCallback(){super.connectedCallback(),this.observer=new MutationObserver(()=>this.render()),this.observer.observe(this,{childList:!0,subtree:!0,characterData:!0}),this.docListener=t=>{this.hasAttr("open")&&(t.composedPath().includes(this)||(this.removeAttribute("open"),this.render()))},document.addEventListener("click",this.docListener)}disconnectedCallback(){var t;super.disconnectedCallback(),(t=this.observer)==null||t.disconnect(),this.docListener&&document.removeEventListener("click",this.docListener)}select(t){this.value=t,this.removeAttribute("open"),this.render(),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{value:t}}))}render(){var d,g,y,S,k,z,_;const t=this.hasAttr("open"),e=this.root.querySelector(".search"),r=(d=e==null?void 0:e.value)!=null?d:"",s=e!=null&&this.root.activeElement===e,i=s?e.selectionStart:null,a=this.options;let o=this.getAttr("value");if(!o){const x=this.querySelector("option[selected]");o=(S=(y=x==null?void 0:x.getAttribute("value"))!=null?y:(g=x==null?void 0:x.textContent)==null?void 0:g.trim())!=null?S:""}const n=(z=(k=a.find(x=>x.value===o))==null?void 0:k.label)!=null?z:"",c=this.getAttr("placeholder","Selecione…"),u=r?a.filter(x=>x.label.toLowerCase().includes(r.toLowerCase())):a;this.setTemplate(`
|
|
155
155
|
<span class="trigger" part="trigger" role="button" tabindex="${this.disabled?-1:0}" aria-haspopup="listbox" aria-expanded="${t}">
|
|
156
156
|
<span class="${n?"label":"placeholder"}">${n||c}</span>
|
|
157
157
|
<span class="actions">
|
|
@@ -308,7 +308,7 @@
|
|
|
308
308
|
}
|
|
309
309
|
.clear:hover { color: var(--fx-color-danger); }
|
|
310
310
|
.clear[hidden] { display: none; }
|
|
311
|
-
`;let q=ut;function
|
|
311
|
+
`;let q=ut;function Wt(){return b("fx-select",q)}Wt();const pt=class pt extends f{static get observedAttributes(){return["type","size","placeholder","disabled","readonly","min","max","step"]}get size(){const t=this.getAttr("size","md");return t==="sm"||t==="lg"?t:"md"}set size(t){this.setAttribute("size",t)}get value(){return this.getAttr("value")}set value(t){this.setAttribute("value",t)}get disabled(){return this.hasAttr("disabled")}set disabled(t){this.toggleAttr("disabled",!!t)}render(){const t=this.getAttr("type","text"),e=this.getAttr("placeholder"),r=this.hasAttr("readonly"),s=this.hasAttr("disabled"),i=this.getAttr("min"),a=this.getAttr("max"),o=this.getAttr("step");this.setTemplate(`
|
|
312
312
|
${this.hasAttr("clearable")?'<div class="wrap">':""}
|
|
313
313
|
<input class="field" part="input" type="${t}"
|
|
314
314
|
${e?`placeholder="${e}"`:""}
|
|
@@ -1645,10 +1645,10 @@
|
|
|
1645
1645
|
::slotted(fx-tab) {
|
|
1646
1646
|
display: none !important;
|
|
1647
1647
|
}
|
|
1648
|
-
`;let X=St;const zt=class zt extends f{constructor(){super(...arguments),this._initialized=!1}static get observedAttributes(){return["tab"]}get tab(){return this.getAttr("tab")}get visible(){return!this.hasAttr("hidden")}set visible(t){this.toggleAttr("hidden",!t)}render(){var t;if(this.setTemplate("<slot></slot>"),!this._initialized){const e=(t=this.closest("fx-tabs"))!=null?t:(()=>{let s=this.previousElementSibling;for(;s;){if(s.matches("fx-tabs"))return s;s=s.previousElementSibling}return null})(),r=e&&e.getAttribute("value")||"";this.getAttribute("tab")!==r&&this.setAttribute("hidden",""),this._initialized=!0}}};zt.styles=p`
|
|
1648
|
+
`;let X=St;const zt=class zt extends f{constructor(){super(...arguments),this._initialized=!1}static get observedAttributes(){return["tab"]}get tab(){return this.getAttr("tab")}set tab(t){this.setAttribute("tab",t)}get visible(){return!this.hasAttr("hidden")}set visible(t){this.toggleAttr("hidden",!t)}render(){var t;if(this.setTemplate("<slot></slot>"),!this._initialized){const e=(t=this.closest("fx-tabs"))!=null?t:(()=>{let s=this.previousElementSibling;for(;s;){if(s.matches("fx-tabs"))return s;s=s.previousElementSibling}return null})(),r=e&&e.getAttribute("value")||"";this.getAttribute("tab")!==r&&this.setAttribute("hidden",""),this._initialized=!0}}};zt.styles=p`
|
|
1649
1649
|
:host { display: block; padding: var(--fx-space-lg) 0; font-family: var(--fx-font-family); color: var(--fx-text-default); }
|
|
1650
1650
|
:host([hidden]) { display: none; }
|
|
1651
|
-
`;let
|
|
1651
|
+
`;let J=zt;function ge(){return b("fx-tabs",X)}function be(){return b("fx-tab-panel",J)}ge(),be();const $t=class $t extends f{constructor(){super(...arguments),this._done=!1}static get observedAttributes(){return["value","indeterminate","variant","label","hide-label","size"]}get value(){return Number(this.getAttr("value","0"))||0}set value(t){this.setAttribute("value",String(Math.min(100,Math.max(0,t))))}render(){const t=Math.min(100,Math.max(0,this.value)),e=this.hasAttr("indeterminate"),r=this.getAttr("label"),s=!e&&!this.hasAttr("hide-label");this.setTemplate(`
|
|
1652
1652
|
${r?`<div class="caption" part="caption">${r}</div>`:""}
|
|
1653
1653
|
<div class="row">
|
|
1654
1654
|
<div class="track" part="track" role="progressbar"
|
|
@@ -1707,7 +1707,7 @@
|
|
|
1707
1707
|
color: var(--fx-text-muted);
|
|
1708
1708
|
margin-bottom: var(--fx-space-xs);
|
|
1709
1709
|
}
|
|
1710
|
-
`;let
|
|
1710
|
+
`;let U=$t;function xe(){return b("fx-progress",U)}xe();const Et=class Et extends f{static get observedAttributes(){return["variant","width","height","lines"]}render(){const t=this.getAttr("variant","text"),e=this.getAttr("width"),r=this.getAttr("height"),s=`${e?`width:${e};`:""}${r?`height:${r};`:""}`;if(t==="circle"){const a=r||e||"40px",o=s.includes("height")?s:`width:${a};height:${a};`;this.setTemplate(`<div class="bone circle" part="bone" style="${o}"></div>`);return}if(t==="rect"){const a=s||"width:100%;height:80px;";this.setTemplate(`<div class="bone" part="bone" style="${a}"></div>`);return}const i=Number(this.getAttr("lines","3"))||3;this.setTemplate(`
|
|
1711
1711
|
${Array.from({length:i},()=>'<div class="bone text"></div>').join("")}
|
|
1712
1712
|
`)}};Et.styles=p`
|
|
1713
1713
|
:host { display: block; width: 100%; min-width: 80px; font-family: var(--fx-font-family); }
|
|
@@ -1727,7 +1727,7 @@
|
|
|
1727
1727
|
.text { height: 12px; width: 100%; margin-bottom: var(--fx-space-sm); }
|
|
1728
1728
|
.text:last-of-type { width: 60%; margin-bottom: 0; }
|
|
1729
1729
|
.circle { border-radius: var(--fx-radius-full); }
|
|
1730
|
-
`;let
|
|
1730
|
+
`;let W=Et;function ve(){return b("fx-skeleton",W)}ve();const Ct=class Ct extends f{static get observedAttributes(){return["variant","title","dismissible"]}render(){var s,i;const t=this.getAttr("variant","info"),e=this.getAttr("title"),r={info:"ℹ",success:"✓",warning:"⚠",danger:"✕"};this.setTemplate(`
|
|
1731
1731
|
<div class="alert" part="alert" role="alert">
|
|
1732
1732
|
<span class="icon">${(s=r[t])!=null?s:"ℹ"}</span>
|
|
1733
1733
|
<div class="content">
|
|
@@ -2003,7 +2003,7 @@
|
|
|
2003
2003
|
}
|
|
2004
2004
|
.info { color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) - 2px); }
|
|
2005
2005
|
select.nav { cursor: pointer; }
|
|
2006
|
-
`;let et=Mt;function Ae(){return b("fx-pagination",et)}Ae();const qt=class qt extends f{static get observedAttributes(){return["size","placeholder","source","disabled","min-chars"]}get size(){const t=this.getAttr("size","md");return t==="sm"||t==="lg"?t:"md"}set size(t){this.setAttribute("size",t)}get value(){return this.getAttr("value")}set value(t){this.setAttribute("value",t)}get source(){try{const t=JSON.parse(this.getAttr("source","[]"));return Array.isArray(t)?t.map(String):[]}catch(t){return[]}}render(){const t=this.getAttr("placeholder");this.setTemplate(`
|
|
2006
|
+
`;let et=Mt;function Ae(){return b("fx-pagination",et)}Ae();const qt=class qt extends f{static get observedAttributes(){return["size","placeholder","source","disabled","min-chars"]}get size(){const t=this.getAttr("size","md");return t==="sm"||t==="lg"?t:"md"}set size(t){this.setAttribute("size",t)}get value(){return this.getAttr("value")}set value(t){this.setAttribute("value",t)}get source(){try{const t=JSON.parse(this.getAttr("source","[]"));return Array.isArray(t)?t.map(String):[]}catch(t){return[]}}set source(t){this.setAttribute("source",typeof t=="string"?t:JSON.stringify(t))}render(){const t=this.getAttr("placeholder");this.setTemplate(`
|
|
2007
2007
|
<input class="field" part="input" type="text"
|
|
2008
2008
|
${t?`placeholder="${t}"`:""} autocomplete="off"/>
|
|
2009
2009
|
<div class="list" part="list" role="listbox"></div>
|
|
@@ -2327,7 +2327,6 @@
|
|
|
2327
2327
|
@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; } }
|
|
2328
2328
|
@keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }
|
|
2329
2329
|
.list-item { animation: slideIn 0.2s ease-out; }
|
|
2330
|
-
@media (prefers-color-scheme: dark) { :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); } }
|
|
2331
2330
|
`;let it=Nt;function E(v){return v.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function ze(){return b("fx-orderlist",it)}ze();const jt=class jt extends f{constructor(){super(...arguments),this._source=[],this._filteredSource=null,this._target=[],this._filteredTarget=null,this._sourceSelection=[],this._targetSelection=[],this._sourceFilterValue="",this._targetFilterValue="",this._filterListenersAttached=!1,this._optionTemplate=null}static get observedAttributes(){return["source","target","source-key","target-key","filter","filter-by","filter-placeholder","dragdrop","striped","selection-mode","show-select-all","source-label","target-label"]}set source(t){this._source=t,this._filteredSource=null,this.render()}get source(){return this._source}set target(t){this._target=t,this._filteredTarget=null,this.render()}get target(){return this._target}set sourceSelection(t){this._sourceSelection=t,this.render()}get sourceSelection(){return this._sourceSelection}set targetSelection(t){this._targetSelection=t,this.render()}get targetSelection(){return this._targetSelection}get sourceKey(){return this.getAttr("source-key","")}set sourceKey(t){this.setAttribute("source-key",t)}get targetKey(){return this.getAttr("target-key","")}set targetKey(t){this.setAttribute("target-key",t)}get filter(){return this.hasAttr("filter")}set filter(t){this.toggleAttr("filter",t)}get filterBy(){return this.getAttr("filter-by","label")}set filterBy(t){this.setAttribute("filter-by",t)}get filterPlaceholder(){return this.getAttr("filter-placeholder","Buscar...")}set filterPlaceholder(t){this.setAttribute("filter-placeholder",t)}get dragdrop(){return this.hasAttr("dragdrop")}set dragdrop(t){this.toggleAttr("dragdrop",t)}get striped(){return this.hasAttr("striped")}set striped(t){this.toggleAttr("striped",t)}get selectionMode(){const t=this.getAttr("selection-mode","");return t==="single"||t==="multiple"?t:""}set selectionMode(t){this.setAttribute("selection-mode",t)}get showSelectAll(){return this.hasAttr("show-select-all")}set showSelectAll(t){this.toggleAttr("show-select-all",t)}get sourceLabel(){return this.getAttr("source-label","Disponíveis")}set sourceLabel(t){this.setAttribute("source-label",t)}get targetLabel(){return this.getAttr("target-label","Selecionados")}set targetLabel(t){this.setAttribute("target-label",t)}get sourceFilterValue(){return this._sourceFilterValue}set sourceFilterValue(t){this._sourceFilterValue=t,this._applySourceFilter(),this._updateListDisplay()}get targetFilterValue(){return this._targetFilterValue}set targetFilterValue(t){this._targetFilterValue=t,this._applyTargetFilter(),this._updateListDisplay()}setOptionTemplate(t){this._optionTemplate=t,this.render()}connectedCallback(){this._parseSourceAttribute(),this._parseTargetAttribute(),super.connectedCallback()}attributeChangedCallback(){this.getAttr("source","")!==""&&this._parseSourceAttribute(),this.getAttr("target","")!==""&&this._parseTargetAttribute(),super.attributeChangedCallback()}_parseSourceAttribute(){const t=this.getAttr("source","");if(t)try{this._source=JSON.parse(t),this._filteredSource=null}catch(e){this._source=[]}}_parseTargetAttribute(){const t=this.getAttr("target","");if(t)try{this._target=JSON.parse(t),this._filteredTarget=null}catch(e){this._target=[]}}_applySourceFilter(){if(!this._sourceFilterValue){this._filteredSource=null;return}const t=this.filterBy.split(",").map(e=>e.trim());this._filteredSource=this._source.filter(e=>t.some(r=>{const s=e[r];return s==null?!1:String(s).toLowerCase().includes(this._sourceFilterValue.toLowerCase())}))}_applyTargetFilter(){if(!this._targetFilterValue){this._filteredTarget=null;return}const t=this.filterBy.split(",").map(e=>e.trim());this._filteredTarget=this._target.filter(e=>t.some(r=>{const s=e[r];return s==null?!1:String(s).toLowerCase().includes(this._targetFilterValue.toLowerCase())}))}_getDisplaySource(){return this._filteredSource||this._source}_getDisplayTarget(){return this._filteredTarget||this._target}_getItemKey(t,e,r){const s=r?this.sourceKey:this.targetKey;return s&&t[s]!=null?String(t[s]):t.id!=null?String(t.id):t.key!=null?String(t.key):t.label!=null?String(t.label):t.name!=null?String(t.name):t.value!=null?String(t.value):String(e)}_getItemLabel(t){const e=["label","name","title","text","value"];for(const r of e)if(t[r]!=null)return String(t[r]);return JSON.stringify(t)}_isSourceSelected(t,e){return this._sourceSelection.some(r=>this._getItemKey(r,-1,!0)===this._getItemKey(t,e,!0))}_isTargetSelected(t,e){return this._targetSelection.some(r=>this._getItemKey(r,-1,!1)===this._getItemKey(t,e,!1))}_emitMoveToTarget(){this.dispatchEvent(new CustomEvent("move-to-target",{bubbles:!0,composed:!0,detail:{items:[...this._sourceSelection],source:[...this._source],target:[...this._target]}}))}_emitMoveToSource(){this.dispatchEvent(new CustomEvent("move-to-source",{bubbles:!0,composed:!0,detail:{items:[...this._targetSelection],source:[...this._source],target:[...this._target]}}))}_emitSelectionChangeSource(){this.dispatchEvent(new CustomEvent("selection-change-source",{bubbles:!0,composed:!0,detail:{selection:[...this._sourceSelection]}}))}_emitSelectionChangeTarget(){this.dispatchEvent(new CustomEvent("selection-change-target",{bubbles:!0,composed:!0,detail:{selection:[...this._targetSelection]}}))}render(){const t=this._getDisplaySource(),e=this._getDisplayTarget(),r=this.selectionMode,s=r==="multiple"&&this.showSelectAll,i=t.length===0?`<li class="empty-message">${this.filter?"Nenhum resultado":"Nenhum item"}</li>`:t.map((c,u)=>`<li class="list-item${this._isSourceSelected(c,u)?" selected":""}" data-index="${u}" data-list="source" tabindex="0">${r?'<input type="checkbox" class="checkbox"'+(this._isSourceSelected(c,u)?" checked":"")+" />":""}<span class="item-content">${this._optionTemplate?this._optionTemplate(c):$(this._getItemLabel(c))}</span></li>`).join(""),a=e.length===0?`<li class="empty-message">${this.filter?"Nenhum resultado":"Nenhum selecionado"}</li>`:e.map((c,u)=>`<li class="list-item${this._isTargetSelected(c,u)?" selected":""}" data-index="${u}" data-list="target" tabindex="0">${r?'<input type="checkbox" class="checkbox"'+(this._isTargetSelected(c,u)?" checked":"")+" />":""}<span class="item-content">${this._optionTemplate?this._optionTemplate(c):$(this._getItemLabel(c))}</span></li>`).join(""),o=s?`<div class="select-all-bar" part="select-all-bar"><label><input type="checkbox" class="select-all-checkbox" data-list="source" ${this._sourceSelection.length>0&&this._sourceSelection.length===this._source.length?"checked":""} aria-label="Selecionar todos da origem" /> Selecionar Todos</label><span class="selection-count">${this._sourceSelection.length} selecionado(s)</span></div>`:"",n=s?`<div class="select-all-bar" part="select-all-bar"><label><input type="checkbox" class="select-all-checkbox" data-list="target" ${this._targetSelection.length>0&&this._targetSelection.length===this._target.length?"checked":""} aria-label="Selecionar todos do destino" /> Selecionar Todos</label><span class="selection-count">${this._targetSelection.length} selecionado(s)</span></div>`:"";this.setTemplate(`<div class="container"><div class="list-container"><div class="list-label">${$(this.sourceLabel)} (${this._source.length})</div>${this.filter?'<div class="filter-wrapper"><input type="text" class="filter-input source-filter" placeholder="'+this.filterPlaceholder+'" value="'+$(this._sourceFilterValue)+'" /></div>':""}${o}<div class="list-wrapper"><ul class="list source-list" role="listbox" tabindex="0">${i}</ul></div></div><div class="controls"><div class="control-group"><button class="control-btn" data-action="move-all-target" part="control-btn" aria-label="Mover todos para destino"><span class="control-btn-icon">»</span></button><button class="control-btn" data-action="move-target" part="control-btn" aria-label="Mover para destino"><span class="control-btn-icon">→</span></button></div><div class="control-group"><button class="control-btn" data-action="move-source" part="control-btn" aria-label="Mover para origem"><span class="control-btn-icon">←</span></button><button class="control-btn" data-action="move-all-source" part="control-btn" aria-label="Mover todos para origem"><span class="control-btn-icon">«</span></button></div></div><div class="list-container"><div class="list-label">${$(this.targetLabel)} (${this._target.length})</div>${this.filter?'<div class="filter-wrapper"><input type="text" class="filter-input target-filter" placeholder="'+this.filterPlaceholder+'" value="'+$(this._targetFilterValue)+'" /></div>':""}${n}<div class="list-wrapper"><ul class="list target-list" role="listbox" tabindex="0">${a}</ul></div></div></div>`),this._attachListeners()}_attachListeners(){this._filterListenersAttached||(this._filterListenersAttached=!0,this.root.addEventListener("input",t=>{const e=t.target;if(e.classList.contains("select-all-checkbox")){this._handleSelectAll(e);return}e.classList.contains("source-filter")?this.sourceFilterValue=e.value:e.classList.contains("target-filter")&&(this.targetFilterValue=e.value)}),this.root.addEventListener("click",t=>{const e=t.target,r=e.closest(".control-btn");if(r){switch(r.dataset.action){case"move-target":this._moveToTarget();break;case"move-all-target":this._moveAllToTarget();break;case"move-source":this._moveToSource();break;case"move-all-source":this._moveAllToSource();break}return}const s=e.closest(".list-item");if(!s)return;const i=s.dataset.list==="source",a=Number(s.dataset.index),o=(i?this._getDisplaySource():this._getDisplayTarget())[a];i?this._toggleSourceSelection(o,a):this._toggleTargetSelection(o,a)})),this._updateControlsState()}_handleSelectAll(t){t.dataset.list==="source"?(this._sourceSelection=t.checked?[...this._getDisplaySource()]:[],this._emitSelectionChangeSource()):(this._targetSelection=t.checked?[...this._getDisplayTarget()]:[],this._emitSelectionChangeTarget()),this._updateSelectionDisplay(),this._updateControlsState()}_updateSelectionDisplay(){const t=(e,r,s)=>{e&&e.querySelectorAll(".list-item").forEach(i=>{const a=Number(i.dataset.index),o=r(s()[a],a);i.classList.toggle("selected",o),i.setAttribute("aria-selected",String(o));const n=i.querySelector(".checkbox");n&&(n.checked=o)})};t(this.root.querySelector(".source-list"),(e,r)=>this._isSourceSelected(e,r),()=>this._getDisplaySource()),t(this.root.querySelector(".target-list"),(e,r)=>this._isTargetSelected(e,r),()=>this._getDisplayTarget()),this._updateSelectAllBars()}_updateSelectAllBars(){if(!(this.selectionMode==="multiple"&&this.showSelectAll))return;[{el:this.root.querySelector('.select-all-checkbox[data-list="source"]'),total:this._source.length,sel:this._sourceSelection.length},{el:this.root.querySelector('.select-all-checkbox[data-list="target"]'),total:this._target.length,sel:this._targetSelection.length}].forEach(({el:e,total:r,sel:s})=>{var a;if(!e)return;e.checked=r>0&&s===r;const i=(a=e.closest(".select-all-bar"))==null?void 0:a.querySelector(".selection-count");i&&(i.textContent=`${s} selecionado(s)`)})}_updateControlsState(){this.root.querySelectorAll(".control-btn").forEach(t=>{const e=t.dataset.action;t.disabled=e==="move-target"&&this._sourceSelection.length===0||e==="move-all-target"&&this._source.length===0||e==="move-source"&&this._targetSelection.length===0||e==="move-all-source"&&this._target.length===0})}_moveToTarget(){if(!this._sourceSelection.length)return;const t=[...this._sourceSelection];this._source=this._source.filter(e=>!t.some(r=>this._getItemKey(r,-1,!0)===this._getItemKey(e,-1,!0))),this._target=[...this._target,...t],this._sourceSelection=[],this._filteredSource=null,this._filteredTarget=null,this._updateListDisplay(),this._updateControlsState(),this._emitMoveToTarget()}_moveToSource(){if(!this._targetSelection.length)return;const t=[...this._targetSelection];this._target=this._target.filter(e=>!t.some(r=>this._getItemKey(r,-1,!1)===this._getItemKey(e,-1,!1))),this._source=[...this._source,...t],this._targetSelection=[],this._filteredSource=null,this._filteredTarget=null,this._updateListDisplay(),this._updateControlsState(),this._emitMoveToSource()}_moveAllToTarget(){const t=[...this._source];this._source=[],this._target=[...this._target,...t],this._sourceSelection=[],this._filteredSource=null,this._filteredTarget=null,this._updateListDisplay(),this._updateControlsState(),this._emitMoveToTarget()}_moveAllToSource(){const t=[...this._target];this._target=[],this._source=[...this._source,...t],this._targetSelection=[],this._filteredSource=null,this._filteredTarget=null,this._updateListDisplay(),this._updateControlsState(),this._emitMoveToSource()}_toggleSourceSelection(t,e){const r=this.selectionMode||"single",s=this._getItemKey(t,e,!0),i=this._sourceSelection.findIndex(a=>this._getItemKey(a,-1,!0)===s);i>=0?this._sourceSelection.splice(i,1):r==="multiple"?this._sourceSelection.push(t):this._sourceSelection=[t],this._emitSelectionChangeSource(),this._updateSelectionDisplay(),this._updateControlsState()}_toggleTargetSelection(t,e){const r=this.selectionMode||"single",s=this._getItemKey(t,e,!1),i=this._targetSelection.findIndex(a=>this._getItemKey(a,-1,!1)===s);i>=0?this._targetSelection.splice(i,1):r==="multiple"?this._targetSelection.push(t):this._targetSelection=[t],this._emitSelectionChangeTarget(),this._updateSelectionDisplay(),this._updateControlsState()}_updateListDisplay(){var u,l;const t=(u=this.root.querySelector(".source-list"))==null?void 0:u.parentElement,e=(l=this.root.querySelector(".target-list"))==null?void 0:l.parentElement,r=this.root.querySelector(".list-container:first-of-type .list-label"),s=this.root.querySelector(".list-container:last-of-type .list-label");if(!t||!e){this.render();return}const i=this._getDisplaySource(),a=this._getDisplayTarget(),o=this.selectionMode,n=i.length===0?`<li class="empty-message" part="empty-message">${this.filter?"Nenhum resultado":"Nenhum item"}</li>`:i.map((h,d)=>`<li class="list-item${this._isSourceSelected(h,d)?" selected":""}" part="list-item" data-index="${d}" data-list="source" role="option" aria-selected="${this._isSourceSelected(h,d)}" tabindex="0">${o?'<input type="checkbox" class="checkbox" part="checkbox"'+(this._isSourceSelected(h,d)?" checked":"")+" />":""}<span class="item-content" part="item-content">${this._optionTemplate?this._optionTemplate(h):$(this._getItemLabel(h))}</span></li>`).join(""),c=a.length===0?`<li class="empty-message" part="empty-message">${this.filter?"Nenhum resultado":"Nenhum selecionado"}</li>`:a.map((h,d)=>`<li class="list-item${this._isTargetSelected(h,d)?" selected":""}" part="list-item" data-index="${d}" data-list="target" role="option" aria-selected="${this._isTargetSelected(h,d)}" tabindex="0">${o?'<input type="checkbox" class="checkbox" part="checkbox"'+(this._isTargetSelected(h,d)?" checked":"")+" />":""}<span class="item-content" part="item-content">${this._optionTemplate?this._optionTemplate(h):$(this._getItemLabel(h))}</span></li>`).join("");t.innerHTML=`<ul class="list source-list" role="listbox" tabindex="0">${n}</ul>`,e.innerHTML=`<ul class="list target-list" role="listbox" tabindex="0">${c}</ul>`,r&&(r.textContent=`${this.sourceLabel} (${this._source.length})`),s&&(s.textContent=`${this.targetLabel} (${this._target.length})`),this._updateSelectAllBars(),this._attachListeners()}};jt.styles=p`
|
|
2332
2331
|
:host {
|
|
2333
2332
|
display: block;
|