@seedgrid/fe-components 2026.10.2 → 2026.11.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.
Files changed (42) hide show
  1. package/dist/ai/seedgrid-components.manifest.json +69 -4
  2. package/dist/generated/compiledStyles.d.ts +1 -1
  3. package/dist/generated/compiledStyles.d.ts.map +1 -1
  4. package/dist/generated/compiledStyles.js +1 -1
  5. package/dist/i18n/en-US.d.ts.map +1 -1
  6. package/dist/i18n/en-US.js +4 -0
  7. package/dist/i18n/es.d.ts.map +1 -1
  8. package/dist/i18n/es.js +67 -63
  9. package/dist/i18n/fr.d.ts.map +1 -1
  10. package/dist/i18n/fr.js +53 -49
  11. package/dist/i18n/pt-BR.d.ts.map +1 -1
  12. package/dist/i18n/pt-BR.js +13 -9
  13. package/dist/i18n/pt-PT.d.ts.map +1 -1
  14. package/dist/i18n/pt-PT.js +13 -9
  15. package/dist/index.d.ts +2 -2
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/inputs/SgDatatable.d.ts +10 -0
  19. package/dist/inputs/SgDatatable.d.ts.map +1 -1
  20. package/dist/inputs/SgDatatable.js +75 -14
  21. package/dist/inputs/SgDatatable.meta.d.ts.map +1 -1
  22. package/dist/inputs/SgDatatable.meta.js +6 -4
  23. package/dist/inputs/SgInputCNPJ.d.ts.map +1 -1
  24. package/dist/inputs/SgInputCNPJ.js +1 -6
  25. package/dist/inputs/SgInputCPFCNPJ.d.ts +10 -0
  26. package/dist/inputs/SgInputCPFCNPJ.d.ts.map +1 -1
  27. package/dist/inputs/SgInputCPFCNPJ.js +55 -2
  28. package/dist/inputs/SgInputCPFCNPJ.meta.d.ts.map +1 -1
  29. package/dist/inputs/SgInputCPFCNPJ.meta.js +11 -0
  30. package/dist/inputs/SgInputPassword.d.ts.map +1 -1
  31. package/dist/inputs/SgInputPassword.js +6 -0
  32. package/dist/inputs/publicaCnpj.d.ts +3 -0
  33. package/dist/inputs/publicaCnpj.d.ts.map +1 -0
  34. package/dist/inputs/publicaCnpj.js +7 -0
  35. package/dist/inputs/useSgContainerWidth.d.ts +13 -0
  36. package/dist/inputs/useSgContainerWidth.d.ts.map +1 -0
  37. package/dist/inputs/useSgContainerWidth.js +42 -0
  38. package/dist/overlay/SgDialog.d.ts.map +1 -1
  39. package/dist/overlay/SgDialog.js +15 -11
  40. package/dist/sandbox.cjs +51 -51
  41. package/dist/style.css +1 -1
  42. package/package.json +3 -3
@@ -7,9 +7,9 @@ export const sgMeta = {
7
7
  displayName: "SgDatatable",
8
8
  category: "data",
9
9
  subcategory: "datatable",
10
- description: "Tabela de dados interativa com colunas configuraveis, paginacao, ordenacao, filtro, selecao e persistencia de layout de colunas.",
10
+ description: "Tabela de dados interativa com colunas configuraveis, paginacao, ordenacao, filtro, selecao e persistencia de layout de colunas. Em celular pode virar lista de cartoes (mobileMode=\"cards\").",
11
11
  tags: ["data", "table", "grid", "listing", "interactive"],
12
- capabilities: ["pagination", "sorting", "filtering", "selection", "column-config", "column-layout-persistence", "row-actions"],
12
+ capabilities: ["pagination", "sorting", "filtering", "selection", "column-config", "column-layout-persistence", "row-actions", "mobile-cards"],
13
13
  fieldSemantics: ["tabularData", "dataGrid", "listing", "collectionView"],
14
14
  props: [
15
15
  { name: "id", type: "string", description: "Identificador da tabela usado para DOM e persistencia do layout de colunas.", semanticRole: "data", bindable: true },
@@ -17,6 +17,7 @@ export const sgMeta = {
17
17
  { name: "rows", type: "number", description: "Linhas por pagina quando a paginacao esta ativa (os dados vao em value).", semanticRole: "behavior", bindable: true },
18
18
  { name: "selectionMode", type: "\"single\" | \"multiple\"", description: "Modo de selecao de linhas.", semanticRole: "behavior", bindable: true },
19
19
  { name: "loading", type: "boolean", default: false, description: "Indica estado de carregamento.", semanticRole: "appearance", bindable: true },
20
+ { name: "mobileMode", type: "\"scroll\" | \"cards\"", default: "scroll", description: "Comportamento em tela estreita (container abaixo de 600 px): scroll rola a tabela na horizontal; cards mostra cada linha como cartao 'coluna: valor' mantendo ordenacao, selecao, acoes, rodape e paginacao.", semanticRole: "behavior", bindable: true },
20
21
  { name: "paginator", type: "boolean", default: false, description: "Ativa paginacao.", semanticRole: "behavior", bindable: true },
21
22
  { name: "onPage", type: "(event: SgDatatablePageEvent) => void", description: "Callback de paginacao.", semanticRole: "event", bindable: false },
22
23
  { name: "onSort", type: "(event: SgDatatableSortEvent) => void", description: "Callback de ordenacao.", semanticRole: "event", bindable: false }
@@ -34,14 +35,15 @@ export const aiHints = {
34
35
  preferredUseCases: [
35
36
  "Exibicao de colecoes tabulares com interacao.",
36
37
  "Listagens administrativas com filtro, ordenacao e pagina.",
37
- "Tabelas com acoes por linha e selecao."
38
+ "Tabelas com acoes por linha e selecao.",
39
+ "Listagens que precisam funcionar em celular: mobileMode=\"cards\" mostra cada linha como cartao (tabela que se adapta ao celular)."
38
40
  ],
39
41
  avoidUseCases: [
40
42
  "Formularios de entrada simples.",
41
43
  "Colecoes muito visuais em formato de cards.",
42
44
  "Dados pequenos onde uma lista simples basta."
43
45
  ],
44
- synonyms: ["datatable", "data grid", "table", "listing grid"],
46
+ synonyms: ["datatable", "tabela no celular", "tabela responsiva", "data grid", "table", "listing grid", "tabela mobile", "lista de cartoes", "cards no celular", "responsive table", "mobile table"],
45
47
  relatedEntityFields: ["rows", "records", "items", "results", "tableData"],
46
48
  compositionHints: [
47
49
  "Combinar com filtros acima da tabela usando inputs de busca e selecao.",
@@ -1 +1 @@
1
- {"version":3,"file":"SgInputCNPJ.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputCNPJ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMnE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG;IAC9E,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;QACzD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;KACnC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7D,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C,CAAC;AAgBF,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CA2IlD"}
1
+ {"version":3,"file":"SgInputCNPJ.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputCNPJ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOnE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG;IAC9E,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;QACzD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;KACnC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7D,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C,CAAC;AAUF,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CA2IlD"}
@@ -6,18 +6,13 @@ import { resolveFieldError } from "../rhf";
6
6
  import { maskCnpj } from "../masks";
7
7
  import { isValidCnpj } from "../validators";
8
8
  import { t, useComponentsI18n } from "../i18n";
9
+ import { defaultPublicaCnpjFetch } from "./publicaCnpj";
9
10
  function onlyAlnumUpper(value) {
10
11
  return value.replace(/[^0-9A-Za-z]/g, "").toUpperCase();
11
12
  }
12
13
  function onlyDigits(value) {
13
14
  return value.replace(/\D/g, "");
14
15
  }
15
- const defaultPublicaCnpjFetch = async (cnpj) => {
16
- const response = await fetch(`https://publica.cnpj.ws/cnpj/${cnpj}`);
17
- if (!response.ok)
18
- return null;
19
- return response.json();
20
- };
21
16
  export function SgInputCNPJ(props) {
22
17
  const i18n = useComponentsI18n();
23
18
  const { required, requiredMessage, lengthMessage, invalidMessage, validateOnBlur, error, validation, validateWithPublicaCnpj, publicaCnpjErrorMessage, publicaCnpjFetch, onPublicaCnpjResult, onPublicaCnpjError, ...rest } = props;
@@ -16,6 +16,16 @@ export type SgInputCPFCNPJProps = Omit<SgInputTextProps, "inputProps" | "error">
16
16
  validation?: (value: string) => string | null;
17
17
  onValidation?: (message: string | null) => void;
18
18
  validateOnBlur?: boolean;
19
+ /** Quando o documento e um CNPJ numerico valido, confirma na base publica (publica.cnpj.ws) que ele existe. */
20
+ validateWithPublicaCnpj?: boolean;
21
+ /** Mensagem quando a base publica nao encontra o CNPJ. */
22
+ publicaCnpjErrorMessage?: string;
23
+ /** Consulta injetavel (testes sem rede). Padrao: https://publica.cnpj.ws. */
24
+ publicaCnpjFetch?: (cnpj: string) => Promise<unknown | null>;
25
+ /** Recebe o resultado da consulta (`null` quando nao achou). */
26
+ onPublicaCnpjResult?: (data: unknown | null) => void;
27
+ /** Chamado quando a consulta falha (rede ou limite da API); a validacao passa. */
28
+ onPublicaCnpjError?: (error: unknown) => void;
19
29
  };
20
30
  export declare function SgInputCPFCNPJ(props: SgInputCPFCNPJProps): import("react/jsx-runtime").JSX.Element;
21
31
  //# sourceMappingURL=SgInputCPFCNPJ.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SgInputCPFCNPJ.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputCPFCNPJ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMnE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG;IACjF,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;QACzD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;KACnC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAUF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAgGxD"}
1
+ {"version":3,"file":"SgInputCPFCNPJ.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputCPFCNPJ.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOnE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG;IACjF,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;QACzD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;KACnC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+GAA+G;IAC/G,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0DAA0D;IAC1D,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7D,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C,CAAC;AAUF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAgKxD"}
@@ -6,6 +6,7 @@ import { resolveFieldError } from "../rhf";
6
6
  import { maskCpfCnpj } from "../masks";
7
7
  import { isValidCnpj, isValidCpf } from "../validators";
8
8
  import { t, useComponentsI18n } from "../i18n";
9
+ import { defaultPublicaCnpjFetch } from "./publicaCnpj";
9
10
  function onlyDigits(value) {
10
11
  return value.replace(/\D/g, "");
11
12
  }
@@ -14,8 +15,10 @@ function onlyAlnumUpper(value) {
14
15
  }
15
16
  export function SgInputCPFCNPJ(props) {
16
17
  const i18n = useComponentsI18n();
17
- const { required, requiredMessage, lengthMessage, invalidMessage, validateOnBlur, error, validation, ...rest } = props;
18
+ const { required, requiredMessage, lengthMessage, invalidMessage, validateOnBlur, error, validation, validateWithPublicaCnpj, publicaCnpjErrorMessage, publicaCnpjFetch, onPublicaCnpjResult, onPublicaCnpjError, ...rest } = props;
18
19
  const [internalError, setInternalError] = React.useState(null);
20
+ const lastValidatedCnpjRef = React.useRef(null);
21
+ const lastPublicaFoundRef = React.useRef(null);
19
22
  const runValidation = React.useCallback((value) => {
20
23
  const raw = onlyAlnumUpper(value);
21
24
  if (!raw && !required) {
@@ -68,9 +71,59 @@ export function SgInputCPFCNPJ(props) {
68
71
  props.onValidation?.(message);
69
72
  return;
70
73
  }
74
+ if (validateWithPublicaCnpj && !/[A-Z]/.test(raw)) {
75
+ const digits = onlyDigits(raw);
76
+ if (digits.length === 14) {
77
+ const message = publicaCnpjErrorMessage ?? invalidMessage ?? t(i18n, "components.inputs.cnpj.invalid");
78
+ if (lastValidatedCnpjRef.current === digits) {
79
+ if (lastPublicaFoundRef.current === false) {
80
+ setInternalError(message);
81
+ props.onValidation?.(message);
82
+ }
83
+ else {
84
+ setInternalError(null);
85
+ props.onValidation?.(null);
86
+ }
87
+ return;
88
+ }
89
+ void (async () => {
90
+ try {
91
+ const checker = publicaCnpjFetch ?? defaultPublicaCnpjFetch;
92
+ const data = await checker(digits);
93
+ lastValidatedCnpjRef.current = digits;
94
+ lastPublicaFoundRef.current = Boolean(data);
95
+ onPublicaCnpjResult?.(data);
96
+ if (!data) {
97
+ setInternalError(message);
98
+ props.onValidation?.(message);
99
+ return;
100
+ }
101
+ }
102
+ catch (err) {
103
+ onPublicaCnpjError?.(err);
104
+ }
105
+ setInternalError(null);
106
+ props.onValidation?.(null);
107
+ })();
108
+ return;
109
+ }
110
+ }
71
111
  setInternalError(null);
72
112
  props.onValidation?.(null);
73
- }, [i18n, required, requiredMessage, lengthMessage, invalidMessage, validation, props]);
113
+ }, [
114
+ i18n,
115
+ required,
116
+ requiredMessage,
117
+ lengthMessage,
118
+ invalidMessage,
119
+ validation,
120
+ props,
121
+ validateWithPublicaCnpj,
122
+ publicaCnpjErrorMessage,
123
+ publicaCnpjFetch,
124
+ onPublicaCnpjResult,
125
+ onPublicaCnpjError
126
+ ]);
74
127
  const inputProps = {
75
128
  ...rest.inputProps,
76
129
  inputMode: rest.inputProps?.inputMode ?? "text",
@@ -1 +1 @@
1
- {"version":3,"file":"SgInputCPFCNPJ.meta.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputCPFCNPJ.meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE9D,eAAO,MAAM,MAAM,EAAE,QAsDpB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,WAyBrB,CAAC"}
1
+ {"version":3,"file":"SgInputCPFCNPJ.meta.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputCPFCNPJ.meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE9D,eAAO,MAAM,MAAM,EAAE,QAiEpB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,WAyBrB,CAAC"}
@@ -19,6 +19,11 @@ export const sgMeta = {
19
19
  { name: "lengthMessage", type: "string", description: "Mensagem para comprimento invalido.", semanticRole: "validation", bindable: true },
20
20
  { name: "invalidMessage", type: "string", description: "Mensagem para documento invalido.", semanticRole: "validation", bindable: true },
21
21
  { name: "validateOnBlur", type: "boolean", default: true, description: "Executa validacao no blur.", semanticRole: "behavior", bindable: true },
22
+ { name: "validateWithPublicaCnpj", type: "boolean", default: false, description: "Confirma na base publica que o CNPJ numerico existe.", semanticRole: "behavior", bindable: true },
23
+ { name: "publicaCnpjErrorMessage", type: "string", description: "Mensagem quando a base publica nao encontra o CNPJ.", semanticRole: "validation", bindable: true },
24
+ { name: "publicaCnpjFetch", type: "(cnpj: string) => Promise<unknown | null>", description: "Consulta injetavel (padrao publica.cnpj.ws).", semanticRole: "behavior", bindable: false },
25
+ { name: "onPublicaCnpjResult", type: "(data: unknown | null) => void", description: "Recebe o resultado da consulta.", semanticRole: "event", bindable: false },
26
+ { name: "onPublicaCnpjError", type: "(error: unknown) => void", description: "Chamado quando a consulta falha.", semanticRole: "event", bindable: false },
22
27
  { name: "validation", type: "(value: string) => string | null", description: "Validacao customizada adicional.", semanticRole: "validation", bindable: false },
23
28
  { name: "onValidation", type: "(message: string | null) => void", description: "Callback para estado de validacao.", semanticRole: "event", bindable: false }
24
29
  ],
@@ -30,6 +35,12 @@ export const sgMeta = {
30
35
  file: "apps/showcase/src/app/components/sg-input-cpf-cnpj/samples/basico.tsx.sample",
31
36
  kind: "sample"
32
37
  },
38
+ {
39
+ id: "publica-cnpj",
40
+ title: "Consulta na base publica",
41
+ file: "apps/showcase/src/app/components/sg-input-cpf-cnpj/samples/cnpj-publico.tsx.sample",
42
+ kind: "sample"
43
+ },
33
44
  {
34
45
  id: "playground",
35
46
  title: "Playground",
@@ -1 +1 @@
1
- {"version":3,"file":"SgInputPassword.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputPassword.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAInE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,gBAAgB,EAChB,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,iBAAiB,GAAG,gBAAgB,CACpF,GAAG;IACF,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,4GAA4G;IAC5G,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAC3C,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,oBAAoB,CAAC,2CAgbpE"}
1
+ {"version":3,"file":"SgInputPassword.d.ts","sourceRoot":"","sources":["../../src/inputs/SgInputPassword.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAInE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,gBAAgB,EAChB,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,iBAAiB,GAAG,gBAAgB,CACpF,GAAG;IACF,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,4GAA4G;IAC5G,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAC3C,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,oBAAoB,CAAC,2CAqbpE"}
@@ -12,6 +12,8 @@ export function SgInputPassword(props) {
12
12
  const [isHidden, setIsHidden] = React.useState(hidePassword ?? true);
13
13
  const [hasInteracted, setHasInteracted] = React.useState(false);
14
14
  const [unmetRequirements, setUnmetRequirements] = React.useState([]);
15
+ // Barra de forca: sem texto digitado nao ha o que medir (antes ficava toda verde com o campo vazio).
16
+ const [hasText, setHasText] = React.useState(false);
15
17
  const inputRef = React.useRef(null);
16
18
  const commonPasswordSet = React.useMemo(() => {
17
19
  if (!commonPasswordCheck)
@@ -80,11 +82,14 @@ export function SgInputPassword(props) {
80
82
  prohibitsSequentialAscCharacters,
81
83
  prohibitsSequentialDescCharacters
82
84
  ];
85
+ if (!hasText)
86
+ return 0;
83
87
  const activeChecks = totalChecks.filter((v) => v !== false).length;
84
88
  if (activeChecks === 0)
85
89
  return 0;
86
90
  return activeChecks - unmetRequirements.length;
87
91
  }, [
92
+ hasText,
88
93
  lowerRequired,
89
94
  minSize,
90
95
  numberRequired,
@@ -174,6 +179,7 @@ export function SgInputPassword(props) {
174
179
  upperRequired
175
180
  ]);
176
181
  const runValidation = React.useCallback((value) => {
182
+ setHasText(value.length > 0);
177
183
  if (!value && !required) {
178
184
  setInternalError(null);
179
185
  onValidation?.(null);
@@ -0,0 +1,3 @@
1
+ /** Consulta padrao da base publica de CNPJ (publica.cnpj.ws). Resposta nao-2xx vira `null` ("nao achou"). */
2
+ export declare const defaultPublicaCnpjFetch: (cnpj: string) => Promise<any>;
3
+ //# sourceMappingURL=publicaCnpj.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicaCnpj.d.ts","sourceRoot":"","sources":["../../src/inputs/publicaCnpj.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,eAAO,MAAM,uBAAuB,GAAU,MAAM,MAAM,iBAIzD,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Consulta padrao da base publica de CNPJ (publica.cnpj.ws). Resposta nao-2xx vira `null` ("nao achou"). */
2
+ export const defaultPublicaCnpjFetch = async (cnpj) => {
3
+ const response = await fetch(`https://publica.cnpj.ws/cnpj/${cnpj}`);
4
+ if (!response.ok)
5
+ return null;
6
+ return response.json();
7
+ };
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ /**
3
+ * Mede a largura (px) do elemento observado e acompanha o redimensionamento.
4
+ *
5
+ * - Devolve `null` enquanto a largura nao e conhecida (SSR, antes da primeira medicao,
6
+ * elemento oculto/sem layout). Quem consome deve tratar `null` como "nao estreito",
7
+ * para nunca trocar o layout no servidor nem piscar na hidratacao.
8
+ * - Mede o CONTAINER (e nao a janela), como o `LayoutBuilder` do Flutter: a tabela dentro de
9
+ * um painel estreito num desktop tambem e considerada estreita.
10
+ * - `enabled=false` nao observa nada (custo zero para quem nao usa).
11
+ */
12
+ export declare function useSgContainerWidth(ref: React.RefObject<HTMLElement | null>, enabled?: boolean): number | null;
13
+ //# sourceMappingURL=useSgContainerWidth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSgContainerWidth.d.ts","sourceRoot":"","sources":["../../src/inputs/useSgContainerWidth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,OAAO,UAAO,GACb,MAAM,GAAG,IAAI,CAiCf"}
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import React from "react";
3
+ const useIsomorphicLayoutEffect = typeof window === "undefined" ? React.useEffect : React.useLayoutEffect;
4
+ /**
5
+ * Mede a largura (px) do elemento observado e acompanha o redimensionamento.
6
+ *
7
+ * - Devolve `null` enquanto a largura nao e conhecida (SSR, antes da primeira medicao,
8
+ * elemento oculto/sem layout). Quem consome deve tratar `null` como "nao estreito",
9
+ * para nunca trocar o layout no servidor nem piscar na hidratacao.
10
+ * - Mede o CONTAINER (e nao a janela), como o `LayoutBuilder` do Flutter: a tabela dentro de
11
+ * um painel estreito num desktop tambem e considerada estreita.
12
+ * - `enabled=false` nao observa nada (custo zero para quem nao usa).
13
+ */
14
+ export function useSgContainerWidth(ref, enabled = true) {
15
+ const [width, setWidth] = React.useState(null);
16
+ useIsomorphicLayoutEffect(() => {
17
+ if (!enabled) {
18
+ setWidth((prev) => (prev === null ? prev : null));
19
+ return;
20
+ }
21
+ const element = ref.current;
22
+ if (!element)
23
+ return;
24
+ const measure = () => {
25
+ const next = element.getBoundingClientRect().width;
26
+ const resolved = next > 0 ? Math.round(next) : null;
27
+ setWidth((prev) => (prev === resolved ? prev : resolved));
28
+ };
29
+ measure();
30
+ if (typeof ResizeObserver !== "undefined") {
31
+ const observer = new ResizeObserver(measure);
32
+ observer.observe(element);
33
+ return () => observer.disconnect();
34
+ }
35
+ if (typeof window !== "undefined") {
36
+ window.addEventListener("resize", measure);
37
+ return () => window.removeEventListener("resize", measure);
38
+ }
39
+ return;
40
+ }, [ref, enabled]);
41
+ return width;
42
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"SgDialog.d.ts","sourceRoot":"","sources":["../../src/overlay/SgDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEzB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3E,gCAAgC;IAChC,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAsRF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,4BAqRtD;yBArRe,QAAQ"}
1
+ {"version":3,"file":"SgDialog.d.ts","sourceRoot":"","sources":["../../src/overlay/SgDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEzB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3E,gCAAgC;IAChC,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAsRF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,4BAwRtD;yBAxRe,QAAQ"}
@@ -20,25 +20,25 @@ function sizeClass(size) {
20
20
  return "max-w-none w-[calc(100vw-2rem)] h-[calc(100vh-2rem)] max-h-none";
21
21
  }
22
22
  }
23
- function severityClass(severity) {
23
+ /** Cor do acento da severidade: a mesma do fundo do SgButton da severidade (var do tema com fallback). `null` em "plain". */
24
+ function severityColor(severity) {
24
25
  switch (severity) {
25
26
  case "primary":
26
- return "border-t-[hsl(var(--primary))]";
27
+ return "var(--sg-btn-primary-bg, hsl(var(--primary)))";
27
28
  case "secondary":
28
- return "border-t-[hsl(var(--secondary))]";
29
+ return "var(--sg-btn-secondary-bg, hsl(var(--secondary)))";
29
30
  case "success":
30
- return "border-t-[hsl(var(--tertiary,var(--accent,var(--primary))))]";
31
+ return "var(--sg-btn-success-bg, hsl(var(--tertiary, var(--accent))))";
31
32
  case "info":
32
- return "border-t-[hsl(var(--secondary,var(--primary)))]";
33
+ return "var(--sg-btn-info-bg, hsl(var(--secondary, var(--primary))))";
33
34
  case "warning":
34
- return "border-t-[hsl(var(--accent,var(--secondary,var(--primary))))]";
35
+ return "var(--sg-btn-warning-bg, hsl(var(--secondary, var(--accent))))";
35
36
  case "help":
36
- return "border-t-[hsl(var(--secondary,var(--primary)))]";
37
+ return "var(--sg-btn-help-bg, hsl(var(--secondary, var(--primary))))";
37
38
  case "danger":
38
- return "border-t-[hsl(var(--destructive))]";
39
- case "plain":
39
+ return "var(--sg-btn-danger-bg, hsl(var(--destructive)))";
40
40
  default:
41
- return "border-t-[hsl(var(--border))]";
41
+ return null;
42
42
  }
43
43
  }
44
44
  function contentStateClass(animation, entered) {
@@ -400,11 +400,15 @@ export function SgDialog(props) {
400
400
  const contentStyle = {
401
401
  ...dialogVars,
402
402
  ...transitionStyle,
403
+ ...(customColor === undefined && severityColor(severity)
404
+ ? { backgroundColor: `color-mix(in srgb, ${severityColor(severity)} 12%, hsl(var(--background)))` }
405
+ : {}),
406
+ ...(showTopAccent ? { borderTopColor: severityColor(severity) ?? "hsl(var(--border))" } : {}),
403
407
  ...(customColor !== undefined ? { backgroundColor: customColor } : {}),
404
408
  ...(customPalette ? { color: customPalette.foreground, borderColor: customPalette.border } : {}),
405
409
  ...(resolvedShadow !== undefined ? { boxShadow: resolvedShadow } : {})
406
410
  };
407
- return createPortal(_jsxs("div", { className: cn("fixed inset-0 z-[1000]", className), style: style, role: "dialog", "aria-modal": "true", "aria-label": a11yLabel, children: [_jsx("div", { ref: overlayRef, onMouseDown: onOverlayMouseDown, className: cn(overlayBase, overlayState, overlayClassName), style: transitionStyle }), _jsx("div", { className: "fixed inset-0 flex items-center justify-center p-4", onMouseDown: onViewportMouseDown, children: _jsxs("div", { ref: contentRef, className: cn(contentBase, sizeClass(size), contentStateClass(animation, entered), showTopAccent ? severityClass(severity) : false, contentClassName), style: contentStyle, children: [(title || subtitle || closeable || leading || trailing) && (_jsxs("div", { className: cn("px-5 py-4 border-b border-[var(--sg-dialog-divider)] flex items-start gap-3", headerClassName), children: [leading ? _jsx("div", { className: "shrink-0 pt-0.5", children: leading }) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [title ? _jsx("div", { className: "text-base font-semibold leading-6", children: title }) : null, subtitle ? _jsx("div", { className: "mt-1 text-sm text-[var(--sg-dialog-muted-foreground)]", children: subtitle }) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [trailing ? _jsx("div", { className: "shrink-0", children: trailing }) : null, closeable ? (_jsx("button", { type: "button", onClick: close, className: cn("inline-flex items-center justify-center h-9 w-9 rounded-lg", "hover:bg-[var(--sg-dialog-hover-bg)] active:bg-[var(--sg-dialog-active-bg)]", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--ring,var(--primary)))]"), "aria-label": t(i18n, "components.dialog.close"), children: _jsx(CloseIcon, {}) })) : null] })] })), _jsx("div", { className: cn("px-5 py-4 overflow-auto", bodyClassName), children: children }), footer ? (_jsx("div", { className: cn("px-5 py-4 border-t border-[var(--sg-dialog-divider)] flex items-center justify-end gap-2", footerClassName), children: footer })) : null] }) })] }), document.body);
411
+ return createPortal(_jsxs("div", { className: cn("fixed inset-0 z-[1000]", className), style: style, role: "dialog", "aria-modal": "true", "aria-label": a11yLabel, children: [_jsx("div", { ref: overlayRef, onMouseDown: onOverlayMouseDown, className: cn(overlayBase, overlayState, overlayClassName), style: transitionStyle }), _jsx("div", { className: "fixed inset-0 flex items-center justify-center p-4", onMouseDown: onViewportMouseDown, children: _jsxs("div", { ref: contentRef, className: cn(contentBase, sizeClass(size), contentStateClass(animation, entered), contentClassName), style: contentStyle, children: [(title || subtitle || closeable || leading || trailing) && (_jsxs("div", { className: cn("px-5 py-4 border-b border-[var(--sg-dialog-divider)] flex items-start gap-3", headerClassName), children: [leading ? _jsx("div", { className: "shrink-0 pt-0.5", children: leading }) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [title ? _jsx("div", { className: "text-base font-semibold leading-6", children: title }) : null, subtitle ? _jsx("div", { className: "mt-1 text-sm text-[var(--sg-dialog-muted-foreground)]", children: subtitle }) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [trailing ? _jsx("div", { className: "shrink-0", children: trailing }) : null, closeable ? (_jsx("button", { type: "button", onClick: close, className: cn("inline-flex items-center justify-center h-9 w-9 rounded-lg", "hover:bg-[var(--sg-dialog-hover-bg)] active:bg-[var(--sg-dialog-active-bg)]", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--ring,var(--primary)))]"), "aria-label": t(i18n, "components.dialog.close"), children: _jsx(CloseIcon, {}) })) : null] })] })), _jsx("div", { className: cn("px-5 py-4 overflow-auto", bodyClassName), children: children }), footer ? (_jsx("div", { className: cn("px-5 py-4 border-t border-[var(--sg-dialog-divider)] flex items-center justify-end gap-2", footerClassName), children: footer })) : null] }) })] }), document.body);
408
412
  }
409
413
  function CloseIcon() {
410
414
  return (_jsx("svg", { viewBox: "0 0 24 24", className: "size-5", "aria-hidden": "true", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }));