@plenustech/design-system 0.2.4 → 0.2.5
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 +8 -0
- package/dist/components/actions/ButtonTile/ButtonTile.module.css.cjs +1 -1
- package/dist/components/actions/ButtonTile/ButtonTile.module.css.js +10 -10
- package/dist/components/actions/Toolbar/Toolbar.cjs +1 -1
- package/dist/components/actions/Toolbar/Toolbar.cjs.map +1 -1
- package/dist/components/actions/Toolbar/Toolbar.js +64 -53
- package/dist/components/actions/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/data-display/CodeBlock/syntax.cjs +10 -3
- package/dist/components/data-display/CodeBlock/syntax.cjs.map +1 -1
- package/dist/components/data-display/CodeBlock/syntax.js +68 -48
- package/dist/components/data-display/CodeBlock/syntax.js.map +1 -1
- package/dist/components/data-display/Timeline/Timeline.cjs +1 -1
- package/dist/components/data-display/Timeline/Timeline.cjs.map +1 -1
- package/dist/components/data-display/Timeline/Timeline.js +6 -6
- package/dist/components/data-display/Timeline/Timeline.js.map +1 -1
- package/dist/components/data-display/Timeline/Timeline.module.css.cjs +1 -1
- package/dist/components/data-display/Timeline/Timeline.module.css.js +18 -16
- package/dist/components/data-display/Timeline/Timeline.module.css.js.map +1 -1
- package/dist/components/forms/Checkbox/Checkbox.module.css.cjs +1 -1
- package/dist/components/forms/Checkbox/Checkbox.module.css.js +5 -5
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs +1 -1
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js +1 -1
- package/dist/components/forms/Field/Field.cjs +1 -1
- package/dist/components/forms/Field/Field.cjs.map +1 -1
- package/dist/components/forms/Field/Field.js +22 -22
- package/dist/components/forms/Field/Field.js.map +1 -1
- package/dist/components/forms/Field/Field.module.css.cjs +1 -1
- package/dist/components/forms/Field/Field.module.css.js +19 -17
- package/dist/components/forms/Field/Field.module.css.js.map +1 -1
- package/dist/components/forms/InputText/InputText.cjs +1 -1
- package/dist/components/forms/InputText/InputText.cjs.map +1 -1
- package/dist/components/forms/InputText/InputText.js +24 -24
- package/dist/components/forms/InputText/InputText.js.map +1 -1
- package/dist/components/forms/InputText/InputText.module.css.cjs +1 -1
- package/dist/components/forms/InputText/InputText.module.css.js +9 -7
- package/dist/components/forms/InputText/InputText.module.css.js.map +1 -1
- package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs +1 -1
- package/dist/components/forms/RadioGroup/RadioGroup.module.css.js +4 -4
- package/dist/components/forms/Select/Select.cjs.map +1 -1
- package/dist/components/forms/Select/Select.js.map +1 -1
- package/dist/components/forms/Switch/Switch.module.css.cjs +1 -1
- package/dist/components/forms/Switch/Switch.module.css.js +6 -6
- package/dist/components/icons/suite.cjs +1 -0
- package/dist/components/icons/suite.js +10894 -0
- package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
- package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +71 -44
- package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
- package/dist/components/navigation/Pagination/Pagination.module.css.cjs +1 -1
- package/dist/components/navigation/Pagination/Pagination.module.css.js +18 -14
- package/dist/components/navigation/Pagination/Pagination.module.css.js.map +1 -1
- package/dist/components/overlays/Menu/Menu.cjs +1 -1
- package/dist/components/overlays/Menu/Menu.cjs.map +1 -1
- package/dist/components/overlays/Menu/Menu.js +37 -36
- package/dist/components/overlays/Menu/Menu.js.map +1 -1
- package/dist/components/overlays/Menu/keyShortcuts.cjs +2 -0
- package/dist/components/overlays/Menu/keyShortcuts.cjs.map +1 -0
- package/dist/components/overlays/Menu/keyShortcuts.js +55 -0
- package/dist/components/overlays/Menu/keyShortcuts.js.map +1 -0
- package/dist/components/overlays/Tooltip/Tooltip.cjs +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +81 -56
- package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
- package/dist/design-system.css +1 -1
- package/dist/icons.cjs +2 -0
- package/dist/icons.cjs.map +1 -0
- package/dist/icons.js +2054 -0
- package/dist/icons.js.map +1 -0
- package/dist/types/components/data-display/CodeBlock/syntax.d.ts +1 -1
- package/dist/types/components/data-display/Timeline/Timeline.d.ts +4 -1
- package/dist/types/components/data-display/Timeline/index.d.ts +1 -1
- package/dist/types/components/forms/Field/Field.d.ts +1 -1
- package/dist/types/components/forms/InputText/InputText.d.ts +1 -1
- package/dist/types/components/forms/Select/Select.d.ts +5 -1
- package/dist/types/components/icons/suite.d.ts +2051 -0
- package/dist/types/components/navigation/Pagination/Pagination.d.ts +13 -1
- package/dist/types/components/navigation/Pagination/index.d.ts +1 -1
- package/dist/types/components/overlays/Menu/Menu.d.ts +3 -1
- package/dist/types/components/overlays/Menu/keyShortcuts.d.ts +2 -0
- package/dist/types/components/overlays/Tooltip/Tooltip.d.ts +26 -5
- package/dist/types/icons.d.ts +6 -0
- package/dist/types/index.d.ts +2 -2
- package/package.json +8 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),t=require("./Pagination.module.css.cjs"),h=require("../../icons/icons.cjs"),N=require("../../../utils/formatters/formatarNumero.cjs");function P({className:s,disabled:a=!1,formatRange:e,label:o="Paginação",onPageChange:l,page:d,pageCount:c,pageSize:u,siblings:f=1,totalItems:m,...g}){if(c<=1)return null;const i=Math.min(Math.max(d,1),c),p=j(i,c,f);function x(r){a||l(r)}return n.jsxs("nav",{...g,"aria-label":o,className:[t.default.pagination,s].filter(Boolean).join(" "),children:[m!==void 0&&u!==void 0&&n.jsx(M,{formatRange:e,range:{start:(i-1)*u+1,end:Math.min(i*u,m),total:m}}),n.jsx("button",{className:t.default.step,type:"button","aria-label":"Página anterior","aria-disabled":a||i===1||void 0,onClick:()=>i>1&&x(i-1),children:n.jsx(h.IconChevronLeft,{size:14})}),n.jsx("ol",{className:t.default.list,children:p.map((r,b)=>r===null?n.jsx("li",{className:t.default.gap,"aria-hidden":"true",children:"…"},`gap-${b}`):n.jsx("li",{children:n.jsx("button",{className:[t.default.page,r===i&&t.default.current].filter(Boolean).join(" "),type:"button","aria-label":`Página ${r}`,"aria-current":r===i?"page":void 0,"aria-disabled":a||void 0,onClick:()=>x(r),children:r})},r))}),n.jsx("button",{className:t.default.step,type:"button","aria-label":"Próxima página","aria-disabled":a||i===c||void 0,onClick:()=>i<c&&x(i+1),children:n.jsx(h.IconChevronRight,{size:14})})]})}function M({formatRange:s,range:a}){if(s)return n.jsx("span",{className:t.default.range,role:"status",children:s(a)});const[e,o,l]=[a.start,a.end,a.total].map(d=>N.formatarNumero(d));return n.jsxs("span",{className:t.default.range,role:"status",children:[n.jsx("span",{"aria-hidden":"true",children:`${e}–${o} de ${l}`}),n.jsx("span",{className:t.default.hiddenText,children:`Itens ${e} a ${o} de ${l}`})]})}function j(s,a,e){const o=e*2+5;if(a<=o)return Array.from({length:a},(u,f)=>f+1);const l=Math.max(Math.min(s-e,a-e*2-2),3),d=Math.min(Math.max(s+e,e*2+3),a-2),c=Array.from({length:d-l+1},(u,f)=>l+f);return[1,l>3?null:2,...c,d<a-2?null:a-1,a]}exports.Pagination=P;exports.montarFaixa=j;
|
|
2
2
|
//# sourceMappingURL=Pagination.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.cjs","sources":["../../../../src/components/navigation/Pagination/Pagination.tsx"],"sourcesContent":["import { type ComponentPropsWithRef } from 'react';\nimport styles from './Pagination.module.css';\nimport { IconChevronLeft, IconChevronRight } from '../../icons';\n\nexport interface PaginationProps extends ComponentPropsWithRef<'nav'> {\n /** Suspende a troca de pagina, como enquanto a pagina pedida carrega. Os botoes continuam focaveis. */\n disabled?: boolean;\n label?: string;\n onPageChange: (page: number) => void;\n page: number;\n pageCount: number;\n /** Quantidade de paginas mostradas de cada lado da atual. */\n siblings?: number;\n}\n\nexport function Pagination({\n className,\n disabled = false,\n label = 'Paginação',\n onPageChange,\n page,\n pageCount,\n siblings = 1,\n ...props\n}: PaginationProps) {\n if (pageCount <= 1) {\n return null;\n }\n\n const atual = Math.min(Math.max(page, 1), pageCount);\n const paginas = montarFaixa(atual, pageCount, siblings);\n\n function irPara(pagina: number) {\n if (!disabled) {\n onPageChange(pagina);\n }\n }\n\n return (\n <nav {...props} aria-label={label} className={[styles.pagination, className].filter(Boolean).join(' ')}>\n {/* `aria-disabled`, e nao `disabled`: desabilitado na borda, o botao perdia o foco de quem acabou de usa-lo. */}\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Página anterior\"\n aria-disabled={disabled || atual === 1 || undefined}\n onClick={() => atual > 1 && irPara(atual - 1)}\n >\n <IconChevronLeft size={14} />\n </button>\n <ol className={styles.list}>\n {paginas.map((numero, indice) =>\n numero === null ? (\n <li className={styles.gap} key={`gap-${indice}`} aria-hidden=\"true\">\n …\n </li>\n ) : (\n <li key={numero}>\n <button\n className={[styles.page, numero === atual && styles.current].filter(Boolean).join(' ')}\n type=\"button\"\n aria-label={`Página ${numero}`}\n aria-current={numero === atual ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={() => irPara(numero)}\n >\n {numero}\n </button>\n </li>\n ),\n )}\n </ol>\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Próxima página\"\n aria-disabled={disabled || atual === pageCount || undefined}\n onClick={() => atual < pageCount && irPara(atual + 1)}\n >\n <IconChevronRight size={14} />\n </button>\n </nav>\n );\n}\n\n/**\n * Primeira e ultima pagina sempre visiveis; null representa a reticencia. A faixa tem sempre as mesmas vagas: perto\n * da ponta a janela encosta nela em vez de encolher, e reticencia nunca esconde uma pagina so.\n */\nexport function montarFaixa(atual: number, total: number, vizinhos: number): (number | null)[] {\n const vagas = vizinhos * 2 + 5;\n\n if (total <= vagas) {\n return Array.from({ length: total }, (_, indice) => indice + 1);\n }\n\n const inicio = Math.max(Math.min(atual - vizinhos, total - vizinhos * 2 - 2), 3);\n const fim = Math.min(Math.max(atual + vizinhos, vizinhos * 2 + 3), total - 2);\n const janela = Array.from({ length: fim - inicio + 1 }, (_, indice) => inicio + indice);\n\n return [1, inicio > 3 ? null : 2, ...janela, fim < total - 2 ? null : total - 1, total];\n}\n"],"names":["Pagination","className","disabled","label","onPageChange","page","pageCount","siblings","props","atual","paginas","montarFaixa","irPara","pagina","styles","jsx","IconChevronLeft","numero","indice","IconChevronRight","
|
|
1
|
+
{"version":3,"file":"Pagination.cjs","sources":["../../../../src/components/navigation/Pagination/Pagination.tsx"],"sourcesContent":["import { type ComponentPropsWithRef } from 'react';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './Pagination.module.css';\nimport { IconChevronLeft, IconChevronRight } from '../../icons';\n\n/** Posições, contadas de 1, do primeiro e do último item da página, e o total de itens. */\nexport interface PaginationRange {\n end: number;\n start: number;\n total: number;\n}\n\nexport interface PaginationProps extends ComponentPropsWithRef<'nav'> {\n /** Suspende a troca de pagina, como enquanto a pagina pedida carrega. Os botoes continuam focaveis. */\n disabled?: boolean;\n /** Troca o texto do intervalo, que por padrão é `1.201–1.250 de 4.380`. */\n formatRange?: (range: PaginationRange) => string;\n label?: string;\n onPageChange: (page: number) => void;\n page: number;\n pageCount: number;\n /** Itens por página. Com `totalItems`, mostra o intervalo da página atual. */\n pageSize?: number;\n /** Quantidade de paginas mostradas de cada lado da atual. */\n siblings?: number;\n /** Total de itens. Com `pageSize`, mostra o intervalo da página atual. */\n totalItems?: number;\n}\n\nexport function Pagination({\n className,\n disabled = false,\n formatRange,\n label = 'Paginação',\n onPageChange,\n page,\n pageCount,\n pageSize,\n siblings = 1,\n totalItems,\n ...props\n}: PaginationProps) {\n if (pageCount <= 1) {\n return null;\n }\n\n const atual = Math.min(Math.max(page, 1), pageCount);\n const paginas = montarFaixa(atual, pageCount, siblings);\n\n function irPara(pagina: number) {\n if (!disabled) {\n onPageChange(pagina);\n }\n }\n\n return (\n <nav {...props} aria-label={label} className={[styles.pagination, className].filter(Boolean).join(' ')}>\n {totalItems !== undefined && pageSize !== undefined && (\n <PaginationRangeText\n formatRange={formatRange}\n range={{\n start: (atual - 1) * pageSize + 1,\n end: Math.min(atual * pageSize, totalItems),\n total: totalItems,\n }}\n />\n )}\n {/* `aria-disabled`, e nao `disabled`: desabilitado na borda, o botao perdia o foco de quem acabou de usa-lo. */}\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Página anterior\"\n aria-disabled={disabled || atual === 1 || undefined}\n onClick={() => atual > 1 && irPara(atual - 1)}\n >\n <IconChevronLeft size={14} />\n </button>\n <ol className={styles.list}>\n {paginas.map((numero, indice) =>\n numero === null ? (\n <li className={styles.gap} key={`gap-${indice}`} aria-hidden=\"true\">\n …\n </li>\n ) : (\n <li key={numero}>\n <button\n className={[styles.page, numero === atual && styles.current].filter(Boolean).join(' ')}\n type=\"button\"\n aria-label={`Página ${numero}`}\n aria-current={numero === atual ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={() => irPara(numero)}\n >\n {numero}\n </button>\n </li>\n ),\n )}\n </ol>\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Próxima página\"\n aria-disabled={disabled || atual === pageCount || undefined}\n onClick={() => atual < pageCount && irPara(atual + 1)}\n >\n <IconChevronRight size={14} />\n </button>\n </nav>\n );\n}\n\n/**\n * Região viva: ao trocar de página, o leitor de tela anuncia o novo intervalo, e só ele, pois os botões não mudam\n * de nome. O travessão some na fala de muitos leitores, e o texto padrão tem uma forma falada à parte.\n */\nfunction PaginationRangeText({\n formatRange,\n range,\n}: {\n formatRange?: (range: PaginationRange) => string;\n range: PaginationRange;\n}) {\n if (formatRange) {\n return (\n <span className={styles.range} role=\"status\">\n {formatRange(range)}\n </span>\n );\n }\n\n const [inicio, fim, total] = [range.start, range.end, range.total].map((numero) => formatarNumero(numero));\n\n return (\n <span className={styles.range} role=\"status\">\n <span aria-hidden=\"true\">{`${inicio}–${fim} de ${total}`}</span>\n <span className={styles.hiddenText}>{`Itens ${inicio} a ${fim} de ${total}`}</span>\n </span>\n );\n}\n\n/**\n * Primeira e ultima pagina sempre visiveis; null representa a reticencia. A faixa tem sempre as mesmas vagas: perto\n * da ponta a janela encosta nela em vez de encolher, e reticencia nunca esconde uma pagina so.\n */\nexport function montarFaixa(atual: number, total: number, vizinhos: number): (number | null)[] {\n const vagas = vizinhos * 2 + 5;\n\n if (total <= vagas) {\n return Array.from({ length: total }, (_, indice) => indice + 1);\n }\n\n const inicio = Math.max(Math.min(atual - vizinhos, total - vizinhos * 2 - 2), 3);\n const fim = Math.min(Math.max(atual + vizinhos, vizinhos * 2 + 3), total - 2);\n const janela = Array.from({ length: fim - inicio + 1 }, (_, indice) => inicio + indice);\n\n return [1, inicio > 3 ? null : 2, ...janela, fim < total - 2 ? null : total - 1, total];\n}\n"],"names":["Pagination","className","disabled","formatRange","label","onPageChange","page","pageCount","pageSize","siblings","totalItems","props","atual","paginas","montarFaixa","irPara","pagina","styles","jsx","PaginationRangeText","IconChevronLeft","numero","indice","IconChevronRight","range","inicio","fim","total","formatarNumero","vizinhos","vagas","_","janela"],"mappings":"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"}
|
|
@@ -1,70 +1,97 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { IconChevronLeft as
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { jsxs as u, jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import t from "./Pagination.module.css.js";
|
|
3
|
+
import { IconChevronLeft as N, IconChevronRight as $ } from "../../icons/icons.js";
|
|
4
|
+
import { formatarNumero as M } from "../../../utils/formatters/formatarNumero.js";
|
|
5
|
+
function B({
|
|
6
|
+
className: s,
|
|
7
|
+
disabled: a = !1,
|
|
8
|
+
formatRange: r,
|
|
9
|
+
label: o = "Paginação",
|
|
10
|
+
onPageChange: l,
|
|
11
|
+
page: d,
|
|
12
|
+
pageCount: c,
|
|
13
|
+
pageSize: m,
|
|
14
|
+
siblings: h = 1,
|
|
15
|
+
totalItems: f,
|
|
16
|
+
...b
|
|
13
17
|
}) {
|
|
14
|
-
if (
|
|
18
|
+
if (c <= 1)
|
|
15
19
|
return null;
|
|
16
|
-
const
|
|
17
|
-
function
|
|
18
|
-
|
|
20
|
+
const i = Math.min(Math.max(d, 1), c), g = v(i, c, h);
|
|
21
|
+
function p(e) {
|
|
22
|
+
a || l(e);
|
|
19
23
|
}
|
|
20
|
-
return /* @__PURE__ */
|
|
21
|
-
/* @__PURE__ */
|
|
24
|
+
return /* @__PURE__ */ u("nav", { ...b, "aria-label": o, className: [t.pagination, s].filter(Boolean).join(" "), children: [
|
|
25
|
+
f !== void 0 && m !== void 0 && /* @__PURE__ */ n(
|
|
26
|
+
P,
|
|
27
|
+
{
|
|
28
|
+
formatRange: r,
|
|
29
|
+
range: {
|
|
30
|
+
start: (i - 1) * m + 1,
|
|
31
|
+
end: Math.min(i * m, f),
|
|
32
|
+
total: f
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ n(
|
|
22
37
|
"button",
|
|
23
38
|
{
|
|
24
|
-
className:
|
|
39
|
+
className: t.step,
|
|
25
40
|
type: "button",
|
|
26
41
|
"aria-label": "Página anterior",
|
|
27
|
-
"aria-disabled":
|
|
28
|
-
onClick: () =>
|
|
29
|
-
children: /* @__PURE__ */
|
|
42
|
+
"aria-disabled": a || i === 1 || void 0,
|
|
43
|
+
onClick: () => i > 1 && p(i - 1),
|
|
44
|
+
children: /* @__PURE__ */ n(N, { size: 14 })
|
|
30
45
|
}
|
|
31
46
|
),
|
|
32
|
-
/* @__PURE__ */
|
|
33
|
-
(
|
|
47
|
+
/* @__PURE__ */ n("ol", { className: t.list, children: g.map(
|
|
48
|
+
(e, x) => e === null ? /* @__PURE__ */ n("li", { className: t.gap, "aria-hidden": "true", children: "…" }, `gap-${x}`) : /* @__PURE__ */ n("li", { children: /* @__PURE__ */ n(
|
|
34
49
|
"button",
|
|
35
50
|
{
|
|
36
|
-
className: [
|
|
51
|
+
className: [t.page, e === i && t.current].filter(Boolean).join(" "),
|
|
37
52
|
type: "button",
|
|
38
|
-
"aria-label": `Página ${
|
|
39
|
-
"aria-current":
|
|
40
|
-
"aria-disabled":
|
|
41
|
-
onClick: () =>
|
|
42
|
-
children:
|
|
53
|
+
"aria-label": `Página ${e}`,
|
|
54
|
+
"aria-current": e === i ? "page" : void 0,
|
|
55
|
+
"aria-disabled": a || void 0,
|
|
56
|
+
onClick: () => p(e),
|
|
57
|
+
children: e
|
|
43
58
|
}
|
|
44
|
-
) },
|
|
59
|
+
) }, e)
|
|
45
60
|
) }),
|
|
46
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ n(
|
|
47
62
|
"button",
|
|
48
63
|
{
|
|
49
|
-
className:
|
|
64
|
+
className: t.step,
|
|
50
65
|
type: "button",
|
|
51
66
|
"aria-label": "Próxima página",
|
|
52
|
-
"aria-disabled":
|
|
53
|
-
onClick: () =>
|
|
54
|
-
children: /* @__PURE__ */
|
|
67
|
+
"aria-disabled": a || i === c || void 0,
|
|
68
|
+
onClick: () => i < c && p(i + 1),
|
|
69
|
+
children: /* @__PURE__ */ n($, { size: 14 })
|
|
55
70
|
}
|
|
56
71
|
)
|
|
57
72
|
] });
|
|
58
73
|
}
|
|
59
|
-
function
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
74
|
+
function P({
|
|
75
|
+
formatRange: s,
|
|
76
|
+
range: a
|
|
77
|
+
}) {
|
|
78
|
+
if (s)
|
|
79
|
+
return /* @__PURE__ */ n("span", { className: t.range, role: "status", children: s(a) });
|
|
80
|
+
const [r, o, l] = [a.start, a.end, a.total].map((d) => M(d));
|
|
81
|
+
return /* @__PURE__ */ u("span", { className: t.range, role: "status", children: [
|
|
82
|
+
/* @__PURE__ */ n("span", { "aria-hidden": "true", children: `${r}–${o} de ${l}` }),
|
|
83
|
+
/* @__PURE__ */ n("span", { className: t.hiddenText, children: `Itens ${r} a ${o} de ${l}` })
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
86
|
+
function v(s, a, r) {
|
|
87
|
+
const o = r * 2 + 5;
|
|
88
|
+
if (a <= o)
|
|
89
|
+
return Array.from({ length: a }, (m, h) => h + 1);
|
|
90
|
+
const l = Math.max(Math.min(s - r, a - r * 2 - 2), 3), d = Math.min(Math.max(s + r, r * 2 + 3), a - 2), c = Array.from({ length: d - l + 1 }, (m, h) => l + h);
|
|
91
|
+
return [1, l > 3 ? null : 2, ...c, d < a - 2 ? null : a - 1, a];
|
|
65
92
|
}
|
|
66
93
|
export {
|
|
67
|
-
|
|
68
|
-
|
|
94
|
+
B as Pagination,
|
|
95
|
+
v as montarFaixa
|
|
69
96
|
};
|
|
70
97
|
//# sourceMappingURL=Pagination.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.js","sources":["../../../../src/components/navigation/Pagination/Pagination.tsx"],"sourcesContent":["import { type ComponentPropsWithRef } from 'react';\nimport styles from './Pagination.module.css';\nimport { IconChevronLeft, IconChevronRight } from '../../icons';\n\nexport interface PaginationProps extends ComponentPropsWithRef<'nav'> {\n /** Suspende a troca de pagina, como enquanto a pagina pedida carrega. Os botoes continuam focaveis. */\n disabled?: boolean;\n label?: string;\n onPageChange: (page: number) => void;\n page: number;\n pageCount: number;\n /** Quantidade de paginas mostradas de cada lado da atual. */\n siblings?: number;\n}\n\nexport function Pagination({\n className,\n disabled = false,\n label = 'Paginação',\n onPageChange,\n page,\n pageCount,\n siblings = 1,\n ...props\n}: PaginationProps) {\n if (pageCount <= 1) {\n return null;\n }\n\n const atual = Math.min(Math.max(page, 1), pageCount);\n const paginas = montarFaixa(atual, pageCount, siblings);\n\n function irPara(pagina: number) {\n if (!disabled) {\n onPageChange(pagina);\n }\n }\n\n return (\n <nav {...props} aria-label={label} className={[styles.pagination, className].filter(Boolean).join(' ')}>\n {/* `aria-disabled`, e nao `disabled`: desabilitado na borda, o botao perdia o foco de quem acabou de usa-lo. */}\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Página anterior\"\n aria-disabled={disabled || atual === 1 || undefined}\n onClick={() => atual > 1 && irPara(atual - 1)}\n >\n <IconChevronLeft size={14} />\n </button>\n <ol className={styles.list}>\n {paginas.map((numero, indice) =>\n numero === null ? (\n <li className={styles.gap} key={`gap-${indice}`} aria-hidden=\"true\">\n …\n </li>\n ) : (\n <li key={numero}>\n <button\n className={[styles.page, numero === atual && styles.current].filter(Boolean).join(' ')}\n type=\"button\"\n aria-label={`Página ${numero}`}\n aria-current={numero === atual ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={() => irPara(numero)}\n >\n {numero}\n </button>\n </li>\n ),\n )}\n </ol>\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Próxima página\"\n aria-disabled={disabled || atual === pageCount || undefined}\n onClick={() => atual < pageCount && irPara(atual + 1)}\n >\n <IconChevronRight size={14} />\n </button>\n </nav>\n );\n}\n\n/**\n * Primeira e ultima pagina sempre visiveis; null representa a reticencia. A faixa tem sempre as mesmas vagas: perto\n * da ponta a janela encosta nela em vez de encolher, e reticencia nunca esconde uma pagina so.\n */\nexport function montarFaixa(atual: number, total: number, vizinhos: number): (number | null)[] {\n const vagas = vizinhos * 2 + 5;\n\n if (total <= vagas) {\n return Array.from({ length: total }, (_, indice) => indice + 1);\n }\n\n const inicio = Math.max(Math.min(atual - vizinhos, total - vizinhos * 2 - 2), 3);\n const fim = Math.min(Math.max(atual + vizinhos, vizinhos * 2 + 3), total - 2);\n const janela = Array.from({ length: fim - inicio + 1 }, (_, indice) => inicio + indice);\n\n return [1, inicio > 3 ? null : 2, ...janela, fim < total - 2 ? null : total - 1, total];\n}\n"],"names":["Pagination","className","disabled","label","onPageChange","page","pageCount","siblings","props","atual","paginas","montarFaixa","irPara","pagina","styles","jsx","IconChevronLeft","numero","indice","IconChevronRight","
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../../../src/components/navigation/Pagination/Pagination.tsx"],"sourcesContent":["import { type ComponentPropsWithRef } from 'react';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './Pagination.module.css';\nimport { IconChevronLeft, IconChevronRight } from '../../icons';\n\n/** Posições, contadas de 1, do primeiro e do último item da página, e o total de itens. */\nexport interface PaginationRange {\n end: number;\n start: number;\n total: number;\n}\n\nexport interface PaginationProps extends ComponentPropsWithRef<'nav'> {\n /** Suspende a troca de pagina, como enquanto a pagina pedida carrega. Os botoes continuam focaveis. */\n disabled?: boolean;\n /** Troca o texto do intervalo, que por padrão é `1.201–1.250 de 4.380`. */\n formatRange?: (range: PaginationRange) => string;\n label?: string;\n onPageChange: (page: number) => void;\n page: number;\n pageCount: number;\n /** Itens por página. Com `totalItems`, mostra o intervalo da página atual. */\n pageSize?: number;\n /** Quantidade de paginas mostradas de cada lado da atual. */\n siblings?: number;\n /** Total de itens. Com `pageSize`, mostra o intervalo da página atual. */\n totalItems?: number;\n}\n\nexport function Pagination({\n className,\n disabled = false,\n formatRange,\n label = 'Paginação',\n onPageChange,\n page,\n pageCount,\n pageSize,\n siblings = 1,\n totalItems,\n ...props\n}: PaginationProps) {\n if (pageCount <= 1) {\n return null;\n }\n\n const atual = Math.min(Math.max(page, 1), pageCount);\n const paginas = montarFaixa(atual, pageCount, siblings);\n\n function irPara(pagina: number) {\n if (!disabled) {\n onPageChange(pagina);\n }\n }\n\n return (\n <nav {...props} aria-label={label} className={[styles.pagination, className].filter(Boolean).join(' ')}>\n {totalItems !== undefined && pageSize !== undefined && (\n <PaginationRangeText\n formatRange={formatRange}\n range={{\n start: (atual - 1) * pageSize + 1,\n end: Math.min(atual * pageSize, totalItems),\n total: totalItems,\n }}\n />\n )}\n {/* `aria-disabled`, e nao `disabled`: desabilitado na borda, o botao perdia o foco de quem acabou de usa-lo. */}\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Página anterior\"\n aria-disabled={disabled || atual === 1 || undefined}\n onClick={() => atual > 1 && irPara(atual - 1)}\n >\n <IconChevronLeft size={14} />\n </button>\n <ol className={styles.list}>\n {paginas.map((numero, indice) =>\n numero === null ? (\n <li className={styles.gap} key={`gap-${indice}`} aria-hidden=\"true\">\n …\n </li>\n ) : (\n <li key={numero}>\n <button\n className={[styles.page, numero === atual && styles.current].filter(Boolean).join(' ')}\n type=\"button\"\n aria-label={`Página ${numero}`}\n aria-current={numero === atual ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={() => irPara(numero)}\n >\n {numero}\n </button>\n </li>\n ),\n )}\n </ol>\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Próxima página\"\n aria-disabled={disabled || atual === pageCount || undefined}\n onClick={() => atual < pageCount && irPara(atual + 1)}\n >\n <IconChevronRight size={14} />\n </button>\n </nav>\n );\n}\n\n/**\n * Região viva: ao trocar de página, o leitor de tela anuncia o novo intervalo, e só ele, pois os botões não mudam\n * de nome. O travessão some na fala de muitos leitores, e o texto padrão tem uma forma falada à parte.\n */\nfunction PaginationRangeText({\n formatRange,\n range,\n}: {\n formatRange?: (range: PaginationRange) => string;\n range: PaginationRange;\n}) {\n if (formatRange) {\n return (\n <span className={styles.range} role=\"status\">\n {formatRange(range)}\n </span>\n );\n }\n\n const [inicio, fim, total] = [range.start, range.end, range.total].map((numero) => formatarNumero(numero));\n\n return (\n <span className={styles.range} role=\"status\">\n <span aria-hidden=\"true\">{`${inicio}–${fim} de ${total}`}</span>\n <span className={styles.hiddenText}>{`Itens ${inicio} a ${fim} de ${total}`}</span>\n </span>\n );\n}\n\n/**\n * Primeira e ultima pagina sempre visiveis; null representa a reticencia. A faixa tem sempre as mesmas vagas: perto\n * da ponta a janela encosta nela em vez de encolher, e reticencia nunca esconde uma pagina so.\n */\nexport function montarFaixa(atual: number, total: number, vizinhos: number): (number | null)[] {\n const vagas = vizinhos * 2 + 5;\n\n if (total <= vagas) {\n return Array.from({ length: total }, (_, indice) => indice + 1);\n }\n\n const inicio = Math.max(Math.min(atual - vizinhos, total - vizinhos * 2 - 2), 3);\n const fim = Math.min(Math.max(atual + vizinhos, vizinhos * 2 + 3), total - 2);\n const janela = Array.from({ length: fim - inicio + 1 }, (_, indice) => inicio + indice);\n\n return [1, inicio > 3 ? null : 2, ...janela, fim < total - 2 ? null : total - 1, total];\n}\n"],"names":["Pagination","className","disabled","formatRange","label","onPageChange","page","pageCount","pageSize","siblings","totalItems","props","atual","paginas","montarFaixa","irPara","pagina","styles","jsx","PaginationRangeText","IconChevronLeft","numero","indice","IconChevronRight","range","inicio","fim","total","formatarNumero","vizinhos","vagas","_","janela"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t="
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_pagination_156fv_1",t="_range_156fv_8",n="_hiddenText_156fv_19 _hiddenText_7tv83_113",_="_list_156fv_23",a="_page_156fv_32",s="_step_156fv_33",i="_current_156fv_51",g="_gap_156fv_74",o={pagination:e,range:t,hiddenText:n,list:_,page:a,step:s,current:i,gap:g};exports.current=i;exports.default=o;exports.gap=g;exports.hiddenText=n;exports.list=_;exports.page=a;exports.pagination=e;exports.range=t;exports.step=s;
|
|
2
2
|
//# sourceMappingURL=Pagination.module.css.cjs.map
|
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
const
|
|
2
|
-
pagination:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
const t = "_pagination_156fv_1", _ = "_range_156fv_8", n = "_hiddenText_156fv_19 _hiddenText_7tv83_113", e = "_list_156fv_23", s = "_page_156fv_32", a = "_step_156fv_33", i = "_current_156fv_51", o = "_gap_156fv_74", p = {
|
|
2
|
+
pagination: t,
|
|
3
|
+
range: _,
|
|
4
|
+
hiddenText: n,
|
|
5
|
+
list: e,
|
|
6
|
+
page: s,
|
|
7
|
+
step: a,
|
|
8
|
+
current: i,
|
|
9
|
+
gap: o
|
|
8
10
|
};
|
|
9
11
|
export {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
s as
|
|
16
|
-
|
|
12
|
+
i as current,
|
|
13
|
+
p as default,
|
|
14
|
+
o as gap,
|
|
15
|
+
n as hiddenText,
|
|
16
|
+
e as list,
|
|
17
|
+
s as page,
|
|
18
|
+
t as pagination,
|
|
19
|
+
_ as range,
|
|
20
|
+
a as step
|
|
17
21
|
};
|
|
18
22
|
//# sourceMappingURL=Pagination.module.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Pagination.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),c=require("react"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),c=require("react"),P=require("react-dom"),E=require("@react-aria/focus"),K=require("@react-aria/overlays"),I=require("../../../hooks/useMergedRefs.cjs"),T=require("./keyShortcuts.cjs"),n=require("./Menu.module.css.cjs"),B=require("../../../hooks/useSelection/useSelection.cjs"),F=require("../../icons/icons.cjs");function O(o,y){return u=>{o==null||o(u),y(u)}}function H({children:o,defaultOpen:y=!1,items:u,label:D,onOpenChange:a,open:h}){const l=c.useRef(null),[m,w]=c.useState(y),[M,i]=c.useState("first"),f=h??m;function k(t){w(t),a==null||a(t)}function b(t){i(t),k(!0)}function x(t){var g;k(!1),t&&((g=l.current)==null||g.focus())}const p=o.props,d=I.useMergedRefs(l,p.ref),j=c.cloneElement(o,{ref:d,"aria-haspopup":"menu","aria-expanded":f,onClick:O(p.onClick,()=>f?x(!0):b("first")),onKeyDown:O(p.onKeyDown,t=>{(t.key==="ArrowDown"||t.key==="ArrowUp")&&(t.preventDefault(),b(t.key==="ArrowDown"?"first":"last"))})});return r.jsxs(r.Fragment,{children:[j,f&&typeof document<"u"&&P.createPortal(r.jsx(E.FocusScope,{children:r.jsx(v,{items:u,label:D,openedWith:M,onClose:x,triggerRef:l})}),document.body)]})}function R(o){return"items"in o}function v({items:o,label:y,onClose:u,openedWith:D,triggerRef:a}){var S;const h=c.useRef(null),l=c.useRef(new Map),m=c.useMemo(()=>o.flatMap(e=>R(e)?e.items:[e]),[o]),w=c.useMemo(()=>m.map(e=>({key:e.key,disabled:e.disabled,textValue:e.label})),[m]),M=B.useSelection({items:w,mode:"none"}),{focusedKey:i,focusFirst:f,focusLast:k,focusNext:b,focusPrevious:x,search:p}=M,{overlayProps:d}=K.useOverlay({isOpen:!0,onClose:()=>u(!1),isDismissable:!0,shouldCloseOnBlur:!1,shouldCloseOnInteractOutside:e=>{var s;return!((s=a.current)!=null&&s.contains(e))}},h),{overlayProps:j}=K.useOverlayPosition({targetRef:a,overlayRef:h,placement:"bottom start",offset:6,containerPadding:8,isOpen:!0}),t=Math.min(Number((S=j.style)==null?void 0:S.maxHeight)||360,360);c.useEffect(()=>{D==="last"?k():f()},[]),c.useEffect(()=>{var e;i&&((e=l.current.get(i))==null||e.focus())},[i]);function g(e){var s;e.disabled||(u(!0),(s=e.onSelect)==null||s.call(e))}function N(e){const s=e.checked!==void 0;return r.jsxs("button",{"aria-checked":s?e.checked:void 0,"aria-keyshortcuts":e.shortcutKeys??(e.shortcut?T.toAriaKeyShortcuts(e.shortcut):void 0),className:[n.default.item,e.tone==="danger"&&n.default.danger].filter(Boolean).join(" "),disabled:e.disabled,onClick:()=>g(e),ref:q=>{q?l.current.set(e.key,q):l.current.delete(e.key)},role:s?"menuitemcheckbox":"menuitem",tabIndex:i===e.key?0:-1,type:"button",children:[e.icon&&r.jsx("span",{"aria-hidden":"true",className:n.default.icon,children:e.icon}),r.jsx("span",{className:n.default.label,children:e.label}),e.shortcut&&r.jsx("kbd",{"aria-hidden":"true",className:n.default.shortcut,children:e.shortcut}),s&&r.jsx(F.IconCheck,{className:[n.default.check,e.checked&&n.default.checkOn].filter(Boolean).join(" ")})]},e.key)}function A(e){e.key==="ArrowDown"?(e.preventDefault(),b()):e.key==="ArrowUp"?(e.preventDefault(),x()):e.key==="Home"?(e.preventDefault(),f()):e.key==="End"?(e.preventDefault(),k()):e.key==="Escape"||e.key==="Tab"?u(!0):e.key.length===1&&!e.metaKey&&!e.ctrlKey&&p(e.key)}return r.jsx("div",{...d,"data-react-aria-top-layer":"true",ref:h,className:n.default.menu,style:{...j.style,maxHeight:t},role:"menu","aria-label":y,onKeyDown:e=>{var s;A(e),(s=d.onKeyDown)==null||s.call(d,e)},children:o.map((e,s)=>R(e)?r.jsxs("div",{"aria-label":e.title,className:n.default.section,role:"group",children:[s>0&&r.jsx("div",{"aria-hidden":"true",className:n.default.divider}),e.title&&r.jsx("div",{"aria-hidden":"true",className:n.default.sectionTitle,children:e.title}),e.items.map(N)]},e.key):N(e))})}exports.Menu=H;
|
|
2
2
|
//# sourceMappingURL=Menu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.cjs","sources":["../../../../src/components/overlays/Menu/Menu.tsx"],"sourcesContent":["import {\n cloneElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { useSelection, type SelectionItem } from '../../../hooks/useSelection';\nimport { IconCheck } from '../../icons';\nimport styles from './Menu.module.css';\n\nexport interface MenuItem {\n /** Com ele, o item e de marcar e mostra o visto quando marcado, como o tipo atual de um bloco. */\n checked?: boolean;\n disabled?: boolean;\n /** Icone decorativo antes do texto. */\n icon?: ReactNode;\n key: string;\n label: string;\n onSelect?: () => void;\n /** Atalho escrito a direita, como `Ctrl+D`, e anunciado em `aria-keyshortcuts`. */\n shortcut?: string;\n /** `danger` para a acao que destroi, como remover. */\n tone?: 'danger';\n}\n\n/** Grupo de itens, com titulo opcional; entre dois grupos, o menu desenha o divisor. */\nexport interface MenuSection {\n items: readonly MenuItem[];\n key: string;\n title?: string;\n}\n\nexport interface MenuProps {\n children: ReactElement<Record<string, unknown>>;\n /** Abertura inicial no modo nao controlado. */\n defaultOpen?: boolean;\n items: readonly (MenuItem | MenuSection)[];\n label: string;\n /** Avisa cada abertura e fechamento pedidos pelo gatilho, pelo teclado, pela opcao ou pelo clique fora. */\n onOpenChange?: (open: boolean) => void;\n /** Controla a abertura; sem ele, o menu guarda o proprio estado. */\n open?: boolean;\n}\n\n/** Encadeia o manipulador do gatilho ao do menu, em vez de substitui-lo. */\nfunction encadear<E>(proprio: ((evento: E) => void) | undefined, seguinte: (evento: E) => void) {\n return (evento: E) => {\n proprio?.(evento);\n seguinte(evento);\n };\n}\n\nexport function Menu({ children, defaultOpen = false, items, label, onOpenChange, open: controlledOpen }: MenuProps) {\n const triggerRef = useRef<HTMLElement>(null);\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [openedWith, setOpenedWith] = useState<'first' | 'last'>('first');\n const open = controlledOpen ?? internalOpen;\n\n function setOpen(proximo: boolean) {\n setInternalOpen(proximo);\n onOpenChange?.(proximo);\n }\n\n function abrir(from: 'first' | 'last') {\n setOpenedWith(from);\n setOpen(true);\n }\n\n // O foco volta na hora, antes de o `onSelect` montar o que vem depois, como um campo com `autoFocus` ou\n // um Dialog, que guarda o elemento em foco para devolver. Clique fora nao devolve: o foco e de quem foi clicado.\n function fechar(devolverFoco: boolean) {\n setOpen(false);\n\n if (devolverFoco) {\n triggerRef.current?.focus();\n }\n }\n\n const dono = children.props;\n const mergedTriggerRef = useMergedRefs(triggerRef, dono.ref as Ref<HTMLElement> | undefined);\n const trigger = cloneElement(children, {\n ref: mergedTriggerRef,\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n onClick: encadear(dono.onClick as (evento: unknown) => void, () =>\n open ? fechar(true) : abrir('first'),\n ),\n onKeyDown: encadear(dono.onKeyDown as (evento: KeyboardEvent) => void, (event: KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n abrir(event.key === 'ArrowDown' ? 'first' : 'last');\n }\n }),\n });\n\n return (\n <>\n {trigger}\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n // O escopo proprio poe o menu na arvore de escopos do Dialog, cujo `contain` puxaria o foco de volta.\n // Sem `contain` aqui: ele disputaria o foco com o gatilho quando o menu fecha.\n <FocusScope>\n <MenuList\n items={items}\n label={label}\n openedWith={openedWith}\n onClose={fechar}\n triggerRef={triggerRef}\n />\n </FocusScope>,\n document.body,\n )}\n </>\n );\n}\n\nfunction ehSecao(entrada: MenuItem | MenuSection): entrada is MenuSection {\n return 'items' in entrada;\n}\n\nfunction MenuList({\n items: entradas,\n label,\n onClose,\n openedWith,\n triggerRef,\n}: {\n items: readonly (MenuItem | MenuSection)[];\n label: string;\n onClose: (devolverFoco: boolean) => void;\n openedWith: 'first' | 'last';\n triggerRef: React.RefObject<HTMLElement | null>;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const nodes = useRef(new Map<string, HTMLElement>());\n // O teclado percorre os itens de todos os grupos como uma lista so.\n const items = useMemo(() => entradas.flatMap((entrada) => (ehSecao(entrada) ? entrada.items : [entrada])), [entradas]);\n const collection = useMemo<SelectionItem[]>(\n () => items.map((item) => ({ key: item.key, disabled: item.disabled, textValue: item.label })),\n [items],\n );\n const selection = useSelection({ items: collection, mode: 'none' });\n const { focusedKey, focusFirst, focusLast, focusNext, focusPrevious, search } = selection;\n\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n // Sem isto o gatilho conta como \"fora\": o ponteiro fecha o menu e o clique\n // dele reabre em seguida, e o menu pisca sem abrir.\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose: () => onClose(false),\n isDismissable: true,\n shouldCloseOnBlur: false,\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n ref,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: ref,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 360, 360);\n\n useEffect(() => {\n if (openedWith === 'last') {\n focusLast();\n } else {\n focusFirst();\n }\n // Posicao inicial depende apenas de como o menu foi aberto.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (focusedKey) {\n nodes.current.get(focusedKey)?.focus();\n }\n }, [focusedKey]);\n\n function acionar(item: MenuItem) {\n if (item.disabled) {\n return;\n }\n\n onClose(true);\n item.onSelect?.();\n }\n\n function renderizarItem(item: MenuItem) {\n const marcavel = item.checked !== undefined;\n\n return (\n <button\n aria-checked={marcavel ? item.checked : undefined}\n aria-keyshortcuts={item.shortcut}\n className={[styles.item, item.tone === 'danger' && styles.danger].filter(Boolean).join(' ')}\n disabled={item.disabled}\n key={item.key}\n onClick={() => acionar(item)}\n ref={(node) => {\n if (node) {\n nodes.current.set(item.key, node);\n } else {\n nodes.current.delete(item.key);\n }\n }}\n role={marcavel ? 'menuitemcheckbox' : 'menuitem'}\n tabIndex={focusedKey === item.key ? 0 : -1}\n type=\"button\"\n >\n {item.icon && (\n <span aria-hidden=\"true\" className={styles.icon}>\n {item.icon}\n </span>\n )}\n <span className={styles.label}>{item.label}</span>\n {item.shortcut && (\n <kbd aria-hidden=\"true\" className={styles.shortcut}>\n {item.shortcut}\n </kbd>\n )}\n {marcavel && <IconCheck className={[styles.check, item.checked && styles.checkOn].filter(Boolean).join(' ')} />}\n </button>\n );\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n focusNext();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n focusPrevious();\n } else if (event.key === 'Home') {\n event.preventDefault();\n focusFirst();\n } else if (event.key === 'End') {\n event.preventDefault();\n focusLast();\n } else if (event.key === 'Escape' || event.key === 'Tab') {\n onClose(true);\n } else if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n search(event.key);\n }\n }\n\n return (\n <div\n {...overlayProps}\n data-react-aria-top-layer=\"true\"\n ref={ref}\n className={styles.menu}\n style={{ ...positionProps.style, maxHeight: alturaMaxima }}\n role=\"menu\"\n aria-label={label}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event);\n }}\n >\n {entradas.map((entrada, indice) => {\n if (!ehSecao(entrada)) {\n return renderizarItem(entrada);\n }\n\n return (\n <div aria-label={entrada.title} className={styles.section} key={entrada.key} role=\"group\">\n {indice > 0 && <div aria-hidden=\"true\" className={styles.divider} />}\n {entrada.title && (\n <div aria-hidden=\"true\" className={styles.sectionTitle}>\n {entrada.title}\n </div>\n )}\n {entrada.items.map(renderizarItem)}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["encadear","proprio","seguinte","evento","Menu","children","defaultOpen","items","label","onOpenChange","controlledOpen","triggerRef","useRef","internalOpen","setInternalOpen","useState","openedWith","setOpenedWith","open","setOpen","proximo","abrir","from","fechar","devolverFoco","_a","dono","mergedTriggerRef","useMergedRefs","trigger","cloneElement","event","jsxs","Fragment","createPortal","FocusScope","jsx","MenuList","ehSecao","entrada","entradas","onClose","ref","nodes","useMemo","collection","item","selection","useSelection","focusedKey","focusFirst","focusLast","focusNext","focusPrevious","search","overlayProps","useOverlay","elemento","positionProps","useOverlayPosition","alturaMaxima","useEffect","acionar","renderizarItem","marcavel","styles","node","IconCheck","handleKeyDown","indice"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Menu.cjs","sources":["../../../../src/components/overlays/Menu/Menu.tsx"],"sourcesContent":["import {\n cloneElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { useSelection, type SelectionItem } from '../../../hooks/useSelection';\nimport { IconCheck } from '../../icons';\nimport { toAriaKeyShortcuts } from './keyShortcuts';\nimport styles from './Menu.module.css';\n\nexport interface MenuItem {\n /** Com ele, o item e de marcar e mostra o visto quando marcado, como o tipo atual de um bloco. */\n checked?: boolean;\n disabled?: boolean;\n /** Icone decorativo antes do texto. */\n icon?: ReactNode;\n key: string;\n label: string;\n onSelect?: () => void;\n /** Atalho escrito à direita, como `Ctrl+D` ou `⌘⇧D`; convertido nos nomes de tecla de `aria-keyshortcuts`. */\n shortcut?: string;\n /** Valor de `aria-keyshortcuts` quando a conversão do `shortcut` não basta, como `Control+Shift+D Meta+Shift+D`. */\n shortcutKeys?: string;\n /** `danger` para a acao que destroi, como remover. */\n tone?: 'danger';\n}\n\n/** Grupo de itens, com titulo opcional; entre dois grupos, o menu desenha o divisor. */\nexport interface MenuSection {\n items: readonly MenuItem[];\n key: string;\n title?: string;\n}\n\nexport interface MenuProps {\n children: ReactElement<Record<string, unknown>>;\n /** Abertura inicial no modo nao controlado. */\n defaultOpen?: boolean;\n items: readonly (MenuItem | MenuSection)[];\n label: string;\n /** Avisa cada abertura e fechamento pedidos pelo gatilho, pelo teclado, pela opcao ou pelo clique fora. */\n onOpenChange?: (open: boolean) => void;\n /** Controla a abertura; sem ele, o menu guarda o proprio estado. */\n open?: boolean;\n}\n\n/** Encadeia o manipulador do gatilho ao do menu, em vez de substitui-lo. */\nfunction encadear<E>(proprio: ((evento: E) => void) | undefined, seguinte: (evento: E) => void) {\n return (evento: E) => {\n proprio?.(evento);\n seguinte(evento);\n };\n}\n\nexport function Menu({ children, defaultOpen = false, items, label, onOpenChange, open: controlledOpen }: MenuProps) {\n const triggerRef = useRef<HTMLElement>(null);\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [openedWith, setOpenedWith] = useState<'first' | 'last'>('first');\n const open = controlledOpen ?? internalOpen;\n\n function setOpen(proximo: boolean) {\n setInternalOpen(proximo);\n onOpenChange?.(proximo);\n }\n\n function abrir(from: 'first' | 'last') {\n setOpenedWith(from);\n setOpen(true);\n }\n\n // O foco volta na hora, antes de o `onSelect` montar o que vem depois, como um campo com `autoFocus` ou\n // um Dialog, que guarda o elemento em foco para devolver. Clique fora nao devolve: o foco e de quem foi clicado.\n function fechar(devolverFoco: boolean) {\n setOpen(false);\n\n if (devolverFoco) {\n triggerRef.current?.focus();\n }\n }\n\n const dono = children.props;\n const mergedTriggerRef = useMergedRefs(triggerRef, dono.ref as Ref<HTMLElement> | undefined);\n const trigger = cloneElement(children, {\n ref: mergedTriggerRef,\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n onClick: encadear(dono.onClick as (evento: unknown) => void, () =>\n open ? fechar(true) : abrir('first'),\n ),\n onKeyDown: encadear(dono.onKeyDown as (evento: KeyboardEvent) => void, (event: KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n abrir(event.key === 'ArrowDown' ? 'first' : 'last');\n }\n }),\n });\n\n return (\n <>\n {trigger}\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n // O escopo proprio poe o menu na arvore de escopos do Dialog, cujo `contain` puxaria o foco de volta.\n // Sem `contain` aqui: ele disputaria o foco com o gatilho quando o menu fecha.\n <FocusScope>\n <MenuList\n items={items}\n label={label}\n openedWith={openedWith}\n onClose={fechar}\n triggerRef={triggerRef}\n />\n </FocusScope>,\n document.body,\n )}\n </>\n );\n}\n\nfunction ehSecao(entrada: MenuItem | MenuSection): entrada is MenuSection {\n return 'items' in entrada;\n}\n\nfunction MenuList({\n items: entradas,\n label,\n onClose,\n openedWith,\n triggerRef,\n}: {\n items: readonly (MenuItem | MenuSection)[];\n label: string;\n onClose: (devolverFoco: boolean) => void;\n openedWith: 'first' | 'last';\n triggerRef: React.RefObject<HTMLElement | null>;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const nodes = useRef(new Map<string, HTMLElement>());\n // O teclado percorre os itens de todos os grupos como uma lista so.\n const items = useMemo(() => entradas.flatMap((entrada) => (ehSecao(entrada) ? entrada.items : [entrada])), [entradas]);\n const collection = useMemo<SelectionItem[]>(\n () => items.map((item) => ({ key: item.key, disabled: item.disabled, textValue: item.label })),\n [items],\n );\n const selection = useSelection({ items: collection, mode: 'none' });\n const { focusedKey, focusFirst, focusLast, focusNext, focusPrevious, search } = selection;\n\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n // Sem isto o gatilho conta como \"fora\": o ponteiro fecha o menu e o clique\n // dele reabre em seguida, e o menu pisca sem abrir.\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose: () => onClose(false),\n isDismissable: true,\n shouldCloseOnBlur: false,\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n ref,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: ref,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 360, 360);\n\n useEffect(() => {\n if (openedWith === 'last') {\n focusLast();\n } else {\n focusFirst();\n }\n // Posicao inicial depende apenas de como o menu foi aberto.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (focusedKey) {\n nodes.current.get(focusedKey)?.focus();\n }\n }, [focusedKey]);\n\n function acionar(item: MenuItem) {\n if (item.disabled) {\n return;\n }\n\n onClose(true);\n item.onSelect?.();\n }\n\n function renderizarItem(item: MenuItem) {\n const marcavel = item.checked !== undefined;\n\n return (\n <button\n aria-checked={marcavel ? item.checked : undefined}\n aria-keyshortcuts={item.shortcutKeys ?? (item.shortcut ? toAriaKeyShortcuts(item.shortcut) : undefined)}\n className={[styles.item, item.tone === 'danger' && styles.danger].filter(Boolean).join(' ')}\n disabled={item.disabled}\n key={item.key}\n onClick={() => acionar(item)}\n ref={(node) => {\n if (node) {\n nodes.current.set(item.key, node);\n } else {\n nodes.current.delete(item.key);\n }\n }}\n role={marcavel ? 'menuitemcheckbox' : 'menuitem'}\n tabIndex={focusedKey === item.key ? 0 : -1}\n type=\"button\"\n >\n {item.icon && (\n <span aria-hidden=\"true\" className={styles.icon}>\n {item.icon}\n </span>\n )}\n <span className={styles.label}>{item.label}</span>\n {item.shortcut && (\n <kbd aria-hidden=\"true\" className={styles.shortcut}>\n {item.shortcut}\n </kbd>\n )}\n {marcavel && <IconCheck className={[styles.check, item.checked && styles.checkOn].filter(Boolean).join(' ')} />}\n </button>\n );\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n focusNext();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n focusPrevious();\n } else if (event.key === 'Home') {\n event.preventDefault();\n focusFirst();\n } else if (event.key === 'End') {\n event.preventDefault();\n focusLast();\n } else if (event.key === 'Escape' || event.key === 'Tab') {\n onClose(true);\n } else if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n search(event.key);\n }\n }\n\n return (\n <div\n {...overlayProps}\n data-react-aria-top-layer=\"true\"\n ref={ref}\n className={styles.menu}\n style={{ ...positionProps.style, maxHeight: alturaMaxima }}\n role=\"menu\"\n aria-label={label}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event);\n }}\n >\n {entradas.map((entrada, indice) => {\n if (!ehSecao(entrada)) {\n return renderizarItem(entrada);\n }\n\n return (\n <div aria-label={entrada.title} className={styles.section} key={entrada.key} role=\"group\">\n {indice > 0 && <div aria-hidden=\"true\" className={styles.divider} />}\n {entrada.title && (\n <div aria-hidden=\"true\" className={styles.sectionTitle}>\n {entrada.title}\n </div>\n )}\n {entrada.items.map(renderizarItem)}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["encadear","proprio","seguinte","evento","Menu","children","defaultOpen","items","label","onOpenChange","controlledOpen","triggerRef","useRef","internalOpen","setInternalOpen","useState","openedWith","setOpenedWith","open","setOpen","proximo","abrir","from","fechar","devolverFoco","_a","dono","mergedTriggerRef","useMergedRefs","trigger","cloneElement","event","jsxs","Fragment","createPortal","FocusScope","jsx","MenuList","ehSecao","entrada","entradas","onClose","ref","nodes","useMemo","collection","item","selection","useSelection","focusedKey","focusFirst","focusLast","focusNext","focusPrevious","search","overlayProps","useOverlay","elemento","positionProps","useOverlayPosition","alturaMaxima","useEffect","acionar","renderizarItem","marcavel","toAriaKeyShortcuts","styles","node","IconCheck","handleKeyDown","indice"],"mappings":"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"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { jsxs as K, Fragment as F, jsx as n } from "react/jsx-runtime";
|
|
2
|
-
import { useRef as M, useState as
|
|
2
|
+
import { useRef as M, useState as I, cloneElement as H, useMemo as P, useEffect as R } from "react";
|
|
3
3
|
import { createPortal as T } from "react-dom";
|
|
4
4
|
import { FocusScope as C } from "@react-aria/focus";
|
|
5
5
|
import { useOverlay as L, useOverlayPosition as U } from "@react-aria/overlays";
|
|
6
6
|
import { useMergedRefs as W } from "../../../hooks/useMergedRefs.js";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
|
|
7
|
+
import { toAriaKeyShortcuts as z } from "./keyShortcuts.js";
|
|
8
|
+
import s from "./Menu.module.css.js";
|
|
9
|
+
import { useSelection as V } from "../../../hooks/useSelection/useSelection.js";
|
|
10
|
+
import { IconCheck as q } from "../../icons/icons.js";
|
|
11
|
+
function j(t, d) {
|
|
11
12
|
return (c) => {
|
|
12
|
-
|
|
13
|
+
t == null || t(c), d(c);
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
function
|
|
16
|
-
const i = M(null), [
|
|
16
|
+
function oe({ children: t, defaultOpen: d = !1, items: c, label: g, onOpenChange: l, open: m }) {
|
|
17
|
+
const i = M(null), [p, N] = I(d), [x, a] = I("first"), u = m ?? p;
|
|
17
18
|
function y(o) {
|
|
18
19
|
N(o), l == null || l(o);
|
|
19
20
|
}
|
|
@@ -24,15 +25,15 @@ function ee({ children: s, defaultOpen: d = !1, items: c, label: g, onOpenChange
|
|
|
24
25
|
var D;
|
|
25
26
|
y(!1), o && ((D = i.current) == null || D.focus());
|
|
26
27
|
}
|
|
27
|
-
const
|
|
28
|
+
const h = t.props, f = W(i, h.ref), w = H(t, {
|
|
28
29
|
ref: f,
|
|
29
30
|
"aria-haspopup": "menu",
|
|
30
31
|
"aria-expanded": u,
|
|
31
32
|
onClick: j(
|
|
32
|
-
|
|
33
|
+
h.onClick,
|
|
33
34
|
() => u ? b(!0) : k("first")
|
|
34
35
|
),
|
|
35
|
-
onKeyDown: j(
|
|
36
|
+
onKeyDown: j(h.onKeyDown, (o) => {
|
|
36
37
|
(o.key === "ArrowDown" || o.key === "ArrowUp") && (o.preventDefault(), k(o.key === "ArrowDown" ? "first" : "last"));
|
|
37
38
|
})
|
|
38
39
|
});
|
|
@@ -42,7 +43,7 @@ function ee({ children: s, defaultOpen: d = !1, items: c, label: g, onOpenChange
|
|
|
42
43
|
// O escopo proprio poe o menu na arvore de escopos do Dialog, cujo `contain` puxaria o foco de volta.
|
|
43
44
|
// Sem `contain` aqui: ele disputaria o foco com o gatilho quando o menu fecha.
|
|
44
45
|
/* @__PURE__ */ n(C, { children: /* @__PURE__ */ n(
|
|
45
|
-
|
|
46
|
+
v,
|
|
46
47
|
{
|
|
47
48
|
items: c,
|
|
48
49
|
label: g,
|
|
@@ -55,21 +56,21 @@ function ee({ children: s, defaultOpen: d = !1, items: c, label: g, onOpenChange
|
|
|
55
56
|
)
|
|
56
57
|
] });
|
|
57
58
|
}
|
|
58
|
-
function E(
|
|
59
|
-
return "items" in
|
|
59
|
+
function E(t) {
|
|
60
|
+
return "items" in t;
|
|
60
61
|
}
|
|
61
|
-
function
|
|
62
|
-
items:
|
|
62
|
+
function v({
|
|
63
|
+
items: t,
|
|
63
64
|
label: d,
|
|
64
65
|
onClose: c,
|
|
65
66
|
openedWith: g,
|
|
66
67
|
triggerRef: l
|
|
67
68
|
}) {
|
|
68
69
|
var A;
|
|
69
|
-
const m = M(null), i = M(/* @__PURE__ */ new Map()),
|
|
70
|
-
() =>
|
|
71
|
-
[
|
|
72
|
-
), x =
|
|
70
|
+
const m = M(null), i = M(/* @__PURE__ */ new Map()), p = P(() => t.flatMap((e) => E(e) ? e.items : [e]), [t]), N = P(
|
|
71
|
+
() => p.map((e) => ({ key: e.key, disabled: e.disabled, textValue: e.label })),
|
|
72
|
+
[p]
|
|
73
|
+
), x = V({ items: N, mode: "none" }), { focusedKey: a, focusFirst: u, focusLast: y, focusNext: k, focusPrevious: b, search: h } = x, { overlayProps: f } = L(
|
|
73
74
|
{
|
|
74
75
|
isOpen: !0,
|
|
75
76
|
onClose: () => c(!1),
|
|
@@ -89,9 +90,9 @@ function q({
|
|
|
89
90
|
containerPadding: 8,
|
|
90
91
|
isOpen: !0
|
|
91
92
|
}), o = Math.min(Number((A = w.style) == null ? void 0 : A.maxHeight) || 360, 360);
|
|
92
|
-
|
|
93
|
+
R(() => {
|
|
93
94
|
g === "last" ? y() : u();
|
|
94
|
-
}, []),
|
|
95
|
+
}, []), R(() => {
|
|
95
96
|
var e;
|
|
96
97
|
a && ((e = i.current.get(a)) == null || e.focus());
|
|
97
98
|
}, [a]);
|
|
@@ -105,28 +106,28 @@ function q({
|
|
|
105
106
|
"button",
|
|
106
107
|
{
|
|
107
108
|
"aria-checked": r ? e.checked : void 0,
|
|
108
|
-
"aria-keyshortcuts": e.shortcut,
|
|
109
|
-
className: [
|
|
109
|
+
"aria-keyshortcuts": e.shortcutKeys ?? (e.shortcut ? z(e.shortcut) : void 0),
|
|
110
|
+
className: [s.item, e.tone === "danger" && s.danger].filter(Boolean).join(" "),
|
|
110
111
|
disabled: e.disabled,
|
|
111
112
|
onClick: () => D(e),
|
|
112
|
-
ref: (
|
|
113
|
-
|
|
113
|
+
ref: (S) => {
|
|
114
|
+
S ? i.current.set(e.key, S) : i.current.delete(e.key);
|
|
114
115
|
},
|
|
115
116
|
role: r ? "menuitemcheckbox" : "menuitem",
|
|
116
117
|
tabIndex: a === e.key ? 0 : -1,
|
|
117
118
|
type: "button",
|
|
118
119
|
children: [
|
|
119
|
-
e.icon && /* @__PURE__ */ n("span", { "aria-hidden": "true", className:
|
|
120
|
-
/* @__PURE__ */ n("span", { className:
|
|
121
|
-
e.shortcut && /* @__PURE__ */ n("kbd", { "aria-hidden": "true", className:
|
|
122
|
-
r && /* @__PURE__ */ n(
|
|
120
|
+
e.icon && /* @__PURE__ */ n("span", { "aria-hidden": "true", className: s.icon, children: e.icon }),
|
|
121
|
+
/* @__PURE__ */ n("span", { className: s.label, children: e.label }),
|
|
122
|
+
e.shortcut && /* @__PURE__ */ n("kbd", { "aria-hidden": "true", className: s.shortcut, children: e.shortcut }),
|
|
123
|
+
r && /* @__PURE__ */ n(q, { className: [s.check, e.checked && s.checkOn].filter(Boolean).join(" ") })
|
|
123
124
|
]
|
|
124
125
|
},
|
|
125
126
|
e.key
|
|
126
127
|
);
|
|
127
128
|
}
|
|
128
129
|
function B(e) {
|
|
129
|
-
e.key === "ArrowDown" ? (e.preventDefault(), k()) : e.key === "ArrowUp" ? (e.preventDefault(), b()) : e.key === "Home" ? (e.preventDefault(), u()) : e.key === "End" ? (e.preventDefault(), y()) : e.key === "Escape" || e.key === "Tab" ? c(!0) : e.key.length === 1 && !e.metaKey && !e.ctrlKey &&
|
|
130
|
+
e.key === "ArrowDown" ? (e.preventDefault(), k()) : e.key === "ArrowUp" ? (e.preventDefault(), b()) : e.key === "Home" ? (e.preventDefault(), u()) : e.key === "End" ? (e.preventDefault(), y()) : e.key === "Escape" || e.key === "Tab" ? c(!0) : e.key.length === 1 && !e.metaKey && !e.ctrlKey && h(e.key);
|
|
130
131
|
}
|
|
131
132
|
return /* @__PURE__ */ n(
|
|
132
133
|
"div",
|
|
@@ -134,7 +135,7 @@ function q({
|
|
|
134
135
|
...f,
|
|
135
136
|
"data-react-aria-top-layer": "true",
|
|
136
137
|
ref: m,
|
|
137
|
-
className:
|
|
138
|
+
className: s.menu,
|
|
138
139
|
style: { ...w.style, maxHeight: o },
|
|
139
140
|
role: "menu",
|
|
140
141
|
"aria-label": d,
|
|
@@ -142,15 +143,15 @@ function q({
|
|
|
142
143
|
var r;
|
|
143
144
|
B(e), (r = f.onKeyDown) == null || r.call(f, e);
|
|
144
145
|
},
|
|
145
|
-
children:
|
|
146
|
-
r > 0 && /* @__PURE__ */ n("div", { "aria-hidden": "true", className:
|
|
147
|
-
e.title && /* @__PURE__ */ n("div", { "aria-hidden": "true", className:
|
|
146
|
+
children: t.map((e, r) => E(e) ? /* @__PURE__ */ K("div", { "aria-label": e.title, className: s.section, role: "group", children: [
|
|
147
|
+
r > 0 && /* @__PURE__ */ n("div", { "aria-hidden": "true", className: s.divider }),
|
|
148
|
+
e.title && /* @__PURE__ */ n("div", { "aria-hidden": "true", className: s.sectionTitle, children: e.title }),
|
|
148
149
|
e.items.map(O)
|
|
149
150
|
] }, e.key) : O(e))
|
|
150
151
|
}
|
|
151
152
|
);
|
|
152
153
|
}
|
|
153
154
|
export {
|
|
154
|
-
|
|
155
|
+
oe as Menu
|
|
155
156
|
};
|
|
156
157
|
//# sourceMappingURL=Menu.js.map
|