@wrrdev/fenix-ui 1.0.16 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/_virtual/preload-helper.js +68 -0
- package/dist/_virtual/preload-helper.js.map +1 -0
- package/dist/assets/base-css-BifSeW2H.js +31 -0
- package/dist/assets/base-css-BifSeW2H.js.map +1 -0
- package/dist/components/alert/alert.d.ts +2 -1
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/alert.js +10 -2
- package/dist/components/alert/alert.js.map +1 -1
- package/dist/components/avatar/avatar.d.ts +21 -0
- package/dist/components/avatar/avatar.d.ts.map +1 -0
- package/dist/components/avatar/avatar.js +91 -0
- package/dist/components/avatar/avatar.js.map +1 -0
- package/dist/components/avatar/index.d.ts +8 -0
- package/dist/components/avatar/index.d.ts.map +1 -0
- package/dist/components/avatar/index.js +7 -0
- package/dist/components/avatar/index.js.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +35 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.js +113 -0
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
- package/dist/components/breadcrumb/index.d.ts +8 -0
- package/dist/components/breadcrumb/index.d.ts.map +1 -0
- package/dist/components/breadcrumb/index.js +7 -0
- package/dist/components/breadcrumb/index.js.map +1 -0
- package/dist/components/card/card.d.ts +15 -0
- package/dist/components/card/card.d.ts.map +1 -0
- package/dist/components/card/card.js +80 -0
- package/dist/components/card/card.js.map +1 -0
- package/dist/components/card/index.d.ts +8 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/card/index.js +7 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/carousel/carousel.d.ts +28 -0
- package/dist/components/carousel/carousel.d.ts.map +1 -0
- package/dist/components/carousel/carousel.js +176 -0
- package/dist/components/carousel/carousel.js.map +1 -0
- package/dist/components/carousel/index.d.ts +8 -0
- package/dist/components/carousel/index.d.ts.map +1 -0
- package/dist/components/carousel/index.js +7 -0
- package/dist/components/carousel/index.js.map +1 -0
- package/dist/components/chip/chip.d.ts +19 -0
- package/dist/components/chip/chip.d.ts.map +1 -0
- package/dist/components/chip/chip.js +126 -0
- package/dist/components/chip/chip.js.map +1 -0
- package/dist/components/chip/index.d.ts +8 -0
- package/dist/components/chip/index.d.ts.map +1 -0
- package/dist/components/chip/index.js +7 -0
- package/dist/components/chip/index.js.map +1 -0
- package/dist/components/confirmpopup/confirmpopup.d.ts +44 -0
- package/dist/components/confirmpopup/confirmpopup.d.ts.map +1 -0
- package/dist/components/confirmpopup/confirmpopup.js +233 -0
- package/dist/components/confirmpopup/confirmpopup.js.map +1 -0
- package/dist/components/confirmpopup/index.d.ts +8 -0
- package/dist/components/confirmpopup/index.d.ts.map +1 -0
- package/dist/components/confirmpopup/index.js +7 -0
- package/dist/components/confirmpopup/index.js.map +1 -0
- package/dist/components/empty-state/empty-state.d.ts +14 -0
- package/dist/components/empty-state/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state/empty-state.js +71 -0
- package/dist/components/empty-state/empty-state.js.map +1 -0
- package/dist/components/empty-state/index.d.ts +8 -0
- package/dist/components/empty-state/index.d.ts.map +1 -0
- package/dist/components/empty-state/index.js +7 -0
- package/dist/components/empty-state/index.js.map +1 -0
- package/dist/components/fileupload/fileupload.d.ts +42 -0
- package/dist/components/fileupload/fileupload.d.ts.map +1 -0
- package/dist/components/fileupload/fileupload.js +284 -0
- package/dist/components/fileupload/fileupload.js.map +1 -0
- package/dist/components/fileupload/index.d.ts +8 -0
- package/dist/components/fileupload/index.d.ts.map +1 -0
- package/dist/components/fileupload/index.js +7 -0
- package/dist/components/fileupload/index.js.map +1 -0
- package/dist/components/menu/index.d.ts +8 -0
- package/dist/components/menu/index.d.ts.map +1 -0
- package/dist/components/menu/index.js +7 -0
- package/dist/components/menu/index.js.map +1 -0
- package/dist/components/menu/menu.d.ts +23 -0
- package/dist/components/menu/menu.d.ts.map +1 -0
- package/dist/components/menu/menu.js +155 -0
- package/dist/components/menu/menu.js.map +1 -0
- package/dist/components/orderlist/orderlist.d.ts +1 -1
- package/dist/components/orderlist/orderlist.d.ts.map +1 -1
- package/dist/components/orderlist/orderlist.js +2 -2
- package/dist/components/orderlist/orderlist.js.map +1 -1
- package/dist/components/password-strength/index.d.ts +8 -0
- package/dist/components/password-strength/index.d.ts.map +1 -0
- package/dist/components/password-strength/index.js +7 -0
- package/dist/components/password-strength/index.js.map +1 -0
- package/dist/components/password-strength/password-strength.d.ts +23 -0
- package/dist/components/password-strength/password-strength.d.ts.map +1 -0
- package/dist/components/password-strength/password-strength.js +109 -0
- package/dist/components/password-strength/password-strength.js.map +1 -0
- package/dist/components/picklist/picklist.d.ts +1 -1
- package/dist/components/picklist/picklist.d.ts.map +1 -1
- package/dist/components/picklist/picklist.js +2 -2
- package/dist/components/picklist/picklist.js.map +1 -1
- package/dist/components/popover/index.d.ts +8 -0
- package/dist/components/popover/index.d.ts.map +1 -0
- package/dist/components/popover/index.js +7 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/popover/popover.d.ts +39 -0
- package/dist/components/popover/popover.d.ts.map +1 -0
- package/dist/components/popover/popover.js +228 -0
- package/dist/components/popover/popover.js.map +1 -0
- package/dist/components/rating/index.d.ts +8 -0
- package/dist/components/rating/index.d.ts.map +1 -0
- package/dist/components/rating/index.js +7 -0
- package/dist/components/rating/index.js.map +1 -0
- package/dist/components/rating/rating.d.ts +25 -0
- package/dist/components/rating/rating.d.ts.map +1 -0
- package/dist/components/rating/rating.js +119 -0
- package/dist/components/rating/rating.js.map +1 -0
- package/dist/components/slider/index.d.ts +8 -0
- package/dist/components/slider/index.d.ts.map +1 -0
- package/dist/components/slider/index.js +7 -0
- package/dist/components/slider/index.js.map +1 -0
- package/dist/components/slider/slider.d.ts +33 -0
- package/dist/components/slider/slider.d.ts.map +1 -0
- package/dist/components/slider/slider.js +260 -0
- package/dist/components/slider/slider.js.map +1 -0
- package/dist/components/stepper/index.d.ts +8 -0
- package/dist/components/stepper/index.d.ts.map +1 -0
- package/dist/components/stepper/index.js +7 -0
- package/dist/components/stepper/index.js.map +1 -0
- package/dist/components/stepper/stepper.d.ts +33 -0
- package/dist/components/stepper/stepper.d.ts.map +1 -0
- package/dist/components/stepper/stepper.js +162 -0
- package/dist/components/stepper/stepper.js.map +1 -0
- package/dist/components/timeline/index.d.ts +8 -0
- package/dist/components/timeline/index.d.ts.map +1 -0
- package/dist/components/timeline/index.js +7 -0
- package/dist/components/timeline/index.js.map +1 -0
- package/dist/components/timeline/timeline.d.ts +30 -0
- package/dist/components/timeline/timeline.d.ts.map +1 -0
- package/dist/components/timeline/timeline.js +146 -0
- package/dist/components/timeline/timeline.js.map +1 -0
- package/dist/components/toast/toast.d.ts.map +1 -1
- package/dist/components/toast/toast.js +21 -2
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toggle-button-group/index.d.ts +8 -0
- package/dist/components/toggle-button-group/index.d.ts.map +1 -0
- package/dist/components/toggle-button-group/index.js +7 -0
- package/dist/components/toggle-button-group/index.js.map +1 -0
- package/dist/components/toggle-button-group/toggle-button-group.d.ts +21 -0
- package/dist/components/toggle-button-group/toggle-button-group.d.ts.map +1 -0
- package/dist/components/toggle-button-group/toggle-button-group.js +103 -0
- package/dist/components/toggle-button-group/toggle-button-group.js.map +1 -0
- package/dist/components/tree/index.d.ts +8 -0
- package/dist/components/tree/index.d.ts.map +1 -0
- package/dist/components/tree/index.js +7 -0
- package/dist/components/tree/index.js.map +1 -0
- package/dist/components/tree/tree.d.ts +34 -0
- package/dist/components/tree/tree.d.ts.map +1 -0
- package/dist/components/tree/tree.js +149 -0
- package/dist/components/tree/tree.js.map +1 -0
- package/dist/core/base.d.ts +1 -1
- package/dist/core/base.d.ts.map +1 -1
- package/dist/core/base.js +1 -1
- package/dist/core/base.js.map +1 -1
- package/dist/docs/app.d.ts.map +1 -1
- package/dist/docs/componentes/avatar.doc.d.ts +6 -0
- package/dist/docs/componentes/avatar.doc.d.ts.map +1 -0
- package/dist/docs/componentes/breadcrumb.doc.d.ts +6 -0
- package/dist/docs/componentes/breadcrumb.doc.d.ts.map +1 -0
- package/dist/docs/componentes/card.doc.d.ts +6 -0
- package/dist/docs/componentes/card.doc.d.ts.map +1 -0
- package/dist/docs/componentes/carousel.doc.d.ts +6 -0
- package/dist/docs/componentes/carousel.doc.d.ts.map +1 -0
- package/dist/docs/componentes/chip.doc.d.ts +6 -0
- package/dist/docs/componentes/chip.doc.d.ts.map +1 -0
- package/dist/docs/componentes/confirmpopup.doc.d.ts +6 -0
- package/dist/docs/componentes/confirmpopup.doc.d.ts.map +1 -0
- package/dist/docs/componentes/empty-state.doc.d.ts +6 -0
- package/dist/docs/componentes/empty-state.doc.d.ts.map +1 -0
- package/dist/docs/componentes/fileupload.doc.d.ts +6 -0
- package/dist/docs/componentes/fileupload.doc.d.ts.map +1 -0
- package/dist/docs/componentes/index.d.ts.map +1 -1
- package/dist/docs/componentes/menu.doc.d.ts +6 -0
- package/dist/docs/componentes/menu.doc.d.ts.map +1 -0
- package/dist/docs/componentes/password-strength.doc.d.ts +6 -0
- package/dist/docs/componentes/password-strength.doc.d.ts.map +1 -0
- package/dist/docs/componentes/popover.doc.d.ts +6 -0
- package/dist/docs/componentes/popover.doc.d.ts.map +1 -0
- package/dist/docs/componentes/rating.doc.d.ts +6 -0
- package/dist/docs/componentes/rating.doc.d.ts.map +1 -0
- package/dist/docs/componentes/slider.doc.d.ts +6 -0
- package/dist/docs/componentes/slider.doc.d.ts.map +1 -0
- package/dist/docs/componentes/stepper.doc.d.ts +6 -0
- package/dist/docs/componentes/stepper.doc.d.ts.map +1 -0
- package/dist/docs/componentes/timeline.doc.d.ts +6 -0
- package/dist/docs/componentes/timeline.doc.d.ts.map +1 -0
- package/dist/docs/componentes/toggle-button-group.doc.d.ts +6 -0
- package/dist/docs/componentes/toggle-button-group.doc.d.ts.map +1 -0
- package/dist/docs/componentes/tree.doc.d.ts +6 -0
- package/dist/docs/componentes/tree.doc.d.ts.map +1 -0
- package/dist/fenix-icons.woff2 +0 -0
- package/dist/fenix-ui.umd.min.js +1317 -160
- package/dist/fenix-ui2.esm.js +4317 -7816
- package/dist/fenix-ui2.esm.js.map +1 -1
- package/dist/fenix-ui3.esm.js +10396 -84
- package/dist/fenix-ui3.esm.js.map +1 -1
- package/dist/fenix-ui4.esm.js +110 -0
- package/dist/fenix-ui4.esm.js.map +1 -0
- package/dist/icons/base-css.d.ts +21 -0
- package/dist/icons/base-css.d.ts.map +1 -0
- package/dist/icons/base-css.js +32 -0
- package/dist/icons/base-css.js.map +1 -0
- package/dist/icons/fenix-icons.woff2 +0 -0
- package/dist/icons/index.d.ts +31 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +47 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/names.d.ts +11 -0
- package/dist/icons/names.d.ts.map +1 -0
- package/dist/icons/names.js +4283 -0
- package/dist/icons/names.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -1
- package/dist/plugins/auto-import.d.ts +2 -0
- package/dist/plugins/auto-import.d.ts.map +1 -1
- package/dist/plugins/auto-import.js +23 -0
- package/dist/plugins/auto-import.js.map +1 -1
- package/package.json +74 -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.1.0**, 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.1.0):
|
|
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
|
-->
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const scriptRel = "modulepreload";
|
|
2
|
+
const assetsURL = function(dep) {
|
|
3
|
+
return "/" + dep;
|
|
4
|
+
};
|
|
5
|
+
const seen = {};
|
|
6
|
+
const __vitePreload = function preload(baseModule, deps, importerUrl) {
|
|
7
|
+
let promise = Promise.resolve();
|
|
8
|
+
if (deps && deps.length > 0) {
|
|
9
|
+
document.getElementsByTagName("link");
|
|
10
|
+
const cspNonceMeta = document.querySelector(
|
|
11
|
+
"meta[property=csp-nonce]"
|
|
12
|
+
);
|
|
13
|
+
const cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce");
|
|
14
|
+
promise = Promise.allSettled(
|
|
15
|
+
deps.map((dep) => {
|
|
16
|
+
dep = assetsURL(dep);
|
|
17
|
+
if (dep in seen) return;
|
|
18
|
+
seen[dep] = true;
|
|
19
|
+
const isCss = dep.endsWith(".css");
|
|
20
|
+
const cssSelector = isCss ? '[rel="stylesheet"]' : "";
|
|
21
|
+
if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const link = document.createElement("link");
|
|
25
|
+
link.rel = isCss ? "stylesheet" : scriptRel;
|
|
26
|
+
if (!isCss) {
|
|
27
|
+
link.as = "script";
|
|
28
|
+
}
|
|
29
|
+
link.crossOrigin = "";
|
|
30
|
+
link.href = dep;
|
|
31
|
+
if (cspNonce) {
|
|
32
|
+
link.setAttribute("nonce", cspNonce);
|
|
33
|
+
}
|
|
34
|
+
document.head.appendChild(link);
|
|
35
|
+
if (isCss) {
|
|
36
|
+
return new Promise((res, rej) => {
|
|
37
|
+
link.addEventListener("load", res);
|
|
38
|
+
link.addEventListener(
|
|
39
|
+
"error",
|
|
40
|
+
() => rej(new Error(`Unable to preload CSS for ${dep}`))
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
function handlePreloadError(err) {
|
|
48
|
+
const e = new Event("vite:preloadError", {
|
|
49
|
+
cancelable: true
|
|
50
|
+
});
|
|
51
|
+
e.payload = err;
|
|
52
|
+
window.dispatchEvent(e);
|
|
53
|
+
if (!e.defaultPrevented) {
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return promise.then((res) => {
|
|
58
|
+
for (const item of res || []) {
|
|
59
|
+
if (item.status !== "rejected") continue;
|
|
60
|
+
handlePreloadError(item.reason);
|
|
61
|
+
}
|
|
62
|
+
return baseModule().catch(handlePreloadError);
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
export {
|
|
66
|
+
__vitePreload
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=preload-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload-helper.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const FENIX_ICON_FONT_FAMILY = "Fenix Icons";
|
|
2
|
+
const FENIX_ICON_FONT_VAR = `var(--fx-icon-font, ${FENIX_ICON_FONT_FAMILY})`;
|
|
3
|
+
const FENIX_ICON_BASE_CSS = `
|
|
4
|
+
.fx-icon {
|
|
5
|
+
font-family: ${FENIX_ICON_FONT_VAR};
|
|
6
|
+
font-weight: normal;
|
|
7
|
+
font-style: normal;
|
|
8
|
+
line-height: 1;
|
|
9
|
+
letter-spacing: normal;
|
|
10
|
+
text-transform: none;
|
|
11
|
+
display: inline-block;
|
|
12
|
+
white-space: nowrap;
|
|
13
|
+
word-wrap: normal;
|
|
14
|
+
direction: ltr;
|
|
15
|
+
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
|
|
16
|
+
-webkit-font-smoothing: antialiased;
|
|
17
|
+
text-rendering: optimizeLegibility;
|
|
18
|
+
user-select: none;
|
|
19
|
+
}
|
|
20
|
+
.fx-icon.fx-icon-fill { font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24; }
|
|
21
|
+
.fx-icon.fx-icon-bold { font-variation-settings: 'FILL' 0, 'wght' 600, 'GRAD' 0, 'opsz' 24; }
|
|
22
|
+
`;
|
|
23
|
+
function isFenixIconName(value) {
|
|
24
|
+
return /^[a-z][a-z0-9_]*$/.test(value.trim());
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
FENIX_ICON_FONT_FAMILY as F,
|
|
28
|
+
FENIX_ICON_BASE_CSS as a,
|
|
29
|
+
isFenixIconName as i
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=base-css-BifSeW2H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-css-BifSeW2H.js","sources":["../../src/icons/base-css.ts"],"sourcesContent":["/**\n * CSS base da biblioteca de ícones — módulo LEVE (não importa a lista de nomes\n * nem dispara o carregamento da fonte). Usado dentro dos Shadow DOMs dos\n * componentes que suportam o atributo `icon`.\n *\n * O @font-face em si é injetado no <head> por `@wrrdev/fenix-ui/icons`\n * (ver ./index.ts) — @font-face registrado no documento também se aplica\n * dentro dos Shadow DOMs.\n */\n\n/** Nome da família de fontes dos ícones (self-hosted, sem dependência externa). */\nexport const FENIX_ICON_FONT_FAMILY = 'Fenix Icons';\n\n/** Família configurável via CSS custom property (fallback para o nome padrão). */\nexport const FENIX_ICON_FONT_VAR = `var(--fx-icon-font, ${FENIX_ICON_FONT_FAMILY})`;\n\n/**\n * Regras da classe `.fx-icon` para uso DENTRO de Shadow DOM\n * (concatene às `static styles` do componente).\n */\nexport const FENIX_ICON_BASE_CSS = `\n.fx-icon {\n font-family: ${FENIX_ICON_FONT_VAR};\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n word-wrap: normal;\n direction: ltr;\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n user-select: none;\n}\n.fx-icon.fx-icon-fill { font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24; }\n.fx-icon.fx-icon-bold { font-variation-settings: 'FILL' 0, 'wght' 600, 'GRAD' 0, 'opsz' 24; }\n`;\n\n/** Verifica se o valor parece um nome de ícone da Fenix Icons (e não emoji/texto livre). */\nexport function isFenixIconName(value: string): boolean {\n return /^[a-z][a-z0-9_]*$/.test(value.trim());\n}\n"],"names":[],"mappings":"AAWO,MAAM,yBAAyB;AAG/B,MAAM,sBAAsB,uBAAuB,sBAAsB;AAMzE,MAAM,sBAAsB;AAAA;AAAA,iBAElB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoB7B,SAAS,gBAAgB,OAAwB;AACtD,SAAO,oBAAoB,KAAK,MAAM,KAAA,CAAM;AAC9C;"}
|
|
@@ -2,7 +2,8 @@ import { FxElement } from '../../core/base';
|
|
|
2
2
|
/**
|
|
3
3
|
* <fx-alert> — Aviso inline com variantes semânticas.
|
|
4
4
|
*
|
|
5
|
-
* Atributos: variant (info|success|warning|danger, padrão info), title, dismissible
|
|
5
|
+
* Atributos: variant (info|success|warning|danger, padrão info), title, dismissible,
|
|
6
|
+
* icon (nome da Fenix Icons, ex.: icon="notification" — substitui o glifo padrão).
|
|
6
7
|
* Slot padrão: conteúdo da mensagem. Evento `dismiss`.
|
|
7
8
|
*/
|
|
8
9
|
export declare class FxAlert extends FxElement {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/alert/alert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/alert/alert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAM5C;;;;;;GAMG;AACH,qBAAa,OAAQ,SAAQ,SAAS;IACpC,OAAgB,MAAM,SAmCpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;cAEkB,MAAM,IAAI,IAAI;CA4BlC;AAED,wBAAgB,aAAa,IAAI,OAAO,OAAO,CAE9C"}
|
|
@@ -1,23 +1,29 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["icons/index.js","icons/names.js","icons/base-css.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import { __vitePreload } from "../../_virtual/preload-helper.js";
|
|
1
3
|
import { FxElement } from "../../core/base.js";
|
|
2
4
|
import { css } from "../../core/css.js";
|
|
3
5
|
import { defineElement } from "../../core/define.js";
|
|
4
6
|
import { esc } from "../../core/sanitize.js";
|
|
7
|
+
import { FENIX_ICON_BASE_CSS, isFenixIconName } from "../../icons/base-css.js";
|
|
5
8
|
const _FxAlert = class _FxAlert extends FxElement {
|
|
6
9
|
static get observedAttributes() {
|
|
7
|
-
return ["variant", "title", "dismissible"];
|
|
10
|
+
return ["variant", "title", "dismissible", "icon"];
|
|
8
11
|
}
|
|
9
12
|
render() {
|
|
10
13
|
const variant = this.getAttr("variant", "info");
|
|
11
14
|
const title = this.getAttr("title");
|
|
15
|
+
const iconName = this.getAttr("icon");
|
|
16
|
+
if (isFenixIconName(iconName)) void __vitePreload(() => import("../../icons/index.js"), true ? __vite__mapDeps([0,1,2]) : void 0);
|
|
12
17
|
const icons = {
|
|
13
18
|
info: "ℹ",
|
|
14
19
|
success: "✓",
|
|
15
20
|
warning: "⚠",
|
|
16
21
|
danger: "✕"
|
|
17
22
|
};
|
|
23
|
+
const iconHtml = iconName ? `<span class="icon${isFenixIconName(iconName) ? " fx-icon" : ""}" part="icon" aria-hidden="true">${esc(iconName)}</span>` : `<span class="icon">${icons[variant] ?? "ℹ"}</span>`;
|
|
18
24
|
this.setTemplate(`
|
|
19
25
|
<div class="alert" part="alert" role="alert">
|
|
20
|
-
|
|
26
|
+
${iconHtml}
|
|
21
27
|
<div class="content">
|
|
22
28
|
${title ? `<div class="title">${esc(title)}</div>` : ""}
|
|
23
29
|
<div class="body"><slot></slot></div>
|
|
@@ -55,6 +61,8 @@ _FxAlert.styles = css`
|
|
|
55
61
|
}
|
|
56
62
|
:host([hidden]) { display: none; }
|
|
57
63
|
.icon { color: var(--_color); font-weight: bold; line-height: 1.4; }
|
|
64
|
+
${FENIX_ICON_BASE_CSS}
|
|
65
|
+
.icon.fx-icon { font-size: 20px; line-height: 1.2; }
|
|
58
66
|
.content { flex: 1; }
|
|
59
67
|
.title { font-weight: 600; }
|
|
60
68
|
.body { margin-top: 2px; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"mappings":";;;;;;;AAaO,MAAM,WAAN,MAAM,iBAAgB,UAAU;AAAA,EAsCrC,WAAoB,qBAA+B;AACjD,WAAO,CAAC,WAAW,SAAS,eAAe,MAAM;AAAA,EACnD;AAAA,EAEmB,SAAe;AAChC,UAAM,UAAU,KAAK,QAAQ,WAAW,MAAM;AAC9C,UAAM,QAAQ,KAAK,QAAQ,OAAO;AAClC,UAAM,WAAW,KAAK,QAAQ,MAAM;AACpC,QAAI,gBAAgB,QAAQ,EAAG,0BAAK,OAAO,sBAAa;AACxD,UAAM,QAAgC;AAAA,MACpC,MAAM;AAAA,MAAK,SAAS;AAAA,MAAK,SAAS;AAAA,MAAK,QAAQ;AAAA;AAEjD,UAAM,WAAW,WACb,oBAAoB,gBAAgB,QAAQ,IAAI,aAAa,EAAE,oCAAoC,IAAI,QAAQ,CAAC,YAChH,sBAAsB,MAAM,OAAO,KAAK,GAAG;AAE/C,SAAK,YAAY;AAAA;AAAA,UAEX,QAAQ;AAAA;AAAA,YAEN,QAAQ,sBAAsB,IAAI,KAAK,CAAC,WAAW,EAAE;AAAA;AAAA;AAAA,UAGvD,KAAK,QAAQ,aAAa,IAAI,uEAAuE,EAAE;AAAA;AAAA,KAE5G;AAED,SAAK,KAAK,cAAc,QAAQ,GAAG,iBAAiB,SAAS,MAAM;AACjE,WAAK,SAAS;AACd,WAAK,cAAc,IAAI,YAAY,WAAW,EAAE,SAAS,MAAM,UAAU,MAAM,CAAC;AAAA,IAClF,CAAC;AAAA,EACH;AACF;AArEE,SAAgB,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,MAwBrB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzBlB,IAAM,UAAN;AAwEA,SAAS,gBAAgC;AAC9C,SAAO,cAAc,YAAY,OAAO;AAC1C","names":[],"ignoreList":[],"sources":["../../../src/components/alert/alert.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\nimport { FENIX_ICON_BASE_CSS, isFenixIconName } from '../../icons/base-css';\n\n/**\n * <fx-alert> — Aviso inline com variantes semânticas.\n *\n * Atributos: variant (info|success|warning|danger, padrão info), title, dismissible,\n * icon (nome da Fenix Icons, ex.: icon=\"notification\" — substitui o glifo padrão).\n * Slot padrão: conteúdo da mensagem. Evento `dismiss`.\n */\nexport class FxAlert extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n --_color: var(--fx-color-primary);\n --_bg: color-mix(in srgb, var(--fx-color-primary) 10%, var(--fx-surface-background));\n }\n :host([variant='info']) { --_color: var(--fx-color-info); --_bg: color-mix(in srgb, var(--fx-color-info) 10%, var(--fx-surface-background)); }\n :host([variant='success']) { --_color: var(--fx-color-success); --_bg: color-mix(in srgb, var(--fx-color-success) 10%, var(--fx-surface-background)); }\n :host([variant='warning']) { --_color: var(--fx-color-warning); --_bg: color-mix(in srgb, var(--fx-color-warning) 12%, var(--fx-surface-background)); }\n :host([variant='danger']) { --_color: var(--fx-color-danger); --_bg: color-mix(in srgb, var(--fx-color-danger) 10%, var(--fx-surface-background)); }\n .alert {\n display: flex;\n align-items: flex-start;\n gap: var(--fx-space-md);\n background: var(--_bg);\n border: 1px solid color-mix(in srgb, var(--_color) 30%, transparent);\n border-radius: var(--fx-radius-md);\n padding: var(--fx-space-md) var(--fx-space-lg);\n font-size: var(--fx-font-size);\n color: var(--fx-text-default);\n }\n :host([hidden]) { display: none; }\n .icon { color: var(--_color); font-weight: bold; line-height: 1.4; }\n ${FENIX_ICON_BASE_CSS}\n .icon.fx-icon { font-size: 20px; line-height: 1.2; }\n .content { flex: 1; }\n .title { font-weight: 600; }\n .body { margin-top: 2px; }\n .close {\n border: none; background: transparent; cursor: pointer;\n color: var(--fx-text-muted); font-size: calc(var(--fx-font-size) + 2px);\n line-height: 1; padding: 0; border-radius: var(--fx-radius-full);\n }\n .close:hover { color: var(--_color); }\n `;\n\n static override get observedAttributes(): string[] {\n return ['variant', 'title', 'dismissible', 'icon'];\n }\n\n protected override render(): void {\n const variant = this.getAttr('variant', 'info');\n const title = this.getAttr('title');\n const iconName = this.getAttr('icon');\n if (isFenixIconName(iconName)) void import('../../icons');\n const icons: Record<string, string> = {\n info: 'ℹ', success: '✓', warning: '⚠', danger: '✕',\n };\n const iconHtml = iconName\n ? `<span class=\"icon${isFenixIconName(iconName) ? ' fx-icon' : ''}\" part=\"icon\" aria-hidden=\"true\">${esc(iconName)}</span>`\n : `<span class=\"icon\">${icons[variant] ?? 'ℹ'}</span>`;\n\n this.setTemplate(`\n <div class=\"alert\" part=\"alert\" role=\"alert\">\n ${iconHtml}\n <div class=\"content\">\n ${title ? `<div class=\"title\">${esc(title)}</div>` : ''}\n <div class=\"body\"><slot></slot></div>\n </div>\n ${this.hasAttr('dismissible') ? '<button type=\"button\" class=\"close\" aria-label=\"Fechar\">×</button>' : ''}\n </div>\n `);\n\n this.root.querySelector('.close')?.addEventListener('click', () => {\n this.hidden = true;\n this.dispatchEvent(new CustomEvent('dismiss', { bubbles: true, composed: true }));\n });\n }\n}\n\nexport function defineFxAlert(): typeof FxAlert {\n return defineElement('fx-alert', FxAlert);\n}\n"],"file":"components/alert/alert.js"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FxElement } from '../../core/base';
|
|
2
|
+
/**
|
|
3
|
+
* <fx-avatar> — Representação visual de usuário/item.
|
|
4
|
+
*
|
|
5
|
+
* Atributos: size (number px / sm|md|lg), shape (circle|rounded|square),
|
|
6
|
+
* variant (image|text|icon), src (imagem), alt (acessibilidade).
|
|
7
|
+
* Slots: `icon` (glifo/emoji quando variant=icon) e padrão (iniciais).
|
|
8
|
+
*
|
|
9
|
+
* Uso em grupo: posicione vários `<fx-avatar>` em um container com a classe
|
|
10
|
+
* `avatar-group` (empilha com overlap automático).
|
|
11
|
+
*/
|
|
12
|
+
export declare class FxAvatar extends FxElement {
|
|
13
|
+
static styles: string;
|
|
14
|
+
static get observedAttributes(): string[];
|
|
15
|
+
get variant(): string;
|
|
16
|
+
get src(): string;
|
|
17
|
+
set src(v: string);
|
|
18
|
+
protected render(): void;
|
|
19
|
+
}
|
|
20
|
+
export declare function defineFxAvatar(): typeof FxAvatar;
|
|
21
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;;;;;GASG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAgB,MAAM,SAmDpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;IAED,IAAI,OAAO,IAAI,MAAM,CAA4C;IACjE,IAAI,GAAG,IAAI,MAAM,CAAgC;IACjD,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,EAAkC;cAEhC,MAAM,IAAI,IAAI;CAiBlC;AAED,wBAAgB,cAAc,IAAI,OAAO,QAAQ,CAEhD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { FxElement } from "../../core/base.js";
|
|
2
|
+
import { css } from "../../core/css.js";
|
|
3
|
+
import { defineElement } from "../../core/define.js";
|
|
4
|
+
import { esc } from "../../core/sanitize.js";
|
|
5
|
+
const _FxAvatar = class _FxAvatar extends FxElement {
|
|
6
|
+
static get observedAttributes() {
|
|
7
|
+
return ["size", "shape", "variant", "src", "alt"];
|
|
8
|
+
}
|
|
9
|
+
get variant() {
|
|
10
|
+
return this.getAttr("variant", "text");
|
|
11
|
+
}
|
|
12
|
+
get src() {
|
|
13
|
+
return this.getAttr("src");
|
|
14
|
+
}
|
|
15
|
+
set src(v) {
|
|
16
|
+
this.setAttribute("src", v);
|
|
17
|
+
}
|
|
18
|
+
render() {
|
|
19
|
+
const variant = this.variant;
|
|
20
|
+
const src = this.getAttr("src");
|
|
21
|
+
const alt = this.getAttr("alt", "");
|
|
22
|
+
const isIcon = variant === "icon";
|
|
23
|
+
const isImage = variant === "image" && src;
|
|
24
|
+
this.setTemplate(`
|
|
25
|
+
<span class="avatar${isImage ? " image" : isIcon ? " icon-slot" : " text"}" part="avatar" aria-label="${esc(alt)}" role="img">
|
|
26
|
+
${isImage ? `<img src="${esc(src)}" alt="${esc(alt)}">` : isIcon ? `<slot name="icon" class="slot-icon"></slot>` : `<slot></slot>`}
|
|
27
|
+
</span>
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
_FxAvatar.styles = css`
|
|
32
|
+
:host {
|
|
33
|
+
display: inline-block;
|
|
34
|
+
font-family: var(--fx-font-family);
|
|
35
|
+
font-size: var(--fx-font-size);
|
|
36
|
+
--_size: var(--fx-size-md, 36px);
|
|
37
|
+
--_bg: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));
|
|
38
|
+
--_color: var(--fx-text-default, #1e293b);
|
|
39
|
+
}
|
|
40
|
+
:host([size='sm']) { --_size: var(--fx-size-sm, 24px); }
|
|
41
|
+
:host([size='lg']) { --_size: var(--fx-size-lg, 48px); }
|
|
42
|
+
|
|
43
|
+
.avatar {
|
|
44
|
+
display: inline-flex;
|
|
45
|
+
align-items: center;
|
|
46
|
+
justify-content: center;
|
|
47
|
+
width: var(--_size);
|
|
48
|
+
height: var(--_size);
|
|
49
|
+
min-width: var(--_size);
|
|
50
|
+
box-sizing: border-box;
|
|
51
|
+
background: var(--_bg);
|
|
52
|
+
color: var(--_color);
|
|
53
|
+
font-weight: 700;
|
|
54
|
+
font-size: calc(var(--_size) / 2.2);
|
|
55
|
+
line-height: 1;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
text-decoration: none;
|
|
58
|
+
/* border-radius definido por shape abaixo */
|
|
59
|
+
}
|
|
60
|
+
:host([shape='square']) .avatar { border-radius: var(--fx-radius-sm); }
|
|
61
|
+
:host([shape='rounded']) .avatar { border-radius: var(--fx-radius-md); }
|
|
62
|
+
:host([shape='circle']) .avatar, :host([shape='']) .avatar { border-radius: var(--fx-radius-full); }
|
|
63
|
+
|
|
64
|
+
.avatar img {
|
|
65
|
+
width: 100%;
|
|
66
|
+
height: 100%;
|
|
67
|
+
object-fit: cover;
|
|
68
|
+
display: block;
|
|
69
|
+
}
|
|
70
|
+
.avatar.text { font-size: calc(var(--_size) / 2.6); }
|
|
71
|
+
.avatar .slot-icon { font-size: calc(var(--_size) / 2.4); }
|
|
72
|
+
|
|
73
|
+
/* grupo empilhado */
|
|
74
|
+
:host(.avatar-group) { display: inline-flex; }
|
|
75
|
+
:host(.avatar-group) > .avatar {
|
|
76
|
+
border: 2px solid var(--fx-surface-background);
|
|
77
|
+
margin-left: calc(var(--_size) / -3);
|
|
78
|
+
z-index: 1;
|
|
79
|
+
}
|
|
80
|
+
:host(.avatar-group) > .avatar:last-child { margin-left: 0; }
|
|
81
|
+
:host(.avatar-group) > .avatar:hover { z-index: 2; }
|
|
82
|
+
`;
|
|
83
|
+
let FxAvatar = _FxAvatar;
|
|
84
|
+
function defineFxAvatar() {
|
|
85
|
+
return defineElement("fx-avatar", FxAvatar);
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
FxAvatar,
|
|
89
|
+
defineFxAvatar
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sources":["../../../src/components/avatar/avatar.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-avatar> — Representação visual de usuário/item.\n *\n * Atributos: size (number px / sm|md|lg), shape (circle|rounded|square),\n * variant (image|text|icon), src (imagem), alt (acessibilidade).\n * Slots: `icon` (glifo/emoji quando variant=icon) e padrão (iniciais).\n *\n * Uso em grupo: posicione vários `<fx-avatar>` em um container com a classe\n * `avatar-group` (empilha com overlap automático).\n */\nexport class FxAvatar extends FxElement {\n static override styles = css`\n :host {\n display: inline-block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n --_size: var(--fx-size-md, 36px);\n --_bg: var(--fx-surface-surface-hover, rgba(0, 0, 0, 0.08));\n --_color: var(--fx-text-default, #1e293b);\n }\n :host([size='sm']) { --_size: var(--fx-size-sm, 24px); }\n :host([size='lg']) { --_size: var(--fx-size-lg, 48px); }\n\n .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--_size);\n height: var(--_size);\n min-width: var(--_size);\n box-sizing: border-box;\n background: var(--_bg);\n color: var(--_color);\n font-weight: 700;\n font-size: calc(var(--_size) / 2.2);\n line-height: 1;\n overflow: hidden;\n text-decoration: none;\n /* border-radius definido por shape abaixo */\n }\n :host([shape='square']) .avatar { border-radius: var(--fx-radius-sm); }\n :host([shape='rounded']) .avatar { border-radius: var(--fx-radius-md); }\n :host([shape='circle']) .avatar, :host([shape='']) .avatar { border-radius: var(--fx-radius-full); }\n\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n .avatar.text { font-size: calc(var(--_size) / 2.6); }\n .avatar .slot-icon { font-size: calc(var(--_size) / 2.4); }\n\n /* grupo empilhado */\n :host(.avatar-group) { display: inline-flex; }\n :host(.avatar-group) > .avatar {\n border: 2px solid var(--fx-surface-background);\n margin-left: calc(var(--_size) / -3);\n z-index: 1;\n }\n :host(.avatar-group) > .avatar:last-child { margin-left: 0; }\n :host(.avatar-group) > .avatar:hover { z-index: 2; }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'shape', 'variant', 'src', 'alt'];\n }\n\n get variant(): string { return this.getAttr('variant', 'text'); }\n get src(): string { return this.getAttr('src'); }\n set src(v: string) { this.setAttribute('src', v); }\n\n protected override render(): void {\n const variant = this.variant;\n const src = this.getAttr('src');\n const alt = this.getAttr('alt', '');\n const isIcon = variant === 'icon';\n const isImage = variant === 'image' && src;\n\n this.setTemplate(`\n <span class=\"avatar${isImage ? ' image' : isIcon ? ' icon-slot' : ' text'}\" part=\"avatar\" aria-label=\"${esc(alt)}\" role=\"img\">\n ${isImage\n ? `<img src=\"${esc(src)}\" alt=\"${esc(alt)}\">`\n : isIcon\n ? `<slot name=\"icon\" class=\"slot-icon\"></slot>`\n : `<slot></slot>`}\n </span>\n `);\n }\n}\n\nexport function defineFxAvatar(): typeof FxAvatar {\n return defineElement('fx-avatar', FxAvatar);\n}\n"],"names":[],"mappings":";;;;AAeO,MAAM,YAAN,MAAM,kBAAiB,UAAU;AAAA,EAsDtC,WAAoB,qBAA+B;AACjD,WAAO,CAAC,QAAQ,SAAS,WAAW,OAAO,KAAK;AAAA,EAClD;AAAA,EAEA,IAAI,UAAkB;AAAE,WAAO,KAAK,QAAQ,WAAW,MAAM;AAAA,EAAG;AAAA,EAChE,IAAI,MAAc;AAAE,WAAO,KAAK,QAAQ,KAAK;AAAA,EAAG;AAAA,EAChD,IAAI,IAAI,GAAW;AAAE,SAAK,aAAa,OAAO,CAAC;AAAA,EAAG;AAAA,EAE/B,SAAe;AAChC,UAAM,UAAU,KAAK;AACrB,UAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,UAAM,MAAM,KAAK,QAAQ,OAAO,EAAE;AAClC,UAAM,SAAS,YAAY;AAC3B,UAAM,UAAU,YAAY,WAAW;AAEvC,SAAK,YAAY;AAAA,2BACM,UAAU,WAAW,SAAS,eAAe,OAAO,+BAA+B,IAAI,GAAG,CAAC;AAAA,UAC5G,UACkB,aAAa,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,OACvD,SACE,gDACA,eAAe;AAAA;AAAA,KAExB;AAAA,EACH;AACF;AA9EE,UAAgB,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,WAAN;AAiFA,SAAS,iBAAkC;AAChD,SAAO,cAAc,aAAa,QAAQ;AAC5C;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,CAAC;AAIpB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/avatar/index.ts"],"sourcesContent":["import { FxAvatar, defineFxAvatar } from './avatar';\n\nexport { FxAvatar };\n\ndefineFxAvatar();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-avatar': FxAvatar;\n }\n}\n"],"names":[],"mappings":";;AAIA,eAAA;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FxElement } from '../../core/base';
|
|
2
|
+
/**
|
|
3
|
+
* <fx-breadcrumb> — Trilha de navegação hierárquica.
|
|
4
|
+
*
|
|
5
|
+
* Atributos: size (sm|md|lg), separator (glifo entre itens, padrão '/'),
|
|
6
|
+
* label (acessibilidade, padrão 'Breadcrumb').
|
|
7
|
+
* Slots: `item` (repetível — cada <fx-breadcrumb-item> ou elemento com
|
|
8
|
+
* [slot="item"] vira um passo) e `separator` (customiza o separador).
|
|
9
|
+
*
|
|
10
|
+
* Marcação declarativa recomendada:
|
|
11
|
+
* <fx-breadcrumb>
|
|
12
|
+
* <fx-breadcrumb-item href="/">Home</fx-breadcrumb-item>
|
|
13
|
+
* <fx-breadcrumb-item href="/produtos">Produtos</fx-breadcrumb-item>
|
|
14
|
+
* <fx-breadcrumb-item>Detalhe</fx-breadcrumb-item>
|
|
15
|
+
* </fx-breadcrumb>
|
|
16
|
+
*
|
|
17
|
+
* Eventos (composed): `select` (detail: { item, index }) ao clicar num item.
|
|
18
|
+
*/
|
|
19
|
+
export declare class FxBreadcrumb extends FxElement {
|
|
20
|
+
static styles: string;
|
|
21
|
+
static get observedAttributes(): string[];
|
|
22
|
+
protected render(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Move os itens do light DOM para o nav e intercala separadores.
|
|
25
|
+
* Como o playground atribui innerHTML (filhos chegam assincronamente) e
|
|
26
|
+
* re-renders posteriores já terão os itens no nav, a lógica abaixo é
|
|
27
|
+
* idempotente: coleta filhos do light DOM apenas na 1ª chamada.
|
|
28
|
+
*/
|
|
29
|
+
private _decorateItems;
|
|
30
|
+
private _items;
|
|
31
|
+
protected connectedCallback(): void;
|
|
32
|
+
protected disconnectedCallback(): void;
|
|
33
|
+
}
|
|
34
|
+
export declare function defineFxBreadcrumb(): typeof FxBreadcrumb;
|
|
35
|
+
//# sourceMappingURL=breadcrumb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumb/breadcrumb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC,OAAgB,MAAM,SAuCpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;cAEkB,MAAM,IAAI,IAAI;IAUjC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,MAAM,CAAiB;cAEZ,iBAAiB,IAAI,IAAI;cAczB,oBAAoB,IAAI,IAAI;CAIhD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,YAAY,CAExD"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { FxElement } from "../../core/base.js";
|
|
2
|
+
import { css } from "../../core/css.js";
|
|
3
|
+
import { defineElement } from "../../core/define.js";
|
|
4
|
+
import { esc } from "../../core/sanitize.js";
|
|
5
|
+
const _FxBreadcrumb = class _FxBreadcrumb extends FxElement {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this._items = [];
|
|
9
|
+
}
|
|
10
|
+
static get observedAttributes() {
|
|
11
|
+
return ["size", "separator", "label"];
|
|
12
|
+
}
|
|
13
|
+
render() {
|
|
14
|
+
const label = this.getAttr("label", "Breadcrumb");
|
|
15
|
+
this.setTemplate(`
|
|
16
|
+
<nav part="nav" aria-label="${esc(label)}"></nav>
|
|
17
|
+
`);
|
|
18
|
+
this._decorateItems();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Move os itens do light DOM para o nav e intercala separadores.
|
|
22
|
+
* Como o playground atribui innerHTML (filhos chegam assincronamente) e
|
|
23
|
+
* re-renders posteriores já terão os itens no nav, a lógica abaixo é
|
|
24
|
+
* idempotente: coleta filhos do light DOM apenas na 1ª chamada.
|
|
25
|
+
*/
|
|
26
|
+
_decorateItems() {
|
|
27
|
+
const nav = this.shadowRoot?.querySelector("nav");
|
|
28
|
+
if (!nav) return;
|
|
29
|
+
const sep = this.getAttr("separator", "/");
|
|
30
|
+
if (this._items.length === 0) {
|
|
31
|
+
this._items = Array.from(this.children).filter(
|
|
32
|
+
(el) => el.matches('[slot="item"]')
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
nav.innerHTML = "";
|
|
36
|
+
this._items.forEach((item, i) => {
|
|
37
|
+
const isLast = i === this._items.length - 1;
|
|
38
|
+
item.setAttribute("aria-current", isLast ? "page" : "false");
|
|
39
|
+
nav.appendChild(item);
|
|
40
|
+
if (isLast) return;
|
|
41
|
+
const s = document.createElement("span");
|
|
42
|
+
s.className = "sep";
|
|
43
|
+
s.setAttribute("part", "separator");
|
|
44
|
+
s.setAttribute("aria-hidden", "true");
|
|
45
|
+
s.textContent = sep;
|
|
46
|
+
nav.appendChild(s);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
connectedCallback() {
|
|
50
|
+
super.connectedCallback();
|
|
51
|
+
const obs = new MutationObserver(() => {
|
|
52
|
+
if (this.children.length > 0) {
|
|
53
|
+
obs.disconnect();
|
|
54
|
+
this._decorateItems();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
obs.observe(this, { childList: true });
|
|
58
|
+
if (this.children.length > 0) this._decorateItems();
|
|
59
|
+
}
|
|
60
|
+
disconnectedCallback() {
|
|
61
|
+
super.disconnectedCallback();
|
|
62
|
+
this._items = [];
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
_FxBreadcrumb.styles = css`
|
|
66
|
+
:host {
|
|
67
|
+
display: block;
|
|
68
|
+
font-family: var(--fx-font-family);
|
|
69
|
+
font-size: var(--fx-font-size);
|
|
70
|
+
}
|
|
71
|
+
nav {
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
flex-wrap: wrap;
|
|
75
|
+
gap: var(--fx-space-xs);
|
|
76
|
+
}
|
|
77
|
+
:host([size='sm']) nav { font-size: calc(var(--fx-font-size) - 2px); }
|
|
78
|
+
:host([size='lg']) nav { font-size: calc(var(--fx-font-size) + 2px); }
|
|
79
|
+
|
|
80
|
+
/* itens (movidos para o nav no shadow DOM) */
|
|
81
|
+
nav [slot='item'] {
|
|
82
|
+
display: inline-flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
gap: var(--fx-space-xs);
|
|
85
|
+
color: var(--fx-text-muted);
|
|
86
|
+
text-decoration: none;
|
|
87
|
+
cursor: pointer;
|
|
88
|
+
transition: color var(--fx-motion-duration-fast) var(--fx-motion-easing);
|
|
89
|
+
}
|
|
90
|
+
nav [slot='item']:hover { color: var(--fx-color-primary); }
|
|
91
|
+
nav [slot='item'][aria-current='page'] {
|
|
92
|
+
color: var(--fx-text-default);
|
|
93
|
+
font-weight: 600;
|
|
94
|
+
cursor: default;
|
|
95
|
+
}
|
|
96
|
+
nav [slot='item'][aria-current='page']:hover { color: var(--fx-text-default); }
|
|
97
|
+
|
|
98
|
+
.sep {
|
|
99
|
+
color: var(--fx-text-muted);
|
|
100
|
+
user-select: none;
|
|
101
|
+
display: inline-flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
}
|
|
104
|
+
`;
|
|
105
|
+
let FxBreadcrumb = _FxBreadcrumb;
|
|
106
|
+
function defineFxBreadcrumb() {
|
|
107
|
+
return defineElement("fx-breadcrumb", FxBreadcrumb);
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
FxBreadcrumb,
|
|
111
|
+
defineFxBreadcrumb
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","sources":["../../../src/components/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { FxElement } from '../../core/base';\nimport { css } from '../../core/css';\nimport { defineElement } from '../../core/define';\nimport { esc } from '../../core/sanitize';\n\n/**\n * <fx-breadcrumb> — Trilha de navegação hierárquica.\n *\n * Atributos: size (sm|md|lg), separator (glifo entre itens, padrão '/'),\n * label (acessibilidade, padrão 'Breadcrumb').\n * Slots: `item` (repetível — cada <fx-breadcrumb-item> ou elemento com\n * [slot=\"item\"] vira um passo) e `separator` (customiza o separador).\n *\n * Marcação declarativa recomendada:\n * <fx-breadcrumb>\n * <fx-breadcrumb-item href=\"/\">Home</fx-breadcrumb-item>\n * <fx-breadcrumb-item href=\"/produtos\">Produtos</fx-breadcrumb-item>\n * <fx-breadcrumb-item>Detalhe</fx-breadcrumb-item>\n * </fx-breadcrumb>\n *\n * Eventos (composed): `select` (detail: { item, index }) ao clicar num item.\n */\nexport class FxBreadcrumb extends FxElement {\n static override styles = css`\n :host {\n display: block;\n font-family: var(--fx-font-family);\n font-size: var(--fx-font-size);\n }\n nav {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--fx-space-xs);\n }\n :host([size='sm']) nav { font-size: calc(var(--fx-font-size) - 2px); }\n :host([size='lg']) nav { font-size: calc(var(--fx-font-size) + 2px); }\n\n /* itens (movidos para o nav no shadow DOM) */\n nav [slot='item'] {\n display: inline-flex;\n align-items: center;\n gap: var(--fx-space-xs);\n color: var(--fx-text-muted);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--fx-motion-duration-fast) var(--fx-motion-easing);\n }\n nav [slot='item']:hover { color: var(--fx-color-primary); }\n nav [slot='item'][aria-current='page'] {\n color: var(--fx-text-default);\n font-weight: 600;\n cursor: default;\n }\n nav [slot='item'][aria-current='page']:hover { color: var(--fx-text-default); }\n\n .sep {\n color: var(--fx-text-muted);\n user-select: none;\n display: inline-flex;\n align-items: center;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return ['size', 'separator', 'label'];\n }\n\n protected override render(): void {\n const label = this.getAttr('label', 'Breadcrumb');\n\n this.setTemplate(`\n <nav part=\"nav\" aria-label=\"${esc(label)}\"></nav>\n `);\n\n this._decorateItems();\n }\n\n /**\n * Move os itens do light DOM para o nav e intercala separadores.\n * Como o playground atribui innerHTML (filhos chegam assincronamente) e\n * re-renders posteriores já terão os itens no nav, a lógica abaixo é\n * idempotente: coleta filhos do light DOM apenas na 1ª chamada.\n */\n private _decorateItems(): void {\n const nav = this.shadowRoot?.querySelector('nav');\n if (!nav) return;\n const sep = this.getAttr('separator', '/');\n\n // 1ª vez: captura itens do light DOM (idempotente — só coleta uma vez)\n if (this._items.length === 0) {\n this._items = Array.from(this.children).filter((el) =>\n el.matches('[slot=\"item\"]'),\n );\n }\n\n // limpa nav e reconstrói com os itens armazenados\n nav.innerHTML = '';\n this._items.forEach((item, i) => {\n const isLast = i === this._items.length - 1;\n item.setAttribute('aria-current', isLast ? 'page' : 'false');\n nav.appendChild(item);\n if (isLast) return;\n const s = document.createElement('span');\n s.className = 'sep';\n s.setAttribute('part', 'separator');\n s.setAttribute('aria-hidden', 'true');\n s.textContent = sep;\n nav.appendChild(s);\n });\n }\n\n private _items: Element[] = [];\n\n protected override connectedCallback(): void {\n super.connectedCallback();\n // filhos podem não estar disponíveis ainda (innerHTML do playground)\n const obs = new MutationObserver(() => {\n if (this.children.length > 0) {\n obs.disconnect();\n this._decorateItems();\n }\n });\n obs.observe(this, { childList: true });\n // se já tem filhos, decora na hora\n if (this.children.length > 0) this._decorateItems();\n }\n\n protected override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._items = [];\n }\n}\n\nexport function defineFxBreadcrumb(): typeof FxBreadcrumb {\n return defineElement('fx-breadcrumb', FxBreadcrumb);\n}\n"],"names":[],"mappings":";;;;AAsBO,MAAM,gBAAN,MAAM,sBAAqB,UAAU;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA;AA0FL,SAAQ,SAAoB,CAAA;AAAA,EAAC;AAAA,EAhD7B,WAAoB,qBAA+B;AACjD,WAAO,CAAC,QAAQ,aAAa,OAAO;AAAA,EACtC;AAAA,EAEmB,SAAe;AAChC,UAAM,QAAQ,KAAK,QAAQ,SAAS,YAAY;AAEhD,SAAK,YAAY;AAAA,oCACe,IAAI,KAAK,CAAC;AAAA,KACzC;AAED,SAAK,eAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,iBAAuB;AAC7B,UAAM,MAAM,KAAK,YAAY,cAAc,KAAK;AAChD,QAAI,CAAC,IAAK;AACV,UAAM,MAAM,KAAK,QAAQ,aAAa,GAAG;AAGzC,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B,WAAK,SAAS,MAAM,KAAK,KAAK,QAAQ,EAAE;AAAA,QAAO,CAAC,OAC9C,GAAG,QAAQ,eAAe;AAAA,MAAA;AAAA,IAE9B;AAGA,QAAI,YAAY;AAChB,SAAK,OAAO,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAM,SAAS,MAAM,KAAK,OAAO,SAAS;AAC1C,WAAK,aAAa,gBAAgB,SAAS,SAAS,OAAO;AAC3D,UAAI,YAAY,IAAI;AACpB,UAAI,OAAQ;AACZ,YAAM,IAAI,SAAS,cAAc,MAAM;AACvC,QAAE,YAAY;AACd,QAAE,aAAa,QAAQ,WAAW;AAClC,QAAE,aAAa,eAAe,MAAM;AACpC,QAAE,cAAc;AAChB,UAAI,YAAY,CAAC;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAImB,oBAA0B;AAC3C,UAAM,kBAAA;AAEN,UAAM,MAAM,IAAI,iBAAiB,MAAM;AACrC,UAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,YAAI,WAAA;AACJ,aAAK,eAAA;AAAA,MACP;AAAA,IACF,CAAC;AACD,QAAI,QAAQ,MAAM,EAAE,WAAW,MAAM;AAErC,QAAI,KAAK,SAAS,SAAS,QAAQ,eAAA;AAAA,EACrC;AAAA,EAEmB,uBAA6B;AAC9C,UAAM,qBAAA;AACN,SAAK,SAAS,CAAA;AAAA,EAChB;AACF;AA7GE,cAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADpB,IAAM,eAAN;AAgHA,SAAS,qBAA0C;AACxD,SAAO,cAAc,iBAAiB,YAAY;AACpD;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumb/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,CAAC;AAIxB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,YAAY,CAAC;KAC/B;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/breadcrumb/index.ts"],"sourcesContent":["import { FxBreadcrumb, defineFxBreadcrumb } from './breadcrumb';\n\nexport { FxBreadcrumb };\n\ndefineFxBreadcrumb();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'fx-breadcrumb': FxBreadcrumb;\n }\n}\n"],"names":[],"mappings":";;AAIA,mBAAA;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FxElement } from '../../core/base';
|
|
2
|
+
/**
|
|
3
|
+
* <fx-card> — Container de conteúdo com cabeçalho, corpo e rodapé.
|
|
4
|
+
*
|
|
5
|
+
* Atributos: variant (elevated|flat|outline, padrão elevated), size (sm|md|lg),
|
|
6
|
+
* padded (exibe padding interno), heading (rótulo opcional no cabeçalho).
|
|
7
|
+
* Slots: `header`, padrão (conteúdo), `footer`.
|
|
8
|
+
*/
|
|
9
|
+
export declare class FxCard extends FxElement {
|
|
10
|
+
static styles: string;
|
|
11
|
+
static get observedAttributes(): string[];
|
|
12
|
+
protected render(): void;
|
|
13
|
+
}
|
|
14
|
+
export declare function defineFxCard(): typeof FxCard;
|
|
15
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/components/card/card.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;;;;GAMG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACnC,OAAgB,MAAM,SAmDpB;IAEF,WAAoB,kBAAkB,IAAI,MAAM,EAAE,CAEjD;cAEkB,MAAM,IAAI,IAAI;CAUlC;AAED,wBAAgB,YAAY,IAAI,OAAO,MAAM,CAE5C"}
|