@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
package/README.md
CHANGED
|
@@ -92,6 +92,14 @@ import '@plenustech/design-system/reset.css';
|
|
|
92
92
|
|
|
93
93
|
Uma aplicação nova ganha a aparência completa do sistema importando as duas. Uma aplicação existente, que já tem a própria base, importa apenas a primeira: os componentes não dependem do reset.
|
|
94
94
|
|
|
95
|
+
### Ícones
|
|
96
|
+
|
|
97
|
+
Os ícones de interface vêm do ponto de entrada principal. A suíte completa do Bootstrap Icons, com os 2.050 desenhos pelo nome de cada um, tem entrada própria, e o bundle leva só os importados:
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
import { IconFolder, IconTruck } from '@plenustech/design-system/icons';
|
|
101
|
+
```
|
|
102
|
+
|
|
95
103
|
### Fontes
|
|
96
104
|
|
|
97
105
|
Os componentes usam três famílias, nos pesos definidos em [TOKENS-REFERENCE-TYPOGRAPHY.md](TOKENS-REFERENCE-TYPOGRAPHY.md): Poppins 600, Montserrat 400 e 600 e JetBrains Mono 500.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_tile_1xvjy_2",l="_sm_1xvjy_24",t="_md_1xvjy_32",_="_icon_1xvjy_40",s="_label_1xvjy_54",o={tile:e,sm:l,md:t,icon:_,label:s};exports.default=o;exports.icon=_;exports.label=s;exports.md=t;exports.sm=l;exports.tile=e;
|
|
2
2
|
//# sourceMappingURL=ButtonTile.module.css.cjs.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
const _ = "
|
|
1
|
+
const _ = "_tile_1xvjy_2", s = "_sm_1xvjy_24", t = "_md_1xvjy_32", l = "_icon_1xvjy_40", o = "_label_1xvjy_54", c = {
|
|
2
2
|
tile: _,
|
|
3
|
-
sm:
|
|
4
|
-
md:
|
|
5
|
-
icon:
|
|
6
|
-
label:
|
|
3
|
+
sm: s,
|
|
4
|
+
md: t,
|
|
5
|
+
icon: l,
|
|
6
|
+
label: o
|
|
7
7
|
};
|
|
8
8
|
export {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
c as default,
|
|
10
|
+
l as icon,
|
|
11
|
+
o as label,
|
|
12
|
+
t as md,
|
|
13
|
+
s as sm,
|
|
14
14
|
_ as tile
|
|
15
15
|
};
|
|
16
16
|
//# sourceMappingURL=ButtonTile.module.css.js.map
|
|
@@ -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 y=require("react/jsx-runtime"),v=require("react"),S=require("react-dom"),I=require("@react-aria/overlays"),w=require("../../../hooks/useMergedRefs.cjs"),l=require("./Toolbar.module.css.cjs"),M="button, a[href], input, select, textarea, [tabindex]",N='input:not([type="checkbox"]), textarea, select, [contenteditable="true"]',O=8;function A(e){return[...e.querySelectorAll(M)].filter(o=>!o.matches(":disabled"))}function h(e,o){const r=e.find(n=>n===o)??e[0];e.forEach(n=>{n.tabIndex=n===r?0:-1})}function D(e,o,r,n){const f=n==="vertical"?"ArrowDown":"ArrowRight",c=n==="vertical"?"ArrowUp":"ArrowLeft";return e===f?(o+1)%r:e===c?(o-1+r)%r:e==="Home"?0:e==="End"?r-1:void 0}function j({anchorRef:e,placement:o="top start",...r}){return e?typeof document>"u"?null:S.createPortal(y.jsx(L,{...r,anchorRef:e,placement:o}),document.body):y.jsx(P,{...r})}function L({anchorRef:e,placement:o,ref:r,style:n,...f}){const c=v.useRef(null),d=w.useMergedRefs(c,r),{overlayProps:b,updatePosition:g}=I.useOverlayPosition({targetRef:e,overlayRef:c,placement:o,offset:O,isOpen:!0});return v.useEffect(()=>{const p=e.current;if(!p)return;function x(T){T.target instanceof Node&&T.target.contains(p)&&g()}const s=typeof ResizeObserver>"u"?void 0:new ResizeObserver(()=>g());return s==null||s.observe(p),window.addEventListener("scroll",x,{capture:!0,passive:!0}),()=>{s==null||s.disconnect(),window.removeEventListener("scroll",x,{capture:!0})}},[e,e.current,g]),y.jsx(P,{...f,ref:d,anchored:!0,"data-react-aria-top-layer":"true",style:{...n,...b.style}})}function P({anchored:e=!1,appearance:o="floating",children:r,className:n,label:f,onFocus:c,onKeyDown:d,orientation:b="horizontal",ref:g,sticky:p=!1,...x}){const s=v.useRef(null),T=w.useMergedRefs(s,g),R=v.useRef(null);v.useLayoutEffect(()=>{const t=s.current,a=()=>h(A(t),R.current);a();const u=new MutationObserver(a);return u.observe(t,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["disabled"]}),()=>u.disconnect()},[]);function q(t){var m;c==null||c(t);const a=A(t.currentTarget);if(t.target===t.currentTarget){(m=a.find(i=>i.tabIndex===0)??a[0])==null||m.focus();return}const u=a.find(i=>i===t.target);u&&(R.current=u,h(a,u))}function E(t){d==null||d(t);const a=t.target;if(t.defaultPrevented||a.matches(N))return;const u=A(t.currentTarget),m=u.indexOf(a),i=m===-1?void 0:D(t.key,m,u.length,b);i!==void 0&&(t.preventDefault(),u[i].focus())}return y.jsx("div",{...x,ref:T,"aria-label":f,"aria-orientation":b,className:[l.default.toolbar,l.default[b],l.default[o],p&&!e&&l.default.sticky,e&&l.default.anchored,n].filter(Boolean).join(" "),onFocus:q,onKeyDown:E,role:"toolbar",tabIndex:-1,children:r})}function k({className:e,label:o,...r}){return y.jsx("div",{...r,"aria-label":o,className:[l.default.group,e].filter(Boolean).join(" "),role:"group"})}j.Group=k;exports.Toolbar=j;
|
|
2
2
|
//# sourceMappingURL=Toolbar.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.cjs","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","useOverlayPosition","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","event","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Toolbar.cjs","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps, updatePosition } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // O posicionamento não refaz a conta quando rola um contêiner da âncora e só observa o tamanho da âncora da montagem.\n // Aqui, a barra acompanha as duas coisas, também na âncora trocada depois, como o bloco selecionado de um editor.\n useEffect(() => {\n const anchor = anchorRef.current;\n\n if (!anchor) {\n return;\n }\n\n function followScroll(event: Event) {\n if (event.target instanceof Node && event.target.contains(anchor)) {\n updatePosition();\n }\n }\n\n const resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => updatePosition());\n resizeObserver?.observe(anchor);\n window.addEventListener('scroll', followScroll, { capture: true, passive: true });\n\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', followScroll, { capture: true });\n };\n }, [anchorRef, anchorRef.current, updatePosition]);\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","updatePosition","useOverlayPosition","useEffect","anchor","followScroll","event","resizeObserver","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"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"}
|
|
@@ -1,106 +1,117 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import { createPortal as
|
|
4
|
-
import { useOverlayPosition as
|
|
5
|
-
import { useMergedRefs as
|
|
1
|
+
import { jsx as v } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as w, useLayoutEffect as R, useEffect as L } from "react";
|
|
3
|
+
import { createPortal as O } from "react-dom";
|
|
4
|
+
import { useOverlayPosition as S } from "@react-aria/overlays";
|
|
5
|
+
import { useMergedRefs as E } from "../../../hooks/useMergedRefs.js";
|
|
6
6
|
import f from "./Toolbar.module.css.js";
|
|
7
|
-
const
|
|
8
|
-
function
|
|
9
|
-
return [...r.querySelectorAll(
|
|
7
|
+
const D = "button, a[href], input, select, textarea, [tabindex]", j = 'input:not([type="checkbox"]), textarea, select, [contenteditable="true"]', k = 8;
|
|
8
|
+
function h(r) {
|
|
9
|
+
return [...r.querySelectorAll(D)].filter((o) => !o.matches(":disabled"));
|
|
10
10
|
}
|
|
11
|
-
function
|
|
11
|
+
function T(r, o) {
|
|
12
12
|
const t = r.find((n) => n === o) ?? r[0];
|
|
13
13
|
r.forEach((n) => {
|
|
14
14
|
n.tabIndex = n === t ? 0 : -1;
|
|
15
15
|
});
|
|
16
16
|
}
|
|
17
17
|
function B(r, o, t, n) {
|
|
18
|
-
const
|
|
19
|
-
return r ===
|
|
18
|
+
const l = n === "vertical" ? "ArrowDown" : "ArrowRight", c = n === "vertical" ? "ArrowUp" : "ArrowLeft";
|
|
19
|
+
return r === l ? (o + 1) % t : r === c ? (o - 1 + t) % t : r === "Home" ? 0 : r === "End" ? t - 1 : void 0;
|
|
20
20
|
}
|
|
21
21
|
function C({ anchorRef: r, placement: o = "top start", ...t }) {
|
|
22
|
-
return r ? typeof document > "u" ? null :
|
|
22
|
+
return r ? typeof document > "u" ? null : O(/* @__PURE__ */ v(M, { ...t, anchorRef: r, placement: o }), document.body) : /* @__PURE__ */ v(P, { ...t });
|
|
23
23
|
}
|
|
24
|
-
function
|
|
24
|
+
function M({
|
|
25
25
|
anchorRef: r,
|
|
26
26
|
placement: o,
|
|
27
27
|
ref: t,
|
|
28
28
|
style: n,
|
|
29
|
-
...
|
|
29
|
+
...l
|
|
30
30
|
}) {
|
|
31
|
-
const
|
|
31
|
+
const c = w(null), d = E(c, t), { overlayProps: b, updatePosition: p } = S({
|
|
32
32
|
targetRef: r,
|
|
33
|
-
overlayRef:
|
|
33
|
+
overlayRef: c,
|
|
34
34
|
placement: o,
|
|
35
35
|
offset: k,
|
|
36
36
|
isOpen: !0
|
|
37
37
|
});
|
|
38
|
-
return
|
|
39
|
-
|
|
38
|
+
return L(() => {
|
|
39
|
+
const m = r.current;
|
|
40
|
+
if (!m)
|
|
41
|
+
return;
|
|
42
|
+
function y(A) {
|
|
43
|
+
A.target instanceof Node && A.target.contains(m) && p();
|
|
44
|
+
}
|
|
45
|
+
const u = typeof ResizeObserver > "u" ? void 0 : new ResizeObserver(() => p());
|
|
46
|
+
return u == null || u.observe(m), window.addEventListener("scroll", y, { capture: !0, passive: !0 }), () => {
|
|
47
|
+
u == null || u.disconnect(), window.removeEventListener("scroll", y, { capture: !0 });
|
|
48
|
+
};
|
|
49
|
+
}, [r, r.current, p]), /* @__PURE__ */ v(
|
|
50
|
+
P,
|
|
40
51
|
{
|
|
41
|
-
...
|
|
42
|
-
ref:
|
|
52
|
+
...l,
|
|
53
|
+
ref: d,
|
|
43
54
|
anchored: !0,
|
|
44
55
|
"data-react-aria-top-layer": "true",
|
|
45
|
-
style: { ...n, ...
|
|
56
|
+
style: { ...n, ...b.style }
|
|
46
57
|
}
|
|
47
58
|
);
|
|
48
59
|
}
|
|
49
|
-
function
|
|
60
|
+
function P({
|
|
50
61
|
anchored: r = !1,
|
|
51
62
|
appearance: o = "floating",
|
|
52
63
|
children: t,
|
|
53
64
|
className: n,
|
|
54
|
-
label:
|
|
55
|
-
onFocus:
|
|
56
|
-
onKeyDown:
|
|
57
|
-
orientation:
|
|
58
|
-
ref:
|
|
59
|
-
sticky:
|
|
60
|
-
...
|
|
65
|
+
label: l,
|
|
66
|
+
onFocus: c,
|
|
67
|
+
onKeyDown: d,
|
|
68
|
+
orientation: b = "horizontal",
|
|
69
|
+
ref: p,
|
|
70
|
+
sticky: m = !1,
|
|
71
|
+
...y
|
|
61
72
|
}) {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
const e =
|
|
73
|
+
const u = w(null), A = E(u, p), x = w(null);
|
|
74
|
+
R(() => {
|
|
75
|
+
const e = u.current, a = () => T(h(e), x.current);
|
|
65
76
|
a();
|
|
66
77
|
const i = new MutationObserver(a);
|
|
67
78
|
return i.observe(e, { subtree: !0, childList: !0, attributes: !0, attributeFilter: ["disabled"] }), () => i.disconnect();
|
|
68
79
|
}, []);
|
|
69
|
-
function
|
|
70
|
-
var
|
|
71
|
-
|
|
72
|
-
const a =
|
|
80
|
+
function I(e) {
|
|
81
|
+
var g;
|
|
82
|
+
c == null || c(e);
|
|
83
|
+
const a = h(e.currentTarget);
|
|
73
84
|
if (e.target === e.currentTarget) {
|
|
74
|
-
(
|
|
85
|
+
(g = a.find((s) => s.tabIndex === 0) ?? a[0]) == null || g.focus();
|
|
75
86
|
return;
|
|
76
87
|
}
|
|
77
|
-
const i = a.find((
|
|
78
|
-
i && (
|
|
88
|
+
const i = a.find((s) => s === e.target);
|
|
89
|
+
i && (x.current = i, T(a, i));
|
|
79
90
|
}
|
|
80
91
|
function N(e) {
|
|
81
|
-
|
|
92
|
+
d == null || d(e);
|
|
82
93
|
const a = e.target;
|
|
83
94
|
if (e.defaultPrevented || a.matches(j))
|
|
84
95
|
return;
|
|
85
|
-
const i =
|
|
86
|
-
|
|
96
|
+
const i = h(e.currentTarget), g = i.indexOf(a), s = g === -1 ? void 0 : B(e.key, g, i.length, b);
|
|
97
|
+
s !== void 0 && (e.preventDefault(), i[s].focus());
|
|
87
98
|
}
|
|
88
|
-
return /* @__PURE__ */
|
|
99
|
+
return /* @__PURE__ */ v(
|
|
89
100
|
"div",
|
|
90
101
|
{
|
|
91
|
-
...
|
|
92
|
-
ref:
|
|
93
|
-
"aria-label":
|
|
94
|
-
"aria-orientation":
|
|
102
|
+
...y,
|
|
103
|
+
ref: A,
|
|
104
|
+
"aria-label": l,
|
|
105
|
+
"aria-orientation": b,
|
|
95
106
|
className: [
|
|
96
107
|
f.toolbar,
|
|
97
|
-
f[
|
|
108
|
+
f[b],
|
|
98
109
|
f[o],
|
|
99
|
-
|
|
110
|
+
m && !r && f.sticky,
|
|
100
111
|
r && f.anchored,
|
|
101
112
|
n
|
|
102
113
|
].filter(Boolean).join(" "),
|
|
103
|
-
onFocus:
|
|
114
|
+
onFocus: I,
|
|
104
115
|
onKeyDown: N,
|
|
105
116
|
role: "toolbar",
|
|
106
117
|
tabIndex: -1,
|
|
@@ -108,10 +119,10 @@ function x({
|
|
|
108
119
|
}
|
|
109
120
|
);
|
|
110
121
|
}
|
|
111
|
-
function
|
|
112
|
-
return /* @__PURE__ */
|
|
122
|
+
function G({ className: r, label: o, ...t }) {
|
|
123
|
+
return /* @__PURE__ */ v("div", { ...t, "aria-label": o, className: [f.group, r].filter(Boolean).join(" "), role: "group" });
|
|
113
124
|
}
|
|
114
|
-
C.Group =
|
|
125
|
+
C.Group = G;
|
|
115
126
|
export {
|
|
116
127
|
C as Toolbar
|
|
117
128
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","useOverlayPosition","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","event","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps, updatePosition } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // O posicionamento não refaz a conta quando rola um contêiner da âncora e só observa o tamanho da âncora da montagem.\n // Aqui, a barra acompanha as duas coisas, também na âncora trocada depois, como o bloco selecionado de um editor.\n useEffect(() => {\n const anchor = anchorRef.current;\n\n if (!anchor) {\n return;\n }\n\n function followScroll(event: Event) {\n if (event.target instanceof Node && event.target.contains(anchor)) {\n updatePosition();\n }\n }\n\n const resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => updatePosition());\n resizeObserver?.observe(anchor);\n window.addEventListener('scroll', followScroll, { capture: true, passive: true });\n\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', followScroll, { capture: true });\n };\n }, [anchorRef, anchorRef.current, updatePosition]);\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","updatePosition","useOverlayPosition","useEffect","anchor","followScroll","event","resizeObserver","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x={java:"Java",javascript:"JavaScript",jsx:"JSX",typescript:"TypeScript",tsx:"TSX",sql:"SQL",json:"JSON",shell:"Shell",delphi:"Delphi"};function a(e){return new RegExp(`\\b(?:${e.trim().split(/\s+/).join("|")})\\b`)}const u=/\/\*[\s\S]*?(?:\*\/|$)/,f=/\/\/.*/,l=/"(?:\\.|[^"\\\n])*"?/,w=/'(?:\\.|[^'\\\n])*'?/,d=/\b(?:0[xX][\da-fA-F_]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[eE][+-]?\d+)?)[lLfFdDn]?\b/,c=/\b[A-Za-z_$][\w$]*(?=\s*\()/,S=/@[A-Za-z_]\w*/,A=a(`
|
|
2
2
|
abstract assert boolean break byte case catch char class const continue default do double else enum extends
|
|
3
3
|
final finally float for goto if implements import instanceof int interface long native new package private
|
|
4
4
|
protected public record return sealed short static strictfp super switch synchronized this throw throws
|
|
@@ -19,6 +19,13 @@
|
|
|
19
19
|
`),T=a(`
|
|
20
20
|
case declare do done elif else esac exit export fi for function if in local readonly return select then until
|
|
21
21
|
while
|
|
22
|
-
`),
|
|
23
|
-
|
|
22
|
+
`),O=a(`
|
|
23
|
+
absolute abstract and array as asm begin case class const constructor default deprecated destructor dispinterface
|
|
24
|
+
div do downto dynamic else end except exports external false file finalization finally for forward function goto
|
|
25
|
+
helper if implementation implements in inherited initialization inline interface is label library message mod nil
|
|
26
|
+
not object of on operator or out overload override packed platform private procedure program property protected
|
|
27
|
+
public published raise read record reintroduce repeat resourcestring sealed self set shl shr static stdcall strict
|
|
28
|
+
string then threadvar to true try type unit until uses var virtual while with write xor
|
|
29
|
+
`),E=[["comment",f],["comment",u],["string",/`(?:\\[\s\S]|[^`\\])*`?/],["string",l],["string",w],["number",d]],m=[...E,["keyword",a(y)],["function",c]],h=[...E,["annotation",S],["keyword",a(y+L)],["function",c]],b=[[void 0,new RegExp("(?<=>)[^<>{}\\n]+(?=<)")],["tag",new RegExp("(?<=<\\/|(?:^|[^\\w$)\\]])<)[A-Za-z][\\w.]*")],["attribute",/\b[A-Za-z_][\w-]*(?==[{"'])/]],R={java:[["comment",f],["comment",u],["string",/"""[\s\S]*?(?:"""|$)/],["string",l],["string",/'(?:\\.|[^'\\\n])'/],["annotation",S],["number",d],["keyword",A],["function",c]],javascript:m,jsx:[...b,...m],typescript:h,tsx:[...b,...h],sql:[["comment",/--.*/],["comment",u],["string",/'(?:''|[^'])*'?/],["number",d],["keyword",_],["function",c]],json:[["property",/"(?:\\.|[^"\\\n])*"(?=\s*:)/],["string",l],["number",/-?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b/],["keyword",/\b(?:true|false|null)\b/]],shell:[["comment",new RegExp("(?<![^\\s;])#.*")],["string",l],["string",w],["property",/\$(?:\{[^}\n]*\}|\w+|[@*#?$!])/],["keyword",T],["number",d]],delphi:[["annotation",/\{\$[^}]*\}?|\(\*\$[\s\S]*?(?:\*\)|$)/],["comment",f],["comment",/\{[\s\S]*?(?:\}|$)/],["comment",/\(\*[\s\S]*?(?:\*\)|$)/],["string",/'(?:''|[^'\n])*'?/],["string",/#(?:\$[\da-fA-F]+|\d+)/],["number",/\$[\da-fA-F]+\b|%[01]+\b|\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b/],["keyword",O],["function",c]]},$=new Set(["sql","delphi"]),g=new Map;function j(e){const i=g.get(e);if(i)return i;const r=R[e],o=$.has(e)?"gi":"g",n={kinds:r.map(([t])=>t),pattern:new RegExp(r.map(([,t])=>`(${t.source})`).join("|"),o)};return g.set(e,n),n}function v(e,i){const{kinds:r,pattern:o}=j(i),n=[];let t=0;for(const s of e.matchAll(o)){s.index>t&&n.push({text:e.slice(t,s.index)});const p=r[s.slice(1).findIndex(k=>k!==void 0)];n.push(p?{kind:p,text:s[0]}:{text:s[0]}),t=s.index+s[0].length}return t<e.length&&n.push({text:e.slice(t)}),n}function I(e,i){const r=[[]];for(const o of i?v(e,i):[{text:e}])o.text.split(`
|
|
30
|
+
`).forEach((n,t)=>{t>0&&r.push([]),n&&r[r.length-1].push({...o,text:n})});return r}exports.SYNTAX_LABELS=x;exports.tokenize=v;exports.tokenizeLines=I;
|
|
24
31
|
//# sourceMappingURL=syntax.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syntax.cjs","sources":["../../../../src/components/data-display/CodeBlock/syntax.ts"],"sourcesContent":["/**\n * Realce de sintaxe por regras lexicas, sem analisador de linguagem: reconhece o\n * que ajuda a ler o trecho — palavra reservada, texto, numero, comentario,\n * anotacao, chamada, propriedade, tag e atributo — e deixa o resto sem cor.\n */\n\nexport type CodeSyntax = 'java' | 'javascript' | 'jsx' | 'typescript' | 'tsx' | 'sql' | 'json' | 'shell';\n\nexport type CodeTokenKind =\n | 'annotation'\n | 'attribute'\n | 'comment'\n | 'function'\n | 'keyword'\n | 'number'\n | 'property'\n | 'string'\n | 'tag';\n\nexport interface CodeToken {\n kind?: CodeTokenKind;\n text: string;\n}\n\n/** Regra sem papel reconhece um trecho para que nenhuma outra o pinte, como o texto entre tags. */\ntype Rule = readonly [CodeTokenKind | undefined, RegExp];\n\ninterface Grammar {\n kinds: readonly (CodeTokenKind | undefined)[];\n pattern: RegExp;\n}\n\nexport const SYNTAX_LABELS: Readonly<Record<CodeSyntax, string>> = {\n java: 'Java',\n javascript: 'JavaScript',\n jsx: 'JSX',\n typescript: 'TypeScript',\n tsx: 'TSX',\n sql: 'SQL',\n json: 'JSON',\n shell: 'Shell',\n};\n\nfunction words(list: string): RegExp {\n return new RegExp(`\\\\b(?:${list.trim().split(/\\s+/).join('|')})\\\\b`);\n}\n\nconst BLOCK_COMMENT = /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/;\nconst LINE_COMMENT = /\\/\\/.*/;\nconst DOUBLE_QUOTED = /\"(?:\\\\.|[^\"\\\\\\n])*\"?/;\nconst SINGLE_QUOTED = /'(?:\\\\.|[^'\\\\\\n])*'?/;\nconst NUMBER = /\\b(?:0[xX][\\da-fA-F_]+|\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[eE][+-]?\\d+)?)[lLfFdDn]?\\b/;\nconst CALL = /\\b[A-Za-z_$][\\w$]*(?=\\s*\\()/;\nconst ANNOTATION = /@[A-Za-z_]\\w*/;\n\nconst JAVA_KEYWORDS = words(`\n abstract assert boolean break byte case catch char class const continue default do double else enum extends\n final finally float for goto if implements import instanceof int interface long native new package private\n protected public record return sealed short static strictfp super switch synchronized this throw throws\n transient try var void volatile while yield true false null\n`);\n\nconst JAVASCRIPT_WORDS = `\n async await break case catch class const continue debugger default delete do else export extends finally for\n from function get if import in instanceof let new of return set static super switch this throw try typeof var\n void while with yield true false null undefined\n`;\n\nconst TYPESCRIPT_WORDS = `\n abstract any as asserts bigint boolean declare enum implements infer interface is keyof namespace never number\n object private protected public readonly satisfies string symbol type unique unknown\n`;\n\nconst SQL_KEYWORDS = words(`\n add all alter and as asc begin between by case check column commit constraint create cross database default\n delete desc distinct drop else end exists foreign from full grant group having if in index inner insert into\n is join key left like limit not null offset on or order outer primary procedure references returning revoke\n right rollback schema select set table then transaction trigger true false union unique update values view\n when where with\n`);\n\nconst SHELL_KEYWORDS = words(`\n case declare do done elif else esac exit export fi for function if in local readonly return select then until\n while\n`);\n\nconst JAVASCRIPT_RULES: readonly Rule[] = [\n ['comment', LINE_COMMENT],\n ['comment', BLOCK_COMMENT],\n ['string', /`(?:\\\\[\\s\\S]|[^`\\\\])*`?/],\n ['string', DOUBLE_QUOTED],\n ['string', SINGLE_QUOTED],\n ['number', NUMBER],\n];\n\nconst JAVASCRIPT: readonly Rule[] = [...JAVASCRIPT_RULES, ['keyword', words(JAVASCRIPT_WORDS)], ['function', CALL]];\n\nconst TYPESCRIPT: readonly Rule[] = [\n ...JAVASCRIPT_RULES,\n ['annotation', ANNOTATION],\n ['keyword', words(JAVASCRIPT_WORDS + TYPESCRIPT_WORDS)],\n ['function', CALL],\n];\n\n/**\n * Vem antes das regras da linguagem. O `<` colado a um nome e o generico de `useState<string>`, e nao uma tag; o\n * texto entre `>` e `<` e conteudo, e o numero dentro dele nao e literal.\n */\nconst JSX_RULES: readonly Rule[] = [\n [undefined, /(?<=>)[^<>{}\\n]+(?=<)/],\n ['tag', /(?<=<\\/|(?:^|[^\\w$)\\]])<)[A-Za-z][\\w.]*/],\n ['attribute', /\\b[A-Za-z_][\\w-]*(?==[{\"'])/],\n];\n\nconst RULES: Readonly<Record<CodeSyntax, readonly Rule[]>> = {\n java: [\n ['comment', LINE_COMMENT],\n ['comment', BLOCK_COMMENT],\n ['string', /\"\"\"[\\s\\S]*?(?:\"\"\"|$)/],\n ['string', DOUBLE_QUOTED],\n ['string', /'(?:\\\\.|[^'\\\\\\n])'/],\n ['annotation', ANNOTATION],\n ['number', NUMBER],\n ['keyword', JAVA_KEYWORDS],\n ['function', CALL],\n ],\n javascript: JAVASCRIPT,\n jsx: [...JSX_RULES, ...JAVASCRIPT],\n typescript: TYPESCRIPT,\n tsx: [...JSX_RULES, ...TYPESCRIPT],\n sql: [\n ['comment', /--.*/],\n ['comment', BLOCK_COMMENT],\n ['string', /'(?:''|[^'])*'?/],\n ['number', NUMBER],\n ['keyword', SQL_KEYWORDS],\n ['function', CALL],\n ],\n json: [\n ['property', /\"(?:\\\\.|[^\"\\\\\\n])*\"(?=\\s*:)/],\n ['string', DOUBLE_QUOTED],\n ['number', /-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/],\n ['keyword', /\\b(?:true|false|null)\\b/],\n ],\n shell: [\n ['comment', /(?<![^\\s;])#.*/],\n ['string', DOUBLE_QUOTED],\n ['string', SINGLE_QUOTED],\n ['property', /\\$(?:\\{[^}\\n]*\\}|\\w+|[@*#?$!])/],\n ['keyword', SHELL_KEYWORDS],\n ['number', NUMBER],\n ],\n};\n\n/** O SQL e lido sem distincao de caixa: `select` e `SELECT` sao a mesma palavra. */\nconst CASE_INSENSITIVE: ReadonlySet<CodeSyntax> = new Set(['sql']);\n\nconst grammars = new Map<CodeSyntax, Grammar>();\n\nfunction grammarOf(syntax: CodeSyntax): Grammar {\n const cached = grammars.get(syntax);\n\n if (cached) {\n return cached;\n }\n\n const rules = RULES[syntax];\n const flags = CASE_INSENSITIVE.has(syntax) ? 'gi' : 'g';\n const grammar = {\n kinds: rules.map(([kind]) => kind),\n pattern: new RegExp(rules.map(([, rule]) => `(${rule.source})`).join('|'), flags),\n };\n\n grammars.set(syntax, grammar);\n\n return grammar;\n}\n\nexport function tokenize(code: string, syntax: CodeSyntax): CodeToken[] {\n const { kinds, pattern } = grammarOf(syntax);\n const tokens: CodeToken[] = [];\n let end = 0;\n\n for (const match of code.matchAll(pattern)) {\n if (match.index > end) {\n tokens.push({ text: code.slice(end, match.index) });\n }\n\n const kind = kinds[match.slice(1).findIndex((group) => group !== undefined)];\n\n tokens.push(kind ? { kind, text: match[0] } : { text: match[0] });\n end = match.index + match[0].length;\n }\n\n if (end < code.length) {\n tokens.push({ text: code.slice(end) });\n }\n\n return tokens;\n}\n\n/** As linhas do trecho, cada uma com os seus pedacos: o comentario de bloco que atravessa linhas e partido nelas. */\nexport function tokenizeLines(code: string, syntax?: CodeSyntax): CodeToken[][] {\n const lines: CodeToken[][] = [[]];\n\n for (const token of syntax ? tokenize(code, syntax) : [{ text: code }]) {\n token.text.split('\\n').forEach((part, index) => {\n if (index > 0) {\n lines.push([]);\n }\n\n if (part) {\n lines[lines.length - 1].push({ ...token, text: part });\n }\n });\n }\n\n return lines;\n}\n"],"names":["SYNTAX_LABELS","words","list","BLOCK_COMMENT","LINE_COMMENT","DOUBLE_QUOTED","SINGLE_QUOTED","NUMBER","CALL","ANNOTATION","JAVA_KEYWORDS","JAVASCRIPT_WORDS","TYPESCRIPT_WORDS","SQL_KEYWORDS","SHELL_KEYWORDS","JAVASCRIPT_RULES","JAVASCRIPT","TYPESCRIPT","JSX_RULES","RULES","CASE_INSENSITIVE","grammars","grammarOf","syntax","cached","rules","flags","grammar","kind","rule","tokenize","code","kinds","pattern","tokens","end","match","group","tokenizeLines","lines","token","part","index"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"syntax.cjs","sources":["../../../../src/components/data-display/CodeBlock/syntax.ts"],"sourcesContent":["/**\n * Realce de sintaxe por regras lexicas, sem analisador de linguagem: reconhece o\n * que ajuda a ler o trecho — palavra reservada, texto, numero, comentario,\n * anotacao, chamada, propriedade, tag e atributo — e deixa o resto sem cor.\n */\n\nexport type CodeSyntax = 'java' | 'javascript' | 'jsx' | 'typescript' | 'tsx' | 'sql' | 'json' | 'shell' | 'delphi';\n\nexport type CodeTokenKind =\n | 'annotation'\n | 'attribute'\n | 'comment'\n | 'function'\n | 'keyword'\n | 'number'\n | 'property'\n | 'string'\n | 'tag';\n\nexport interface CodeToken {\n kind?: CodeTokenKind;\n text: string;\n}\n\n/** Regra sem papel reconhece um trecho para que nenhuma outra o pinte, como o texto entre tags. */\ntype Rule = readonly [CodeTokenKind | undefined, RegExp];\n\ninterface Grammar {\n kinds: readonly (CodeTokenKind | undefined)[];\n pattern: RegExp;\n}\n\nexport const SYNTAX_LABELS: Readonly<Record<CodeSyntax, string>> = {\n java: 'Java',\n javascript: 'JavaScript',\n jsx: 'JSX',\n typescript: 'TypeScript',\n tsx: 'TSX',\n sql: 'SQL',\n json: 'JSON',\n shell: 'Shell',\n delphi: 'Delphi',\n};\n\nfunction words(list: string): RegExp {\n return new RegExp(`\\\\b(?:${list.trim().split(/\\s+/).join('|')})\\\\b`);\n}\n\nconst BLOCK_COMMENT = /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/;\nconst LINE_COMMENT = /\\/\\/.*/;\nconst DOUBLE_QUOTED = /\"(?:\\\\.|[^\"\\\\\\n])*\"?/;\nconst SINGLE_QUOTED = /'(?:\\\\.|[^'\\\\\\n])*'?/;\nconst NUMBER = /\\b(?:0[xX][\\da-fA-F_]+|\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[eE][+-]?\\d+)?)[lLfFdDn]?\\b/;\nconst CALL = /\\b[A-Za-z_$][\\w$]*(?=\\s*\\()/;\nconst ANNOTATION = /@[A-Za-z_]\\w*/;\n\nconst JAVA_KEYWORDS = words(`\n abstract assert boolean break byte case catch char class const continue default do double else enum extends\n final finally float for goto if implements import instanceof int interface long native new package private\n protected public record return sealed short static strictfp super switch synchronized this throw throws\n transient try var void volatile while yield true false null\n`);\n\nconst JAVASCRIPT_WORDS = `\n async await break case catch class const continue debugger default delete do else export extends finally for\n from function get if import in instanceof let new of return set static super switch this throw try typeof var\n void while with yield true false null undefined\n`;\n\nconst TYPESCRIPT_WORDS = `\n abstract any as asserts bigint boolean declare enum implements infer interface is keyof namespace never number\n object private protected public readonly satisfies string symbol type unique unknown\n`;\n\nconst SQL_KEYWORDS = words(`\n add all alter and as asc begin between by case check column commit constraint create cross database default\n delete desc distinct drop else end exists foreign from full grant group having if in index inner insert into\n is join key left like limit not null offset on or order outer primary procedure references returning revoke\n right rollback schema select set table then transaction trigger true false union unique update values view\n when where with\n`);\n\nconst SHELL_KEYWORDS = words(`\n case declare do done elif else esac exit export fi for function if in local readonly return select then until\n while\n`);\n\nconst DELPHI_KEYWORDS = words(`\n absolute abstract and array as asm begin case class const constructor default deprecated destructor dispinterface\n div do downto dynamic else end except exports external false file finalization finally for forward function goto\n helper if implementation implements in inherited initialization inline interface is label library message mod nil\n not object of on operator or out overload override packed platform private procedure program property protected\n public published raise read record reintroduce repeat resourcestring sealed self set shl shr static stdcall strict\n string then threadvar to true try type unit until uses var virtual while with write xor\n`);\n\nconst JAVASCRIPT_RULES: readonly Rule[] = [\n ['comment', LINE_COMMENT],\n ['comment', BLOCK_COMMENT],\n ['string', /`(?:\\\\[\\s\\S]|[^`\\\\])*`?/],\n ['string', DOUBLE_QUOTED],\n ['string', SINGLE_QUOTED],\n ['number', NUMBER],\n];\n\nconst JAVASCRIPT: readonly Rule[] = [...JAVASCRIPT_RULES, ['keyword', words(JAVASCRIPT_WORDS)], ['function', CALL]];\n\nconst TYPESCRIPT: readonly Rule[] = [\n ...JAVASCRIPT_RULES,\n ['annotation', ANNOTATION],\n ['keyword', words(JAVASCRIPT_WORDS + TYPESCRIPT_WORDS)],\n ['function', CALL],\n];\n\n/**\n * Vem antes das regras da linguagem. O `<` colado a um nome e o generico de `useState<string>`, e nao uma tag; o\n * texto entre `>` e `<` e conteudo, e o numero dentro dele nao e literal.\n */\nconst JSX_RULES: readonly Rule[] = [\n [undefined, /(?<=>)[^<>{}\\n]+(?=<)/],\n ['tag', /(?<=<\\/|(?:^|[^\\w$)\\]])<)[A-Za-z][\\w.]*/],\n ['attribute', /\\b[A-Za-z_][\\w-]*(?==[{\"'])/],\n];\n\nconst RULES: Readonly<Record<CodeSyntax, readonly Rule[]>> = {\n java: [\n ['comment', LINE_COMMENT],\n ['comment', BLOCK_COMMENT],\n ['string', /\"\"\"[\\s\\S]*?(?:\"\"\"|$)/],\n ['string', DOUBLE_QUOTED],\n ['string', /'(?:\\\\.|[^'\\\\\\n])'/],\n ['annotation', ANNOTATION],\n ['number', NUMBER],\n ['keyword', JAVA_KEYWORDS],\n ['function', CALL],\n ],\n javascript: JAVASCRIPT,\n jsx: [...JSX_RULES, ...JAVASCRIPT],\n typescript: TYPESCRIPT,\n tsx: [...JSX_RULES, ...TYPESCRIPT],\n sql: [\n ['comment', /--.*/],\n ['comment', BLOCK_COMMENT],\n ['string', /'(?:''|[^'])*'?/],\n ['number', NUMBER],\n ['keyword', SQL_KEYWORDS],\n ['function', CALL],\n ],\n json: [\n ['property', /\"(?:\\\\.|[^\"\\\\\\n])*\"(?=\\s*:)/],\n ['string', DOUBLE_QUOTED],\n ['number', /-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/],\n ['keyword', /\\b(?:true|false|null)\\b/],\n ],\n shell: [\n ['comment', /(?<![^\\s;])#.*/],\n ['string', DOUBLE_QUOTED],\n ['string', SINGLE_QUOTED],\n ['property', /\\$(?:\\{[^}\\n]*\\}|\\w+|[@*#?$!])/],\n ['keyword', SHELL_KEYWORDS],\n ['number', NUMBER],\n ],\n // A diretiva de compilacao usa a forma do comentario, com `$` na abertura: vem antes dele e sai como anotacao.\n delphi: [\n ['annotation', /\\{\\$[^}]*\\}?|\\(\\*\\$[\\s\\S]*?(?:\\*\\)|$)/],\n ['comment', LINE_COMMENT],\n ['comment', /\\{[\\s\\S]*?(?:\\}|$)/],\n ['comment', /\\(\\*[\\s\\S]*?(?:\\*\\)|$)/],\n ['string', /'(?:''|[^'\\n])*'?/],\n ['string', /#(?:\\$[\\da-fA-F]+|\\d+)/],\n ['number', /\\$[\\da-fA-F]+\\b|%[01]+\\b|\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/],\n ['keyword', DELPHI_KEYWORDS],\n ['function', CALL],\n ],\n};\n\n/** SQL e Delphi sao lidos sem distincao de caixa: `select` e `SELECT`, `begin` e `Begin` sao a mesma palavra. */\nconst CASE_INSENSITIVE: ReadonlySet<CodeSyntax> = new Set(['sql', 'delphi']);\n\nconst grammars = new Map<CodeSyntax, Grammar>();\n\nfunction grammarOf(syntax: CodeSyntax): Grammar {\n const cached = grammars.get(syntax);\n\n if (cached) {\n return cached;\n }\n\n const rules = RULES[syntax];\n const flags = CASE_INSENSITIVE.has(syntax) ? 'gi' : 'g';\n const grammar = {\n kinds: rules.map(([kind]) => kind),\n pattern: new RegExp(rules.map(([, rule]) => `(${rule.source})`).join('|'), flags),\n };\n\n grammars.set(syntax, grammar);\n\n return grammar;\n}\n\nexport function tokenize(code: string, syntax: CodeSyntax): CodeToken[] {\n const { kinds, pattern } = grammarOf(syntax);\n const tokens: CodeToken[] = [];\n let end = 0;\n\n for (const match of code.matchAll(pattern)) {\n if (match.index > end) {\n tokens.push({ text: code.slice(end, match.index) });\n }\n\n const kind = kinds[match.slice(1).findIndex((group) => group !== undefined)];\n\n tokens.push(kind ? { kind, text: match[0] } : { text: match[0] });\n end = match.index + match[0].length;\n }\n\n if (end < code.length) {\n tokens.push({ text: code.slice(end) });\n }\n\n return tokens;\n}\n\n/** As linhas do trecho, cada uma com os seus pedacos: o comentario de bloco que atravessa linhas e partido nelas. */\nexport function tokenizeLines(code: string, syntax?: CodeSyntax): CodeToken[][] {\n const lines: CodeToken[][] = [[]];\n\n for (const token of syntax ? tokenize(code, syntax) : [{ text: code }]) {\n token.text.split('\\n').forEach((part, index) => {\n if (index > 0) {\n lines.push([]);\n }\n\n if (part) {\n lines[lines.length - 1].push({ ...token, text: part });\n }\n });\n }\n\n return lines;\n}\n"],"names":["SYNTAX_LABELS","words","list","BLOCK_COMMENT","LINE_COMMENT","DOUBLE_QUOTED","SINGLE_QUOTED","NUMBER","CALL","ANNOTATION","JAVA_KEYWORDS","JAVASCRIPT_WORDS","TYPESCRIPT_WORDS","SQL_KEYWORDS","SHELL_KEYWORDS","DELPHI_KEYWORDS","JAVASCRIPT_RULES","JAVASCRIPT","TYPESCRIPT","JSX_RULES","RULES","CASE_INSENSITIVE","grammars","grammarOf","syntax","cached","rules","flags","grammar","kind","rule","tokenize","code","kinds","pattern","tokens","end","match","group","tokenizeLines","lines","token","part","index"],"mappings":"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"}
|