@wrrdev/fenix-ui 1.1.10 → 1.1.11
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 +20 -2
- package/dist/assets/{font-CF0TXsAP.js → font-DPeWTz-n.js} +58 -13
- package/dist/assets/font-DPeWTz-n.js.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +4 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js +12 -2
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/table/table.d.ts +16 -0
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/table/table.js +28 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/toast/toast.d.ts +8 -0
- package/dist/components/toast/toast.d.ts.map +1 -1
- package/dist/components/toast/toast.js +13 -0
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/tooltip/directive.d.ts +8 -0
- package/dist/components/tooltip/directive.d.ts.map +1 -1
- package/dist/components/tooltip/directive.js +59 -18
- package/dist/components/tooltip/directive.js.map +1 -1
- package/dist/docs/app.d.ts.map +1 -1
- package/dist/fenix-ui.umd.min.js +142 -142
- package/dist/fenix-ui3.esm.js +8 -13
- package/dist/fenix-ui3.esm.js.map +1 -1
- package/dist/fenix-ui4.esm.js +184 -93
- package/dist/fenix-ui4.esm.js.map +1 -1
- package/dist/icons/font.d.ts +23 -0
- package/dist/icons/font.d.ts.map +1 -1
- package/dist/icons/font.js +54 -8
- package/dist/icons/font.js.map +1 -1
- package/dist/icons/index.d.ts +7 -2
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/index.js +6 -11
- package/dist/icons/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/font-CF0TXsAP.js.map +0 -1
package/dist/icons/font.d.ts
CHANGED
|
@@ -8,6 +8,23 @@
|
|
|
8
8
|
*/
|
|
9
9
|
/** URL resolvida da fonte (reutilizada por ./index para o CSS completo). */
|
|
10
10
|
export declare const FENIX_ICONS_FONT_URL: string;
|
|
11
|
+
/**
|
|
12
|
+
* Sobrescreve a URL da fonte em tempo de execução.
|
|
13
|
+
*
|
|
14
|
+
* Use para apontar para um SUBSET próprio (só os glifos que o app usa), o que
|
|
15
|
+
* derruba a fonte de ~5 MB para algumas dezenas de KB:
|
|
16
|
+
*
|
|
17
|
+
* import { setFenixIconsFontUrl } from '@wrrdev/fenix-ui/icons';
|
|
18
|
+
* setFenixIconsFontUrl('/fonts/fenix-icons-subset.woff2');
|
|
19
|
+
*
|
|
20
|
+
* Deve ser chamado ANTES do primeiro `loadFenixIcons()`/`loadFenixIconsFont()`
|
|
21
|
+
* (ou de `<fx-icon>` ser montado). A tipagem dos ícones não muda: continua
|
|
22
|
+
* valendo a lista completa de `FenixIconName` — o subset precisa conter os
|
|
23
|
+
* glifos que você realmente usa. Passe `''` para voltar à URL do build.
|
|
24
|
+
*/
|
|
25
|
+
export declare function setFenixIconsFontUrl(url: string): void;
|
|
26
|
+
/** Informa os nomes disponíveis para a reinjeção do CSS completo. */
|
|
27
|
+
export declare function __setFenixIconNames(names: readonly string[]): void;
|
|
11
28
|
/** Id do <style> com @font-face + classe base. */
|
|
12
29
|
export declare const FENIX_ICONS_FONT_STYLE_ID = "fenix-icons-font";
|
|
13
30
|
/** Id do <style> com o CSS completo (@font-face + base + classes por ícone). */
|
|
@@ -16,6 +33,12 @@ export declare const FENIX_ICONS_STYLE_ID = "fenix-icons";
|
|
|
16
33
|
export declare function buildFenixIconsFontFaceCss(): string;
|
|
17
34
|
/** CSS leve: @font-face + classe base (sem as classes por ícone). */
|
|
18
35
|
export declare function buildFenixIconsFontCss(): string;
|
|
36
|
+
/**
|
|
37
|
+
* CSS completo (@font-face + base + uma regra por ícone), com a URL de fonte
|
|
38
|
+
* vigente. Vive aqui (e não só em ./index) para que `setFenixIconsFontUrl`
|
|
39
|
+
* consiga recriar o estilo completo sem importar outro módulo.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildFullCss(names: readonly string[]): string;
|
|
19
42
|
/**
|
|
20
43
|
* Injeta @font-face + classe base no <head> (idempotente). Não duplica quando
|
|
21
44
|
* o CSS completo (`fenix-icons`) já foi carregado por `import '.../icons'`.
|
package/dist/icons/font.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../../src/icons/font.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AAErD,kDAAkD;AAClD,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAElD,yBAAyB;AACzB,wBAAgB,0BAA0B,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../../src/icons/font.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AAErD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAatD;AAQD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAElE;AASD,kDAAkD;AAClD,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAElD,yBAAyB;AACzB,wBAAgB,0BAA0B,IAAI,MAAM,CAQnD;AAED,qEAAqE;AACrE,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAM7D;AAyCD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,GAAE,QAAQ,GAAG,SAAkE,GACpF,IAAI,CAON;AAED,gEAAgE;AAChE,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
|
package/dist/icons/font.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FENIX_ICON_BASE_CSS, FENIX_ICON_FONT_FAMILY } from "./base-css.js";
|
|
2
2
|
function resolveFontUrl() {
|
|
3
3
|
if (typeof __FENIX_ICONS_FONT_URL__ !== "undefined" && __FENIX_ICONS_FONT_URL__) {
|
|
4
4
|
return __FENIX_ICONS_FONT_URL__;
|
|
@@ -6,26 +6,69 @@ function resolveFontUrl() {
|
|
|
6
6
|
return new URL("" + new URL("../assets/fenix-icons-DmgotBzD.woff2", import.meta.url).href, import.meta.url).toString();
|
|
7
7
|
}
|
|
8
8
|
const FENIX_ICONS_FONT_URL = resolveFontUrl();
|
|
9
|
+
function setFenixIconsFontUrl(url) {
|
|
10
|
+
const next = url.trim() || void 0;
|
|
11
|
+
if (fontUrlOverride === next) return;
|
|
12
|
+
fontUrlOverride = next;
|
|
13
|
+
const target = typeof document !== "undefined" ? document : void 0;
|
|
14
|
+
if (!target) return;
|
|
15
|
+
const hadFull = !!target.getElementById(FENIX_ICONS_STYLE_ID);
|
|
16
|
+
const hadFont = !!target.getElementById(FENIX_ICONS_FONT_STYLE_ID);
|
|
17
|
+
resetInjectedStyles(target);
|
|
18
|
+
if (hadFull) reinjectFull(target, fullNamesRef);
|
|
19
|
+
if (hadFont) injectFontStyle(target);
|
|
20
|
+
}
|
|
21
|
+
let fullNamesRef = [];
|
|
22
|
+
function __setFenixIconNames(names) {
|
|
23
|
+
fullNamesRef = names;
|
|
24
|
+
}
|
|
25
|
+
let fontUrlOverride;
|
|
26
|
+
function currentFontUrl() {
|
|
27
|
+
return fontUrlOverride ?? FENIX_ICONS_FONT_URL;
|
|
28
|
+
}
|
|
9
29
|
const FENIX_ICONS_FONT_STYLE_ID = "fenix-icons-font";
|
|
10
30
|
const FENIX_ICONS_STYLE_ID = "fenix-icons";
|
|
11
31
|
function buildFenixIconsFontFaceCss() {
|
|
12
|
-
return `@font-face{font-family:'${FENIX_ICON_FONT_FAMILY}';font-style:normal;font-weight:100 700;font-display:
|
|
32
|
+
return `@font-face{font-family:'${FENIX_ICON_FONT_FAMILY}';font-style:normal;font-weight:100 700;font-display:swap;src:url('${currentFontUrl()}') format('woff2');}`;
|
|
13
33
|
}
|
|
14
34
|
function buildFenixIconsFontCss() {
|
|
15
35
|
return buildFenixIconsFontFaceCss() + FENIX_ICON_BASE_CSS;
|
|
16
36
|
}
|
|
37
|
+
function buildFullCss(names) {
|
|
38
|
+
let rules = "";
|
|
39
|
+
for (const name of names) {
|
|
40
|
+
rules += `.fx-icon-${name}::before{content:"${name}"}`;
|
|
41
|
+
}
|
|
42
|
+
return buildFenixIconsFontFaceCss() + FENIX_ICON_BASE_CSS + rules;
|
|
43
|
+
}
|
|
17
44
|
let fontInjected = false;
|
|
45
|
+
function resetInjectedStyles(target = typeof document !== "undefined" ? document : void 0) {
|
|
46
|
+
fontInjected = false;
|
|
47
|
+
if (!target) return;
|
|
48
|
+
target.getElementById(FENIX_ICONS_FONT_STYLE_ID)?.remove();
|
|
49
|
+
target.getElementById(FENIX_ICONS_STYLE_ID)?.remove();
|
|
50
|
+
}
|
|
51
|
+
function injectFontStyle(target) {
|
|
52
|
+
const style = target.createElement("style");
|
|
53
|
+
style.id = FENIX_ICONS_FONT_STYLE_ID;
|
|
54
|
+
style.textContent = buildFenixIconsFontCss();
|
|
55
|
+
target.head.appendChild(style);
|
|
56
|
+
fontInjected = true;
|
|
57
|
+
}
|
|
58
|
+
function reinjectFull(target, names) {
|
|
59
|
+
if (target.getElementById(FENIX_ICONS_STYLE_ID)) return;
|
|
60
|
+
const style = target.createElement("style");
|
|
61
|
+
style.id = FENIX_ICONS_STYLE_ID;
|
|
62
|
+
style.textContent = buildFullCss(names);
|
|
63
|
+
target.head.appendChild(style);
|
|
64
|
+
}
|
|
18
65
|
function loadFenixIconsFont(target = typeof document !== "undefined" ? document : void 0) {
|
|
19
66
|
if (fontInjected || !target) return;
|
|
20
67
|
if (target.getElementById(FENIX_ICONS_STYLE_ID)) {
|
|
21
68
|
fontInjected = true;
|
|
22
69
|
return;
|
|
23
70
|
}
|
|
24
|
-
|
|
25
|
-
style.id = FENIX_ICONS_FONT_STYLE_ID;
|
|
26
|
-
style.textContent = buildFenixIconsFontCss();
|
|
27
|
-
target.head.appendChild(style);
|
|
28
|
-
fontInjected = true;
|
|
71
|
+
injectFontStyle(target);
|
|
29
72
|
}
|
|
30
73
|
function __resetFenixIconsFontInjection() {
|
|
31
74
|
fontInjected = false;
|
|
@@ -35,8 +78,11 @@ export {
|
|
|
35
78
|
FENIX_ICONS_FONT_URL,
|
|
36
79
|
FENIX_ICONS_STYLE_ID,
|
|
37
80
|
__resetFenixIconsFontInjection,
|
|
81
|
+
__setFenixIconNames,
|
|
38
82
|
buildFenixIconsFontCss,
|
|
39
83
|
buildFenixIconsFontFaceCss,
|
|
40
|
-
|
|
84
|
+
buildFullCss,
|
|
85
|
+
loadFenixIconsFont,
|
|
86
|
+
setFenixIconsFontUrl
|
|
41
87
|
};
|
|
42
88
|
//# sourceMappingURL=font.js.map
|
package/dist/icons/font.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font.js","sources":["../../src/icons/font.ts"],"sourcesContent":["/**\n * Carregamento LEVE da fonte de ícones (@font-face + classe base).\n *\n * Separado de ./index de propósito: importar este módulo NÃO injeta o CSS\n * completo com as ~4.300 regras `fx-icon-<nome>`. É o que o <fx-icon> usa —\n * dentro do Shadow DOM o glifo vem da ligadura (o nome como conteúdo), então\n * as classes por ícone não atravessam a fronteira do shadow root.\n */\n\nimport { FENIX_ICON_BASE_CSS, FENIX_ICON_FONT_FAMILY } from './base-css';\n\n/** URL da fonte woff2: no build ESM a fonte vive na mesma pasta do módulo (dist/icons). */\ndeclare const __FENIX_ICONS_FONT_URL__: string | undefined;\n\nfunction resolveFontUrl(): string {\n if (typeof __FENIX_ICONS_FONT_URL__ !== 'undefined' && __FENIX_ICONS_FONT_URL__) {\n return __FENIX_ICONS_FONT_URL__;\n }\n // IMPORTANTE: o `import.meta.url` precisa ser usado DIRETAMENTE como 2º\n // argumento de `new URL` (sem variável intermediária). É assim que Vite,\n // webpack e Rollup reconhecem o padrão de asset e copiam/reescrevem a URL\n // da fonte no build do PROJETO CONSUMIDOR — com variável, a URL permanece\n // dinâmica e quebra em produção (a fonte 404 e os ícones viram texto).\n return new URL('./fenix-icons.woff2', import.meta.url).toString();\n}\n\n/** URL resolvida da fonte (reutilizada por ./index para o CSS completo). */\nexport const FENIX_ICONS_FONT_URL = resolveFontUrl();\n\n/** Id do <style> com @font-face + classe base. */\nexport const FENIX_ICONS_FONT_STYLE_ID = 'fenix-icons-font';\n\n/** Id do <style> com o CSS completo (@font-face + base + classes por ícone). */\nexport const FENIX_ICONS_STYLE_ID = 'fenix-icons';\n\n/** CSS do @font-face. */\nexport function buildFenixIconsFontFaceCss(): string {\n return (\n `@font-face{font-family:'${FENIX_ICON_FONT_FAMILY}';font-style:normal;font-weight:100 700;` +\n `font-display:
|
|
1
|
+
{"version":3,"file":"font.js","sources":["../../src/icons/font.ts"],"sourcesContent":["/**\n * Carregamento LEVE da fonte de ícones (@font-face + classe base).\n *\n * Separado de ./index de propósito: importar este módulo NÃO injeta o CSS\n * completo com as ~4.300 regras `fx-icon-<nome>`. É o que o <fx-icon> usa —\n * dentro do Shadow DOM o glifo vem da ligadura (o nome como conteúdo), então\n * as classes por ícone não atravessam a fronteira do shadow root.\n */\n\nimport { FENIX_ICON_BASE_CSS, FENIX_ICON_FONT_FAMILY } from './base-css';\n\n/** URL da fonte woff2: no build ESM a fonte vive na mesma pasta do módulo (dist/icons). */\ndeclare const __FENIX_ICONS_FONT_URL__: string | undefined;\n\nfunction resolveFontUrl(): string {\n if (typeof __FENIX_ICONS_FONT_URL__ !== 'undefined' && __FENIX_ICONS_FONT_URL__) {\n return __FENIX_ICONS_FONT_URL__;\n }\n // IMPORTANTE: o `import.meta.url` precisa ser usado DIRETAMENTE como 2º\n // argumento de `new URL` (sem variável intermediária). É assim que Vite,\n // webpack e Rollup reconhecem o padrão de asset e copiam/reescrevem a URL\n // da fonte no build do PROJETO CONSUMIDOR — com variável, a URL permanece\n // dinâmica e quebra em produção (a fonte 404 e os ícones viram texto).\n return new URL('./fenix-icons.woff2', import.meta.url).toString();\n}\n\n/** URL resolvida da fonte (reutilizada por ./index para o CSS completo). */\nexport const FENIX_ICONS_FONT_URL = resolveFontUrl();\n\n/**\n * Sobrescreve a URL da fonte em tempo de execução.\n *\n * Use para apontar para um SUBSET próprio (só os glifos que o app usa), o que\n * derruba a fonte de ~5 MB para algumas dezenas de KB:\n *\n * import { setFenixIconsFontUrl } from '@wrrdev/fenix-ui/icons';\n * setFenixIconsFontUrl('/fonts/fenix-icons-subset.woff2');\n *\n * Deve ser chamado ANTES do primeiro `loadFenixIcons()`/`loadFenixIconsFont()`\n * (ou de `<fx-icon>` ser montado). A tipagem dos ícones não muda: continua\n * valendo a lista completa de `FenixIconName` — o subset precisa conter os\n * glifos que você realmente usa. Passe `''` para voltar à URL do build.\n */\nexport function setFenixIconsFontUrl(url: string): void {\n const next = url.trim() || undefined;\n if (fontUrlOverride === next) return;\n fontUrlOverride = next;\n // O CSS já injetado embute a URL antiga: remove e reinjeta com a nova,\n // senão a troca não teria efeito em apps que já carregaram a fonte.\n const target = typeof document !== 'undefined' ? document : undefined;\n if (!target) return;\n const hadFull = !!target.getElementById(FENIX_ICONS_STYLE_ID);\n const hadFont = !!target.getElementById(FENIX_ICONS_FONT_STYLE_ID);\n resetInjectedStyles(target);\n if (hadFull) reinjectFull(target, fullNamesRef);\n if (hadFont) injectFontStyle(target);\n}\n\n/**\n * Nomes registrados por ./index, usados só se for preciso recriar o CSS\n * completo. Evita que ./font dependa da lista de ~4.300 nomes.\n */\nlet fullNamesRef: readonly string[] = [];\n\n/** Informa os nomes disponíveis para a reinjeção do CSS completo. */\nexport function __setFenixIconNames(names: readonly string[]): void {\n fullNamesRef = names;\n}\n\nlet fontUrlOverride: string | undefined;\n\n/** URL efetiva: a sobrescrita em runtime tem prioridade sobre a do build. */\nfunction currentFontUrl(): string {\n return fontUrlOverride ?? FENIX_ICONS_FONT_URL;\n}\n\n/** Id do <style> com @font-face + classe base. */\nexport const FENIX_ICONS_FONT_STYLE_ID = 'fenix-icons-font';\n\n/** Id do <style> com o CSS completo (@font-face + base + classes por ícone). */\nexport const FENIX_ICONS_STYLE_ID = 'fenix-icons';\n\n/** CSS do @font-face. */\nexport function buildFenixIconsFontFaceCss(): string {\n return (\n `@font-face{font-family:'${FENIX_ICON_FONT_FAMILY}';font-style:normal;font-weight:100 700;` +\n // `swap` (e não `block`): com `block` o texto fica INVISÍVEL até a fonte\n // baixar — em 3G/4G isso vira tela branca por vários segundos. `swap`\n // mostra o glifo de fallback imediatamente e troca quando a fonte chega.\n `font-display:swap;src:url('${currentFontUrl()}') format('woff2');}`\n );\n}\n\n/** CSS leve: @font-face + classe base (sem as classes por ícone). */\nexport function buildFenixIconsFontCss(): string {\n return buildFenixIconsFontFaceCss() + FENIX_ICON_BASE_CSS;\n}\n\n/**\n * CSS completo (@font-face + base + uma regra por ícone), com a URL de fonte\n * vigente. Vive aqui (e não só em ./index) para que `setFenixIconsFontUrl`\n * consiga recriar o estilo completo sem importar outro módulo.\n */\nexport function buildFullCss(names: readonly string[]): string {\n let rules = '';\n for (const name of names) {\n rules += `.fx-icon-${name}::before{content:\"${name}\"}`;\n }\n return buildFenixIconsFontFaceCss() + FENIX_ICON_BASE_CSS + rules;\n}\n\nlet fontInjected = false;\n\n/**\n * Remove os <style> de ícones já injetados, para reinjetar com outra URL.\n * Usado por `setFenixIconsFontUrl`.\n */\nfunction resetInjectedStyles(\n target: Document | undefined = typeof document !== 'undefined' ? document : undefined,\n): void {\n fontInjected = false;\n if (!target) return;\n target.getElementById(FENIX_ICONS_FONT_STYLE_ID)?.remove();\n target.getElementById(FENIX_ICONS_STYLE_ID)?.remove();\n}\n\n/** Cria e anexa o <style> leve (@font-face + classe base) no <head>. */\nfunction injectFontStyle(target: Document): void {\n const style = target.createElement('style');\n style.id = FENIX_ICONS_FONT_STYLE_ID;\n style.textContent = buildFenixIconsFontCss();\n target.head.appendChild(style);\n fontInjected = true;\n}\n\n/**\n * Reinjeta o CSS completo (o de `./index`).\n *\n * Fica aqui para que a troca de URL da fonte recrie o estilo. Não usa o flag\n * `injected` de ./index: o <style> antigo já foi removido do DOM, então\n * recriá-lo aqui é sempre seguro e evita depender do estado de outro módulo.\n */\nfunction reinjectFull(target: Document, names: readonly string[]): void {\n if (target.getElementById(FENIX_ICONS_STYLE_ID)) return;\n const style = target.createElement('style');\n style.id = FENIX_ICONS_STYLE_ID;\n style.textContent = buildFullCss(names);\n target.head.appendChild(style);\n}\n\n/**\n * Injeta @font-face + classe base no <head> (idempotente). Não duplica quando\n * o CSS completo (`fenix-icons`) já foi carregado por `import '.../icons'`.\n */\nexport function loadFenixIconsFont(\n target: Document | undefined = typeof document !== 'undefined' ? document : undefined,\n): void {\n if (fontInjected || !target) return;\n if (target.getElementById(FENIX_ICONS_STYLE_ID)) {\n fontInjected = true;\n return;\n }\n injectFontStyle(target);\n}\n\n/** Reseta o estado de injeção da fonte (uso interno/testes). */\nexport function __resetFenixIconsFontInjection(): void {\n fontInjected = false;\n}"],"names":[],"mappings":";AAcA,SAAS,iBAAyB;AAChC,MAAI,OAAO,6BAA6B,eAAe,0BAA0B;AAC/E,WAAO;AAAA,EACT;AAMA,SAAO,IAAA,IAAA,4EAAA,YAAA,GAAA,EAAgD,SAAA;AACzD;AAGO,MAAM,uBAAuB,eAAA;AAgB7B,SAAS,qBAAqB,KAAmB;AACtD,QAAM,OAAO,IAAI,KAAA,KAAU;AAC3B,MAAI,oBAAoB,KAAM;AAC9B,oBAAkB;AAGlB,QAAM,SAAS,OAAO,aAAa,cAAc,WAAW;AAC5D,MAAI,CAAC,OAAQ;AACb,QAAM,UAAU,CAAC,CAAC,OAAO,eAAe,oBAAoB;AAC5D,QAAM,UAAU,CAAC,CAAC,OAAO,eAAe,yBAAyB;AACjE,sBAAoB,MAAM;AAC1B,MAAI,QAAS,cAAa,QAAQ,YAAY;AAC9C,MAAI,yBAAyB,MAAM;AACrC;AAMA,IAAI,eAAkC,CAAA;AAG/B,SAAS,oBAAoB,OAAgC;AAClE,iBAAe;AACjB;AAEA,IAAI;AAGJ,SAAS,iBAAyB;AAChC,SAAO,mBAAmB;AAC5B;AAGO,MAAM,4BAA4B;AAGlC,MAAM,uBAAuB;AAG7B,SAAS,6BAAqC;AACnD,SACE,2BAA2B,sBAAsB,sEAInB,eAAA,CAAgB;AAElD;AAGO,SAAS,yBAAiC;AAC/C,SAAO,+BAA+B;AACxC;AAOO,SAAS,aAAa,OAAkC;AAC7D,MAAI,QAAQ;AACZ,aAAW,QAAQ,OAAO;AACxB,aAAS,YAAY,IAAI,qBAAqB,IAAI;AAAA,EACpD;AACA,SAAO,2BAAA,IAA+B,sBAAsB;AAC9D;AAEA,IAAI,eAAe;AAMnB,SAAS,oBACP,SAA+B,OAAO,aAAa,cAAc,WAAW,QACtE;AACN,iBAAe;AACf,MAAI,CAAC,OAAQ;AACb,SAAO,eAAe,yBAAyB,GAAG,OAAA;AAClD,SAAO,eAAe,oBAAoB,GAAG,OAAA;AAC/C;AAGA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,QAAQ,OAAO,cAAc,OAAO;AAC1C,QAAM,KAAK;AACX,QAAM,cAAc,uBAAA;AACpB,SAAO,KAAK,YAAY,KAAK;AAC7B,iBAAe;AACjB;AASA,SAAS,aAAa,QAAkB,OAAgC;AACtE,MAAI,OAAO,eAAe,oBAAoB,EAAG;AACjD,QAAM,QAAQ,OAAO,cAAc,OAAO;AAC1C,QAAM,KAAK;AACX,QAAM,cAAc,aAAa,KAAK;AACtC,SAAO,KAAK,YAAY,KAAK;AAC/B;AAMO,SAAS,mBACd,SAA+B,OAAO,aAAa,cAAc,WAAW,QACtE;AACN,MAAI,gBAAgB,CAAC,OAAQ;AAC7B,MAAI,OAAO,eAAe,oBAAoB,GAAG;AAC/C,mBAAe;AACf;AAAA,EACF;AACA,kBAAgB,MAAM;AACxB;AAGO,SAAS,iCAAuC;AACrD,iBAAe;AACjB;"}
|
package/dist/icons/index.d.ts
CHANGED
|
@@ -17,10 +17,15 @@
|
|
|
17
17
|
export { FENIX_ICON_NAMES } from './names';
|
|
18
18
|
export type { FenixIconName, FenixIconKnownName } from './types';
|
|
19
19
|
export { FENIX_ICON_BASE_CSS, FENIX_ICON_FONT_FAMILY, isFenixIconName } from './base-css';
|
|
20
|
-
export { buildFenixIconsFontCss, loadFenixIconsFont, __resetFenixIconsFontInjection } from './font';
|
|
20
|
+
export { buildFenixIconsFontCss, loadFenixIconsFont, setFenixIconsFontUrl, __resetFenixIconsFontInjection, } from './font';
|
|
21
21
|
/** CSS base compartilhado (usado também dentro dos Shadow DOMs dos componentes). */
|
|
22
22
|
export declare const FENIX_ICON_DOC_BASE_CSS = "\n.fx-icon {\n font-family: var(--fx-icon-font, Fenix Icons);\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";
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Monta o CSS completo (@font-face + base + classes por ícone).
|
|
25
|
+
*
|
|
26
|
+
* A montagem mora em ./font para que `setFenixIconsFontUrl` consiga recriar o
|
|
27
|
+
* estilo injetado já com a nova URL, sem duplicar a lógica das ligaduras.
|
|
28
|
+
*/
|
|
24
29
|
export declare function buildFenixIconsCss(): string;
|
|
25
30
|
/**
|
|
26
31
|
* Injeta o CSS dos ícones no `<head>` do documento (idempotente).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1F,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,8BAA8B,GAC/B,MAAM,QAAQ,CAAC;AAEhB,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,moBAAsB,CAAC;AAE3D;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAOD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,QAAQ,GAAG,SAAkE,GAAG,IAAI,CAO1H;AAED,uDAAuD;AACvD,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD"}
|
package/dist/icons/index.js
CHANGED
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import { FENIX_ICON_NAMES } from "./names.js";
|
|
2
2
|
import { FENIX_ICON_BASE_CSS } from "./base-css.js";
|
|
3
3
|
import { FENIX_ICON_FONT_FAMILY, isFenixIconName } from "./base-css.js";
|
|
4
|
-
import { FENIX_ICONS_STYLE_ID,
|
|
5
|
-
import { buildFenixIconsFontCss, loadFenixIconsFont } from "./font.js";
|
|
4
|
+
import { FENIX_ICONS_STYLE_ID, buildFullCss, __resetFenixIconsFontInjection, __setFenixIconNames } from "./font.js";
|
|
5
|
+
import { buildFenixIconsFontCss, loadFenixIconsFont, setFenixIconsFontUrl } from "./font.js";
|
|
6
6
|
const FENIX_ICON_DOC_BASE_CSS = FENIX_ICON_BASE_CSS;
|
|
7
|
-
function buildClassRules() {
|
|
8
|
-
let rules = "";
|
|
9
|
-
for (const name of FENIX_ICON_NAMES) {
|
|
10
|
-
rules += `.fx-icon-${name}::before{content:"${name}"}`;
|
|
11
|
-
}
|
|
12
|
-
return rules;
|
|
13
|
-
}
|
|
14
7
|
function buildFenixIconsCss() {
|
|
15
|
-
return
|
|
8
|
+
return buildFullCss(FENIX_ICON_NAMES);
|
|
16
9
|
}
|
|
10
|
+
__setFenixIconNames(FENIX_ICON_NAMES);
|
|
17
11
|
let injected = false;
|
|
18
12
|
function loadFenixIcons(target = typeof document !== "undefined" ? document : void 0) {
|
|
19
13
|
if (injected || !target) return;
|
|
@@ -39,6 +33,7 @@ export {
|
|
|
39
33
|
buildFenixIconsFontCss,
|
|
40
34
|
isFenixIconName,
|
|
41
35
|
loadFenixIcons,
|
|
42
|
-
loadFenixIconsFont
|
|
36
|
+
loadFenixIconsFont,
|
|
37
|
+
setFenixIconsFontUrl
|
|
43
38
|
};
|
|
44
39
|
//# sourceMappingURL=index.js.map
|
package/dist/icons/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/icons/index.ts"],"sourcesContent":["/**\n * Fenix Icons — biblioteca de ícones padrão do FenixUI.\n *\n * Fonte self-hosted (`fenix-icons.woff2`, Material Symbols Rounded, Apache 2.0)\n * com TODOS os ícones embarcados — nenhuma requisição externa, nenhum CDN.\n *\n * Uso geral (basta importar `@wrrdev/fenix-ui/icons` UMA vez — o auto-import\n * faz isso automaticamente quando detecta `fx-icon` no código):\n *\n * <i class=\"fx-icon fx-icon-home\"></i>\n * <span class=\"fx-icon\">settings</span> (nome do ícone como conteúdo)\n * <fx-icon name=\"home\" /> (com autocomplete no editor)\n *\n * Modificadores: fx-icon-fill (preenchido), fx-icon-bold (peso maior).\n * Tamanho via font-size, cor via currentColor.\n */\n\nimport { FENIX_ICON_NAMES } from './names';\nimport { FENIX_ICON_BASE_CSS } from './base-css';\nimport {\n FENIX_ICONS_STYLE_ID,\n
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/icons/index.ts"],"sourcesContent":["/**\n * Fenix Icons — biblioteca de ícones padrão do FenixUI.\n *\n * Fonte self-hosted (`fenix-icons.woff2`, Material Symbols Rounded, Apache 2.0)\n * com TODOS os ícones embarcados — nenhuma requisição externa, nenhum CDN.\n *\n * Uso geral (basta importar `@wrrdev/fenix-ui/icons` UMA vez — o auto-import\n * faz isso automaticamente quando detecta `fx-icon` no código):\n *\n * <i class=\"fx-icon fx-icon-home\"></i>\n * <span class=\"fx-icon\">settings</span> (nome do ícone como conteúdo)\n * <fx-icon name=\"home\" /> (com autocomplete no editor)\n *\n * Modificadores: fx-icon-fill (preenchido), fx-icon-bold (peso maior).\n * Tamanho via font-size, cor via currentColor.\n */\n\nimport { FENIX_ICON_NAMES } from './names';\nimport { FENIX_ICON_BASE_CSS } from './base-css';\nimport {\n FENIX_ICONS_STYLE_ID,\n buildFullCss,\n __resetFenixIconsFontInjection,\n __setFenixIconNames,\n} from './font';\n\nexport { FENIX_ICON_NAMES } from './names';\nexport type { FenixIconName, FenixIconKnownName } from './types';\nexport { FENIX_ICON_BASE_CSS, FENIX_ICON_FONT_FAMILY, isFenixIconName } from './base-css';\n// Carregamento leve da fonte (usado pelo <fx-icon>) — ver ./font.\nexport {\n buildFenixIconsFontCss,\n loadFenixIconsFont,\n setFenixIconsFontUrl,\n __resetFenixIconsFontInjection,\n} from './font';\n\n/** CSS base compartilhado (usado também dentro dos Shadow DOMs dos componentes). */\nexport const FENIX_ICON_DOC_BASE_CSS = FENIX_ICON_BASE_CSS;\n\n/**\n * Monta o CSS completo (@font-face + base + classes por ícone).\n *\n * A montagem mora em ./font para que `setFenixIconsFontUrl` consiga recriar o\n * estilo injetado já com a nova URL, sem duplicar a lógica das ligaduras.\n */\nexport function buildFenixIconsCss(): string {\n return buildFullCss(FENIX_ICON_NAMES);\n}\n\n// Habilita a reinjeção do CSS completo quando a URL da fonte mudar em runtime.\n__setFenixIconNames(FENIX_ICON_NAMES);\n\nlet injected = false;\n\n/**\n * Injeta o CSS dos ícones no `<head>` do documento (idempotente).\n * Chamado automaticamente ao importar `@wrrdev/fenix-ui/icons`.\n * O `@font-face` registrado no documento também vale dentro dos Shadow DOMs.\n */\nexport function loadFenixIcons(target: Document | undefined = typeof document !== 'undefined' ? document : undefined): void {\n if (injected || !target) return;\n const style = target.createElement('style');\n style.id = FENIX_ICONS_STYLE_ID;\n style.textContent = buildFenixIconsCss();\n target.head.appendChild(style);\n injected = true;\n}\n\n/** Reseta o estado de injeção (uso interno/testes). */\nexport function __resetFenixIconsInjection(): void {\n injected = false;\n __resetFenixIconsFontInjection();\n}\n\n// Import com efeito colateral: `import '@wrrdev/fenix-ui/icons'` já carrega tudo.\nloadFenixIcons();"],"names":[],"mappings":";;;;;AAsCO,MAAM,0BAA0B;AAQhC,SAAS,qBAA6B;AAC3C,SAAO,aAAa,gBAAgB;AACtC;AAGA,oBAAoB,gBAAgB;AAEpC,IAAI,WAAW;AAOR,SAAS,eAAe,SAA+B,OAAO,aAAa,cAAc,WAAW,QAAiB;AAC1H,MAAI,YAAY,CAAC,OAAQ;AACzB,QAAM,QAAQ,OAAO,cAAc,OAAO;AAC1C,QAAM,KAAK;AACX,QAAM,cAAc,mBAAA;AACpB,SAAO,KAAK,YAAY,KAAK;AAC7B,aAAW;AACb;AAGO,SAAS,6BAAmC;AACjD,aAAW;AACX,iCAAA;AACF;AAGA,eAAA;"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"font-CF0TXsAP.js","sources":["../../src/core/sanitize.ts","../../src/icons/base-css.ts","../../src/icons/font.ts"],"sourcesContent":["/**\n * Sanitização de strings para injeção segura em HTML.\n *\n * Previne XSS ao escapar caracteres especiais antes de usar innerHTML.\n * Use SEMPRE que dados externos (API, usuário) forem injetados no DOM.\n */\n\n/** Caracteres que devem ser escapados para prevenir XSS. */\nconst HTML_ENTITIES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '=',\n};\n\n/** Regex que captura todos os caracteres perigosos. */\nconst SANITIZE_REGEX = /[&<>\"'`=/]/g;\n\n/**\n * Escapa caracteres especiais de HTML para prevenir XSS.\n *\n * @param value - Valor a ser escapado (convertido para string)\n * @returns String segura para innerHTML\n *\n * @example\n * // Seguro contra XSS\n * const userInput = '<img src=x onerror=alert(1)>';\n * element.innerHTML = `<div>${esc(userInput)}</div>`;\n * // Resultado: <img src=x onerror=alert(1)>\n */\nexport function esc(value: unknown): string {\n if (value == null) return '';\n return String(value).replace(SANITIZE_REGEX, (char) => HTML_ENTITIES[char] || char);\n}\n\n/**\n * Remove todas as tags HTML da string (strip tags).\n * Use quando quiser apenas texto puro, sem nenhuma marcação.\n *\n * @param html - String potencialmente contendo HTML\n * @returns String sem tags HTML\n */\nexport function stripTags(html: string): string {\n return html.replace(/<[^>]*>/g, '');\n}\n\n/**\n * Sanitiza um objeto de dados recursivamente.\n * Útil para sanitizar arrays de registros antes de renderizar.\n *\n * @param data - Objeto ou array a ser sanitizado\n * @returns Cópia sanitizada do objeto\n */\nexport function sanitizeData<T>(data: T): T {\n if (data == null) return data;\n if (typeof data === 'string') return esc(data) as unknown as T;\n if (Array.isArray(data)) return data.map(sanitizeData) as unknown as T;\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n result[key] = sanitizeData(value);\n }\n return result as T;\n }\n return data;\n}\n","/**\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\nimport { esc } from '../core/sanitize';\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\n/**\n * HTML do ícone para uso DENTRO de Shadow DOM (concatenar ao template).\n *\n * - Nome válido da Fenix Icons (ex.: `home`) → glifo via LIGADURA: o nome\n * vira o conteúdo de texto do elemento com a font-family de ícones.\n * Isso é obrigatório dentro de Shadow DOM: as regras\n * `.fx-icon-<nome>::before` são injetadas no <head> do documento e NÃO\n * atravessam a fronteira do shadow root (apenas o @font-face vale\n * dentro dele) — a classe vazia renderizaria um elemento sem glifo.\n * - Qualquer outro valor (emoji, texto) → texto puro escapado.\n *\n * A classe base `.fx-icon` é fornecida por `FENIX_ICON_BASE_CSS`\n * (concatenada às `static styles` do componente); o @font-face vem do\n * `@wrrdev/fenix-ui/icons` (injetado no <head>).\n */\nexport function fenixIconHtml(icon: string): string {\n const value = (icon ?? '').trim();\n if (!value) return '';\n if (isFenixIconName(value)) {\n return `<i class=\"fx-icon\" aria-hidden=\"true\">${value}</i>`;\n }\n return `<span aria-hidden=\"true\">${esc(value)}</span>`;\n}\n","/**\n * Carregamento LEVE da fonte de ícones (@font-face + classe base).\n *\n * Separado de ./index de propósito: importar este módulo NÃO injeta o CSS\n * completo com as ~4.300 regras `fx-icon-<nome>`. É o que o <fx-icon> usa —\n * dentro do Shadow DOM o glifo vem da ligadura (o nome como conteúdo), então\n * as classes por ícone não atravessam a fronteira do shadow root.\n */\n\nimport { FENIX_ICON_BASE_CSS, FENIX_ICON_FONT_FAMILY } from './base-css';\n\n/** URL da fonte woff2: no build ESM a fonte vive na mesma pasta do módulo (dist/icons). */\ndeclare const __FENIX_ICONS_FONT_URL__: string | undefined;\n\nfunction resolveFontUrl(): string {\n if (typeof __FENIX_ICONS_FONT_URL__ !== 'undefined' && __FENIX_ICONS_FONT_URL__) {\n return __FENIX_ICONS_FONT_URL__;\n }\n // IMPORTANTE: o `import.meta.url` precisa ser usado DIRETAMENTE como 2º\n // argumento de `new URL` (sem variável intermediária). É assim que Vite,\n // webpack e Rollup reconhecem o padrão de asset e copiam/reescrevem a URL\n // da fonte no build do PROJETO CONSUMIDOR — com variável, a URL permanece\n // dinâmica e quebra em produção (a fonte 404 e os ícones viram texto).\n return new URL('./fenix-icons.woff2', import.meta.url).toString();\n}\n\n/** URL resolvida da fonte (reutilizada por ./index para o CSS completo). */\nexport const FENIX_ICONS_FONT_URL = resolveFontUrl();\n\n/** Id do <style> com @font-face + classe base. */\nexport const FENIX_ICONS_FONT_STYLE_ID = 'fenix-icons-font';\n\n/** Id do <style> com o CSS completo (@font-face + base + classes por ícone). */\nexport const FENIX_ICONS_STYLE_ID = 'fenix-icons';\n\n/** CSS do @font-face. */\nexport function buildFenixIconsFontFaceCss(): string {\n return (\n `@font-face{font-family:'${FENIX_ICON_FONT_FAMILY}';font-style:normal;font-weight:100 700;` +\n `font-display:block;src:url('${FENIX_ICONS_FONT_URL}') format('woff2');}`\n );\n}\n\n/** CSS leve: @font-face + classe base (sem as classes por ícone). */\nexport function buildFenixIconsFontCss(): string {\n return buildFenixIconsFontFaceCss() + FENIX_ICON_BASE_CSS;\n}\n\nlet fontInjected = false;\n\n/**\n * Injeta @font-face + classe base no <head> (idempotente). Não duplica quando\n * o CSS completo (`fenix-icons`) já foi carregado por `import '.../icons'`.\n */\nexport function loadFenixIconsFont(\n target: Document | undefined = typeof document !== 'undefined' ? document : undefined,\n): void {\n if (fontInjected || !target) return;\n if (target.getElementById(FENIX_ICONS_STYLE_ID)) {\n fontInjected = true;\n return;\n }\n const style = target.createElement('style');\n style.id = FENIX_ICONS_FONT_STYLE_ID;\n style.textContent = buildFenixIconsFontCss();\n target.head.appendChild(style);\n fontInjected = true;\n}\n\n/** Reseta o estado de injeção da fonte (uso interno/testes). */\nexport function __resetFenixIconsFontInjection(): void {\n fontInjected = false;\n}"],"names":[],"mappings":"AAQA,MAAM,gBAAwC;AAAA,EAC5C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAGA,MAAM,iBAAiB;AAchB,SAAS,IAAI,OAAwB;AAC1C,MAAI,SAAS,KAAM,QAAO;AAC1B,SAAO,OAAO,KAAK,EAAE,QAAQ,gBAAgB,CAAC,SAAS,cAAc,IAAI,KAAK,IAAI;AACpF;AASO,SAAS,UAAU,MAAsB;AAC9C,SAAO,KAAK,QAAQ,YAAY,EAAE;AACpC;AASO,SAAS,aAAgB,MAAY;AAC1C,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,OAAO,SAAS,SAAU,QAAO,IAAI,IAAI;AAC7C,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,YAAY;AACrD,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,SAAkC,CAAA;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAA+B,GAAG;AAC1E,aAAO,GAAG,IAAI,aAAa,KAAK;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;ACxDO,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;AAiBO,SAAS,cAAc,MAAsB;AAClD,QAAM,SAAS,QAAQ,IAAI,KAAA;AAC3B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,gBAAgB,KAAK,GAAG;AAC1B,WAAO,yCAAyC,KAAK;AAAA,EACvD;AACA,SAAO,4BAA4B,IAAI,KAAK,CAAC;AAC/C;ACxDA,SAAS,iBAAyB;AAChC,MAAI,OAAO,6BAA6B,eAAe,0BAA0B;AAC/E,WAAO;AAAA,EACT;AAMA,SAAO,IAAA,IAAA,kEAAA,YAAA,GAAA,EAAgD,SAAA;AACzD;AAGO,MAAM,uBAAuB,eAAA;AAG7B,MAAM,4BAA4B;AAGlC,MAAM,uBAAuB;AAG7B,SAAS,6BAAqC;AACnD,SACE,2BAA2B,sBAAsB,uEAClB,oBAAoB;AAEvD;AAGO,SAAS,yBAAiC;AAC/C,SAAO,+BAA+B;AACxC;AAEA,IAAI,eAAe;AAMZ,SAAS,mBACd,SAA+B,OAAO,aAAa,cAAc,WAAW,QACtE;AACN,MAAI,gBAAgB,CAAC,OAAQ;AAC7B,MAAI,OAAO,eAAe,oBAAoB,GAAG;AAC/C,mBAAe;AACf;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,cAAc,OAAO;AAC1C,QAAM,KAAK;AACX,QAAM,cAAc,uBAAA;AACpB,SAAO,KAAK,YAAY,KAAK;AAC7B,iBAAe;AACjB;AAGO,SAAS,iCAAuC;AACrD,iBAAe;AACjB;"}
|