@orangesys/ui 0.0.0-stage → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +47 -2
- package/dist/index.d.cts +5224 -0
- package/dist/index.d.ts +5224 -0
- package/dist/orange-ui.cjs +5 -0
- package/dist/orange-ui.cjs.map +1 -0
- package/dist/orange-ui.js +16512 -0
- package/dist/orange-ui.js.map +1 -0
- package/dist/styles.css +1 -0
- package/package.json +87 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orange-ui.cjs","sources":["../src/utils/index.ts","../src/hooks/index.ts","../src/components/Accordion/Accordion.tsx","../src/icons/paths.tsx","../src/icons/Icon.tsx","../src/providers/messages.ts","../src/providers/theme.ts","../src/providers/OrangeProvider.tsx","../src/components/VisuallyHidden/VisuallyHidden.tsx","../src/components/Button/Button.tsx","../src/components/Alert/feedback.ts","../src/components/Alert/Alert.tsx","../src/components/AppHeader/AppHeader.tsx","../src/components/Portal/Portal.tsx","../src/components/Modal/overlay.ts","../src/components/Modal/DialogShell.tsx","../src/components/Drawer/Drawer.tsx","../src/components/Footer/Footer.tsx","../src/components/ButtonGroup/context.ts","../src/components/IconButton/IconButton.tsx","../src/components/SideNav/SideNav.tsx","../src/components/SkipLink/SkipLink.tsx","../src/components/AppShell/AppShell.tsx","../src/components/Avatar/Avatar.tsx","../src/components/AvatarGroup/AvatarGroup.tsx","../src/components/BackToTop/BackToTop.tsx","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.tsx","../src/components/BarChart/ChartFrame.tsx","../src/components/BarChart/chartUtils.ts","../src/components/BarChart/BarChart.tsx","../src/components/BottomNavigation/BottomNavigation.tsx","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/Card/Card.tsx","../src/components/Tabs/useSlidingIndicator.ts","../src/components/Carousel/Carousel.tsx","../src/components/TextField/useErrorShake.ts","../src/components/Fieldset/FieldsetBase.tsx","../src/components/Checkbox/CheckboxGroupContext.ts","../src/components/Checkbox/Checkbox.tsx","../src/components/Checkbox/CheckboxGroup.tsx","../src/components/Chip/Chip.tsx","../src/components/CodeBlock/CodeBlock.tsx","../src/components/Field/Field.tsx","../src/components/ColorField/ColorField.tsx","../src/components/Combobox/motion.ts","../src/components/Combobox/shared.tsx","../src/components/Combobox/Combobox.tsx","../src/components/CommandPalette/CommandPalette.tsx","../src/components/ConfirmDialog/ConfirmDialog.tsx","../src/components/Container/Container.tsx","../src/components/Popover/floating.ts","../src/components/Dropdown/Menu.tsx","../src/components/ContextMenu/ContextMenu.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/CurrencyField/CurrencyField.tsx","../src/components/DatePicker/dateUtils.ts","../src/components/DatePicker/Calendar.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/DateRangePicker/rangeUtils.ts","../src/components/DateRangePicker/RangeCalendar.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Divider/Divider.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/ErrorSummary/ErrorSummary.tsx","../src/components/ExpandableText/ExpandableText.tsx","../src/components/Fieldset/Fieldset.tsx","../src/components/FileUploader/FileUploader.tsx","../src/components/Form/Form.tsx","../src/components/Stack/responsive.ts","../src/components/Grid/Grid.tsx","../src/components/Highlight/Highlight.tsx","../src/components/HoverCard/HoverCard.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Image/Image.tsx","../src/components/InlineEdit/InlineEdit.tsx","../src/components/Kbd/Kbd.tsx","../src/components/LineChart/LineChart.tsx","../src/components/Link/Link.tsx","../src/components/List/useStaggerReveal.ts","../src/components/List/List.tsx","../src/components/Listbox/Listbox.tsx","../src/components/Spinner/Spinner.tsx","../src/components/LoadingOverlay/LoadingOverlay.tsx","../src/components/Meter/Meter.tsx","../src/components/Modal/Modal.tsx","../src/components/MonthPaginator/MonthPaginator.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/TextField/InputControl.tsx","../src/components/NumberField/NumberField.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/Paginator/Paginator.tsx","../src/components/Paper/Paper.tsx","../src/components/PasswordField/PasswordField.tsx","../src/components/PinInput/PinInput.tsx","../src/components/Popover/Popover.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/ProgressCircle/ProgressCircle.tsx","../src/components/RadioGroup/RadioGroupContext.ts","../src/components/RadioGroup/Radio.tsx","../src/components/RadioGroup/RadioGroup.tsx","../src/components/Rating/Rating.tsx","../src/components/RelativeTime/RelativeTime.tsx","../src/components/Reveal/Reveal.tsx","../src/components/Search/Search.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Select/Select.tsx","../src/components/Slider/Slider.tsx","../src/components/SortableList/SortableList.tsx","../src/components/Sparkline/Sparkline.tsx","../src/components/SplitButton/SplitButton.tsx","../src/components/Splitter/Splitter.tsx","../src/components/Stack/Stack.tsx","../src/components/Stat/Stat.tsx","../src/components/Stepper/Stepper.tsx","../src/components/Switch/Switch.tsx","../src/components/Table/Table.tsx","../src/components/TableOfContents/TableOfContents.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tag/Tag.tsx","../src/components/TagInput/TagInput.tsx","../src/components/TextField/CharacterCount.tsx","../src/components/TextArea/TextArea.tsx","../src/components/TextField/TextField.tsx","../src/components/TimeField/TimeField.tsx","../src/components/Timeline/Timeline.tsx","../src/components/Toast/Toast.tsx","../src/components/Toast/ToastProvider.tsx","../src/components/ToggleButton/context.ts","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ToggleButton/ToggleButtonGroup.tsx","../src/components/Toggletip/Toggletip.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Tour/Tour.tsx","../src/components/TreeView/TreeView.tsx","../src/components/TruncatedText/TruncatedText.tsx","../src/components/Typography/Typography.tsx"],"sourcesContent":["import type { Ref, RefCallback, SyntheticEvent } from 'react'\n\nexport type ClassValue = string | number | false | null | undefined | Record<string, unknown>\n\n/** Junta classes CSS condicionalmente: `cx('a', cond && 'b', { c: true })`. */\nexport function cx(...values: ClassValue[]): string {\n const out: string[] = []\n for (const v of values) {\n if (!v) continue\n if (typeof v === 'string' || typeof v === 'number') out.push(String(v))\n else for (const [k, on] of Object.entries(v)) if (on) out.push(k)\n }\n return out.join(' ')\n}\n\n/** Atribui um valor a qualquer tipo de ref. */\nexport function setRef<T>(ref: Ref<T> | undefined, value: T | null) {\n if (typeof ref === 'function') ref(value)\n else if (ref && typeof ref === 'object') (ref as { current: T | null }).current = value\n}\n\n/** Combina várias refs em uma única ref callback. */\nexport function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): RefCallback<T> {\n return (value) => {\n for (const ref of refs) setRef(ref, value)\n }\n}\n\n/**\n * Compõe handlers de evento: chama o do usuário primeiro e só executa o interno\n * se `event.defaultPrevented` não tiver sido marcado.\n */\nexport function composeEventHandlers<E extends SyntheticEvent | Event>(\n external: ((event: E) => void) | undefined,\n internal: (event: E) => void,\n) {\n return (event: E) => {\n external?.(event)\n if (!event.defaultPrevented) internal(event)\n }\n}\n\nconst FOCUSABLE = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'iframe',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\n/** Lista elementos focáveis visíveis dentro de `root`, na ordem do DOM. */\nexport function getFocusableElements(root: HTMLElement | null): HTMLElement[] {\n if (!root) return []\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => !el.hasAttribute('inert') && !el.closest('[inert]') && el.getAttribute('aria-hidden') !== 'true',\n )\n}\n\n/** Mantém `value` dentro do intervalo [min, max]. */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max)\n}\n\n/** Verdadeiro quando o código roda no navegador. */\nexport const canUseDOM = typeof window !== 'undefined' && typeof document !== 'undefined'\n\n/** Gera um array [start, ..., end]. */\nexport function range(start: number, end: number): number[] {\n const length = end - start + 1\n return Array.from({ length: Math.max(0, length) }, (_, i) => start + i)\n}\n\nconst warned = new Set<string>()\n\n/**\n * Verdadeiro fora de produção. Bundlers (Vite, webpack, Next…) substituem\n * `process.env.NODE_ENV` por uma string, então a checagem vira constante e o\n * código de aviso some do bundle de produção. Sem bundler e sem `process`\n * (ex.: `<script type=\"module\">` direto no navegador), fica em silêncio.\n */\nfunction isDevelopment(): boolean {\n try {\n return process.env.NODE_ENV !== 'production'\n } catch {\n return false\n }\n}\n\n/** Escreve `[Orange] mensagem` no console uma única vez por chave. */\nfunction warnOnce(key: string, message: string) {\n if (warned.has(key)) return\n warned.add(key)\n console.warn(`[Orange] ${message}`)\n}\n\n/**\n * Emite um aviso de uso incorreto apenas em desenvolvimento (uma vez por\n * mensagem). Em produção, bundlers substituem `process.env.NODE_ENV` e o\n * código é eliminado.\n */\nexport function devWarning(condition: boolean, message: string) {\n if (!condition || !isDevelopment()) return\n warnOnce(message, message)\n}\n\n/**\n * Avisa, só em desenvolvimento e uma única vez por `id`, que uma API pública\n * está depreciada. Chame quando a API antiga for **usada** — não no import:\n *\n * ```ts\n * if (variant === 'ghost') {\n * deprecate(\n * 'Button: `variant=\"ghost\"` está depreciado e sai na v1.0. Use `variant=\"text\"`.',\n * 'button.variant.ghost',\n * )\n * }\n * ```\n *\n * A mensagem diz o que trocar e em qual versão a API sai. `id` estável\n * (`componente.prop.valor`) evita repetir o aviso a cada render; sem ele, a\n * própria mensagem vira o id. Política completa: /usage/versioning.\n */\nexport function deprecate(message: string, id: string = message) {\n if (!isDevelopment()) return\n warnOnce(`deprecate:${id}`, `Depreciado: ${message}`)\n}\n","import {\n useCallback,\n useEffect,\n useId as useReactId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type RefCallback,\n type RefObject,\n} from 'react'\nimport { canUseDOM, getFocusableElements } from '../utils'\n\n/** `useLayoutEffect` no navegador, `useEffect` no servidor (SSR seguro). */\nexport const useIsomorphicLayoutEffect = canUseDOM ? useLayoutEffect : useEffect\n\n/**\n * Gera um id estável e único. Se `providedId` for informado, ele é usado.\n * @example const id = useId('or-field')\n */\nexport function useId(prefix = 'or', providedId?: string): string {\n const reactId = useReactId()\n return providedId ?? `${prefix}-${reactId.replace(/[:«»]/g, '')}`\n}\n\n/**\n * Estado que pode ser controlado (via props) ou não controlado (interno).\n * Segue o padrão `value` / `defaultValue` / `onChange`.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: {\n value?: T\n defaultValue: T\n onChange?: (value: T) => void\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const [internal, setInternal] = useState<T>(defaultValue)\n const isControlled = value !== undefined\n const current = isControlled ? (value as T) : internal\n const currentRef = useRef(current)\n currentRef.current = current\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function' ? (next as (prev: T) => T)(currentRef.current) : next\n if (Object.is(resolved, currentRef.current)) return\n if (!isControlled) setInternal(resolved)\n currentRef.current = resolved\n onChangeRef.current?.(resolved)\n },\n [isControlled],\n )\n\n return [current, setValue]\n}\n\nexport interface UseDisclosureReturn {\n isOpen: boolean\n open: () => void\n close: () => void\n toggle: () => void\n setOpen: (open: boolean) => void\n}\n\n/** Controla estados abre/fecha (modais, menus, drawers). */\nexport function useDisclosure(\n options: { open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void } = {},\n): UseDisclosureReturn {\n const [isOpen, setOpen] = useControllableState({\n value: options.open,\n defaultValue: options.defaultOpen ?? false,\n onChange: options.onOpenChange,\n })\n const open = useCallback(() => setOpen(true), [setOpen])\n const close = useCallback(() => setOpen(false), [setOpen])\n const toggle = useCallback(() => setOpen((v) => !v), [setOpen])\n return useMemo(() => ({ isOpen, open, close, toggle, setOpen }), [isOpen, open, close, toggle, setOpen])\n}\n\n/** Adiciona um listener tipado a `window`, `document` ou um elemento. */\nexport function useEventListener<K extends keyof WindowEventMap>(\n type: K,\n handler: (event: WindowEventMap[K]) => void,\n target?: Window | Document | HTMLElement | null,\n options?: AddEventListenerOptions,\n) {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n useEffect(() => {\n const el = target === undefined ? (canUseDOM ? window : null) : target\n if (!el) return\n const listener = (e: Event) => handlerRef.current(e as WindowEventMap[K])\n el.addEventListener(type, listener, options)\n return () => el.removeEventListener(type, listener, options)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [type, target, options?.capture, options?.passive])\n}\n\n/** Chama `handler` quando ocorre clique/toque fora dos elementos informados. */\nexport function useClickOutside(\n refs: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[],\n handler: (event: PointerEvent) => void,\n enabled = true,\n) {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n useEffect(() => {\n if (!enabled) return\n const list = Array.isArray(refs) ? refs : [refs]\n const listener = (event: PointerEvent) => {\n const target = event.target as Node\n if (list.some((r) => r.current?.contains(target))) return\n handlerRef.current(event)\n }\n document.addEventListener('pointerdown', listener)\n return () => document.removeEventListener('pointerdown', listener)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled])\n}\n\n/** Chama `handler` quando a tecla Escape é pressionada. */\nexport function useEscapeKey(handler: (event: KeyboardEvent) => void, enabled = true) {\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n useEffect(() => {\n if (!enabled) return\n const listener = (event: KeyboardEvent) => {\n if (event.key === 'Escape') handlerRef.current(event)\n }\n document.addEventListener('keydown', listener)\n return () => document.removeEventListener('keydown', listener)\n }, [enabled])\n}\n\n/** Retorna `true` enquanto a media query corresponder. */\nexport function useMediaQuery(query: string, defaultValue = false): boolean {\n const [matches, setMatches] = useState(() =>\n canUseDOM && window.matchMedia ? window.matchMedia(query).matches : defaultValue,\n )\n useEffect(() => {\n if (!canUseDOM || !window.matchMedia) return\n const mql = window.matchMedia(query)\n const update = () => setMatches(mql.matches)\n update()\n mql.addEventListener?.('change', update)\n return () => mql.removeEventListener?.('change', update)\n }, [query])\n return matches\n}\n\n/** `true` quando o usuário pediu menos movimento no sistema operacional. */\nexport function useReducedMotion(): boolean {\n return useMediaQuery('(prefers-reduced-motion: reduce)')\n}\n\n/** Bloqueia o scroll do `body` enquanto `locked` for verdadeiro. */\nexport function useLockBodyScroll(locked: boolean) {\n useIsomorphicLayoutEffect(() => {\n if (!locked || !canUseDOM) return\n const { body, documentElement } = document\n const prevOverflow = body.style.overflow\n const prevPadding = body.style.paddingRight\n // clientWidth é 0 em ambientes sem layout (jsdom, SSR hidratado); ignore nesses casos.\n const scrollbar = documentElement.clientWidth > 0 ? window.innerWidth - documentElement.clientWidth : 0\n body.style.overflow = 'hidden'\n if (scrollbar > 0 && scrollbar < 64) body.style.paddingRight = `${scrollbar}px`\n return () => {\n body.style.overflow = prevOverflow\n body.style.paddingRight = prevPadding\n }\n }, [locked])\n}\n\n/**\n * Prende o foco do teclado dentro de `ref` enquanto `active` for verdadeiro.\n * Ao desativar, devolve o foco para o elemento que estava focado antes.\n */\nexport function useFocusTrap(\n ref: RefObject<HTMLElement | null>,\n active: boolean,\n options: { initialFocus?: RefObject<HTMLElement | null>; restoreFocus?: boolean } = {},\n) {\n const { initialFocus, restoreFocus = true } = options\n useEffect(() => {\n if (!active) return\n const root = ref.current\n if (!root) return\n const previouslyFocused = document.activeElement as HTMLElement | null\n\n const focusFirst = () => {\n const target = initialFocus?.current ?? getFocusableElements(root)[0] ?? root\n if (target === root && !root.hasAttribute('tabindex')) root.setAttribute('tabindex', '-1')\n target.focus({ preventScroll: true })\n }\n // aguarda o próximo frame para garantir que o conteúdo foi renderizado\n const raf = requestAnimationFrame(focusFirst)\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n const focusables = getFocusableElements(root)\n if (focusables.length === 0) {\n event.preventDefault()\n return\n }\n const first = focusables[0]\n const last = focusables[focusables.length - 1]\n const activeEl = document.activeElement\n if (event.shiftKey && (activeEl === first || activeEl === root)) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && activeEl === last) {\n event.preventDefault()\n first.focus()\n }\n }\n root.addEventListener('keydown', onKeyDown)\n return () => {\n cancelAnimationFrame(raf)\n root.removeEventListener('keydown', onKeyDown)\n if (restoreFocus && previouslyFocused && document.contains(previouslyFocused)) {\n previouslyFocused.focus({ preventScroll: true })\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n}\n\nexport type RovingOrientation = 'horizontal' | 'vertical' | 'both'\n\n/**\n * Navegação por setas entre itens (padrão \"roving tabindex\" do WAI-ARIA).\n * Retorna um handler de `onKeyDown` para o contêiner. Os itens devem ter o\n * atributo `data-roving-item` e não estar desabilitados.\n */\nexport function useRovingFocus(\n containerRef: RefObject<HTMLElement | null>,\n options: { orientation?: RovingOrientation; loop?: boolean; selector?: string } = {},\n) {\n const { orientation = 'horizontal', loop = true, selector = '[data-roving-item]:not([disabled])' } = options\n return useCallback(\n (event: React.KeyboardEvent) => {\n const container = containerRef.current\n if (!container) return\n const items = Array.from(container.querySelectorAll<HTMLElement>(selector))\n if (items.length === 0) return\n const index = items.indexOf(document.activeElement as HTMLElement)\n const prevKeys = orientation === 'vertical' ? ['ArrowUp'] : orientation === 'horizontal' ? ['ArrowLeft'] : ['ArrowUp', 'ArrowLeft']\n const nextKeys = orientation === 'vertical' ? ['ArrowDown'] : orientation === 'horizontal' ? ['ArrowRight'] : ['ArrowDown', 'ArrowRight']\n let next = -1\n if (nextKeys.includes(event.key)) next = index + 1 >= items.length ? (loop ? 0 : index) : index + 1\n else if (prevKeys.includes(event.key)) next = index - 1 < 0 ? (loop ? items.length - 1 : 0) : index - 1\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = items.length - 1\n else return\n event.preventDefault()\n items.forEach((el, i) => el.setAttribute('tabindex', i === next ? '0' : '-1'))\n items[next]?.focus()\n },\n [containerRef, orientation, loop, selector],\n )\n}\n\n/** Copia texto para a área de transferência e expõe o estado `copied`. */\nexport function useClipboard(timeout = 2000) {\n const [copied, setCopied] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const copy = useCallback(\n async (text: string) => {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text)\n } else {\n const el = document.createElement('textarea')\n el.value = text\n el.setAttribute('readonly', '')\n el.style.position = 'absolute'\n el.style.left = '-9999px'\n document.body.appendChild(el)\n el.select()\n document.execCommand('copy')\n document.body.removeChild(el)\n }\n setCopied(true)\n clearTimeout(timer.current)\n timer.current = setTimeout(() => setCopied(false), timeout)\n return true\n } catch {\n setCopied(false)\n return false\n }\n },\n [timeout],\n )\n useEffect(() => () => clearTimeout(timer.current), [])\n return { copy, copied }\n}\n\n/** Retorna `value` somente após `delay` ms sem alterações. */\nexport function useDebouncedValue<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value)\n useEffect(() => {\n const t = setTimeout(() => setDebounced(value), delay)\n return () => clearTimeout(t)\n }, [value, delay])\n return debounced\n}\n\n/** Guarda o valor da renderização anterior. */\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined)\n useEffect(() => {\n ref.current = value\n }, [value])\n return ref.current\n}\n\n/** `true` depois que o componente montou no cliente (útil para portais/SSR). */\nexport function useMounted(): boolean {\n const [mounted, setMounted] = useState(false)\n useEffect(() => setMounted(true), [])\n return mounted\n}\n\n/* -------------------------------------------------------------------------- */\n/* Motion */\n/* -------------------------------------------------------------------------- */\n\nexport type PresenceState = 'open' | 'closed'\n\n/**\n * Mantém um elemento montado enquanto a animação (ou transição) de saída roda.\n *\n * - `present`: renderizar o elemento?\n * - `state`: `open` | `closed` — aplique em `data-state` e anime\n * `[data-state='closed']` com uma keyframe de saída (ex.: `or-pop-out`).\n * - `nodeRef`: ligue ao elemento animado.\n *\n * Sem animação (jsdom, CSS ausente, movimento reduzido) desmonta na hora.\n *\n * @example\n * const { present, state, nodeRef } = usePresence(open)\n * return present ? <div ref={nodeRef} data-state={state} className=\"or-popover\" /> : null\n */\nexport function usePresence<T extends HTMLElement = HTMLElement>(open: boolean, options: { timeout?: number } = {}) {\n const { timeout = 1000 } = options\n const [mounted, setMounted] = useState(open)\n const nodeRef = useRef<T | null>(null)\n\n useEffect(() => {\n if (open) {\n setMounted(true)\n return\n }\n if (!mounted) return\n const node = nodeRef.current\n const style = node && canUseDOM ? getComputedStyle(node) : null\n const seconds = (value: string | undefined) =>\n Math.max(0, ...(value ?? '0s').split(',').map((v) => (v.trim().endsWith('ms') ? parseFloat(v) / 1000 : parseFloat(v) || 0)))\n // Movimento reduzido: o base.css força durações de 0.01ms em tudo — trate como sem animação\n // (senão o hook esperaria um animationend/transitionend que nunca vem até o fallback).\n const reduced = canUseDOM && !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n const MIN = 0.002 // segundos; abaixo disso não há animação perceptível\n const hasAnimation =\n !!style && !!style.animationName && style.animationName !== 'none' && seconds(style.animationDuration) > MIN\n const hasTransition = !!style && seconds(style.transitionDuration) > MIN\n if (!node || reduced || (!hasAnimation && !hasTransition)) {\n setMounted(false)\n return\n }\n // Espera TODAS as animações/transições do nó terminarem (ex.: opacidade em 160ms\n // e transform em 250ms) — não só o primeiro *end que chegar.\n const done = (event: Event) => {\n if (event.target !== node) return\n const running =\n typeof node.getAnimations === 'function'\n ? node.getAnimations().some((a) => a.playState === 'running' || a.pending)\n : false\n if (!running) setMounted(false)\n }\n node.addEventListener('animationend', done)\n node.addEventListener('animationcancel', done)\n node.addEventListener('transitionend', done)\n node.addEventListener('transitioncancel', done)\n // Só transição (sem keyframe de saída): se nenhuma propriedade começar a\n // transicionar logo, não há o que esperar — desmonta sem aguardar o fallback.\n let started = hasAnimation\n const onRun = (event: Event) => {\n if (event.target === node) started = true\n }\n node.addEventListener('transitionrun', onRun)\n const noTransition = hasAnimation ? 0 : window.setTimeout(() => !started && setMounted(false), 50)\n const fallback = window.setTimeout(() => setMounted(false), timeout)\n return () => {\n node.removeEventListener('animationend', done)\n node.removeEventListener('animationcancel', done)\n node.removeEventListener('transitionend', done)\n node.removeEventListener('transitioncancel', done)\n node.removeEventListener('transitionrun', onRun)\n window.clearTimeout(noTransition)\n window.clearTimeout(fallback)\n }\n }, [open, mounted, timeout])\n\n return {\n present: open || mounted,\n state: (open ? 'open' : 'closed') as PresenceState,\n nodeRef,\n }\n}\n\n/**\n * `true` quando o elemento entra na viewport (IntersectionObserver).\n * Por padrão dispara uma vez (`once`) — ideal para revelações no scroll.\n * Sem suporte a IntersectionObserver, retorna `true`.\n */\nexport function useInView<T extends Element = HTMLElement>(\n options: { rootMargin?: string; threshold?: number | number[]; once?: boolean; root?: Element | null } = {},\n): [RefCallback<T>, boolean] {\n const { rootMargin = '0px 0px -60px 0px', threshold = 0.08, once = true, root = null } = options\n const [inView, setInView] = useState(false)\n const [node, setNode] = useState<T | null>(null)\n const ref = useCallback<RefCallback<T>>((el) => setNode(el), [])\n\n useEffect(() => {\n if (!node) return\n if (typeof IntersectionObserver === 'undefined') {\n setInView(true)\n return\n }\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry?.isIntersecting) {\n setInView(true)\n if (once) observer.disconnect()\n } else if (!once) {\n setInView(false)\n }\n },\n { rootMargin, threshold, root },\n )\n observer.observe(node)\n return () => observer.disconnect()\n }, [node, rootMargin, once, root, JSON.stringify(threshold)]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return [ref, inView]\n}\n\n/**\n * Anima um número de 0 (ou `from`) até `target` com desaceleração cúbica.\n * Com movimento reduzido (ou `enabled=false`), retorna o valor final direto.\n */\nexport function useCountUp(target: number, options: { duration?: number; from?: number; enabled?: boolean } = {}) {\n const { duration = 900, from = 0, enabled = true } = options\n const reduced = useReducedMotion()\n const [value, setValue] = useState(enabled && !reduced ? from : target)\n\n useEffect(() => {\n if (!enabled || reduced || !canUseDOM) {\n setValue(target)\n return\n }\n let raf = 0\n const start = performance.now()\n const tick = (now: number) => {\n // O timestamp do rAF pode ser anterior a `start`: limita o progresso a [0, 1].\n const p = Math.min(1, Math.max(0, (now - start) / duration))\n setValue(from + (target - from) * (1 - Math.pow(1 - p, 3)))\n if (p < 1) raf = requestAnimationFrame(tick)\n }\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [target, duration, from, enabled, reduced])\n\n return value\n}\n\n/**\n * Direção da rolagem da página (`up` | `down`) e se já passou de `threshold`.\n * Útil para cabeçalhos que se escondem ao rolar para baixo.\n */\nexport function useScrollDirection(options: { threshold?: number; tolerance?: number } = {}) {\n const { threshold = 120, tolerance = 6 } = options\n const [state, setState] = useState<{ direction: 'up' | 'down'; pastThreshold: boolean }>({\n direction: 'up',\n pastThreshold: false,\n })\n useEffect(() => {\n if (!canUseDOM) return\n let last = window.scrollY\n let ticking = false\n const update = () => {\n ticking = false\n const y = window.scrollY\n const delta = y - last\n if (Math.abs(delta) < tolerance) return\n setState({ direction: delta > 0 ? 'down' : 'up', pastThreshold: y > threshold })\n last = y\n }\n const onScroll = () => {\n if (!ticking) {\n ticking = true\n requestAnimationFrame(update)\n }\n }\n window.addEventListener('scroll', onScroll, { passive: true })\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold, tolerance])\n return state\n}\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ButtonHTMLAttributes,\n type ElementType,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { useControllableState, useId, usePresence } from '../../hooks'\nimport { composeEventHandlers, cx, mergeRefs } from '../../utils'\nimport type { HeadingLevel } from '../Typography'\nimport './Accordion.css'\n\nexport type AccordionType = 'single' | 'multiple'\nexport type AccordionVariant = 'outline' | 'flush'\n\ninterface AccordionContextValue {\n type: AccordionType\n collapsible: boolean\n disabled: boolean\n headingLevel: HeadingLevel\n isOpen: (value: string) => boolean\n toggle: (value: string) => void\n}\n\ninterface AccordionItemContextValue {\n value: string\n open: boolean\n disabled: boolean\n triggerId: string\n contentId: string\n}\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null)\nconst AccordionItemContext = createContext<AccordionItemContextValue | null>(null)\n\nfunction useAccordionContext(component: string) {\n const ctx = useContext(AccordionContext)\n if (!ctx) throw new Error(`${component} precisa estar dentro de <Accordion>.`)\n return ctx\n}\n\nfunction useAccordionItemContext(component: string) {\n const ctx = useContext(AccordionItemContext)\n if (!ctx) throw new Error(`${component} precisa estar dentro de <AccordionItem>.`)\n return ctx\n}\n\ninterface AccordionBaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {\n /** Nível semântico dos cabeçalhos (`h2`–`h6`). Padrão: 3. */\n headingLevel?: HeadingLevel\n /** Desabilita todos os itens. */\n disabled?: boolean\n /** `outline` (caixa com borda, padrão) ou `flush` (apenas divisórias). */\n variant?: AccordionVariant\n}\n\nexport interface AccordionSingleProps extends AccordionBaseProps {\n /** `single`: apenas um item aberto por vez. */\n type?: 'single'\n /** Item aberto (controlado). `null` fecha todos. */\n value?: string | null\n /** Item aberto inicialmente (não controlado). */\n defaultValue?: string | null\n onChange?: (value: string | null) => void\n /** Permite fechar o item aberto, deixando todos fechados. Padrão: `true`. */\n collapsible?: boolean\n}\n\nexport interface AccordionMultipleProps extends AccordionBaseProps {\n /** `multiple`: vários itens podem ficar abertos ao mesmo tempo. */\n type: 'multiple'\n /** Itens abertos (controlado). */\n value?: string[]\n /** Itens abertos inicialmente (não controlado). */\n defaultValue?: string[]\n onChange?: (value: string[]) => void\n collapsible?: boolean\n}\n\nexport type AccordionProps = AccordionSingleProps | AccordionMultipleProps\n\nfunction toArray(value: string | string[] | null | undefined): string[] | undefined {\n if (value === undefined) return undefined\n if (value === null) return []\n return Array.isArray(value) ? value : [value]\n}\n\n/**\n * Lista de seções que se expandem e recolhem (padrão \"accordion\" do WAI-ARIA).\n * Use com `AccordionItem`, `AccordionTrigger` e `AccordionContent`.\n */\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(function Accordion(props, ref) {\n const {\n type = 'single',\n value,\n defaultValue,\n onChange,\n collapsible = true,\n headingLevel = 3,\n disabled = false,\n variant = 'outline',\n className,\n onKeyDown,\n children,\n ...rest\n } = props\n const multiple = type === 'multiple'\n\n const [openValues, setOpenValues] = useControllableState<string[]>({\n value: toArray(value),\n defaultValue: toArray(defaultValue) ?? [],\n onChange: (next) => {\n if (multiple) (onChange as ((v: string[]) => void) | undefined)?.(next)\n else (onChange as ((v: string | null) => void) | undefined)?.(next[0] ?? null)\n },\n })\n\n const toggle = useCallback(\n (itemValue: string) => {\n setOpenValues((prev) => {\n const isOpen = prev.includes(itemValue)\n if (multiple) return isOpen ? prev.filter((v) => v !== itemValue) : [...prev, itemValue]\n if (isOpen) return collapsible ? [] : prev\n return [itemValue]\n })\n },\n [multiple, collapsible, setOpenValues],\n )\n\n const context = useMemo<AccordionContextValue>(\n () => ({\n type,\n collapsible: multiple || collapsible,\n disabled,\n headingLevel,\n isOpen: (v) => openValues.includes(v),\n toggle,\n }),\n [type, multiple, collapsible, disabled, headingLevel, openValues, toggle],\n )\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const root = event.currentTarget\n const target = event.target as HTMLElement\n if (!target.hasAttribute('data-or-accordion-trigger') || target.closest('[data-or-accordion]') !== root) return\n const triggers = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-or-accordion-trigger]')).filter(\n (el) => el.closest('[data-or-accordion]') === root && !el.disabled,\n )\n const index = triggers.indexOf(target as HTMLButtonElement)\n const last = triggers.length - 1\n let next: number\n switch (event.key) {\n case 'ArrowDown':\n next = index >= last ? 0 : index + 1\n break\n case 'ArrowUp':\n next = index <= 0 ? last : index - 1\n break\n case 'Home':\n next = 0\n break\n case 'End':\n next = last\n break\n default:\n return\n }\n event.preventDefault()\n triggers[next]?.focus()\n }\n\n return (\n <AccordionContext.Provider value={context}>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- onKeyDown delega ↑/↓/Home/End entre os botões de cabeçalho (padrão APG) */}\n <div\n ref={ref}\n className={cx('or-accordion', `or-accordion--${variant}`, className)}\n data-or-accordion=\"\"\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}\n {...rest}\n >\n {children}\n </div>\n </AccordionContext.Provider>\n )\n})\n\nexport interface AccordionItemProps extends HTMLAttributes<HTMLDivElement> {\n /** Identificador único do item dentro do Accordion. */\n value: string\n /** Desabilita o item. */\n disabled?: boolean\n}\n\n/** Um item do Accordion: agrupa um `AccordionTrigger` e um `AccordionContent`. */\nexport const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(\n { value, disabled = false, className, children, ...rest },\n ref,\n) {\n const accordion = useAccordionContext('AccordionItem')\n const id = useId('or-accordion')\n const open = accordion.isOpen(value)\n const itemDisabled = accordion.disabled || disabled\n const item = useMemo<AccordionItemContextValue>(\n () => ({ value, open, disabled: itemDisabled, triggerId: `${id}-trigger`, contentId: `${id}-content` }),\n [value, open, itemDisabled, id],\n )\n return (\n <AccordionItemContext.Provider value={item}>\n <div\n ref={ref}\n className={cx('or-accordion__item', className)}\n data-state={open ? 'open' : 'closed'}\n data-disabled={itemDisabled || undefined}\n {...rest}\n >\n {children}\n </div>\n </AccordionItemContext.Provider>\n )\n})\n\nexport interface AccordionTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Sobrescreve o nível do cabeçalho definido no Accordion. */\n headingLevel?: HeadingLevel\n}\n\n/**\n * Cabeçalho do item: um `<button>` com `aria-expanded` dentro de um heading.\n * O ícone de caixa quadrada mostra \"+\" fechado e \"−\" aberto.\n */\nexport const AccordionTrigger = forwardRef<HTMLButtonElement, AccordionTriggerProps>(function AccordionTrigger(\n { headingLevel, className, children, onClick, ...rest },\n ref,\n) {\n const accordion = useAccordionContext('AccordionTrigger')\n const item = useAccordionItemContext('AccordionTrigger')\n const Heading = `h${headingLevel ?? accordion.headingLevel}` as ElementType\n // No modo single não recolhível, o item aberto não pode ser fechado (APG).\n const locked = item.open && !accordion.collapsible\n return (\n <Heading className=\"or-accordion__heading\">\n <button\n ref={ref}\n type=\"button\"\n id={item.triggerId}\n className={cx('or-accordion__trigger', className)}\n aria-expanded={item.open}\n aria-controls={item.contentId}\n aria-disabled={locked || undefined}\n disabled={item.disabled}\n data-or-accordion-trigger=\"\"\n onClick={composeEventHandlers(onClick, () => {\n if (!locked) accordion.toggle(item.value)\n })}\n {...rest}\n >\n <span className=\"or-accordion__title\">{children}</span>\n <span className=\"or-accordion__icon\" aria-hidden=\"true\" />\n </button>\n </Heading>\n )\n})\n\nexport type AccordionContentProps = HTMLAttributes<HTMLDivElement>\n\n/**\n * Painel do item (`role=\"region\"` rotulado pelo cabeçalho). Expande com\n * `grid-template-rows: 0fr → 1fr` e só recebe `hidden` quando a transição de\n * saída termina (`usePresence`). Sem movimento em `prefers-reduced-motion`.\n */\nexport const AccordionContent = forwardRef<HTMLDivElement, AccordionContentProps>(function AccordionContent(\n { className, children, ...rest },\n ref,\n) {\n const item = useAccordionItemContext('AccordionContent')\n const { open } = item\n const { present, nodeRef } = usePresence<HTMLDivElement>(open)\n // Ao abrir, o painel fica um quadro em 0fr para a transição ter um ponto de partida.\n const [expanded, setExpanded] = useState(open)\n const composedRef = useMemo(() => mergeRefs(ref, nodeRef), [ref, nodeRef])\n\n useEffect(() => {\n if (!open) {\n setExpanded(false)\n return\n }\n let inner = 0\n const outer = requestAnimationFrame(() => {\n inner = requestAnimationFrame(() => setExpanded(true))\n })\n return () => {\n cancelAnimationFrame(outer)\n cancelAnimationFrame(inner)\n }\n }, [open])\n\n return (\n <div\n ref={composedRef}\n id={item.contentId}\n role=\"region\"\n aria-labelledby={item.triggerId}\n className={cx('or-accordion__content', className)}\n data-state={open && expanded ? 'open' : 'closed'}\n hidden={!present}\n {...rest}\n >\n <div className=\"or-accordion__content-clip\">\n <div className=\"or-accordion__content-inner\">{children}</div>\n </div>\n </div>\n )\n})\n","import type { ReactElement } from 'react'\n\n/**\n * Biblioteca de ícones do Orange: grade 24×24, traço de 1.75px, terminações\n * quadradas e cantos vivos — coerente com a linguagem geométrica do sistema.\n *\n * Para adicionar um ícone: inclua uma nova chave neste objeto (mantenha a\n * ordem alfabética) usando apenas <path>, <circle>, <rect> ou <line>.\n */\nexport const iconPaths = {\n accessibility: (\n <>\n <circle cx=\"12\" cy=\"4.5\" r=\"1.75\" />\n <path d=\"M5 8.5l7 1.5 7-1.5M12 10v4.5M8.5 21l3.5-6.5 3.5 6.5\" />\n </>\n ),\n 'alert-circle': (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7.5v5.5M12 16.25v.5\" />\n </>\n ),\n 'alert-triangle': <path d=\"M12 3.5l9.5 17h-19zM12 10v4.5M12 17.25v.5\" />,\n 'align-center': <path d=\"M4 6h16M7 10h10M4 14h16M7 18h10\" />,\n 'align-left': <path d=\"M4 6h16M4 10h10M4 14h16M4 18h10\" />,\n 'align-right': <path d=\"M4 6h16M10 10h10M4 14h16M10 18h10\" />,\n 'arrow-down': <path d=\"M12 4.5v15M5.5 13l6.5 6.5 6.5-6.5\" />,\n 'arrow-down-to-line': <path d=\"M12 3.5v12.5M5.5 9.5L12 16l6.5-6.5M4.5 20.5h15\" />,\n 'arrow-left': <path d=\"M19.5 12h-15M11 5.5L4.5 12l6.5 6.5\" />,\n 'arrow-right': <path d=\"M4.5 12h15M13 5.5l6.5 6.5-6.5 6.5\" />,\n 'arrow-up': <path d=\"M12 19.5v-15M5.5 11L12 4.5l6.5 6.5\" />,\n 'arrow-up-right': <path d=\"M6.5 17.5l11-11M8 6.5h9.5V16\" />,\n 'arrow-up-to-line': <path d=\"M12 20.5V8M5.5 14.5L12 8l6.5 6.5M4.5 3.5h15\" />,\n 'arrows-up-down': <path d=\"M8 4v16M4 8l4-4 4 4M16 20V4M12 16l4 4 4-4\" />,\n bell: <path d=\"M6 16.5V11a6 6 0 0 1 12 0v5.5l1.5 1.5h-15zM10 20.5h4\" />,\n bold: <path d=\"M7 4.5h6a3.75 3.75 0 0 1 0 7.5H7zM7 12h7a3.75 3.75 0 0 1 0 7.5H7z\" />,\n book: <path d=\"M5 4.5h10.5a3 3 0 0 1 3 3v13H8a3 3 0 0 1-3-3zM5 17.5a3 3 0 0 1 3-3h10.5\" />,\n calendar: <path d=\"M3.5 5.5h17v15h-17zM3.5 10h17M8 3v4.5M16 3v4.5\" />,\n 'chart-bar': <path d=\"M4 20.5h16M6.5 20.5V12M11 20.5V5M15.5 20.5v-6M20 20.5V9\" />,\n check: <path d=\"M4.5 12.5l5 5 10-10\" />,\n 'check-circle': (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M8 12.25l2.75 2.75L16.25 9.5\" />\n </>\n ),\n 'chevron-down': <path d=\"M6 9.5l6 6 6-6\" />,\n 'chevron-left': <path d=\"M14.5 6l-6 6 6 6\" />,\n 'chevron-right': <path d=\"M9.5 6l6 6-6 6\" />,\n 'chevron-up': <path d=\"M6 14.5l6-6 6 6\" />,\n 'chevrons-left': <path d=\"M11.5 6l-6 6 6 6M18.5 6l-6 6 6 6\" />,\n 'chevrons-right': <path d=\"M5.5 6l6 6-6 6M12.5 6l6 6-6 6\" />,\n 'chevrons-up-down': <path d=\"M7.5 9.5L12 5l4.5 4.5M7.5 14.5L12 19l4.5-4.5\" />,\n circle: <circle cx=\"12\" cy=\"12\" r=\"9\" />,\n clock: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3.5 2\" />\n </>\n ),\n close: <path d=\"M6 6l12 12M18 6L6 18\" />,\n code: <path d=\"M8.5 7l-5 5 5 5M15.5 7l5 5-5 5M13.5 4.5l-3 15\" />,\n command: <path d=\"M9 9V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3z\" />,\n copy: <path d=\"M9 9h11v11H9zM5.5 15H4V4h11v1.5\" />,\n download: <path d=\"M12 4v11M7 10l5 5 5-5M4 15.5V20h16v-4.5\" />,\n droplet: <path d=\"M12 3.5l5.5 7.5a6.5 6.5 0 1 1-11 0z\" />,\n edit: <path d=\"M4 20h4.5L19.5 9 15 4.5 4 15.5zM13 6.5l4.5 4.5\" />,\n 'external-link': <path d=\"M14 4h6v6M20 4l-9 9M18 14v6H4V6h6\" />,\n eye: (\n <>\n <path d=\"M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </>\n ),\n 'eye-off': (\n <path d=\"M3.5 3.5l17 17M10 6a9.5 9.5 0 0 1 2-.5c6 0 9.5 6.5 9.5 6.5a17 17 0 0 1-2.5 3.3M6.5 7.3A16.5 16.5 0 0 0 2.5 12S6 18.5 12 18.5a9 9 0 0 0 4.5-1.2M9.9 9.9a3 3 0 0 0 4.2 4.2\" />\n ),\n file: <path d=\"M6 3h8.5L19 7.5V21H6zM14 3v5h5\" />,\n filter: <path d=\"M3.5 5h17l-6.5 8v6.5l-4-2V13z\" />,\n folder: <path d=\"M3.5 5.5h6l2 2.5h9v11.5h-17z\" />,\n 'folder-open': <path d=\"M3.5 19.5v-14h6l2 2.5h7.5v3M3.5 19.5l3-8.5h15l-3 8.5z\" />,\n globe: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M3 12h18M12 3c2.5 2.5 3.75 5.5 3.75 9S14.5 18.5 12 21M12 3C9.5 5.5 8.25 8.5 8.25 12S9.5 18.5 12 21\" />\n </>\n ),\n grid: <path d=\"M4 4h6.5v6.5H4zM13.5 4H20v6.5h-6.5zM4 13.5h6.5V20H4zM13.5 13.5H20V20h-6.5z\" />,\n grip: (\n <path d=\"M9 6h.01M15 6h.01M9 12h.01M15 12h.01M9 18h.01M15 18h.01\" strokeWidth=\"3\" />\n ),\n heart: <path d=\"M12 20s-8-4.75-8-10.5A4.5 4.5 0 0 1 12 7a4.5 4.5 0 0 1 8 2.5C20 15.25 12 20 12 20z\" />,\n 'help-circle': (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .9-1 1.6v.6M12 16.75v.5\" />\n </>\n ),\n home: <path d=\"M3.5 11L12 3.5l8.5 7.5v9.5h-6v-6h-5v6h-6z\" />,\n image: (\n <>\n <path d=\"M3.5 4.5h17v15h-17z\" />\n <circle cx=\"9\" cy=\"9.5\" r=\"1.75\" />\n <path d=\"M20.5 15.5l-5-5-9 9\" />\n </>\n ),\n inbox: <path d=\"M3.5 13.5L6 4.5h12l2.5 9v6h-17zM3.5 13.5H9l1 2.5h4l1-2.5h5.5\" />,\n info: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 11v5.5M12 7.25v.5\" />\n </>\n ),\n italic: <path d=\"M10 4.5h8M6 19.5h8M14 4.5l-4 15\" />,\n keyboard: <path d=\"M2.5 6h19v12h-19zM6 9.5h.01M10 9.5h.01M14 9.5h.01M18 9.5h.01M7.5 14.5h9\" />,\n layers: <path d=\"M12 3.5l9 4.5-9 4.5L3 8zM3 12l9 4.5 9-4.5M3 16l9 4.5 9-4.5\" />,\n layout: <path d=\"M3.5 4h17v16h-17zM3.5 9h17M9.5 9v11\" />,\n link: (\n <path d=\"M10 14a4 4 0 0 0 5.66 0l3.17-3.17a4 4 0 0 0-5.66-5.66L12 6.34M14 10a4 4 0 0 0-5.66 0l-3.17 3.17a4 4 0 0 0 5.66 5.66L12 17.66\" />\n ),\n list: <path d=\"M9 6h11.5M9 12h11.5M9 18h11.5M4 6h.01M4 12h.01M4 18h.01\" />,\n lock: <path d=\"M5 10.5h14v10H5zM8 10.5V7.5a4 4 0 0 1 8 0v3\" />,\n 'log-out': <path d=\"M9.5 20.5H4v-17h5.5M16 7.5l4.5 4.5-4.5 4.5M20.5 12H9.5\" />,\n mail: <path d=\"M3 5.5h18v13H3zM3 6l9 7 9-7\" />,\n menu: <path d=\"M4 7h16M4 12h16M4 17h16\" />,\n minus: <path d=\"M5 12h14\" />,\n monitor: <path d=\"M3 4h18v12.5H3zM8 20.5h8M12 16.5v4\" />,\n moon: <path d=\"M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z\" />,\n 'more-horizontal': <path d=\"M5.5 12h.01M12 12h.01M18.5 12h.01\" strokeWidth=\"3\" />,\n 'more-vertical': <path d=\"M12 5.5v.01M12 12v.01M12 18.5v.01\" strokeWidth=\"3\" />,\n pause: <path d=\"M7 5h3.5v14H7zM13.5 5H17v14h-3.5z\" />,\n play: <path d=\"M7 4.5l12 7.5-12 7.5z\" />,\n plus: <path d=\"M12 5v14M5 12h14\" />,\n redo: <path d=\"M19.5 9.5h-10a5 5 0 0 0 0 10H15M15.5 5.5l4 4-4 4\" />,\n refresh: <path d=\"M20 4.5v5h-5M4 19.5v-5h5M19.1 9.5A7.5 7.5 0 0 0 5.6 7.6M4.9 14.5a7.5 7.5 0 0 0 13.5 1.9\" />,\n rocket: (\n <path d=\"M12.5 15.5l-4-4c1.5-4.5 4.5-7.5 11-8-.5 6.5-3.5 9.5-7 12zM8.5 11.5L5 11l3-3.5h4M12.5 15.5l.5 3.5 3.5-3v-4M7.5 16.5c-1.5.5-2.5 2-3 4 2-.5 3.5-1.5 4-3\" />\n ),\n search: (\n <>\n <circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\" />\n <path d=\"M20 20l-4.75-4.75\" />\n </>\n ),\n send: <path d=\"M21 3L10.5 13.5M21 3l-6.5 18-4-7.5-7.5-4z\" />,\n sliders: <path d=\"M4 7h9M17 7h3M4 17h3M11 17h9M15 4.5v5M9 14.5v5\" />,\n sparkle: <path d=\"M12 3l1.9 5.6L19.5 10.5 13.9 12.4 12 18l-1.9-5.6L4.5 10.5l5.6-1.9zM19 16l.8 2.2L22 19l-2.2.8L19 22l-.8-2.2L16 19l2.2-.8z\" />,\n square: <path d=\"M5 5h14v14H5z\" />,\n star: <path d=\"M12 3.5l2.6 5.6 6.1.7-4.5 4.2 1.2 6L12 17l-5.4 3 1.2-6-4.5-4.2 6.1-.7z\" />,\n sun: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2.5v2M12 19.5v2M2.5 12h2M19.5 12h2M5.3 5.3l1.4 1.4M17.3 17.3l1.4 1.4M5.3 18.7l1.4-1.4M17.3 6.7l1.4-1.4\" />\n </>\n ),\n tag: (\n <>\n <path d=\"M3.5 3.5h8l9 9-8 8-9-9z\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n </>\n ),\n terminal: <path d=\"M3.5 4.5h17v15h-17zM7 9l3 3-3 3M12.5 15H17\" />,\n trash: <path d=\"M4 6.5h16M9 6.5V3.5h6v3M6 6.5l1 14h10l1-14M10 10.5v6M14 10.5v6\" />,\n type: <path d=\"M5 7V4.5h14V7M12 4.5v15M9 19.5h6\" />,\n underline: <path d=\"M7 4v7a5 5 0 0 0 10 0V4M5 20.5h14\" />,\n undo: <path d=\"M4.5 9.5h10a5 5 0 0 1 0 10H9M8.5 5.5l-4 4 4 4\" />,\n upload: <path d=\"M12 15V4M7 9l5-5 5 5M4 15.5V20h16v-4.5\" />,\n user: (\n <>\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 20.5c0-3.9 3.6-6 8-6s8 2.1 8 6\" />\n </>\n ),\n users: (\n <>\n <circle cx=\"9\" cy=\"8\" r=\"3.5\" />\n <path d=\"M2.5 20c0-3.5 2.9-5.5 6.5-5.5s6.5 2 6.5 5.5M15.5 4.8a3.5 3.5 0 0 1 0 6.4M17.5 14.7c2.4.6 4 2.5 4 5.3\" />\n </>\n ),\n 'x-circle': (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M9 9l6 6M15 9l-6 6\" />\n </>\n ),\n zap: <path d=\"M13 2.5L4.5 13.5H12L11 21.5l8.5-11H12z\" />,\n} satisfies Record<string, ReactElement>\n\nexport type IconName = keyof typeof iconPaths\n\nexport const iconNames = Object.keys(iconPaths) as IconName[]\n","import { forwardRef, type SVGProps } from 'react'\nimport { cx } from '../utils'\nimport { iconPaths, type IconName } from './paths'\nimport './Icon.css'\n\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'name' | 'ref'> {\n /** Nome do ícone na biblioteca do Orange. */\n name: IconName\n /** Tamanho: token (`xs`=12, `sm`=16, `md`=20, `lg`=24, `xl`=32) ou pixels. */\n size?: IconSize\n /**\n * Texto alternativo. Quando informado, o ícone é anunciado por leitores de\n * tela (`role=\"img\"`). Sem `label`, o ícone é decorativo (`aria-hidden`).\n */\n label?: string\n /** Espessura do traço. Padrão 1.75. */\n strokeWidth?: number\n}\n\nconst sizes = { xs: 12, sm: 16, md: 20, lg: 24, xl: 32 } as const\n\n/**\n * Ícone SVG da biblioteca do Orange. Decorativo por padrão; informe `label`\n * quando o ícone transmitir significado sozinho.\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(function Icon(\n { name, size = 'md', label, strokeWidth = 1.75, className, ...rest },\n ref,\n) {\n const px = typeof size === 'number' ? size : sizes[size]\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={px}\n height={px}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n className={cx('or-icon', className)}\n data-icon={name}\n focusable=\"false\"\n {...(label ? { role: 'img', 'aria-label': label } : { 'aria-hidden': true })}\n {...rest}\n >\n {iconPaths[name]}\n </svg>\n )\n})\n","/**\n * Textos internos dos componentes (rótulos de botões de fechar, paginação,\n * mensagens para leitores de tela...). Sobrescreva via\n * `<OrangeProvider messages={{ close: 'Fechar janela' }}>`.\n *\n * Use `{nome}` para interpolação: t('pageOf', { page: 2, total: 10 }).\n */\nexport const ptBR = {\n // genéricos\n close: 'Fechar',\n cancel: 'Cancelar',\n confirm: 'Confirmar',\n loading: 'Carregando…',\n required: 'obrigatório',\n optional: 'opcional',\n clear: 'Limpar',\n remove: 'Remover',\n removeItem: 'Remover {label}',\n add: 'Adicionar',\n edit: 'Editar',\n save: 'Salvar',\n delete: 'Excluir',\n more: 'Mais',\n moreActions: 'Mais ações',\n showMore: 'Mostrar mais',\n showLess: 'Mostrar menos',\n expand: 'Expandir',\n collapse: 'Recolher',\n open: 'Abrir',\n menu: 'Menu',\n selected: 'selecionado',\n noResults: 'Nenhum resultado encontrado',\n resultsCount: '{count} resultados disponíveis',\n search: 'Buscar',\n searchPlaceholder: 'Buscar…',\n copy: 'Copiar',\n copied: 'Copiado!',\n copyToClipboard: 'Copiar para a área de transferência',\n codeBlock: 'Bloco de código',\n codeBlockNamed: 'Código: {name}',\n // feedback\n info: 'Informação',\n success: 'Sucesso',\n warning: 'Atenção',\n error: 'Erro',\n dismiss: 'Dispensar',\n notifications: 'Notificações',\n // formulários\n showPassword: 'Mostrar senha',\n hidePassword: 'Ocultar senha',\n increment: 'Aumentar',\n decrement: 'Diminuir',\n errorSummaryTitle: 'Corrija os seguintes erros',\n characterCount: '{count} de {max} caracteres',\n passwordRequirements: 'Requisitos da senha',\n requirementMet: 'atendido',\n requirementNotMet: 'não atendido',\n requirementsProgress: '{count} de {total} requisitos atendidos',\n chooseFile: 'Escolher arquivo',\n chooseFiles: 'Escolher arquivos',\n dropFiles: 'Arraste e solte arquivos aqui ou',\n fileTooLarge: 'Arquivo maior que {size}',\n // datas\n today: 'Hoje',\n previousMonth: 'Mês anterior',\n nextMonth: 'Próximo mês',\n previousYear: 'Ano anterior',\n nextYear: 'Próximo ano',\n chooseDate: 'Escolher data',\n // navegação\n breadcrumb: 'Trilha de navegação',\n pagination: 'Paginação',\n previousPage: 'Página anterior',\n nextPage: 'Próxima página',\n firstPage: 'Primeira página',\n lastPage: 'Última página',\n page: 'Página {page}',\n pageOf: 'Página {page} de {total}',\n backToTop: 'Voltar ao topo',\n skipToContent: 'Pular para o conteúdo principal',\n tableOfContents: 'Nesta página',\n step: 'Etapa {step} de {total}',\n completed: 'concluído',\n current: 'atual',\n previous: 'Anterior',\n next: 'Próximo',\n finish: 'Concluir',\n opensInNewTab: '(abre em nova aba)',\n mainNavigation: 'Navegação principal',\n showFullPath: 'Mostrar caminho completo',\n itemsPerPage: 'Itens por página',\n itemRange: '{start}–{end} de {total}',\n collapseSidebar: 'Recolher menu lateral',\n expandSidebar: 'Expandir menu lateral',\n stepWithError: 'com erro',\n // dados\n sortAscending: 'ordenado de forma crescente',\n sortDescending: 'ordenado de forma decrescente',\n selectAll: 'Selecionar todos',\n selectRow: 'Selecionar linha',\n rating: '{value} de {max} estrelas',\n avatarMore: 'mais {count}',\n presenceOnline: 'Online',\n presenceAway: 'Ausente',\n presenceBusy: 'Ocupado',\n presenceOffline: 'Offline',\n statIncrease: 'aumento de {value}',\n statDecrease: 'queda de {value}',\n statChange: 'variação de {value}',\n keyArrowUp: 'Seta para cima',\n keyArrowDown: 'Seta para baixo',\n keyArrowLeft: 'Seta para a esquerda',\n keyArrowRight: 'Seta para a direita',\n keySpace: 'Espaço',\n // datas e entradas especiais (DatePicker, FileUploader, ColorField, InlineEdit…)\n dayPlaceholder: 'dd',\n monthPlaceholder: 'mm',\n yearPlaceholder: 'aaaa',\n dateFormatHint: 'Formato: {format}',\n invalidDate: 'Data inválida. Use o formato {format}.',\n dateUnavailable: 'Data indisponível. Escolha outra data.',\n changeDate: 'Alterar data, {date}',\n monthNavigation: 'Navegação por mês',\n // período de datas (DateRangePicker, RangeCalendar)\n dateRangeStart: 'Data inicial',\n dateRangeEnd: 'Data final',\n dateRangeChoose: 'Escolher período',\n dateRangeChange: 'Alterar período, {start} a {end}',\n dateRangeStartMarker: 'início',\n dateRangeEndMarker: 'fim',\n dateRangeStartSelected: 'Início: {date}. Escolha a data final.',\n dateRangeSelected: 'Período selecionado: {start} a {end}.',\n dateRangeEndBeforeStart: 'A data final deve ser igual ou posterior à inicial.',\n dateRangeTooShort: 'O período deve ter no mínimo {length}.',\n dateRangeTooLong: 'O período deve ter no máximo {length}.',\n dateRangeDayCountOne: '1 dia',\n dateRangeDayCount: '{count} dias',\n dateRangeInvalidStart: 'Data inicial inválida. Use o formato {format}.',\n dateRangeInvalidEnd: 'Data final inválida. Use o formato {format}.',\n dateRangeUnavailableStart: 'Data inicial indisponível. Escolha outra data.',\n dateRangeUnavailableEnd: 'Data final indisponível. Escolha outra data.',\n dateRangePresets: 'Atalhos de período',\n dateRangeLast7Days: 'Últimos 7 dias',\n dateRangeLast30Days: 'Últimos 30 dias',\n dateRangeThisWeek: 'Esta semana',\n dateRangeThisMonth: 'Este mês',\n dateRangeLastMonth: 'Mês passado',\n dateRangeThisYear: 'Este ano',\n selectedFiles: 'Arquivos selecionados',\n fileTypeNotAccepted: 'Tipo de arquivo não aceito',\n tooManyFiles: 'Envie no máximo {max} arquivos',\n fileAdded: '{name} adicionado',\n filesAdded: '{count} arquivos adicionados',\n fileRemoved: '{name} removido',\n filesRejected: '{count} recusado(s)',\n uploadingFile: 'Enviando {name}',\n uploadComplete: 'Enviado',\n uploadFailed: 'Falha no envio',\n colorPicker: 'Seletor de cor',\n invalidColor: 'Use uma cor hexadecimal no formato #rrggbb',\n suggestedColors: 'Cores sugeridas',\n editValue: 'Editar {label}: {value}',\n emptyValue: 'vazio',\n saving: 'Salvando…',\n saveFailed: 'Não foi possível salvar. Tente novamente.',\n // seleção e entrada (Select, Combobox, MultiSelect, TagInput, Slider, PinInput, CurrencyField)\n showOptions: 'Mostrar opções',\n resultsCountOne: '1 resultado disponível',\n clearAll: 'Limpar tudo',\n selectedItems: 'Itens selecionados',\n itemAdded: 'Adicionado: {label}',\n itemRemoved: 'Removido: {label}',\n maxItemsReached: 'Limite de {max} itens atingido',\n duplicateItem: '\"{label}\" já está na lista',\n minimum: 'mínimo',\n maximum: 'máximo',\n pinDigit: 'Dígito {index} de {total}',\n pinCharacter: 'Caractere {index} de {total}',\n currencyLabel: 'Moeda: {currency}',\n // Listbox\n listboxSelectedCount: '{count} itens selecionados',\n listboxSelectedCountOne: '1 item selecionado',\n listboxSelectedNone: 'Nenhum item selecionado',\n // sobreposições (Toggletip, ContextMenu, CommandPalette)\n moreInfo: 'Mais informações',\n contextMenu: 'Menu de contexto',\n commandPalette: 'Paleta de comandos',\n searchCommands: 'Buscar comandos',\n paletteNavigate: 'Navegar',\n paletteSelect: 'Selecionar',\n // estrutura de página (AppShell, Footer)\n appShellOpenNav: 'Abrir navegação',\n appShellAside: 'Painel lateral',\n footerNavLabel: 'Mapa do site',\n // mídia (Carousel, Image)\n carouselPrevious: 'Slide anterior',\n carouselNext: 'Próximo slide',\n carouselPause: 'Pausar rotação',\n carouselPlay: 'Iniciar rotação',\n carouselSlideLabel: '{index} de {total}',\n carouselPicker: 'Escolher slide',\n carouselSlideTab: 'Slide {index}',\n imageUnavailable: 'Imagem indisponível: {alt}',\n // gráficos (BarChart, LineChart)\n chartBarLabel: 'Gráfico de barras: {title}',\n chartLineLabel: 'Gráfico de linhas: {title}',\n chartSeries: 'Séries: {series}.',\n chartHighest: 'Maior valor: {value}.',\n chartLowest: 'Menor valor: {value}.',\n chartRange: 'De {first} a {last}.',\n chartPoint: '{category} · {series}: {value}',\n chartNoData: 'sem dados',\n chartEmpty: 'Sem dados para exibir',\n chartTotal: 'Total',\n chartCategory: 'Categoria',\n chartLegend: 'Legenda',\n chartShowData: 'Ver dados',\n chartHideData: 'Ocultar dados',\n chartDataCaption: 'Dados: {title}',\n chartKeyboardHint: 'Use as setas para percorrer os valores e Esc para limpar.',\n // painéis redimensionáveis (Splitter)\n splitterResize: 'Redimensionar {label}',\n splitterResizePanels: 'Redimensionar painéis',\n splitterCollapsed: 'Painel {label} recolhido',\n splitterPanelCollapsed: 'Painel recolhido',\n // tour guiado (Tour)\n tourLabel: 'Tour guiado',\n tourBack: 'Voltar',\n tourSkip: 'Pular tour',\n tourStepCounter: '{current} de {total}',\n // lista reordenável (SortableList)\n sortableHandle: 'Reordenar {label}, posição {position} de {total}',\n sortableInstructions:\n 'Pressione Espaço ou Enter para levantar o item. Use as setas para mover, Espaço ou Enter para soltar e Esc para cancelar.',\n sortableLifted:\n '{label} levantado. Posição {position} de {total}. Use as setas para mover, Espaço para soltar, Esc para cancelar.',\n sortableMoved: '{label} movido para a posição {position} de {total}.',\n sortableDropped: '{label} solto na posição {position} de {total}.',\n sortableCancelled: 'Movimento cancelado. {label} voltou para a posição {position} de {total}.',\n sortableMoveMenu: 'Mover {label}',\n sortableMoveItem: '{action}: {label}',\n sortableMoveUp: 'Mover para cima',\n sortableMoveDown: 'Mover para baixo',\n sortableMoveLeft: 'Mover para a esquerda',\n sortableMoveRight: 'Mover para a direita',\n sortableMoveTop: 'Mover para o topo',\n sortableMoveStart: 'Mover para o início',\n sortableMoveEnd: 'Mover para o fim',\n} as const\n\nexport type MessageKey = keyof typeof ptBR\nexport type Messages = Record<MessageKey, string>\n\nexport const enUS: Messages = {\n close: 'Close',\n cancel: 'Cancel',\n confirm: 'Confirm',\n loading: 'Loading…',\n required: 'required',\n optional: 'optional',\n clear: 'Clear',\n remove: 'Remove',\n removeItem: 'Remove {label}',\n add: 'Add',\n edit: 'Edit',\n save: 'Save',\n delete: 'Delete',\n more: 'More',\n moreActions: 'More actions',\n showMore: 'Show more',\n showLess: 'Show less',\n expand: 'Expand',\n collapse: 'Collapse',\n open: 'Open',\n menu: 'Menu',\n selected: 'selected',\n noResults: 'No results found',\n resultsCount: '{count} results available',\n search: 'Search',\n searchPlaceholder: 'Search…',\n copy: 'Copy',\n copied: 'Copied!',\n copyToClipboard: 'Copy to clipboard',\n codeBlock: 'Code block',\n codeBlockNamed: 'Code: {name}',\n info: 'Information',\n success: 'Success',\n warning: 'Warning',\n error: 'Error',\n dismiss: 'Dismiss',\n notifications: 'Notifications',\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n increment: 'Increase',\n decrement: 'Decrease',\n errorSummaryTitle: 'Please fix the following errors',\n characterCount: '{count} of {max} characters',\n passwordRequirements: 'Password requirements',\n requirementMet: 'met',\n requirementNotMet: 'not met',\n requirementsProgress: '{count} of {total} requirements met',\n chooseFile: 'Choose file',\n chooseFiles: 'Choose files',\n dropFiles: 'Drag and drop files here or',\n fileTooLarge: 'File larger than {size}',\n today: 'Today',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousYear: 'Previous year',\n nextYear: 'Next year',\n chooseDate: 'Choose date',\n breadcrumb: 'Breadcrumb',\n pagination: 'Pagination',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n firstPage: 'First page',\n lastPage: 'Last page',\n page: 'Page {page}',\n pageOf: 'Page {page} of {total}',\n backToTop: 'Back to top',\n skipToContent: 'Skip to main content',\n tableOfContents: 'On this page',\n step: 'Step {step} of {total}',\n completed: 'completed',\n current: 'current',\n previous: 'Previous',\n next: 'Next',\n finish: 'Finish',\n opensInNewTab: '(opens in a new tab)',\n mainNavigation: 'Main navigation',\n showFullPath: 'Show full path',\n itemsPerPage: 'Items per page',\n itemRange: '{start}–{end} of {total}',\n collapseSidebar: 'Collapse sidebar',\n expandSidebar: 'Expand sidebar',\n stepWithError: 'with error',\n sortAscending: 'sorted ascending',\n sortDescending: 'sorted descending',\n selectAll: 'Select all',\n selectRow: 'Select row',\n rating: '{value} of {max} stars',\n avatarMore: '{count} more',\n presenceOnline: 'Online',\n presenceAway: 'Away',\n presenceBusy: 'Busy',\n presenceOffline: 'Offline',\n statIncrease: 'increase of {value}',\n statDecrease: 'decrease of {value}',\n statChange: 'change of {value}',\n keyArrowUp: 'Up arrow',\n keyArrowDown: 'Down arrow',\n keyArrowLeft: 'Left arrow',\n keyArrowRight: 'Right arrow',\n keySpace: 'Space',\n dayPlaceholder: 'dd',\n monthPlaceholder: 'mm',\n yearPlaceholder: 'yyyy',\n dateFormatHint: 'Format: {format}',\n invalidDate: 'Invalid date. Use the format {format}.',\n dateUnavailable: 'Date unavailable. Choose another date.',\n changeDate: 'Change date, {date}',\n monthNavigation: 'Month navigation',\n dateRangeStart: 'Start date',\n dateRangeEnd: 'End date',\n dateRangeChoose: 'Choose date range',\n dateRangeChange: 'Change date range, {start} to {end}',\n dateRangeStartMarker: 'start',\n dateRangeEndMarker: 'end',\n dateRangeStartSelected: 'Start: {date}. Choose the end date.',\n dateRangeSelected: 'Selected range: {start} to {end}.',\n dateRangeEndBeforeStart: 'The end date must be on or after the start date.',\n dateRangeTooShort: 'The range must be at least {length}.',\n dateRangeTooLong: 'The range must be at most {length}.',\n dateRangeDayCountOne: '1 day',\n dateRangeDayCount: '{count} days',\n dateRangeInvalidStart: 'Invalid start date. Use the format {format}.',\n dateRangeInvalidEnd: 'Invalid end date. Use the format {format}.',\n dateRangeUnavailableStart: 'Start date unavailable. Choose another date.',\n dateRangeUnavailableEnd: 'End date unavailable. Choose another date.',\n dateRangePresets: 'Date range shortcuts',\n dateRangeLast7Days: 'Last 7 days',\n dateRangeLast30Days: 'Last 30 days',\n dateRangeThisWeek: 'This week',\n dateRangeThisMonth: 'This month',\n dateRangeLastMonth: 'Last month',\n dateRangeThisYear: 'This year',\n selectedFiles: 'Selected files',\n fileTypeNotAccepted: 'File type not accepted',\n tooManyFiles: 'Upload at most {max} files',\n fileAdded: '{name} added',\n filesAdded: '{count} files added',\n fileRemoved: '{name} removed',\n filesRejected: '{count} rejected',\n uploadingFile: 'Uploading {name}',\n uploadComplete: 'Uploaded',\n uploadFailed: 'Upload failed',\n colorPicker: 'Color picker',\n invalidColor: 'Use a hex color in the #rrggbb format',\n suggestedColors: 'Suggested colors',\n editValue: 'Edit {label}: {value}',\n emptyValue: 'empty',\n saving: 'Saving…',\n saveFailed: 'Could not save. Please try again.',\n showOptions: 'Show options',\n resultsCountOne: '1 result available',\n clearAll: 'Clear all',\n selectedItems: 'Selected items',\n itemAdded: 'Added: {label}',\n itemRemoved: 'Removed: {label}',\n maxItemsReached: 'Limit of {max} items reached',\n duplicateItem: '\"{label}\" is already in the list',\n minimum: 'minimum',\n maximum: 'maximum',\n pinDigit: 'Digit {index} of {total}',\n pinCharacter: 'Character {index} of {total}',\n currencyLabel: 'Currency: {currency}',\n listboxSelectedCount: '{count} items selected',\n listboxSelectedCountOne: '1 item selected',\n listboxSelectedNone: 'No items selected',\n moreInfo: 'More information',\n contextMenu: 'Context menu',\n commandPalette: 'Command palette',\n searchCommands: 'Search commands',\n paletteNavigate: 'Navigate',\n paletteSelect: 'Select',\n appShellOpenNav: 'Open navigation',\n appShellAside: 'Side panel',\n footerNavLabel: 'Site map',\n carouselPrevious: 'Previous slide',\n carouselNext: 'Next slide',\n carouselPause: 'Pause rotation',\n carouselPlay: 'Start rotation',\n carouselSlideLabel: '{index} of {total}',\n carouselPicker: 'Choose slide',\n carouselSlideTab: 'Slide {index}',\n imageUnavailable: 'Image unavailable: {alt}',\n chartBarLabel: 'Bar chart: {title}',\n chartLineLabel: 'Line chart: {title}',\n chartSeries: 'Series: {series}.',\n chartHighest: 'Highest value: {value}.',\n chartLowest: 'Lowest value: {value}.',\n chartRange: 'From {first} to {last}.',\n chartPoint: '{category} · {series}: {value}',\n chartNoData: 'no data',\n chartEmpty: 'No data to display',\n chartTotal: 'Total',\n chartCategory: 'Category',\n chartLegend: 'Legend',\n chartShowData: 'Show data',\n chartHideData: 'Hide data',\n chartDataCaption: 'Data: {title}',\n chartKeyboardHint: 'Use the arrow keys to explore the values and Esc to clear.',\n splitterResize: 'Resize {label}',\n splitterResizePanels: 'Resize panels',\n splitterCollapsed: '{label} panel collapsed',\n splitterPanelCollapsed: 'Panel collapsed',\n tourLabel: 'Guided tour',\n tourBack: 'Back',\n tourSkip: 'Skip tour',\n tourStepCounter: '{current} of {total}',\n sortableHandle: 'Reorder {label}, position {position} of {total}',\n sortableInstructions:\n 'Press Space or Enter to lift the item. Use the arrow keys to move, Space or Enter to drop and Esc to cancel.',\n sortableLifted:\n '{label} lifted. Position {position} of {total}. Use the arrow keys to move, Space to drop, Esc to cancel.',\n sortableMoved: '{label} moved to position {position} of {total}.',\n sortableDropped: '{label} dropped at position {position} of {total}.',\n sortableCancelled: 'Move cancelled. {label} returned to position {position} of {total}.',\n sortableMoveMenu: 'Move {label}',\n sortableMoveItem: '{action}: {label}',\n sortableMoveUp: 'Move up',\n sortableMoveDown: 'Move down',\n sortableMoveLeft: 'Move left',\n sortableMoveRight: 'Move right',\n sortableMoveTop: 'Move to top',\n sortableMoveStart: 'Move to start',\n sortableMoveEnd: 'Move to end',\n}\n\nexport type Locale = 'pt-BR' | 'en-US' | (string & {})\n\nexport const builtInMessages: Record<string, Messages> = {\n 'pt-BR': ptBR,\n pt: ptBR,\n 'en-US': enUS,\n en: enUS,\n}\n\nexport function interpolate(template: string, vars?: Record<string, string | number>): string {\n if (!vars) return template\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) =>\n vars[key] !== undefined ? String(vars[key]) : `{${key}}`,\n )\n}\n","/**\n * Temas do Orange: os mesmos `[data-theme]` gerados por `@orangesys/tokens`\n * (a lista é conferida contra os tokens em `OrangeProvider.test.tsx`).\n */\n\n/** Temas prontos, na ordem dos seletores. */\nexport const themeNames = ['dark', 'light', 'dark-hc', 'light-hc'] as const\n\n/** Tema aplicado de fato (valor de `data-theme`). */\nexport type ResolvedTheme = (typeof themeNames)[number]\n\n/** Preferência de tema: um tema fixo ou `system` (segue o sistema operacional). */\nexport type ThemeSetting = ResolvedTheme | 'system'\n\n/** Esquema de cor de um tema. */\nexport type ColorScheme = 'dark' | 'light'\n\n/** Preferências do sistema usadas para resolver `system`. */\nexport interface SystemThemePreferences {\n /** `prefers-color-scheme: light`. */\n prefersLight?: boolean\n /** `prefers-contrast: more`. */\n prefersMoreContrast?: boolean\n}\n\n/** `true` para os temas prontos (`dark`, `light`, `dark-hc`, `light-hc`). */\nexport function isThemeName(value: unknown): value is ResolvedTheme {\n return typeof value === 'string' && (themeNames as readonly string[]).includes(value)\n}\n\n/** `true` para um tema pronto ou `system` — útil ao ler a preferência salva. */\nexport function isThemeSetting(value: unknown): value is ThemeSetting {\n return value === 'system' || isThemeName(value)\n}\n\n/** `true` para os temas de alto contraste (WCAG AAA). */\nexport function isHighContrastTheme(theme: ResolvedTheme): boolean {\n return theme.endsWith('-hc')\n}\n\n/** Esquema de cor de um tema: `dark-hc` → `dark`. */\nexport function getColorScheme(theme: ResolvedTheme): ColorScheme {\n return theme.startsWith('light') ? 'light' : 'dark'\n}\n\n/**\n * Resolve a preferência no tema aplicado. `system` segue `prefers-color-scheme`\n * e, com `prefers-contrast: more`, troca para o tema de alto contraste do mesmo\n * esquema (`dark` → `dark-hc`, `light` → `light-hc`). Temas fixos não mudam.\n */\nexport function resolveTheme(\n setting: ThemeSetting,\n { prefersLight = false, prefersMoreContrast = false }: SystemThemePreferences = {},\n): ResolvedTheme {\n if (setting !== 'system') return setting\n const scheme: ColorScheme = prefersLight ? 'light' : 'dark'\n return prefersMoreContrast ? `${scheme}-hc` : scheme\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react'\nimport { useMediaQuery } from '../hooks'\nimport { builtInMessages, interpolate, ptBR, type Locale, type MessageKey, type Messages } from './messages'\nimport {\n getColorScheme,\n isHighContrastTheme,\n resolveTheme,\n type ColorScheme,\n type ResolvedTheme,\n type ThemeSetting,\n} from './theme'\n\n\nexport interface ThemeContextValue {\n /** Preferência escolhida (pode ser `system`). */\n theme: ThemeSetting\n /** Tema efetivamente aplicado (valor de `data-theme`). */\n resolvedTheme: ResolvedTheme\n /** Esquema de cor do tema aplicado: `dark-hc` → `dark`. */\n colorScheme: ColorScheme\n /** `true` com `dark-hc`/`light-hc` (escolhidos ou vindos de `prefers-contrast: more`). */\n highContrast: boolean\n setTheme: (theme: ThemeSetting) => void\n}\n\ninterface LocaleContextValue {\n locale: Locale\n messages: Messages\n t: (key: MessageKey, vars?: Record<string, string | number>) => string\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\nconst LocaleContext = createContext<LocaleContextValue | null>(null)\n\nexport interface OrangeProviderProps {\n children: ReactNode\n /**\n * Tema inicial (não controlado). Padrão: `dark` — ou, num provider aninhado\n * sem `theme`/`defaultTheme` (ex.: só para trocar o idioma), o tema do provider\n * de fora. `system` segue `prefers-color-scheme` e, com `prefers-contrast: more`,\n * usa o tema de alto contraste do mesmo esquema (`dark-hc`/`light-hc`).\n */\n defaultTheme?: ThemeSetting\n /** Tema controlado: `dark`, `light`, `dark-hc`, `light-hc` ou `system`. */\n theme?: ThemeSetting\n onThemeChange?: (theme: ThemeSetting) => void\n /**\n * Onde aplicar o atributo `data-theme`. `document` (padrão) aplica em `<html>`;\n * `scoped` envolve os filhos em um `<div data-theme>`.\n */\n themeTarget?: 'document' | 'scoped'\n /** Idioma das mensagens internas. Padrão: `pt-BR`. */\n locale?: Locale\n /** Sobrescreve mensagens internas específicas. */\n messages?: Partial<Messages>\n}\n\n/**\n * Provedor raiz do Orange: aplica o tema (escuro, claro ou um dos de alto\n * contraste) e fornece as mensagens internas traduzidas para os componentes.\n */\nexport function OrangeProvider({\n children,\n defaultTheme,\n theme: themeProp,\n onThemeChange,\n themeTarget = 'document',\n locale = 'pt-BR',\n messages: overrides,\n}: OrangeProviderProps) {\n const parent = useContext(ThemeContext)\n // Aninhado sem tema próprio: segue o tema de fora, em vez de voltar ao escuro.\n const inherits = parent !== null && themeProp === undefined && defaultTheme === undefined\n const [internalTheme, setInternalTheme] = useState<ThemeSetting>(defaultTheme ?? 'dark')\n const theme = inherits ? parent.theme : (themeProp ?? internalTheme)\n const prefersLight = useMediaQuery('(prefers-color-scheme: light)')\n const prefersMoreContrast = useMediaQuery('(prefers-contrast: more)')\n const resolvedTheme = resolveTheme(theme, { prefersLight, prefersMoreContrast })\n\n const ownSetTheme = useCallback(\n (next: ThemeSetting) => {\n if (themeProp === undefined) setInternalTheme(next)\n onThemeChange?.(next)\n },\n [themeProp, onThemeChange],\n )\n const setTheme = inherits ? parent.setTheme : ownSetTheme\n\n useEffect(() => {\n if (themeTarget !== 'document') return\n document.documentElement.setAttribute('data-theme', resolvedTheme)\n }, [resolvedTheme, themeTarget])\n\n const themeValue = useMemo<ThemeContextValue>(\n () => ({\n theme,\n resolvedTheme,\n colorScheme: getColorScheme(resolvedTheme),\n highContrast: isHighContrastTheme(resolvedTheme),\n setTheme,\n }),\n [theme, resolvedTheme, setTheme],\n )\n\n const localeValue = useMemo<LocaleContextValue>(() => {\n const base = builtInMessages[locale] ?? builtInMessages[locale.split('-')[0]] ?? ptBR\n const messages = { ...base, ...overrides } as Messages\n return { locale, messages, t: (key, vars) => interpolate(messages[key] ?? key, vars) }\n }, [locale, overrides])\n\n const content =\n themeTarget === 'scoped' ? (\n <div data-theme={resolvedTheme} className=\"or-theme-scope\">\n {children}\n </div>\n ) : (\n children\n )\n\n return (\n <ThemeContext.Provider value={themeValue}>\n <LocaleContext.Provider value={localeValue}>{content}</LocaleContext.Provider>\n </ThemeContext.Provider>\n )\n}\n\nconst fallbackLocale: LocaleContextValue = {\n locale: 'pt-BR',\n messages: ptBR,\n t: (key, vars) => interpolate(ptBR[key] ?? key, vars),\n}\n\nconst fallbackTheme: ThemeContextValue = {\n theme: 'dark',\n resolvedTheme: 'dark',\n colorScheme: 'dark',\n highContrast: false,\n setTheme: () => {},\n}\n\n/** Acessa o tema atual. Funciona fora do provider (retorna `dark`). */\nexport function useTheme(): ThemeContextValue {\n return useContext(ThemeContext) ?? fallbackTheme\n}\n\n/** Acessa idioma e mensagens. Funciona fora do provider (usa pt-BR). */\nexport function useLocale(): LocaleContextValue {\n return useContext(LocaleContext) ?? fallbackLocale\n}\n","import { forwardRef, type AnchorHTMLAttributes, type ElementType, type HTMLAttributes } from 'react'\nimport { cx } from '../../utils'\n\nexport interface VisuallyHiddenProps\n extends HTMLAttributes<HTMLElement>,\n Pick<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'target' | 'rel'> {\n /** Elemento renderizado. Padrão: `span`. */\n as?: ElementType\n /** Torna-se visível quando recebe foco (útil para links de atalho). */\n focusable?: boolean\n}\n\n/**\n * Esconde conteúdo visualmente mantendo-o acessível para leitores de tela.\n */\nexport const VisuallyHidden = forwardRef<HTMLElement, VisuallyHiddenProps>(function VisuallyHidden(\n { as: Component = 'span', focusable = false, className, ...rest },\n ref,\n) {\n return (\n <Component\n ref={ref}\n className={cx(focusable ? 'or-visually-hidden-focusable' : 'or-visually-hidden', className)}\n {...rest}\n />\n )\n})\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Button.css'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Estilo visual. `primary` é a ação principal; use apenas um por contexto. */\n variant?: ButtonVariant\n /** Altura do botão: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: ButtonSize\n /** Ocupa toda a largura disponível. */\n block?: boolean\n /** Mostra um indicador de carregamento e bloqueia novos cliques. */\n loading?: boolean\n /** Texto anunciado a leitores de tela durante o carregamento. */\n loadingText?: string\n /** Ícone antes do rótulo. */\n startIcon?: ReactNode\n /** Ícone depois do rótulo (desliza levemente no hover). */\n endIcon?: ReactNode\n /**\n * Botão somente com ícone (quadrado). Exige `aria-label` para ser\n * compreendido por leitores de tela.\n */\n iconOnly?: boolean\n}\n\n/** Gera as classes do botão — útil para estilizar links como botões. */\nexport function buttonClassName({\n variant = 'primary',\n size = 'md',\n block = false,\n iconOnly = false,\n}: Pick<ButtonProps, 'variant' | 'size' | 'block' | 'iconOnly'> = {}) {\n return cx(\n 'or-button',\n `or-button--${variant}`,\n `or-button--${size}`,\n block && 'or-button--block',\n iconOnly && 'or-button--icon-only',\n )\n}\n\n/**\n * Botões disparam ações: salvar, enviar, excluir, abrir um diálogo.\n * Para navegar entre páginas, use `Link`.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n block = false,\n loading = false,\n loadingText,\n startIcon,\n endIcon,\n iconOnly = false,\n type = 'button',\n disabled,\n className,\n children,\n onClick,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n devWarning(\n iconOnly && !rest['aria-label'] && !rest['aria-labelledby'],\n 'Button com `iconOnly` precisa de `aria-label` ou `aria-labelledby`.',\n )\n return (\n <button\n ref={ref}\n type={type}\n className={cx(buttonClassName({ variant, size, block, iconOnly }), loading && 'or-button--loading', className)}\n disabled={disabled}\n aria-busy={loading || undefined}\n aria-disabled={loading || undefined}\n onClick={(event) => {\n if (loading) {\n event.preventDefault()\n return\n }\n onClick?.(event)\n }}\n {...rest}\n >\n {loading && (\n <>\n <span className=\"or-button__spinner\" aria-hidden=\"true\" />\n <VisuallyHidden role=\"status\">{loadingText ?? t('loading')}</VisuallyHidden>\n </>\n )}\n {startIcon && (\n <span className=\"or-button__icon or-button__icon--start\" aria-hidden=\"true\">\n {startIcon}\n </span>\n )}\n {children !== undefined && children !== null && <span className=\"or-button__label\">{children}</span>}\n {endIcon && (\n <span className=\"or-button__icon or-button__icon--end\" aria-hidden=\"true\">\n {endIcon}\n </span>\n )}\n </button>\n )\n})\n","/*\n * Utilitários internos do grupo Feedback (Alert, Banner, Toast).\n * Não são exportados pelo índice da biblioteca.\n */\nimport { useState } from 'react'\nimport { useIsomorphicLayoutEffect, usePresence } from '../../hooks'\nimport type { IconName } from '../../icons'\nimport type { MessageKey } from '../../providers'\nimport { getFocusableElements } from '../../utils'\n\nexport type FeedbackTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger'\n\n/** Ícone padrão de cada tom. */\nexport const feedbackIcons: Record<FeedbackTone, IconName> = {\n neutral: 'info',\n info: 'info',\n success: 'check-circle',\n warning: 'alert-triangle',\n danger: 'alert-circle',\n}\n\n/**\n * Prefixo lido por leitores de tela antes do título (\"Erro: …\"), para que o\n * significado do tom não dependa só da cor ou do ícone (WCAG 1.4.1).\n */\nexport const feedbackLabelKeys: Record<FeedbackTone, MessageKey | null> = {\n neutral: null,\n info: 'info',\n success: 'success',\n warning: 'warning',\n danger: 'error',\n}\n\n/** Papel de região viva adequado ao tom: urgentes usam `alert` (assertivo). */\nexport function liveRoleFor(tone: FeedbackTone): 'alert' | 'status' {\n return tone === 'danger' || tone === 'warning' ? 'alert' : 'status'\n}\n\n/**\n * Antes de remover `element` do DOM, se o foco estiver dentro dele, move o\n * foco para o próximo elemento focável da página (ou o anterior), evitando que\n * o foco \"caia\" no `<body>`.\n */\nexport function moveFocusOutOf(element: HTMLElement | null) {\n if (!element || typeof document === 'undefined') return\n if (!element.contains(document.activeElement)) return\n const all = getFocusableElements(document.body).filter((el) => !element.contains(el))\n const next = all.find(\n (el) => element.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_FOLLOWING,\n )\n const previous = [...all]\n .reverse()\n .find((el) => element.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_PRECEDING)\n const target = next ?? previous\n if (target) target.focus()\n else (document.activeElement as HTMLElement | null)?.blur()\n}\n\n/**\n * Presença de mensagens dispensáveis (Alert, Banner):\n * - guarda a visibilidade não controlada;\n * - mantém o elemento montado durante a saída animada (`usePresence`), com\n * `inert` para que nada seja focado ou lido enquanto ele some;\n * - indica quando animar a entrada: mensagens `live` (dinâmicas por\n * definição) ou reabertas depois de montadas.\n */\nexport function useFeedbackPresence(open: boolean | undefined, live: boolean) {\n const [internalOpen, setInternalOpen] = useState(true)\n const isOpen = open ?? internalOpen\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(isOpen)\n\n const [previousOpen, setPreviousOpen] = useState(isOpen)\n const [reopened, setReopened] = useState(false)\n if (previousOpen !== isOpen) {\n setPreviousOpen(isOpen)\n if (isOpen) setReopened(true)\n }\n\n const closing = state === 'closed'\n useIsomorphicLayoutEffect(() => {\n const node = nodeRef.current\n if (!node) return\n if (closing) node.setAttribute('inert', '')\n else node.removeAttribute('inert')\n }, [closing, present])\n\n return {\n present,\n state,\n nodeRef,\n enter: live || reopened,\n /** Esconde no modo não controlado (no controlado, quem decide é `open`). */\n hide: () => {\n if (open === undefined) setInternalOpen(false)\n },\n }\n}\n","import { forwardRef, useRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { Button } from '../Button'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport {\n feedbackIcons,\n feedbackLabelKeys,\n liveRoleFor,\n moveFocusOutOf,\n useFeedbackPresence,\n type FeedbackTone,\n} from './feedback'\nimport './Alert.css'\n\nexport type AlertTone = FeedbackTone\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Cor semântica e ícone. */\n tone?: AlertTone\n /** Título curto, em negrito. */\n title?: ReactNode\n /** Substitui o ícone do tom. Use `false` para não exibir ícone. */\n icon?: ReactNode | false\n /** Ações relacionadas à mensagem (ex.: um `Button` `sm` ou um link). */\n action?: ReactNode\n /** Mostra o botão de fechar. */\n dismissible?: boolean\n /** Chamado ao clicar em fechar. */\n onDismiss?: () => void\n /**\n * Visibilidade controlada. Sem esta prop, o Alert se esconde sozinho ao ser\n * fechado.\n */\n open?: boolean\n /**\n * Para mensagens que aparecem dinamicamente: aplica `role=\"alert\"` (tons\n * `danger` e `warning`, anúncio imediato) ou `role=\"status\"` (demais tons,\n * anúncio educado). Mensagens estáticas, presentes no carregamento da\n * página, não devem usar `live`.\n */\n live?: boolean\n}\n\n/**\n * Mensagem inline e contextual — confirma, informa, alerta ou aponta um erro\n * relacionado a uma parte da página.\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n tone = 'info',\n title,\n icon,\n action,\n dismissible = false,\n onDismiss,\n open,\n live = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const rootRef = useRef<HTMLDivElement>(null)\n const { present, state, nodeRef, enter, hide } = useFeedbackPresence(open, live)\n if (!present) return null\n\n const labelKey = feedbackLabelKeys[tone]\n const role = live ? liveRoleFor(tone) : undefined\n\n const dismiss = () => {\n // o foco sai antes da animação de saída começar\n moveFocusOutOf(rootRef.current)\n hide()\n onDismiss?.()\n }\n\n return (\n // Invólucro de presença: na saída, recolhe a altura (grid 1fr → 0fr) enquanto o Alert esmaece.\n <div ref={nodeRef} className=\"or-alert-presence\" data-state={state}>\n <div className=\"or-alert-presence__inner\">\n <div\n ref={mergeRefs(ref, rootRef)}\n className={cx(\n 'or-alert',\n `or-alert--${tone}`,\n dismissible && 'or-alert--dismissible',\n enter && 'or-alert--enter',\n className,\n )}\n {...rest}\n >\n {icon !== false && (\n <span className=\"or-alert__icon\" aria-hidden=\"true\">\n {icon ?? <Icon name={feedbackIcons[tone]} size=\"md\" />}\n </span>\n )}\n <div className=\"or-alert__main\">\n {/* A região viva envolve só a mensagem: ações e o botão de fechar não são lidos no anúncio. */}\n <div className=\"or-alert__message\" role={role} aria-atomic={role ? true : undefined}>\n {labelKey && <VisuallyHidden>{`${t(labelKey)}: `}</VisuallyHidden>}\n {title && <p className=\"or-alert__title\">{title}</p>}\n {children && <div className=\"or-alert__body\">{children}</div>}\n </div>\n {action && <div className=\"or-alert__actions\">{action}</div>}\n </div>\n {dismissible && (\n <Button\n className=\"or-alert__close\"\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={t('close')}\n startIcon={<Icon name=\"close\" size=\"sm\" />}\n onClick={dismiss}\n />\n )}\n </div>\n </div>\n </div>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { useClickOutside, useControllableState, useId, usePresence, useScrollDirection } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport type { RenderLink } from '../Link'\nimport './AppHeader.css'\n\nexport interface AppHeaderNavItem {\n /** Texto do link. */\n label: ReactNode\n /** Destino. */\n href: string\n /** Marca o item como página atual. Padrão: `href === currentHref`. */\n active?: boolean\n}\n\nexport type AppHeaderBreakpoint = 'sm' | 'md' | 'lg'\n\nexport interface AppHeaderProps extends HTMLAttributes<HTMLElement> {\n /** Área da marca (logo com link para o início). */\n brand?: ReactNode\n /** Links da navegação principal. */\n items?: AppHeaderNavItem[]\n /** `href` da página atual: o item correspondente recebe `aria-current=\"page\"`. */\n currentHref?: string\n /** Renderiza os links com o componente do seu roteador. */\n renderLink?: RenderLink\n /** Área de ações à direita (busca, notificações, avatar). */\n actions?: ReactNode\n /** Conteúdo extra no fim do painel do menu em telas pequenas (ex.: botão \"Entrar\"). */\n menuFooter?: ReactNode\n /** Nome da navegação. Padrão: `t('mainNavigation')`. */\n navLabel?: string\n /** Fixa o cabeçalho no topo durante a rolagem. */\n sticky?: boolean\n /**\n * Esconde o cabeçalho ao rolar a página para baixo (depois de 120px) e o\n * mostra de novo ao rolar para cima. Implica `sticky`. Nunca esconde com o\n * foco dentro do cabeçalho ou com o menu aberto.\n */\n hideOnScroll?: boolean\n /**\n * Largura do cabeçalho abaixo da qual a navegação vai para o menu\n * (`sm` 40rem, `md` 48rem, `lg` 64rem). Padrão: `md`.\n */\n collapseBelow?: AppHeaderBreakpoint\n /** Menu aberto em telas pequenas (controlado). */\n menuOpen?: boolean\n /** Menu aberto inicialmente (não controlado). */\n defaultMenuOpen?: boolean\n /** Chamado quando o menu abre ou fecha. */\n onMenuOpenChange?: (open: boolean) => void\n}\n\n/**\n * Cabeçalho da aplicação: marca, navegação principal e ações. Em telas\n * estreitas, a navegação vai para um painel aberto pelo botão de menu.\n */\nexport const AppHeader = forwardRef<HTMLElement, AppHeaderProps>(function AppHeader(\n {\n brand,\n items = [],\n currentHref,\n renderLink,\n actions,\n menuFooter,\n navLabel,\n sticky = false,\n hideOnScroll = false,\n collapseBelow = 'md',\n menuOpen: menuOpenProp,\n defaultMenuOpen = false,\n onMenuOpenChange,\n className,\n onKeyDown,\n onFocus,\n onBlur,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const navId = useId('or-app-header-nav')\n const headerRef = useRef<HTMLElement>(null)\n const menuButtonRef = useRef<HTMLButtonElement>(null)\n const [menuOpen, setMenuOpen] = useControllableState({\n value: menuOpenProp,\n defaultValue: defaultMenuOpen,\n onChange: onMenuOpenChange,\n })\n\n useClickOutside(headerRef, () => setMenuOpen(false), menuOpen)\n\n // Painel móvel com entrada e saída animadas: continua montado até a saída terminar.\n const panel = usePresence<HTMLElement>(menuOpen)\n\n // O ícone do botão de menu só anima depois da primeira troca (não ao montar).\n const [prevMenuOpen, setPrevMenuOpen] = useState(menuOpen)\n const [iconMotion, setIconMotion] = useState(false)\n if (prevMenuOpen !== menuOpen) {\n setPrevMenuOpen(menuOpen)\n setIconMotion(true)\n }\n\n // Esconder ao rolar: nunca com foco dentro do cabeçalho ou com o menu aberto.\n const [scrolledDown, setScrolledDown] = useState(false)\n const [focusWithin, setFocusWithin] = useState(false)\n const scrollHidden = hideOnScroll && scrolledDown && !focusWithin && !menuOpen\n\n const handleFocus = (event: FocusEvent<HTMLElement>) => {\n onFocus?.(event)\n setFocusWithin(true)\n }\n const handleBlur = (event: FocusEvent<HTMLElement>) => {\n onBlur?.(event)\n const next = event.relatedTarget as Node | null\n if (!next || !event.currentTarget.contains(next)) setFocusWithin(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || event.key !== 'Escape' || !menuOpen) return\n setMenuOpen(false)\n menuButtonRef.current?.focus()\n }\n\n const hasNav = items.length > 0 || Boolean(menuFooter)\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- onKeyDown delegado trata Escape do painel móvel\n <header\n ref={mergeRefs(ref, headerRef)}\n className={cx(\n 'or-app-header',\n (sticky || hideOnScroll) && 'or-app-header--sticky',\n hideOnScroll && 'or-app-header--hide-on-scroll',\n className,\n )}\n data-collapse={collapseBelow}\n data-menu-open={menuOpen || undefined}\n data-menu-present={panel.present || undefined}\n data-scroll-hidden={scrollHidden || undefined}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...rest}\n >\n {hideOnScroll && <ScrollWatcher onChange={setScrolledDown} />}\n <div className=\"or-app-header__bar\">\n <div className=\"or-app-header__start\">\n {hasNav && (\n <button\n ref={menuButtonRef}\n type=\"button\"\n className=\"or-app-header__menu\"\n aria-expanded={menuOpen}\n aria-controls={navId}\n aria-label={t('menu')}\n onClick={() => setMenuOpen((v) => !v)}\n >\n <span\n key={menuOpen ? 'close' : 'menu'}\n className={cx('or-app-header__menu-icon', iconMotion && 'or-app-header__menu-icon--enter')}\n >\n <Icon name={menuOpen ? 'close' : 'menu'} />\n </span>\n </button>\n )}\n {brand && <div className=\"or-app-header__brand\">{brand}</div>}\n </div>\n {hasNav && (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions -- clique delegado fecha o painel ao escolher um link nativo\n <nav\n ref={panel.nodeRef}\n id={navId}\n className=\"or-app-header__nav\"\n data-state={panel.state}\n aria-label={navLabel ?? t('mainNavigation')}\n onClick={(event) => {\n if ((event.target as HTMLElement).closest('a[href]')) setMenuOpen(false)\n }}\n >\n <ul className=\"or-app-header__list\">\n {items.map((item, index) => {\n const active = item.active ?? (currentHref !== undefined && item.href === currentHref)\n const linkProps = {\n href: item.href,\n className: 'or-app-header__link',\n 'aria-current': active ? ('page' as const) : undefined,\n children: item.label,\n }\n return (\n <li key={item.href} className=\"or-app-header__item\" style={{ '--_i': index } as CSSProperties}>\n {renderLink ? renderLink(linkProps) : <a {...linkProps} />}\n </li>\n )\n })}\n </ul>\n {menuFooter && <div className=\"or-app-header__menu-footer\">{menuFooter}</div>}\n </nav>\n )}\n {actions && <div className=\"or-app-header__actions\">{actions}</div>}\n </div>\n </header>\n )\n})\n\n/** Observa a direção da rolagem só quando `hideOnScroll` está ligado (evita re-renderizar o cabeçalho). */\nfunction ScrollWatcher({ onChange }: { onChange: (scrolledDown: boolean) => void }) {\n const { direction, pastThreshold } = useScrollDirection()\n const down = direction === 'down' && pastThreshold\n useEffect(() => onChange(down), [down, onChange])\n return null\n}\n","import { type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useMounted } from '../../hooks'\n\nexport interface PortalProps {\n children: ReactNode\n /** Elemento de destino. Padrão: `document.body`. */\n container?: Element | null\n /** Renderiza no lugar, sem portal. */\n disabled?: boolean\n}\n\n/**\n * Renderiza os filhos em outro ponto do DOM (padrão: `document.body`).\n * Usado por Modal, Drawer, Popover, Tooltip e Toast. Seguro para SSR.\n */\nexport function Portal({ children, container, disabled = false }: PortalProps) {\n const mounted = useMounted()\n if (disabled) return <>{children}</>\n if (!mounted) return null\n return createPortal(children, container ?? document.body)\n}\n","/*\n * Infraestrutura interna das sobreposições do Orange (Modal, Drawer, Popover,\n * Tooltip, Dropdown…). Não é exportada pela biblioteca.\n *\n * - Pilha de camadas: só a camada do topo reage a Escape; cliques/foco fora de\n * uma camada fecham apenas as camadas não modais acima do ponto clicado.\n * Eventos vindos de portais aninhados contam como \"dentro\" porque são\n * marcados pelos handlers de captura do React (que seguem a árvore React,\n * não a árvore DOM) — assim um Select dentro de um Modal não o fecha.\n * - z-index: uma camada aberta sobre outra recebe z-index maior que a de baixo\n * (ex.: Dropdown dentro de Modal), mesmo que o token dela seja menor.\n */\nimport {\n useCallback,\n useRef,\n version,\n type ReactElement,\n type Ref,\n type SyntheticEvent,\n} from 'react'\nimport { useIsomorphicLayoutEffect } from '../../hooks'\nimport { getFocusableElements } from '../../utils'\n\n/* -------------------------------------------------------------------------- */\n/* Pilha de camadas */\n/* -------------------------------------------------------------------------- */\n\nexport interface LayerOptions {\n /** Camadas modais bloqueiam a propagação de Escape/clique fora para baixo. */\n modal?: boolean\n /** Chamado com Escape quando esta é a camada do topo. Sem handler, Escape é ignorado. */\n onEscape?: (event: KeyboardEvent) => void\n /** Clique/toque fora desta camada (e de qualquer camada acima dela). */\n onPointerDownOutside?: (event: PointerEvent) => void\n /** Foco movido para fora desta camada (e de qualquer camada acima dela). */\n onFocusOutside?: (event: FocusEvent) => void\n /** Elementos extras considerados \"dentro\" (ex.: o gatilho). */\n insideElements?: () => (Element | null | undefined)[]\n}\n\ninterface LayerEntry {\n events: WeakSet<Event>\n options: { current: LayerOptions }\n node: HTMLElement | null\n}\n\nconst stack: LayerEntry[] = []\n\nfunction isInside(entry: LayerEntry, event: Event) {\n if (entry.events.has(event)) return true\n const target = event.target\n if (!(target instanceof Node)) return false\n if (entry.node?.contains(target)) return true\n return (entry.options.current.insideElements?.() ?? []).some((el) => el?.contains(target))\n}\n\nfunction highestHit(event: Event) {\n for (let i = stack.length - 1; i >= 0; i--) if (isInside(stack[i], event)) return i\n return -1\n}\n\nfunction handleKeyDown(event: KeyboardEvent) {\n if (event.key !== 'Escape' || event.defaultPrevented || event.isComposing) return\n for (let i = stack.length - 1; i >= 0; i--) {\n const { onEscape, modal } = stack[i].options.current\n if (onEscape) {\n event.preventDefault()\n onEscape(event)\n return\n }\n if (modal) return\n }\n}\n\nfunction handlePointerDown(event: PointerEvent) {\n const layers = stack.slice()\n const hit = highestHit(event)\n for (let i = layers.length - 1; i > hit; i--) {\n const { modal, onPointerDownOutside } = layers[i].options.current\n if (modal) break\n onPointerDownOutside?.(event)\n }\n}\n\nfunction handleFocusIn(event: FocusEvent) {\n const layers = stack.slice()\n const hit = highestHit(event)\n for (let i = layers.length - 1; i > hit; i--) {\n const { modal, onFocusOutside } = layers[i].options.current\n onFocusOutside?.(event)\n if (modal) break\n }\n}\n\nfunction attach() {\n document.addEventListener('keydown', handleKeyDown)\n document.addEventListener('pointerdown', handlePointerDown)\n document.addEventListener('focusin', handleFocusIn)\n}\n\nfunction detach() {\n document.removeEventListener('keydown', handleKeyDown)\n document.removeEventListener('pointerdown', handlePointerDown)\n document.removeEventListener('focusin', handleFocusIn)\n}\n\nfunction removeLayer(entry: LayerEntry) {\n const index = stack.indexOf(entry)\n if (index < 0) return\n stack.splice(index, 1)\n if (stack.length === 0) detach()\n}\n\nfunction zIndexOf(node: HTMLElement | null): number {\n if (!node) return Number.NaN\n return Number.parseInt(getComputedStyle(node).zIndex, 10)\n}\n\n/** Garante que `entry` fique acima de todas as camadas já abertas. */\nfunction raise(entry: LayerEntry) {\n const node = entry.node\n if (!node) return\n node.style.removeProperty('z-index')\n const below = stack.reduce((max, layer) => {\n const z = zIndexOf(layer.node)\n return Number.isNaN(z) ? max : Math.max(max, z)\n }, Number.NEGATIVE_INFINITY)\n const own = zIndexOf(node)\n if (Number.isFinite(below) && (Number.isNaN(own) || own <= below))\n node.style.zIndex = String(below + 1)\n}\n\n/**\n * Registra uma camada de sobreposição enquanto `active` for verdadeiro.\n * Espalhe `layerProps` no elemento raiz da camada e passe `setNode` como ref.\n */\nexport function useLayer(active: boolean, options: LayerOptions) {\n const optionsRef = useRef(options)\n optionsRef.current = options\n const entryRef = useRef<LayerEntry | null>(null)\n if (!entryRef.current)\n entryRef.current = { events: new WeakSet(), options: optionsRef, node: null }\n\n useIsomorphicLayoutEffect(() => {\n if (!active) return\n const entry = entryRef.current!\n raise(entry)\n stack.push(entry)\n if (stack.length === 1) attach()\n return () => removeLayer(entry)\n }, [active])\n\n const mark = useCallback((event: SyntheticEvent) => {\n entryRef.current!.events.add(event.nativeEvent)\n }, [])\n\n const setNode = useCallback((node: HTMLElement | null) => {\n entryRef.current!.node = node\n }, [])\n\n const isTop = useCallback(() => stack[stack.length - 1] === entryRef.current, [])\n\n /** Remove a camada da pilha já (antes de devolver o foco ao fechar). */\n const release = useCallback(() => removeLayer(entryRef.current!), [])\n\n return {\n setNode,\n isTop,\n release,\n layerProps: { onPointerDownCapture: mark, onFocusCapture: mark },\n }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Presença (animação de saída) */\n/* -------------------------------------------------------------------------- */\n\n// A implementação vive em src/hooks (pública); reexportada para os overlays.\nexport { usePresence } from '../../hooks'\n\n/* -------------------------------------------------------------------------- */\n/* Utilitários */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Tema do ponto de origem da sobreposição. Conteúdo em portal sai da árvore\n * de `[data-theme]`; reaplicar o tema mantém, por exemplo, um Popover claro\n * aberto a partir de uma área com tema claro dentro de uma página escura.\n */\nexport function getThemeScope(origin: Element | null | undefined): string | undefined {\n return origin?.closest('[data-theme]')?.getAttribute('data-theme') ?? undefined\n}\n\nconst reactMajor = Number.parseInt(version, 10)\n\n/** Lê a ref de um elemento React (React 19: `props.ref`; anteriores: `element.ref`). */\nexport function getElementRef(element: ReactElement): Ref<unknown> | undefined {\n if (reactMajor >= 19) return (element.props as { ref?: Ref<unknown> }).ref\n return (element as unknown as { ref?: Ref<unknown> }).ref\n}\n\n/** Foca o elemento sem rolar a página. */\nexport function focusElement(el: HTMLElement | null | undefined) {\n el?.focus({ preventScroll: true })\n}\n\n/**\n * Elemento focável (via Tab) que vem logo depois de `anchor` na ordem do\n * documento, ignorando os que estão dentro de `exclude`.\n */\nexport function getTabbableAfter(\n anchor: HTMLElement,\n exclude?: HTMLElement | null,\n): HTMLElement | null {\n const all = getFocusableElements(document.body).filter(\n (el) => el.tabIndex >= 0 && !exclude?.contains(el) && !el.closest('[hidden]'),\n )\n const index = all.findIndex((el) => el === anchor || el.contains(anchor))\n if (index >= 0) return all[index + 1] ?? null\n // âncora não focável: primeiro elemento posterior a ela\n return (\n all.find((el) => anchor.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_FOLLOWING) ?? null\n )\n}\n\n/** `true` quando o foco atual veio do teclado (`:focus-visible`). */\nexport function isFocusVisible(el: Element): boolean {\n try {\n return el.matches(':focus-visible')\n } catch {\n return true\n }\n}\n","import {\n useEffect,\n useMemo,\n useRef,\n type FocusEvent as ReactFocusEvent,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type Ref,\n type RefObject,\n} from 'react'\nimport { useIsomorphicLayoutEffect, useLockBodyScroll, useMounted } from '../../hooks'\nimport { canUseDOM, cx, getFocusableElements, mergeRefs } from '../../utils'\nimport { Portal } from '../Portal'\nimport { focusElement, getThemeScope, useLayer, usePresence } from './overlay'\nimport './DialogShell.css'\n\nexport interface DialogShellProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n open: boolean\n /** Pedido de fechamento (Escape, clique no fundo, foco). */\n onDismiss: () => void\n role?: 'dialog' | 'alertdialog' | (string & {})\n initialFocus?: RefObject<HTMLElement | null>\n finalFocus?: RefObject<HTMLElement | null>\n closeOnEscape?: boolean\n closeOnOverlayClick?: boolean\n /** Classe do contêiner fixo (fundo + painel). */\n rootClassName?: string\n panelRef?: Ref<HTMLDivElement>\n children: ReactNode\n}\n\n/**\n * Casca interna dos diálogos modais (Modal, Drawer, ConfirmDialog,\n * CommandPalette): portal, fundo, armadilha de foco, foco inicial e de\n * retorno, Escape, scroll lock, tema herdado e animação de saída.\n */\nexport function DialogShell({\n open,\n onDismiss,\n role = 'dialog',\n initialFocus,\n finalFocus,\n closeOnEscape = true,\n closeOnOverlayClick = true,\n rootClassName,\n panelRef: externalPanelRef,\n className,\n children,\n onKeyDown,\n onFocus,\n ...rest\n}: DialogShellProps) {\n const mounted = useMounted()\n const active = open && mounted\n const { present, state, nodeRef } = usePresence(active)\n const panelRef = useRef<HTMLDivElement | null>(null)\n const restoreRef = useRef<HTMLElement | null>(null)\n const lastFocusedRef = useRef<HTMLElement | null>(null)\n const themeRef = useRef<string | undefined>(undefined)\n const wasActiveRef = useRef(false)\n const pointerDownOnOverlayRef = useRef(false)\n\n // Captura a origem do foco no render em que o diálogo abre — antes que\n // qualquer `autoFocus` do conteúdo mova o foco.\n if (active && !wasActiveRef.current && canUseDOM) {\n const current = document.activeElement\n restoreRef.current =\n current instanceof HTMLElement && current !== document.body ? current : null\n themeRef.current = getThemeScope(restoreRef.current ?? document.documentElement)\n }\n wasActiveRef.current = active\n\n const dismissRef = useRef(onDismiss)\n dismissRef.current = onDismiss\n\n const { setNode, isTop, release, layerProps } = useLayer(active, {\n modal: true,\n onEscape: closeOnEscape ? () => dismissRef.current() : undefined,\n onFocusOutside: () => {\n const panel = panelRef.current\n focusElement(lastFocusedRef.current?.isConnected ? lastFocusedRef.current : panel)\n },\n })\n\n useLockBodyScroll(active)\n\n // Foco inicial: no layout effect, antes da pintura.\n useIsomorphicLayoutEffect(() => {\n if (!active) return\n const panel = panelRef.current\n if (!panel || panel.contains(document.activeElement)) return\n const focusables = getFocusableElements(panel)\n const target =\n initialFocus?.current ??\n panel.querySelector<HTMLElement>('[data-autofocus]') ??\n focusables.find((el) => !el.hasAttribute('data-or-dialog-close')) ??\n focusables[0] ??\n panel\n focusElement(target)\n }, [active])\n\n // Foco de retorno: no cleanup passivo, depois que o React terminou o commit\n // (no commit ele restaura o foco anterior e desfaria a mudança).\n useEffect(() => {\n if (!active) return\n const panel = panelRef.current\n // lido no fechamento: o alvo pode ter mudado enquanto o diálogo estava aberto\n const getFinalFocus = () => finalFocus?.current\n return () => {\n release()\n const target = getFinalFocus() ?? restoreRef.current\n const current = document.activeElement\n const focusLost = !current || current === document.body || !!panel?.contains(current)\n if (target?.isConnected && focusLost) focusElement(target)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n const panelRefs = useMemo(\n () => mergeRefs<HTMLDivElement>(panelRef, nodeRef as Ref<HTMLDivElement>, externalPanelRef),\n [nodeRef, externalPanelRef],\n )\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || event.key !== 'Tab') return\n const panel = panelRef.current\n if (!panel) return\n const current = document.activeElement as HTMLElement | null\n // foco em um portal aninhado (ex.: Popover dentro do Modal): deixa com ele\n if (current && !panel.contains(current)) return\n const items = getFocusableElements(panel).filter(\n (el) => el.tabIndex >= 0 && !el.closest('[hidden]'),\n )\n if (items.length === 0) {\n event.preventDefault()\n return\n }\n const first = items[0]\n const last = items[items.length - 1]\n if (event.shiftKey && (current === first || current === panel)) {\n event.preventDefault()\n focusElement(last)\n } else if (!event.shiftKey && current === last) {\n event.preventDefault()\n focusElement(first)\n }\n }\n\n const handleFocus = (event: ReactFocusEvent<HTMLDivElement>) => {\n onFocus?.(event)\n if (panelRef.current?.contains(event.target))\n lastFocusedRef.current = event.target as HTMLElement\n }\n\n return (\n <Portal>\n {present && (\n <div\n ref={setNode}\n className={cx('or-dialog', rootClassName)}\n data-state={state}\n inert={state === 'closed' || undefined}\n data-theme={themeRef.current}\n {...layerProps}\n >\n <div\n className=\"or-dialog__backdrop\"\n data-state={state}\n aria-hidden=\"true\"\n onMouseDown={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n pointerDownOnOverlayRef.current = event.button === 0 && isTop()\n }}\n onClick={() => {\n if (pointerDownOnOverlayRef.current && closeOnOverlayClick && active)\n dismissRef.current()\n pointerDownOnOverlayRef.current = false\n }}\n />\n <div\n ref={panelRefs}\n role={role}\n aria-modal=\"true\"\n tabIndex={-1}\n data-state={state}\n className={cx('or-dialog__panel', className)}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n {...rest}\n >\n {children}\n </div>\n </div>\n )}\n </Portal>\n )\n}\n","import {\n cloneElement,\n forwardRef,\n type HTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { useDisclosure, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx } from '../../utils'\nimport { Button } from '../Button'\nimport { DialogShell } from '../Modal/DialogShell'\nimport './Drawer.css'\n\nexport type DrawerPlacement = 'left' | 'right' | 'bottom'\nexport type DrawerSize = 'sm' | 'md' | 'lg' | 'full'\n\n/** Funções entregues ao conteúdo/rodapé quando eles são funções. */\nexport interface DrawerRenderProps {\n /** Fecha o painel (útil no modo não controlado, com `trigger`). */\n close: () => void\n}\n\nexport interface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'children'> {\n /** Aberto (controlado). Use com `onOpenChange`. */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o painel pede para abrir ou fechar. */\n onOpenChange?: (open: boolean) => void\n /** Título visível; nomeia o painel via `aria-labelledby`. */\n title: ReactNode\n /** Texto de apoio sob o título (`aria-describedby`). */\n description?: ReactNode\n /** Borda de onde o painel desliza. */\n placement?: DrawerPlacement\n /**\n * Largura (left/right): `sm` 360px, `md` 480px, `lg` 640px, `full` 100%.\n * Altura máxima (bottom): `sm` 40%, `md` 60%, `lg` 85%, `full` 100%.\n */\n size?: DrawerSize\n /** Rodapé fixo com ações. Aceita uma função `({ close }) => …`. */\n footer?: ReactNode | ((props: DrawerRenderProps) => ReactNode)\n /** Elemento que recebe o foco ao abrir. Padrão: primeiro focável do conteúdo. */\n initialFocus?: RefObject<HTMLElement | null>\n /** Elemento que recebe o foco ao fechar. Padrão: o que estava focado antes. */\n finalFocus?: RefObject<HTMLElement | null>\n /** Fecha ao clicar no fundo escurecido. */\n closeOnOverlayClick?: boolean\n /** Fecha com a tecla Escape. */\n closeOnEscape?: boolean\n /** Esconde o botão de fechar do cabeçalho. Garanta outra forma de fechar. */\n hideCloseButton?: boolean\n /** Elemento que abre o painel (modo não controlado). */\n trigger?: ReactElement\n /** Conteúdo rolável do painel. Aceita uma função `({ close }) => …`. */\n children?: ReactNode | ((props: DrawerRenderProps) => ReactNode)\n}\n\n/**\n * Painel modal que desliza de uma borda da tela. Bom para formulários,\n * filtros e detalhes que não exigem sair do contexto atual.\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(function Drawer(\n {\n open,\n defaultOpen,\n onOpenChange,\n title,\n description,\n placement = 'right',\n size = 'md',\n footer,\n initialFocus,\n finalFocus,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n hideCloseButton = false,\n trigger,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const disclosure = useDisclosure({ open, defaultOpen, onOpenChange })\n const titleId = useId('or-drawer-title')\n const descriptionId = useId('or-drawer-description')\n const api: DrawerRenderProps = { close: disclosure.close }\n\n const triggerElement = trigger\n ? cloneElement(trigger as ReactElement<HTMLAttributes<HTMLElement>>, {\n 'aria-haspopup': 'dialog',\n onClick: composeEventHandlers(\n (trigger.props as HTMLAttributes<HTMLElement>).onClick,\n (_event: ReactMouseEvent<HTMLElement>) => disclosure.open(),\n ),\n })\n : null\n\n return (\n <>\n {triggerElement}\n <DialogShell\n open={disclosure.isOpen}\n onDismiss={disclosure.close}\n initialFocus={initialFocus}\n finalFocus={finalFocus}\n closeOnEscape={closeOnEscape}\n closeOnOverlayClick={closeOnOverlayClick}\n rootClassName={cx('or-drawer-root', `or-drawer-root--${placement}`)}\n panelRef={ref}\n className={cx('or-drawer', `or-drawer--${placement}`, `or-drawer--${size}`, className)}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n {...rest}\n >\n <div className=\"or-drawer__header\">\n <div className=\"or-drawer__heading\">\n <h2 id={titleId} className=\"or-drawer__title\">\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className=\"or-drawer__description\">\n {description}\n </p>\n )}\n </div>\n {!hideCloseButton && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={t('close')}\n startIcon={<Icon name=\"close\" />}\n className=\"or-drawer__close\"\n data-or-dialog-close=\"\"\n onClick={disclosure.close}\n />\n )}\n </div>\n <div className=\"or-drawer__body\">\n {typeof children === 'function' ? children(api) : children}\n </div>\n {footer && (\n <div className=\"or-drawer__footer\">\n {typeof footer === 'function' ? footer(api) : footer}\n </div>\n )}\n </DialogShell>\n </>\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport type { RenderLink } from '../Link'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Footer.css'\n\n/** Um link de uma coluna do rodapé. */\nexport interface FooterLinkItem {\n /** Texto do link. */\n label: string\n /** Destino. */\n href: string\n /**\n * Link para outro site: abre em nova aba (`rel=\"noopener noreferrer\"`),\n * mostra o ícone ↗ colado à última palavra e avisa leitores de tela.\n */\n external?: boolean\n}\n\n/** Uma coluna do mapa do site: título curto em caixa alta e a lista de links. */\nexport interface FooterColumn {\n /** Título da coluna (vira um heading). */\n title: string\n links: FooterLinkItem[]\n}\n\nexport type FooterHeadingLevel = 2 | 3 | 4 | 5 | 6\n\nexport interface FooterProps extends HTMLAttributes<HTMLElement> {\n /** Marca (logo com link para o início). */\n brand?: ReactNode\n /** Frase curta sob a marca. */\n description?: ReactNode\n /** Colunas do mapa do site (até 5 por linha em telas largas). */\n columns?: FooterColumn[]\n /** Barra inferior: copyright, termos, versão. */\n bottom?: ReactNode\n /** Nome da navegação do mapa do site. Padrão: `t('footerNavLabel')` (\"Mapa do site\"). */\n navLabel?: string\n /** Nível dos headings das colunas. Padrão: `2`. */\n headingLevel?: FooterHeadingLevel\n /**\n * Renderiza os links internos com o componente do seu roteador:\n * `renderLink={({ href, ...p }) => <RouterLink to={href} {...p} />}`.\n * Links `external` continuam sendo `<a>` nativos.\n */\n renderLink?: RenderLink\n}\n\n/** Separa a última palavra para que o ↗ nunca vá sozinho para a linha de baixo. */\nfunction splitLastWord(label: string): [string, string] {\n const trimmed = label.trimEnd()\n const index = trimmed.lastIndexOf(' ')\n return index === -1 ? ['', trimmed] : [trimmed.slice(0, index + 1), trimmed.slice(index + 1)]\n}\n\n/**\n * Rodapé do site no formato do zop.dev: marca e frase, mapa do site em\n * colunas com títulos em caixa alta e uma barra inferior.\n */\nexport const Footer = forwardRef<HTMLElement, FooterProps>(function Footer(\n {\n brand,\n description,\n columns = [],\n bottom,\n navLabel,\n headingLevel = 2,\n renderLink,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const baseId = useId('or-footer')\n const Heading = `h${headingLevel}` as 'h2'\n const hasBrand = Boolean(brand || description)\n\n return (\n <footer ref={ref} className={cx('or-footer', className)} {...rest}>\n {(hasBrand || columns.length > 0) && (\n <div className=\"or-footer__top\">\n {hasBrand && (\n <div className=\"or-footer__brand\">\n {brand && <div className=\"or-footer__logo\">{brand}</div>}\n {description && <div className=\"or-footer__description\">{description}</div>}\n </div>\n )}\n {columns.length > 0 && (\n <nav className=\"or-footer__sitemap\" aria-label={navLabel ?? t('footerNavLabel')}>\n {columns.map((column, columnIndex) => {\n const headingId = `${baseId}-${columnIndex}`\n return (\n <div key={`${column.title}-${columnIndex}`} className=\"or-footer__column\">\n <Heading id={headingId} className=\"or-footer__heading\">\n {column.title}\n </Heading>\n {/* role=\"list\": o Safari remove a semântica de listas com list-style: none. */}\n <ul role=\"list\" className=\"or-footer__links\" aria-labelledby={headingId}>\n {column.links.map((link) => (\n <li key={link.href} className=\"or-footer__item\">\n {link.external ? (\n <ExternalLink link={link} label={t('opensInNewTab')} />\n ) : (\n <InternalLink link={link} renderLink={renderLink} />\n )}\n </li>\n ))}\n </ul>\n </div>\n )\n })}\n </nav>\n )}\n </div>\n )}\n {children}\n {bottom && <div className=\"or-footer__bottom\">{bottom}</div>}\n </footer>\n )\n})\n\nfunction InternalLink({ link, renderLink }: { link: FooterLinkItem; renderLink?: RenderLink }) {\n const linkProps = {\n href: link.href,\n className: 'or-footer__link',\n children: (\n <>\n {link.label}\n {/* Seta laranja que surge no hover/foco (decorativa). */}\n <Icon name=\"arrow-right\" size=\"sm\" className=\"or-footer__arrow\" />\n </>\n ),\n }\n return renderLink ? <>{renderLink(linkProps)}</> : <a {...linkProps} />\n}\n\nfunction ExternalLink({ link, label }: { link: FooterLinkItem; label: string }) {\n const [start, lastWord] = splitLastWord(link.label)\n return (\n <a\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"or-footer__link or-footer__link--external\"\n >\n {start}\n <span className=\"or-footer__nowrap\">\n {lastWord}\n <Icon name=\"arrow-up-right\" size=\"sm\" className=\"or-footer__external-icon\" />\n </span>\n <VisuallyHidden> {label}</VisuallyHidden>\n </a>\n )\n}\n","import {\n Children,\n cloneElement,\n createContext,\n isValidElement,\n useContext,\n type ReactNode,\n} from 'react'\nimport { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from '../Button'\n\n/**\n * Contexto interno compartilhado pelos componentes de ação (ButtonGroup,\n * ToggleButtonGroup, Toolbar). Repassa `size`, `variant` e `disabled` aos\n * filhos e marca os itens de uma Toolbar para o roving tabindex.\n * Não é exportado pela biblioteca.\n */\nexport interface ActionGroupContextValue {\n size?: ButtonSize\n variant?: ButtonVariant\n disabled?: boolean\n /** Direção herdada por grupos e divisores aninhados (ex.: Toolbar vertical). */\n orientation?: 'horizontal' | 'vertical'\n /** Os itens estão dentro de uma `Toolbar` e participam do roving tabindex. */\n roving?: boolean\n}\n\nexport const ActionGroupContext = createContext<ActionGroupContextValue | null>(null)\n\nexport function useActionGroup(): ActionGroupContextValue | null {\n return useContext(ActionGroupContext)\n}\n\n/** Atributos que marcam um item navegável por setas dentro de uma Toolbar. */\nexport function rovingItemProps(ctx: ActionGroupContextValue | null): { 'data-roving-item'?: '' } {\n return ctx?.roving ? { 'data-roving-item': '' } : {}\n}\n\ntype ButtonElementProps = ButtonProps & { 'data-roving-item'?: string | boolean }\n\n/**\n * O `Button` não lê contexto; por isso os filhos diretos que são `Button`\n * recebem `size`, `variant`, `disabled` e `data-roving-item` do grupo via\n * `cloneElement` — sempre respeitando o que foi definido no próprio botão.\n */\nexport function applyGroupDefaults(children: ReactNode, ctx: ActionGroupContextValue): ReactNode {\n return Children.map(children, (child) => {\n if (!isValidElement<ButtonElementProps>(child) || child.type !== Button) return child\n const own = child.props\n const extra: Partial<ButtonElementProps> = {}\n if (own.size === undefined && ctx.size) extra.size = ctx.size\n if (own.variant === undefined && ctx.variant) extra.variant = ctx.variant\n if (own.disabled === undefined && ctx.disabled) extra.disabled = true\n if (own['data-roving-item'] === undefined && ctx.roving) extra['data-roving-item'] = ''\n return Object.keys(extra).length > 0 ? cloneElement(child, extra) : child\n })\n}\n","import { forwardRef, type ReactElement } from 'react'\nimport { Icon, type IconName } from '../../icons'\nimport { cx } from '../../utils'\nimport { Button, type ButtonProps } from '../Button'\nimport { rovingItemProps, useActionGroup } from '../ButtonGroup/context'\nimport './IconButton.css'\n\nexport interface IconButtonProps extends Omit<\n ButtonProps,\n 'iconOnly' | 'startIcon' | 'endIcon' | 'children' | 'block' | 'aria-label'\n> {\n /** Nome de um ícone do Orange ou um elemento SVG próprio. */\n icon: IconName | ReactElement\n /**\n * Nome acessível do botão (vira `aria-label`). Obrigatório: descreva a ação,\n * não o ícone — \"Excluir arquivo\", não \"Lixeira\".\n */\n label: string\n}\n\n/**\n * Botão quadrado somente com ícone e nome acessível obrigatório.\n * Atalho para `<Button iconOnly aria-label startIcon={<Icon />} />`, com\n * variante `ghost` por padrão e integração com ButtonGroup e Toolbar.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { icon, label, variant, size, disabled, className, ...rest },\n ref,\n) {\n const group = useActionGroup()\n return (\n <Button\n ref={ref}\n iconOnly\n aria-label={label}\n variant={variant ?? group?.variant ?? 'ghost'}\n size={size ?? group?.size ?? 'md'}\n disabled={disabled ?? group?.disabled}\n startIcon={typeof icon === 'string' ? <Icon name={icon} /> : icon}\n className={cx('or-icon-button', className)}\n {...rovingItemProps(group)}\n {...rest}\n />\n )\n})\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { useClickOutside, useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport type { RenderLink } from '../Link'\nimport './SideNav.css'\n\ninterface SideNavContextValue {\n collapsed: boolean\n currentHref?: string\n renderLink?: RenderLink\n level: number\n /** Itens dentro de uma lista renderizam `<li>`; em `header`/`footer`, não. */\n inList: boolean\n}\n\nconst SideNavContext = createContext<SideNavContextValue>({ collapsed: false, level: 0, inList: false })\n\n/* -------------------------------------------------------------------------- */\n/* SideNav */\n/* -------------------------------------------------------------------------- */\n\ntype Slot = ReactNode | ((state: { collapsed: boolean }) => ReactNode)\n\nexport interface SideNavProps extends HTMLAttributes<HTMLElement> {\n /** Modo recolhido: só ícones (rótulos continuam acessíveis e aparecem no hover/foco). Controlado. */\n collapsed?: boolean\n /** Estado recolhido inicial (não controlado). */\n defaultCollapsed?: boolean\n /** Chamado quando o botão de recolher é acionado. */\n onCollapsedChange?: (collapsed: boolean) => void\n /** Mostra o botão \"Recolher menu lateral\" no rodapé. */\n collapsible?: boolean\n /** `href` da página atual: o item correspondente recebe `aria-current=\"page\"`. */\n currentHref?: string\n /** Renderiza os links com o componente do seu roteador. */\n renderLink?: RenderLink\n /** Área superior (marca, seletor de workspace). Aceita função `({ collapsed }) => ReactNode`. */\n header?: Slot\n /** Área inferior (perfil, ajuda). Aceita função `({ collapsed }) => ReactNode`. */\n footer?: Slot\n children?: ReactNode\n}\n\nconst renderSlot = (slot: Slot | undefined, collapsed: boolean) =>\n typeof slot === 'function' ? slot({ collapsed }) : slot\n\n/**\n * Navegação lateral da aplicação: itens com ícone, grupos recolhíveis,\n * seções e modo recolhido (somente ícones).\n */\nexport const SideNav = forwardRef<HTMLElement, SideNavProps>(function SideNav(\n {\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsible = false,\n currentHref,\n renderLink,\n header,\n footer,\n className,\n children,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const [collapsed, setCollapsed] = useControllableState({\n value: collapsedProp,\n defaultValue: defaultCollapsed,\n onChange: onCollapsedChange,\n })\n const ctx = useMemo<SideNavContextValue>(\n () => ({ collapsed, currentHref, renderLink, level: 0, inList: false }),\n [collapsed, currentHref, renderLink],\n )\n const listCtx = useMemo(() => ({ ...ctx, inList: true }), [ctx])\n const toggleLabel = collapsed ? t('expandSidebar') : t('collapseSidebar')\n\n // Troca de modo: rótulos entram com fade (só depois da 1ª troca) e, no quadro\n // da troca, os painéis não animam (evita um \"fantasma\" do painel ao mudar de lugar).\n const [prevCollapsed, setPrevCollapsed] = useState(collapsed)\n const [modeChanged, setModeChanged] = useState(false)\n const [switching, setSwitching] = useState(false)\n if (prevCollapsed !== collapsed) {\n setPrevCollapsed(collapsed)\n setModeChanged(true)\n setSwitching(true)\n }\n useEffect(() => {\n if (!switching) return\n const raf = requestAnimationFrame(() => setSwitching(false))\n return () => cancelAnimationFrame(raf)\n }, [switching])\n\n return (\n <SideNavContext.Provider value={ctx}>\n <nav\n ref={ref}\n aria-label={ariaLabel ?? t('mainNavigation')}\n className={cx('or-side-nav', collapsed && 'or-side-nav--collapsed', className)}\n data-collapsed={collapsed || undefined}\n data-motion={modeChanged || undefined}\n data-switching={switching || undefined}\n {...rest}\n >\n {header && <div className=\"or-side-nav__header\">{renderSlot(header, collapsed)}</div>}\n <div className=\"or-side-nav__body\">\n <SideNavContext.Provider value={listCtx}>\n <ul className=\"or-side-nav__list\">{children}</ul>\n </SideNavContext.Provider>\n </div>\n {(footer || collapsible) && (\n <div className=\"or-side-nav__footer\">\n {renderSlot(footer, collapsed)}\n {collapsible && (\n <button\n type=\"button\"\n className=\"or-side-nav__item or-side-nav__collapse\"\n data-level={0}\n onClick={() => setCollapsed((v) => !v)}\n >\n <span className=\"or-side-nav__icon\" aria-hidden=\"true\">\n <Icon name=\"chevrons-left\" />\n </span>\n <span className=\"or-side-nav__label\">{toggleLabel}</span>\n </button>\n )}\n </div>\n )}\n </nav>\n </SideNavContext.Provider>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* SideNavItem */\n/* -------------------------------------------------------------------------- */\n\nexport interface SideNavItemProps extends Omit<HTMLAttributes<HTMLElement>, 'onClick'> {\n /** Destino. Sem `href`, o item é um botão (ex.: \"Sair\"). */\n href?: string\n /** Ícone decorativo. No modo recolhido, sem ícone, mostra a inicial do rótulo. */\n icon?: ReactNode\n /** Contador ou selo à direita (no modo recolhido vira um ponto). */\n badge?: ReactNode\n /** Marca o item como página atual. Padrão: `href === currentHref` do SideNav. */\n active?: boolean\n /** Desabilita o item. */\n disabled?: boolean\n onClick?: (event: MouseEvent<HTMLElement>) => void\n children: ReactNode\n}\n\nfunction isItemActive(props: { active?: boolean; href?: string }, currentHref?: string) {\n return props.active ?? (currentHref !== undefined && props.href !== undefined && props.href === currentHref)\n}\n\n/** Um destino da navegação lateral. */\nexport const SideNavItem = forwardRef<HTMLElement, SideNavItemProps>(function SideNavItem(\n { href, icon, badge, active, disabled = false, onClick, className, children, ...rest },\n ref,\n) {\n const { collapsed, currentHref, renderLink, level, inList } = useContext(SideNavContext)\n const isActive = isItemActive({ active, href }, currentHref)\n const initial = typeof children === 'string' ? children.trim().charAt(0).toUpperCase() : undefined\n const showRail = collapsed && level === 0\n\n const content = (\n <>\n {icon ? (\n <span className=\"or-side-nav__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : (\n showRail &&\n initial && (\n <span className=\"or-side-nav__icon or-side-nav__initial\" aria-hidden=\"true\">\n {initial}\n </span>\n )\n )}\n <span className=\"or-side-nav__label\">{children}</span>\n {badge !== undefined && badge !== null && badge !== false && <span className=\"or-side-nav__badge\">{badge}</span>}\n </>\n )\n const common = {\n className: cx('or-side-nav__item', className),\n 'aria-current': isActive ? ('page' as const) : undefined,\n 'data-level': level,\n onClick,\n }\n\n let control: ReactNode\n if (href && !disabled) {\n const linkProps = { ...common, ...rest, href, children: content }\n control = renderLink ? (\n renderLink(linkProps as Parameters<RenderLink>[0])\n ) : (\n <a ref={ref as Ref<HTMLAnchorElement>} {...linkProps} />\n )\n } else if (href && disabled) {\n control = (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events -- link desabilitado: onClick é explicitamente removido\n <a ref={ref as Ref<HTMLAnchorElement>} {...common} {...rest} role=\"link\" aria-disabled=\"true\" onClick={undefined}>\n {content}\n </a>\n )\n } else {\n control = (\n <button ref={ref as Ref<HTMLButtonElement>} type=\"button\" disabled={disabled} {...common} {...rest}>\n {content}\n </button>\n )\n }\n\n return inList ? <li className=\"or-side-nav__entry\">{control}</li> : <>{control}</>\n})\n\n/* -------------------------------------------------------------------------- */\n/* SideNavGroup */\n/* -------------------------------------------------------------------------- */\n\nexport interface SideNavGroupProps extends Omit<HTMLAttributes<HTMLLIElement>, 'onToggle'> {\n /** Rótulo do grupo (texto do botão que abre/fecha). */\n label: ReactNode\n /** Ícone decorativo. */\n icon?: ReactNode\n /** Aberto (controlado). */\n open?: boolean\n /** Aberto inicialmente (não controlado). Padrão: aberto se contém o item atual. */\n defaultOpen?: boolean\n /** Chamado ao abrir/fechar. */\n onOpenChange?: (open: boolean) => void\n children?: ReactNode\n}\n\nfunction containsActive(children: ReactNode, currentHref?: string): boolean {\n return Children.toArray(children).some((child) => {\n if (!isValidElement(child)) return false\n const props = (child as ReactElement<{ active?: boolean; href?: string; children?: ReactNode }>).props\n return isItemActive(props, currentHref) || containsActive(props.children, currentHref)\n })\n}\n\n/**\n * Grupo recolhível de itens. O botão expõe `aria-expanded`/`aria-controls`.\n * No modo recolhido, os itens abrem em um painel ao lado.\n */\nexport const SideNavGroup = forwardRef<HTMLLIElement, SideNavGroupProps>(function SideNavGroup(\n { label, icon, open: openProp, defaultOpen, onOpenChange, className, children, onKeyDown, ...rest },\n ref,\n) {\n const parent = useContext(SideNavContext)\n const { collapsed, currentHref, level } = parent\n const hasActive = containsActive(children, currentHref)\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen ?? hasActive,\n onChange: onOpenChange,\n })\n const [flyoutOpen, setFlyoutOpen] = useState(false)\n const listId = useId('or-side-nav-group')\n const groupRef = useRef<HTMLLIElement>(null)\n const toggleRef = useRef<HTMLButtonElement>(null)\n const isFlyout = collapsed && level === 0\n const expanded = isFlyout ? flyoutOpen : open\n\n // Abre o grupo quando a página atual passa a estar dentro dele.\n useEffect(() => {\n if (hasActive && openProp === undefined) setOpen(true)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasActive])\n\n useEffect(() => setFlyoutOpen(false), [collapsed])\n useClickOutside(groupRef, () => setFlyoutOpen(false), isFlyout && flyoutOpen)\n\n const childCtx = useMemo(() => ({ ...parent, level: level + 1, inList: true }), [parent, level])\n\n const handleKeyDown = (event: KeyboardEvent<HTMLLIElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || !isFlyout || !flyoutOpen || event.key !== 'Escape') return\n event.preventDefault()\n event.stopPropagation()\n setFlyoutOpen(false)\n toggleRef.current?.focus()\n }\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- onKeyDown delegado trata Escape do grupo flutuante\n <li\n ref={mergeRefs(ref, groupRef)}\n className={cx('or-side-nav__entry', 'or-side-nav__group', className)}\n data-open={expanded || undefined}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <button\n ref={toggleRef}\n type=\"button\"\n className=\"or-side-nav__item or-side-nav__toggle\"\n aria-expanded={expanded}\n aria-controls={listId}\n data-level={level}\n data-active={hasActive || undefined}\n onClick={() => (isFlyout ? setFlyoutOpen((v) => !v) : setOpen((v) => !v))}\n >\n {icon && (\n <span className=\"or-side-nav__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"or-side-nav__label\">{label}</span>\n <Icon name=\"chevron-down\" size=\"sm\" className=\"or-side-nav__chevron\" />\n </button>\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- clique delegado fecha o painel flutuante ao escolher um link nativo */}\n <div\n className=\"or-side-nav__panel\"\n hidden={!expanded}\n onClick={(event) => {\n if (isFlyout && (event.target as HTMLElement).closest('a[href]')) setFlyoutOpen(false)\n }}\n >\n {/* Wrapper único: a altura anima com grid-template-rows 0fr → 1fr. */}\n <div className=\"or-side-nav__panel-inner\">\n {isFlyout && (\n <p className=\"or-side-nav__panel-title\" aria-hidden=\"true\">\n {label}\n </p>\n )}\n <SideNavContext.Provider value={childCtx}>\n <ul id={listId} className=\"or-side-nav__sublist\">\n {children}\n </ul>\n </SideNavContext.Provider>\n </div>\n </div>\n </li>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* SideNavSection */\n/* -------------------------------------------------------------------------- */\n\nexport interface SideNavSectionProps extends Omit<HTMLAttributes<HTMLLIElement>, 'title'> {\n /** Título da seção (rótulo da lista). No modo recolhido vira uma linha divisória. */\n title: ReactNode\n children?: ReactNode\n}\n\n/** Agrupa itens sob um título curto em caixa alta (ex.: \"Configurações\"). */\nexport const SideNavSection = forwardRef<HTMLLIElement, SideNavSectionProps>(function SideNavSection(\n { title, className, children, ...rest },\n ref,\n) {\n const titleId = useId('or-side-nav-section')\n return (\n <li ref={ref} className={cx('or-side-nav__section', className)} {...rest}>\n <span id={titleId} className=\"or-side-nav__section-title\">\n {title}\n </span>\n <ul className=\"or-side-nav__list\" aria-labelledby={titleId}>\n {children}\n </ul>\n </li>\n )\n})\n","import { forwardRef, type AnchorHTMLAttributes, type MouseEvent } from 'react'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport './SkipLink.css'\n\nexport interface SkipLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * Âncora do conteúdo de destino (`#id`). O elemento precisa existir na\n * página. Padrão: `#main`.\n */\n href?: string\n}\n\n/** Move o foco para o elemento de destino, tornando-o focável se necessário. */\nfunction focusTarget(target: HTMLElement) {\n const focusable = target.matches('a[href], button, input, select, textarea, [tabindex]')\n if (!focusable) {\n target.setAttribute('tabindex', '-1')\n target.addEventListener('blur', () => target.removeAttribute('tabindex'), { once: true })\n }\n target.focus({ preventScroll: true })\n target.scrollIntoView({ block: 'start' })\n}\n\n/**\n * Link de atalho \"Pular para o conteúdo principal\". Fica invisível até\n * receber foco pelo teclado — deve ser o primeiro elemento focável da página.\n */\nexport const SkipLink = forwardRef<HTMLAnchorElement, SkipLinkProps>(function SkipLink(\n { href = '#main', className, children, onClick, ...rest },\n ref,\n) {\n const { t } = useLocale()\n\n const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event)\n if (event.defaultPrevented || !href.startsWith('#')) return\n const target = document.getElementById(decodeURIComponent(href.slice(1)))\n if (!target) return\n // Evita que roteadores baseados em hash interpretem a âncora como rota.\n event.preventDefault()\n focusTarget(target)\n }\n\n return (\n <a ref={ref} href={href} className={cx('or-skip-link', className)} onClick={handleClick} {...rest}>\n {children ?? t('skipToContent')}\n </a>\n )\n})\n","import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect, useMediaQuery } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx, mergeRefs } from '../../utils'\nimport { AppHeader } from '../AppHeader'\nimport { Drawer } from '../Drawer'\nimport { Footer } from '../Footer'\nimport { IconButton, type IconButtonProps } from '../IconButton'\nimport { SideNav, type SideNavProps } from '../SideNav'\nimport { SkipLink } from '../SkipLink'\nimport './AppShell.css'\n\nexport type AppShellBreakpoint = 'md' | 'lg'\n\n/** Mesmos valores de `breakpoints` em `@orangesys/tokens` (md 768px, lg 1024px). */\nconst BREAKPOINTS: Record<AppShellBreakpoint, string> = { md: '768px', lg: '1024px' }\n\n/** Estado da navegação, exposto por `useAppShell()`. */\nexport interface AppShellState {\n /** Painel de navegação aberto (telas abaixo do ponto de quebra). */\n navOpen: boolean\n setNavOpen: (open: boolean) => void\n /** Abre/fecha o painel (telas estreitas) ou recolhe/expande a barra lateral (telas largas). */\n toggleNav: () => void\n /** Barra lateral recolhida (telas a partir do ponto de quebra). */\n navCollapsed: boolean\n setNavCollapsed: (collapsed: boolean) => void\n /** `true` abaixo do ponto de quebra: a navegação vive no painel (Drawer). */\n isCompact: boolean\n}\n\ninterface AppShellContextValue extends AppShellState {\n hasNavigation: boolean\n navId: string\n drawerId: string\n}\n\nconst AppShellContext = createContext<AppShellContextValue | null>(null)\n\nfunction useAppShellContext(component: string): AppShellContextValue {\n const ctx = useContext(AppShellContext)\n if (!ctx) throw new Error(`${component} precisa estar dentro de um <AppShell>.`)\n return ctx\n}\n\n/** Estado entregue ao `navigation` quando ele é uma função. */\nexport interface AppShellNavigationState {\n /** Barra lateral recolhida (sempre `false` dentro do painel). */\n collapsed: boolean\n /** A navegação está no painel (telas estreitas). */\n compact: boolean\n}\n\nexport interface AppShellProps extends HTMLAttributes<HTMLDivElement> {\n /** Topo da página — normalmente um `AppHeader`. */\n header?: ReactNode\n /**\n * Navegação lateral — normalmente um `SideNav`, que passa a seguir o estado\n * recolhido do AppShell. Aceita uma função `({ collapsed, compact }) => ReactNode`.\n */\n navigation?: ReactNode | ((state: AppShellNavigationState) => ReactNode)\n /** Painel complementar à direita do conteúdo (empilha abaixo dele quando falta espaço). */\n aside?: ReactNode\n /** Rodapé — por exemplo, um `Footer`. */\n footer?: ReactNode\n /** Conteúdo principal (`<main>`). */\n children?: ReactNode\n /** Nome do landmark de navegação. Padrão: `t('mainNavigation')`. */\n navLabel?: string\n /** Nome do landmark complementar (`aside`). Padrão: `t('appShellAside')`. */\n asideLabel?: string\n /** Título do painel de navegação em telas estreitas. Padrão: `t('menu')`. */\n navTitle?: ReactNode\n /** `id` do `<main>` (destino do link de atalho). Padrão: gerado. */\n mainId?: string\n /**\n * Elemento da área principal. Use `'div'` quando o AppShell vive dentro de uma\n * aplicação que já tem o seu `<main>` (micro-frontends, prévias embutidas):\n * uma página só pode ter um landmark principal. Padrão: `'main'`.\n */\n mainElement?: 'main' | 'div'\n /** Renderiza o `SkipLink` \"Pular para o conteúdo principal\" como primeiro foco. */\n skipLink?: boolean\n /** Texto do link de atalho. Padrão: `t('skipToContent')`. */\n skipLinkLabel?: ReactNode\n /**\n * Largura da tela a partir da qual a navegação fica fixa ao lado do conteúdo\n * (`md` 768px, `lg` 1024px). Abaixo dela, vai para um painel (Drawer).\n */\n navBreakpoint?: AppShellBreakpoint\n /** Barra lateral recolhida (controlado). */\n navCollapsed?: boolean\n /** Barra lateral recolhida inicialmente (não controlado). */\n defaultNavCollapsed?: boolean\n /** Chamado quando a barra lateral é recolhida ou expandida. */\n onNavCollapsedChange?: (collapsed: boolean) => void\n /** Painel de navegação aberto em telas estreitas (controlado). */\n navOpen?: boolean\n /** Painel aberto inicialmente (não controlado). */\n defaultNavOpen?: boolean\n /** Chamado quando o painel abre ou fecha. */\n onNavOpenChange?: (open: boolean) => void\n /** Fixa o cabeçalho no topo durante a rolagem. */\n stickyHeader?: boolean\n /** Fixa a barra lateral (altura da tela, rolagem própria). */\n stickyNav?: boolean\n /**\n * Ocupa no mínimo a altura da tela e rola com a página. Com `false`, ocupa a\n * altura do contêiner pai e rola o conteúdo por dentro (útil em prévias e painéis).\n */\n fullHeight?: boolean\n}\n\nfunction isElementOfType<P>(node: ReactNode, type: unknown): node is ReactElement<P> {\n return isValidElement(node) && node.type === type\n}\n\n/**\n * Estrutura de página da aplicação: cabeçalho, navegação lateral recolhível\n * (painel em telas estreitas), conteúdo principal, painel complementar e\n * rodapé — com os landmarks e o link de atalho certos.\n */\nexport const AppShell = forwardRef<HTMLDivElement, AppShellProps>(function AppShell(\n {\n header,\n navigation,\n aside,\n footer,\n children,\n navLabel,\n asideLabel,\n navTitle,\n mainId,\n mainElement = 'main',\n skipLink = true,\n skipLinkLabel,\n navBreakpoint = 'lg',\n navCollapsed: navCollapsedProp,\n defaultNavCollapsed = false,\n onNavCollapsedChange,\n navOpen: navOpenProp,\n defaultNavOpen = false,\n onNavOpenChange,\n stickyHeader = true,\n stickyNav = true,\n fullHeight = true,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const resolvedMainId = useId('or-app-shell-main', mainId)\n const navId = useId('or-app-shell-nav')\n const drawerId = useId('or-app-shell-drawer')\n const rootRef = useRef<HTMLDivElement>(null)\n const headerRef = useRef<HTMLElement>(null)\n\n // No servidor (sem matchMedia) assume tela larga; o CSS esconde a barra abaixo do ponto de quebra.\n const isWide = useMediaQuery(`(min-width: ${BREAKPOINTS[navBreakpoint]})`, true)\n const isCompact = !isWide\n\n const [navCollapsed, setNavCollapsed] = useControllableState({\n value: navCollapsedProp,\n defaultValue: defaultNavCollapsed,\n onChange: onNavCollapsedChange,\n })\n const [navOpen, setNavOpen] = useControllableState({\n value: navOpenProp,\n defaultValue: defaultNavOpen,\n onChange: onNavOpenChange,\n })\n\n // Ao passar para a tela larga, a navegação volta para a barra lateral: feche o painel.\n useEffect(() => {\n if (!isCompact && navOpen) setNavOpen(false)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isCompact])\n\n const hasNavigation = navigation !== undefined && navigation !== null && navigation !== false\n const hasHeader = header !== undefined && header !== null && header !== false\n\n const toggleNav = useCallback(() => {\n if (isCompact) setNavOpen((open) => !open)\n else setNavCollapsed((collapsed) => !collapsed)\n }, [isCompact, setNavOpen, setNavCollapsed])\n\n const ctx = useMemo<AppShellContextValue>(\n () => ({\n // Acima do ponto de quebra não há painel: nunca informe \"aberto\".\n navOpen: isCompact && navOpen,\n setNavOpen,\n toggleNav,\n navCollapsed,\n setNavCollapsed,\n isCompact,\n hasNavigation,\n navId,\n drawerId,\n }),\n [\n navOpen,\n setNavOpen,\n toggleNav,\n navCollapsed,\n setNavCollapsed,\n isCompact,\n hasNavigation,\n navId,\n drawerId,\n ],\n )\n\n // A barra lateral fixa fica logo abaixo do cabeçalho: mede a altura real dele.\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current\n const headerNode = headerRef.current\n if (!root || !headerNode || typeof ResizeObserver === 'undefined') return\n const update = () => {\n if (headerNode.offsetHeight > 0)\n root.style.setProperty('--_header-height', `${headerNode.offsetHeight}px`)\n }\n update()\n const observer = new ResizeObserver(update)\n observer.observe(headerNode)\n return () => observer.disconnect()\n }, [hasHeader])\n\n // Cabeçalho fixo na página inteira: reserva a altura dele na rolagem do\n // documento, para que o foco nunca fique escondido sob ele (WCAG 2.4.11).\n useIsomorphicLayoutEffect(() => {\n const headerNode = headerRef.current\n if (!fullHeight || !stickyHeader || !headerNode || typeof document === 'undefined') return\n const html = document.documentElement\n const previous = html.style.scrollPaddingTop\n const update = () => {\n if (headerNode.offsetHeight > 0) html.style.scrollPaddingTop = `${headerNode.offsetHeight}px`\n }\n update()\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(update)\n observer?.observe(headerNode)\n return () => {\n observer?.disconnect()\n html.style.scrollPaddingTop = previous\n }\n }, [hasHeader, fullHeight, stickyHeader])\n\n const label = navLabel ?? t('mainNavigation')\n\n /**\n * Resolve o slot de navegação. Um `SideNav` já é um `<nav>` nomeado: o AppShell\n * não o envolve em outro landmark e sincroniza o modo recolhido com ele.\n */\n const resolveNavigation = (compact: boolean) => {\n const content =\n typeof navigation === 'function'\n ? navigation({ collapsed: compact ? false : navCollapsed, compact })\n : navigation\n if (!isElementOfType<SideNavProps>(content, SideNav)) return { landmark: true, node: content }\n const own = content.props\n const overrides: Partial<SideNavProps> = compact\n ? { collapsed: false, collapsible: false }\n : {\n collapsed: navCollapsed,\n onCollapsedChange: (next: boolean) => {\n own.onCollapsedChange?.(next)\n setNavCollapsed(next)\n },\n }\n return {\n landmark: false,\n node: cloneElement(content, { 'aria-label': own['aria-label'] ?? navLabel, ...overrides }),\n }\n }\n\n let sidebar: ReactNode = null\n if (hasNavigation && !isCompact) {\n const { landmark, node } = resolveNavigation(false)\n sidebar = landmark ? (\n <nav id={navId} className=\"or-app-shell__nav\" aria-label={label}>\n {node}\n </nav>\n ) : (\n <div id={navId} className=\"or-app-shell__nav\">\n {node}\n </div>\n )\n }\n\n const hasSidebar = sidebar !== null\n\n let drawer: ReactNode = null\n if (hasNavigation && isCompact) {\n const { landmark, node } = resolveNavigation(true)\n // Escolher um link fecha o painel (navegação de SPA não recarrega a página).\n const closeOnLink = (event: MouseEvent<HTMLDivElement>) => {\n if ((event.target as HTMLElement).closest('a[href]')) setNavOpen(false)\n }\n drawer = (\n <Drawer\n id={drawerId}\n open={navOpen}\n onOpenChange={setNavOpen}\n title={navTitle ?? t('menu')}\n placement=\"left\"\n size=\"sm\"\n className=\"or-app-shell__drawer\"\n >\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- clique delegado fecha o painel ao escolher um link (Enter em um link também dispara click) */}\n <div className=\"or-app-shell__drawer-content\" onClick={closeOnLink}>\n {landmark ? (\n <nav className=\"or-app-shell__drawer-nav\" aria-label={label}>\n {node}\n </nav>\n ) : (\n node\n )}\n </div>\n </Drawer>\n )\n }\n\n // AppHeader e Footer já são <header>/<footer>: não aninhe landmarks iguais.\n const HeaderTag = isElementOfType(header, AppHeader) ? 'div' : 'header'\n const MainTag = mainElement\n const FooterTag = isElementOfType(footer, Footer) ? 'div' : 'footer'\n\n return (\n <AppShellContext.Provider value={ctx}>\n <div\n ref={mergeRefs(ref, rootRef)}\n className={cx(\n 'or-app-shell',\n fullHeight ? 'or-app-shell--full-height' : 'or-app-shell--contained',\n stickyHeader && 'or-app-shell--sticky-header',\n stickyNav && 'or-app-shell--sticky-nav',\n className,\n )}\n data-breakpoint={navBreakpoint}\n data-compact={isCompact || undefined}\n data-has-nav={hasSidebar || undefined}\n data-collapsed={(hasSidebar && navCollapsed) || undefined}\n {...rest}\n >\n {skipLink && <SkipLink href={`#${resolvedMainId}`}>{skipLinkLabel}</SkipLink>}\n {hasHeader && (\n <HeaderTag ref={headerRef as Ref<HTMLDivElement>} className=\"or-app-shell__header\">\n {header}\n </HeaderTag>\n )}\n <div className=\"or-app-shell__body\">\n {sidebar}\n <div className=\"or-app-shell__content\">\n <div className=\"or-app-shell__columns\">\n <MainTag id={resolvedMainId} tabIndex={-1} className=\"or-app-shell__main\">\n {children}\n </MainTag>\n {aside && (\n <aside\n className=\"or-app-shell__aside\"\n aria-label={asideLabel ?? t('appShellAside')}\n >\n {aside}\n </aside>\n )}\n </div>\n {footer && <FooterTag className=\"or-app-shell__footer\">{footer}</FooterTag>}\n </div>\n </div>\n {drawer}\n </div>\n </AppShellContext.Provider>\n )\n})\n\n/** Estado e ações da navegação do `AppShell` mais próximo. */\nexport function useAppShell(): AppShellState {\n return useAppShellContext('useAppShell')\n}\n\nexport interface AppShellNavToggleProps extends Omit<IconButtonProps, 'icon' | 'label'> {\n /** Ícone. Padrão: menu (telas estreitas) ou chevrons que giram (telas largas). */\n icon?: IconButtonProps['icon']\n /**\n * Nome acessível. Padrão: \"Abrir navegação\" (telas estreitas) ou\n * \"Recolher/Expandir menu lateral\" (telas largas).\n */\n label?: string\n}\n\n/**\n * Botão que abre o painel de navegação (telas estreitas) ou recolhe a barra\n * lateral (telas largas). Coloque-o onde quiser dentro do AppShell — em geral\n * na marca do `AppHeader`. Não renderiza nada sem `navigation`.\n */\nexport const AppShellNavToggle = forwardRef<HTMLButtonElement, AppShellNavToggleProps>(\n function AppShellNavToggle({ icon, label, className, onClick, ...rest }, ref) {\n const { t } = useLocale()\n const shell = useAppShellContext('AppShellNavToggle')\n if (!shell.hasNavigation) return null\n const { isCompact, navOpen, navCollapsed } = shell\n const defaultLabel = isCompact\n ? t('appShellOpenNav')\n : navCollapsed\n ? t('expandSidebar')\n : t('collapseSidebar')\n return (\n <IconButton\n ref={ref}\n icon={icon ?? (isCompact ? 'menu' : 'chevrons-left')}\n label={label ?? defaultLabel}\n className={cx('or-app-shell__toggle', className)}\n data-mode={isCompact ? 'drawer' : 'collapse'}\n aria-expanded={isCompact ? navOpen : !navCollapsed}\n aria-controls={isCompact ? shell.drawerId : shell.navId}\n aria-haspopup={isCompact ? 'dialog' : undefined}\n onClick={composeEventHandlers(onClick, () => shell.toggleNav())}\n {...rest}\n />\n )\n },\n)\n","import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport type { MessageKey } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Avatar.css'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'square' | 'circle'\nexport type AvatarStatus = 'online' | 'away' | 'busy' | 'offline'\n\n/** Contexto interno: o AvatarGroup repassa tamanho e forma aos avatares. */\nexport const AvatarGroupContext = createContext<{ size?: AvatarSize; shape?: AvatarShape } | null>(null)\n\nexport interface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {\n /** URL da foto. Se falhar, mostra as iniciais (ou o ícone de usuário). */\n src?: string\n /**\n * Texto alternativo. Padrão: `name`. Use `alt=\"\"` quando o nome já estiver\n * escrito ao lado do avatar (o avatar vira decorativo).\n */\n alt?: string\n /** Nome da pessoa: gera as iniciais e a cor de fundo. */\n name?: string\n /** `xs` 24px, `sm` 32px, `md` 40px, `lg` 48px, `xl` 64px. */\n size?: AvatarSize\n /** Forma: `square` (padrão) ou `circle`. */\n shape?: AvatarShape\n /** Indicador de presença. */\n status?: AvatarStatus\n /** Substitui o texto acessível do status. */\n statusLabel?: string\n /** Anel pulsante no indicador (\"ao vivo\"). Ignorado para `offline` e em movimento reduzido. */\n pulse?: boolean\n /** Ícone usado quando não há imagem nem nome. */\n icon?: ReactNode\n /** Atributos extras da `<img>` (ex.: `referrerPolicy`, `loading`). */\n imgProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, 'src' | 'alt'>\n}\n\nconst TONES = ['orange', 'amber', 'green', 'blue', 'red', 'neutral'] as const\n\nconst STATUS_KEYS: Record<AvatarStatus, MessageKey> = {\n online: 'presenceOnline',\n away: 'presenceAway',\n busy: 'presenceBusy',\n offline: 'presenceOffline',\n}\n\nfunction initialsOf(name: string, locale: string): string {\n const words = name\n .trim()\n .split(/\\s+/)\n .map((w) => w.replace(/[^\\p{L}\\p{N}]/gu, ''))\n .filter(Boolean)\n if (words.length === 0) return ''\n const first = Array.from(words[0])[0] ?? ''\n const last = words.length > 1 ? (Array.from(words[words.length - 1])[0] ?? '') : ''\n try {\n return (first + last).toLocaleUpperCase(locale)\n } catch {\n return (first + last).toUpperCase()\n }\n}\n\nfunction toneOf(name: string): (typeof TONES)[number] {\n let hash = 0\n for (const char of name.trim().toLowerCase()) hash = (hash * 31 + (char.codePointAt(0) ?? 0)) | 0\n return TONES[Math.abs(hash) % TONES.length]\n}\n\ntype LoadState = 'loading' | 'loaded' | 'error'\n\n/**\n * Representa uma pessoa ou organização: foto, iniciais ou ícone, com\n * indicador de presença opcional.\n */\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n { src, alt, name, size: sizeProp, shape: shapeProp, status, statusLabel, pulse = false, icon, imgProps, className, ...rest },\n ref,\n) {\n const { t, locale } = useLocale()\n const group = useContext(AvatarGroupContext)\n const size = sizeProp ?? group?.size ?? 'md'\n const shape = shapeProp ?? group?.shape ?? 'square'\n const imgRef = useRef<HTMLImageElement>(null)\n const [loadState, setLoadState] = useState<LoadState>(src ? 'loading' : 'error')\n\n useEffect(() => {\n if (!src) {\n setLoadState('error')\n return\n }\n const img = imgRef.current\n // imagem já em cache antes do React registrar o onLoad\n setLoadState(img?.complete && img.naturalWidth > 0 ? 'loaded' : 'loading')\n }, [src])\n\n const initials = name ? initialsOf(name, locale) : ''\n const tone = name ? toneOf(name) : 'neutral'\n const label = alt ?? name ?? ''\n const decorative = label === ''\n const statusText = status ? (statusLabel ?? t(STATUS_KEYS[status])) : ''\n const accessibleName = [label, statusText].filter(Boolean).join(', ')\n const showImage = Boolean(src) && loadState !== 'error'\n\n return (\n <span\n ref={ref}\n className={cx(\n 'or-avatar',\n `or-avatar--${size}`,\n `or-avatar--${shape}`,\n `or-avatar--tone-${tone}`,\n showImage && loadState === 'loaded' && 'or-avatar--loaded',\n className,\n )}\n {...(decorative ? null : { role: 'img', 'aria-label': accessibleName })}\n {...rest}\n >\n <span className=\"or-avatar__frame\" aria-hidden=\"true\">\n {initials ? (\n <span className=\"or-avatar__initials\">{initials}</span>\n ) : (\n <span className=\"or-avatar__icon\">{icon ?? <Icon name=\"user\" />}</span>\n )}\n {showImage && (\n <img\n ref={imgRef}\n className=\"or-avatar__image\"\n src={src}\n alt=\"\"\n onLoad={() => setLoadState('loaded')}\n onError={() => setLoadState('error')}\n {...imgProps}\n />\n )}\n </span>\n {status && (\n <span\n className={cx(\n 'or-avatar__status',\n `or-avatar__status--${status}`,\n pulse && status !== 'offline' && 'or-avatar__status--pulse',\n )}\n aria-hidden=\"true\"\n />\n )}\n {decorative && status && <VisuallyHidden>{statusText}</VisuallyHidden>}\n </span>\n )\n})\n","import { Children, forwardRef, isValidElement, useMemo, type HTMLAttributes, type ReactElement } from 'react'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning } from '../../utils'\nimport { AvatarGroupContext, type AvatarProps, type AvatarShape, type AvatarSize } from '../Avatar/Avatar'\nimport './AvatarGroup.css'\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLUListElement> {\n /** Rótulo da lista (ex.: \"Pessoas com acesso\"). Obrigatório sem `aria-labelledby`. */\n label?: string\n /** Quantidade máxima de avatares visíveis; o restante vira o contador \"+N\". */\n max?: number\n /**\n * Total real de pessoas, quando apenas parte delas foi carregada. O contador\n * mostra `total - visíveis`.\n */\n total?: number\n /** Tamanho aplicado a todos os avatares. */\n size?: AvatarSize\n /** Forma aplicada a todos os avatares. */\n shape?: AvatarShape\n}\n\n/**\n * Avatares sobrepostos em uma lista rotulada, com contador \"+N\" para o\n * excedente. Os filhos devem ser `Avatar`.\n */\nexport const AvatarGroup = forwardRef<HTMLUListElement, AvatarGroupProps>(function AvatarGroup(\n { label, max, total, size = 'md', shape = 'square', className, children, ...rest },\n ref,\n) {\n const { t } = useLocale()\n devWarning(\n !label && !rest['aria-label'] && !rest['aria-labelledby'],\n 'AvatarGroup precisa de `label` (ou `aria-labelledby`) para nomear a lista.',\n )\n const items = Children.toArray(children).filter(isValidElement) as ReactElement<AvatarProps>[]\n const limit = max !== undefined && max > 0 && items.length > max ? max : items.length\n const visible = items.slice(0, limit)\n const hidden = items.slice(limit)\n const hiddenCount = Math.max(total ?? items.length, items.length) - visible.length\n const hiddenNames = hidden\n .map((el) => el.props.name ?? el.props.alt)\n .filter(Boolean)\n .join(', ')\n const context = useMemo(() => ({ size, shape }), [size, shape])\n\n return (\n <AvatarGroupContext.Provider value={context}>\n <ul\n ref={ref}\n role=\"list\"\n aria-label={label}\n className={cx('or-avatar-group', `or-avatar-group--${size}`, className)}\n {...rest}\n >\n {visible.map((child, index) => (\n <li key={child.key ?? index} className=\"or-avatar-group__item\">\n {child}\n </li>\n ))}\n {hiddenCount > 0 && (\n <li className=\"or-avatar-group__item\">\n <span\n className={cx('or-avatar', `or-avatar--${size}`, `or-avatar--${shape}`, 'or-avatar-group__more')}\n role=\"img\"\n aria-label={t('avatarMore', { count: hiddenCount })}\n title={hiddenNames || undefined}\n >\n <span className=\"or-avatar__frame\" aria-hidden=\"true\">\n <span className=\"or-avatar__initials\">+{hiddenCount}</span>\n </span>\n </span>\n </li>\n )}\n </ul>\n </AvatarGroupContext.Provider>\n )\n})\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useState,\n type ButtonHTMLAttributes,\n type MouseEvent,\n type RefObject,\n} from 'react'\nimport { usePresence, useReducedMotion } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { canUseDOM, cx, mergeRefs } from '../../utils'\nimport './BackToTop.css'\n\ntype ElementTarget = HTMLElement | null | RefObject<HTMLElement | null> | (() => HTMLElement | null)\n\nexport interface BackToTopProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n /** Distância rolada (px) a partir da qual o botão aparece. Padrão: 400. */\n threshold?: number\n /**\n * Elemento que recebe o foco depois de voltar ao topo. Aceita elemento, ref,\n * função ou seletor CSS. Padrão: o `<main>` da página ou o `<body>`.\n */\n focusTarget?: ElementTarget | string\n /**\n * Contêiner rolável observado. Padrão: a janela. Use quando o conteúdo rola\n * dentro de um painel com `overflow: auto`.\n */\n scrollContainer?: ElementTarget\n /**\n * `fixed` (padrão) prende o botão no canto da janela; `sticky` o mantém no\n * fim do contêiner rolável (posicione-o como último filho).\n */\n position?: 'fixed' | 'sticky'\n /** Mostra o rótulo ao lado do ícone. Padrão: só o ícone (com `aria-label`). */\n showLabel?: boolean\n /** Rótulo. Padrão: `t('backToTop')` — \"Voltar ao topo\". */\n label?: string\n}\n\nfunction resolve(target: ElementTarget | string | undefined): HTMLElement | null {\n if (!canUseDOM || target == null) return null\n if (typeof target === 'string') return document.querySelector<HTMLElement>(target)\n if (typeof target === 'function') return target()\n if ('current' in target) return target.current\n return target\n}\n\nfunction focusElement(el: HTMLElement) {\n const focusable = el.matches('a[href], button, input, select, textarea, [tabindex]')\n if (!focusable) {\n el.setAttribute('tabindex', '-1')\n el.addEventListener('blur', () => el.removeAttribute('tabindex'), { once: true })\n }\n el.focus({ preventScroll: true })\n}\n\n/**\n * Botão \"Voltar ao topo\": aparece depois que a página é rolada além de\n * `threshold`, rola suavemente até o início (instantâneo com movimento\n * reduzido) e devolve o foco ao início do conteúdo.\n */\nexport const BackToTop = forwardRef<HTMLButtonElement, BackToTopProps>(function BackToTop(\n {\n threshold = 400,\n focusTarget,\n scrollContainer,\n position = 'fixed',\n showLabel = false,\n label,\n className,\n onClick,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const reducedMotion = useReducedMotion()\n const [visible, setVisible] = useState(false)\n const text = label ?? t('backToTop')\n\n const getScroller = useCallback((): HTMLElement | Window | null => {\n if (!canUseDOM) return null\n return scrollContainer === undefined ? window : resolve(scrollContainer)\n }, [scrollContainer])\n\n useEffect(() => {\n const scroller = getScroller()\n if (!scroller) return\n const update = () => {\n const top = scroller === window ? window.scrollY : (scroller as HTMLElement).scrollTop\n setVisible(top > threshold)\n }\n update()\n scroller.addEventListener('scroll', update, { passive: true })\n return () => scroller.removeEventListener('scroll', update)\n }, [getScroller, threshold])\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n const scroller = getScroller()\n if (!scroller) return\n if (typeof scroller.scrollTo === 'function') {\n scroller.scrollTo({ top: 0, behavior: reducedMotion ? 'auto' : 'smooth' })\n } else {\n ;(scroller as HTMLElement).scrollTop = 0\n }\n const target =\n resolve(focusTarget) ??\n (scroller === window ? document.querySelector<HTMLElement>('main') : (scroller as HTMLElement)) ??\n document.body\n focusElement(target)\n }\n\n // Entra e sai com animação: continua montado até a saída terminar.\n const presence = usePresence<HTMLButtonElement>(visible)\n if (!presence.present) return null\n\n return (\n <button\n ref={mergeRefs(ref, presence.nodeRef)}\n type=\"button\"\n className={cx(\n 'or-back-to-top',\n `or-back-to-top--${position}`,\n showLabel && 'or-back-to-top--labeled',\n className,\n )}\n data-state={presence.state}\n aria-label={showLabel ? undefined : text}\n onClick={handleClick}\n {...rest}\n >\n <Icon name=\"arrow-up\" className=\"or-back-to-top__icon\" />\n {showLabel && <span className=\"or-back-to-top__label\">{text}</span>}\n </button>\n )\n})\n","import {\n cloneElement,\n forwardRef,\n isValidElement,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useId, useIsomorphicLayoutEffect, usePresence } from '../../hooks'\nimport { cx, mergeRefs } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Badge.css'\n\nexport type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info'\nexport type BadgeSize = 'sm' | 'md'\n\nexport interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {\n /** Número exibido. Com `0`, o badge some (a menos que `showZero`). */\n count?: number\n /** Valor máximo exibido; acima dele mostra `max+`. Padrão: 99. */\n max?: number\n /** Mostra apenas um ponto (sem número). */\n dot?: boolean\n /** Cor semântica. Padrão: `accent`. */\n tone?: BadgeTone\n /** Tamanho: `sm` ou `md` (padrão). */\n size?: BadgeSize\n /**\n * Texto acessível completo (ex.: \"3 notificações não lidas\"). Sem ele, o\n * leitor de tela ouve apenas o número; pontos sem `label` são decorativos.\n */\n label?: string\n /** Mantém o badge visível quando `count` é 0. */\n showZero?: boolean\n /** Forma do elemento ancorado, para ajustar a posição do badge. */\n overlap?: 'square' | 'circle'\n /** Anel pulsante (\"ao vivo\"), útil com `dot`. Desligado em movimento reduzido. */\n pulse?: boolean\n /**\n * Elemento sobre o qual o badge é posicionado (canto superior direito).\n * O `label` é ligado a ele via `aria-describedby`.\n */\n children?: ReactNode\n}\n\n/**\n * Indicador numérico ou ponto, inline ou sobreposto a outro elemento\n * (ícone, botão, avatar).\n */\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n {\n count,\n max = 99,\n dot = false,\n tone = 'accent',\n size = 'md',\n label,\n showZero = false,\n overlap = 'square',\n pulse = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const descriptionId = useId('or-badge')\n const hasCount = typeof count === 'number' && !Number.isNaN(count)\n const visible = dot || (hasCount && (count > 0 || showZero))\n const display = dot || !hasCount ? '' : count > max ? `${max}+` : String(count)\n const anchored = children !== undefined && children !== null\n const anchorElement = anchored && isValidElement<{ 'aria-describedby'?: string }>(children) ? children : null\n\n // Movimento: nada na primeira renderização; \"pop\" quando o badge surge;\n // \"bump\" quando a contagem muda; saída animada via usePresence.\n const { present, state, nodeRef } = usePresence<HTMLSpanElement>(visible)\n const composedRef = useMemo(() => mergeRefs(ref, nodeRef), [ref, nodeRef])\n const [motion, setMotion] = useState<'pop' | 'bump' | undefined>(undefined)\n const [shownDisplay, setShownDisplay] = useState(display)\n const previous = useRef({ visible, display })\n useIsomorphicLayoutEffect(() => {\n const prev = previous.current\n if (visible && !prev.visible) setMotion('pop')\n else if (visible && display !== prev.display) setMotion('bump')\n if (visible) setShownDisplay(display)\n previous.current = { visible, display }\n }, [visible, display])\n // Durante a saída, mantém o último número em vez de mostrar \"0\".\n const text = visible ? display : shownDisplay\n const leaving = !visible\n\n const classes = cx(\n 'or-badge',\n `or-badge--${tone}`,\n `or-badge--${size}`,\n dot && 'or-badge--dot',\n pulse && 'or-badge--pulse',\n anchored && 'or-badge--overlay',\n anchored && `or-badge--overlap-${overlap}`,\n className,\n )\n\n // Badge sobre um elemento interativo: a informação vira descrição dele.\n if (anchorElement) {\n const description = label ?? display\n const describedBy = [anchorElement.props['aria-describedby'], visible && description ? descriptionId : undefined]\n .filter(Boolean)\n .join(' ')\n return (\n <span className=\"or-badge-anchor\">\n {cloneElement(anchorElement as ReactElement<{ 'aria-describedby'?: string }>, {\n 'aria-describedby': describedBy || undefined,\n })}\n {present && (\n <span\n key={text}\n ref={composedRef}\n className={classes}\n data-state={state}\n data-motion={motion}\n aria-hidden=\"true\"\n {...rest}\n >\n {text}\n </span>\n )}\n {visible && description && (\n <span id={descriptionId} hidden>\n {description}\n </span>\n )}\n </span>\n )\n }\n\n const indicator = present ? (\n <span\n key={text}\n ref={composedRef}\n className={classes}\n data-state={state}\n data-motion={motion}\n aria-hidden={leaving || (!label && dot) ? true : undefined}\n {...rest}\n >\n {label ? (\n <>\n {text && <span aria-hidden=\"true\">{text}</span>}\n <VisuallyHidden>{label}</VisuallyHidden>\n </>\n ) : (\n text\n )}\n </span>\n ) : null\n\n if (anchored) {\n return (\n <span className=\"or-badge-anchor\">\n {children}\n {indicator}\n </span>\n )\n }\n return indicator\n})\n","import { forwardRef, useRef, type ElementType, type HTMLAttributes, type ReactNode } from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport {\n feedbackIcons,\n feedbackLabelKeys,\n liveRoleFor,\n moveFocusOutOf,\n useFeedbackPresence,\n type FeedbackTone,\n} from '../Alert/feedback'\nimport { Button } from '../Button'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Banner.css'\n\nexport type BannerTone = FeedbackTone\nexport type BannerVariant = 'default' | 'accent'\n\nexport interface BannerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Cor semântica e ícone (variante `default`). */\n tone?: BannerTone\n /**\n * `default`: faixa compacta com fundo do tom, para avisos do sistema.\n * `accent`: chamada com borda laranja e título grande (anúncios, convites).\n */\n variant?: BannerVariant\n /** Título curto. Na variante `accent`, é exibido em destaque. */\n title?: ReactNode\n /** Nível de heading do título (`2`–`6`). Sem esta prop, o título é um parágrafo. */\n headingLevel?: 2 | 3 | 4 | 5 | 6\n /** Substitui o ícone do tom. `false` remove o ícone (padrão na variante `accent`). */\n icon?: ReactNode | false\n /** Ação principal: um link ou `Button`. */\n action?: ReactNode\n /** Mostra o botão de fechar. */\n dismissible?: boolean\n /** Chamado ao clicar em fechar. */\n onDismiss?: () => void\n /** Visibilidade controlada. Sem esta prop, o Banner se esconde sozinho ao ser fechado. */\n open?: boolean\n /**\n * Para avisos que surgem com a página já aberta (ex.: queda de conexão):\n * `role=\"alert\"` em `danger`/`warning`, `role=\"status\"` nos demais tons.\n */\n live?: boolean\n /**\n * Indicador \"ao vivo\": o ícone ganha um anel pulsando na cor do tom — para\n * situações em andamento (incidente, manutenção acontecendo agora). O\n * movimento é só um reforço: o texto precisa dizer que é ao vivo.\n */\n pulse?: boolean\n}\n\n/**\n * Faixa de largura total para avisos do sistema ou da página — manutenção,\n * instabilidade, prazos, convites. Fica no topo, acima do conteúdo.\n */\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(\n {\n tone = 'info',\n variant = 'default',\n title,\n headingLevel,\n icon,\n action,\n dismissible = false,\n onDismiss,\n open,\n live = false,\n pulse = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const rootRef = useRef<HTMLDivElement>(null)\n const { present, state, nodeRef, enter, hide } = useFeedbackPresence(open, live)\n if (!present) return null\n\n const isAccent = variant === 'accent'\n const labelKey = isAccent ? null : feedbackLabelKeys[tone]\n const role = live ? liveRoleFor(isAccent ? 'info' : tone) : undefined\n const TitleTag: ElementType = headingLevel ? `h${headingLevel}` : 'p'\n const iconNode =\n icon === false\n ? null\n : (icon ?? (isAccent ? null : <Icon name={feedbackIcons[tone]} size=\"md\" />))\n\n const dismiss = () => {\n // o foco sai antes da animação de saída começar\n moveFocusOutOf(rootRef.current)\n hide()\n onDismiss?.()\n }\n\n return (\n // Invólucro de presença: na saída, recolhe a altura (grid 1fr → 0fr) enquanto o Banner esmaece.\n <div ref={nodeRef} className=\"or-banner-presence\" data-state={state}>\n <div className=\"or-banner-presence__inner\">\n <div\n ref={mergeRefs(ref, rootRef)}\n className={cx(\n 'or-banner',\n `or-banner--${variant}`,\n !isAccent && `or-banner--${tone}`,\n enter && 'or-banner--enter',\n className,\n )}\n {...rest}\n >\n {iconNode && (\n <span\n className={cx('or-banner__icon', pulse && 'or-banner__icon--pulse or-pulse')}\n aria-hidden=\"true\"\n >\n {iconNode}\n </span>\n )}\n <div className=\"or-banner__content\" role={role} aria-atomic={role ? true : undefined}>\n {labelKey && <VisuallyHidden>{`${t(labelKey)}: `}</VisuallyHidden>}\n {title && <TitleTag className=\"or-banner__title\">{title}</TitleTag>}\n {children && <div className=\"or-banner__body\">{children}</div>}\n </div>\n {action && <div className=\"or-banner__action\">{action}</div>}\n {dismissible && (\n <Button\n className=\"or-banner__close\"\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={t('close')}\n startIcon={<Icon name=\"close\" size=\"sm\" />}\n onClick={dismiss}\n />\n )}\n </div>\n </div>\n </div>\n )\n})\n","/**\n * Peças internas compartilhadas pelos gráficos (BarChart e LineChart): figura com\n * legenda, tabela de dados alternativa, dica, região de anúncio e os hooks de\n * largura, movimento e exploração por teclado. Não são exportadas pela biblioteca.\n */\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type RefCallback,\n} from 'react'\nimport {\n useEscapeKey,\n useId,\n useInView,\n useIsomorphicLayoutEffect,\n useReducedMotion,\n} from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './ChartFrame.css'\n\n/* --- Formas e traços ------------------------------------------------------ */\n\nexport type ChartMarkerShape = 'circle' | 'square' | 'triangle' | 'diamond' | 'triangle-down'\n\n/** Marcador de cada série, na ordem: a forma reforça a cor (nunca só a cor). */\nexport const MARKER_SHAPES: ChartMarkerShape[] = [\n 'circle',\n 'square',\n 'triangle',\n 'diamond',\n 'triangle-down',\n]\n\n/** Traço de cada série de linha, na ordem (a primeira é contínua). Pontas redondas: `0.1` vira um ponto. */\nexport const LINE_DASHES = ['', '6 5', '0.1 4.5', '10 5 0.1 5', '14 6']\n\n/** Contorno do marcador como `path` (um só elemento, fácil de animar e de contornar). */\nexport function markerPath(shape: ChartMarkerShape, cx: number, cy: number, r: number): string {\n switch (shape) {\n case 'square': {\n const s = r * 1.8\n return `M${cx - s / 2} ${cy - s / 2}h${s}v${s}h${-s}Z`\n }\n case 'triangle':\n return `M${cx} ${cy - r * 1.25}L${cx + r * 1.2} ${cy + r * 0.85}H${cx - r * 1.2}Z`\n case 'triangle-down':\n return `M${cx} ${cy + r * 1.25}L${cx + r * 1.2} ${cy - r * 0.85}H${cx - r * 1.2}Z`\n case 'diamond':\n return `M${cx} ${cy - r * 1.3}L${cx + r * 1.3} ${cy}L${cx} ${cy + r * 1.3}L${cx - r * 1.3} ${cy}Z`\n default:\n return `M${cx - r} ${cy}a${r} ${r} 0 1 0 ${2 * r} 0a${r} ${r} 0 1 0 ${-2 * r} 0Z`\n }\n}\n\n/** Cor da série como custom property (`--_color`), lida pelo CSS das marcas. */\nexport const colorStyle = (color: string) => ({ '--_color': color }) as CSSProperties\n\n/* --- Hooks ---------------------------------------------------------------- */\n\n/**\n * Largura do elemento, acompanhada com ResizeObserver. Enquanto não há medida\n * (servidor, jsdom), usa `fallback`.\n */\nexport function useElementWidth<T extends HTMLElement>(fallback = 640): [RefCallback<T>, number] {\n const [node, setNode] = useState<T | null>(null)\n const [width, setWidth] = useState(0)\n useIsomorphicLayoutEffect(() => {\n if (!node) return\n setWidth(Math.floor(node.getBoundingClientRect().width))\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver((entries) => {\n const next = entries[0]?.contentRect.width\n if (next !== undefined) setWidth(Math.floor(next))\n })\n observer.observe(node)\n return () => observer.disconnect()\n }, [node])\n return [setNode, width > 0 ? width : fallback]\n}\n\n/**\n * Estado da entrada dos gráficos:\n * - `static`: tudo desenhado, sem animação (servidor, movimento reduzido, sem IntersectionObserver);\n * - `pending`: marcas recolhidas, esperando o gráfico entrar na tela;\n * - `enter`: animação de entrada (uma vez).\n */\nexport type ChartMotionState = 'static' | 'pending' | 'enter'\n\nexport function useChartMotion<T extends Element>(): [RefCallback<T>, ChartMotionState] {\n const reduced = useReducedMotion()\n const [ref, inView] = useInView<T>({ threshold: 0.15, rootMargin: '0px' })\n const [state, setState] = useState<ChartMotionState>('static')\n const armed = useRef(false)\n // Antes da primeira pintura: nada \"pisca\" (desenhado → recolhido → crescendo).\n useIsomorphicLayoutEffect(() => {\n if (armed.current || reduced || typeof IntersectionObserver === 'undefined') return\n armed.current = true\n setState(inView ? 'enter' : 'pending')\n }, [reduced, inView])\n useEffect(() => {\n if (inView) setState((s) => (s === 'pending' ? 'enter' : s))\n }, [inView])\n return [ref, reduced ? 'static' : state]\n}\n\nexport interface ChartActive {\n /** Categoria (barra, ponto do eixo X). */\n index: number\n /** Série dentro da categoria. */\n series: number\n /** Quem moveu o destaque: teclado (anuncia) ou ponteiro (só a dica). */\n source: 'keyboard' | 'pointer'\n}\n\nexport interface ChartExplorerOptions {\n count: number\n seriesCount: number\n /** Teclas que avançam/voltam a categoria e a série. */\n keys: { next: string; prev: string; seriesNext: string; seriesPrev: string }\n /** Texto anunciado ao mover pelo teclado (\"mar · Vendas: R$ 12.400\"). */\n describe: (index: number, series: number) => string\n}\n\n/**\n * Destaque compartilhado por teclado e ponteiro. As setas movem o destaque e a\n * região `status` anuncia o valor; Escape limpa. O ponteiro só mostra a dica.\n */\nexport function useChartExplorer({ count, seriesCount, keys, describe }: ChartExplorerOptions) {\n const [active, setActiveState] = useState<ChartActive | null>(null)\n // A dica continua com o último conteúdo enquanto some (transição de saída).\n const [last, setLast] = useState<ChartActive | null>(null)\n const [announcement, setAnnouncement] = useState('')\n\n // Espelho síncrono: teclas repetidas (tecla segurada) no mesmo quadro partem do valor mais novo.\n const activeRef = useRef<ChartActive | null>(null)\n\n const setActive = useCallback((next: ChartActive | null) => {\n activeRef.current = next\n setActiveState(next)\n if (next) setLast(next)\n }, [])\n\n // Dados mudaram (filtro): o destaque não pode apontar para fora.\n useEffect(() => {\n if (active && (active.index >= count || active.series >= seriesCount)) setActive(null)\n }, [active, count, seriesCount, setActive])\n\n const move = (index: number, series: number) => {\n setActive({ index, series, source: 'keyboard' })\n setAnnouncement(describe(index, series))\n }\n\n const onKeyDown = (event: KeyboardEvent<Element>) => {\n if (count === 0) return\n const current = activeRef.current\n const index = current?.index\n const series = current?.series ?? 0\n const lastIndex = count - 1\n switch (event.key) {\n case keys.next:\n move(index === undefined ? 0 : Math.min(lastIndex, index + 1), series)\n break\n case keys.prev:\n move(index === undefined ? lastIndex : Math.max(0, index - 1), series)\n break\n case keys.seriesNext:\n move(index ?? 0, current ? Math.min(seriesCount - 1, series + 1) : 0)\n break\n case keys.seriesPrev:\n move(index ?? 0, current ? Math.max(0, series - 1) : 0)\n break\n case 'Home':\n move(0, series)\n break\n case 'End':\n move(lastIndex, series)\n break\n case 'Escape':\n if (!current) return\n setActive(null)\n setAnnouncement('')\n // Não fecha também o diálogo/painel em volta.\n event.stopPropagation()\n break\n default:\n return\n }\n event.preventDefault()\n }\n\n const onBlur = () => {\n if (activeRef.current?.source === 'keyboard') setActive(null)\n }\n\n const onPointerLeave = () => {\n if (active?.source === 'pointer') setActive(null)\n }\n\n const point = (index: number, series: number) => {\n if (active?.source === 'pointer' && active.index === index && active.series === series) return\n setActive({ index, series, source: 'pointer' })\n }\n\n // WCAG 1.4.13: a dica do hover some com Escape sem mover o ponteiro.\n useEscapeKey(() => setActive(null), active?.source === 'pointer')\n\n return { active, last, announcement, point, handlers: { onKeyDown, onBlur, onPointerLeave } }\n}\n\n/* --- Legenda -------------------------------------------------------------- */\n\nexport interface ChartLegendItem {\n label: string\n color: string\n /** `bar`: quadrado; `line`: traço com o marcador da série. */\n mark: 'bar' | 'line'\n dash?: string\n shape?: ChartMarkerShape\n}\n\nexport function ChartLegend({ items }: { items: ChartLegendItem[] }) {\n const { t } = useLocale()\n return (\n <ul className=\"or-chart__legend\" role=\"list\" aria-label={t('chartLegend')}>\n {items.map((item, i) => (\n <li\n key={`${item.label}-${i}`}\n className=\"or-chart__legend-item\"\n style={colorStyle(item.color)}\n >\n {item.mark === 'line' ? (\n <svg\n className=\"or-chart__swatch\"\n width=\"28\"\n height=\"14\"\n viewBox=\"0 0 28 14\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <line\n className=\"or-chart__swatch-line\"\n x1=\"1\"\n x2=\"27\"\n y1=\"7\"\n y2=\"7\"\n strokeDasharray={item.dash || undefined}\n />\n <path\n className=\"or-chart__swatch-marker\"\n d={markerPath(item.shape ?? 'circle', 14, 7, 4)}\n />\n </svg>\n ) : (\n <svg\n className=\"or-chart__swatch\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect className=\"or-chart__swatch-fill\" width=\"12\" height=\"12\" />\n </svg>\n )}\n {item.label}\n </li>\n ))}\n </ul>\n )\n}\n\n/* --- Dica ----------------------------------------------------------------- */\n\nexport interface ChartTooltipRow {\n key: string\n label: string\n value: string\n color: string\n active?: boolean\n}\n\nexport interface ChartTooltipProps {\n open: boolean\n /** Âncora em px, relativa à área do gráfico. */\n x: number\n y: number\n /** Largura da área do gráfico (para não vazar pelas bordas). */\n width: number\n title: string\n rows: ChartTooltipRow[]\n /** Linha extra no fim (ex.: total da pilha). */\n footer?: { label: string; value: string }\n}\n\n/** Dica visual (o leitor de tela ouve a região `status` e tem a tabela). */\nexport function ChartTooltip({ open, x, y, width, title, rows, footer }: ChartTooltipProps) {\n const edge = Math.min(88, width / 3)\n const align = x < edge ? 'start' : x > width - edge ? 'end' : 'center'\n return (\n <div\n className=\"or-chart__tooltip\"\n data-state={open ? 'open' : 'closed'}\n data-align={align}\n aria-hidden=\"true\"\n style={{ '--_x': `${Math.round(x)}px`, '--_y': `${Math.round(y)}px` } as CSSProperties}\n >\n <p className=\"or-chart__tooltip-title\">{title}</p>\n <ul className=\"or-chart__tooltip-list\">\n {rows.map((row) => (\n <li\n key={row.key}\n className=\"or-chart__tooltip-row\"\n data-active={row.active || undefined}\n style={colorStyle(row.color)}\n >\n <span className=\"or-chart__tooltip-key\" />\n <strong className=\"or-chart__tooltip-value\">{row.value}</strong>\n <span className=\"or-chart__tooltip-label\">{row.label}</span>\n </li>\n ))}\n {footer && (\n <li className=\"or-chart__tooltip-row or-chart__tooltip-row--footer\">\n <span className=\"or-chart__tooltip-key\" />\n <strong className=\"or-chart__tooltip-value\">{footer.value}</strong>\n <span className=\"or-chart__tooltip-label\">{footer.label}</span>\n </li>\n )}\n </ul>\n </div>\n )\n}\n\n/* --- Figura --------------------------------------------------------------- */\n\nexport interface ChartTableData {\n /** Cabeçalho da primeira coluna (as categorias). */\n categoryLabel: string\n columns: string[]\n rows: { label: string; cells: (number | null)[] }[]\n format: (value: number) => string\n}\n\nexport type ChartVariant = 'outline' | 'plain'\n\n/** Props comuns a BarChart e LineChart. */\nexport interface ChartBaseProps extends Omit<HTMLAttributes<HTMLElement>, 'title' | 'children'> {\n /** Título do gráfico: diz o quê. Vira o `<figcaption>` e o nome do gráfico. */\n title: string\n /** Subtítulo visível: quando e em que unidade (\"R$ mil por mês · 2026\"). */\n description?: ReactNode\n /** Resumo em texto para leitores de tela (a conclusão). Padrão: gerado a partir dos dados. */\n summary?: string\n /** Fonte dos dados, abaixo do gráfico. */\n source?: ReactNode\n /** Esconde o título e o subtítulo visualmente (continuam no `<figcaption>`). */\n hideCaption?: boolean\n /** `outline` (padrão): borda de 1px e respiro interno. `plain`: sem moldura, para cartões. */\n variant?: ChartVariant\n /** Altura da área do gráfico em px, incluindo os rótulos dos eixos. */\n height?: number\n /** Formato dos números: função ou opções do `Intl.NumberFormat` (ex.: `{ style: 'currency', currency: 'BRL' }`). */\n valueFormat?: ((value: number) => string) | Intl.NumberFormatOptions\n /** Cabeçalho da coluna de categorias na tabela de dados (ex.: \"Mês\"). */\n categoryLabel?: string\n /** Começa com a tabela de dados visível. */\n defaultShowData?: boolean\n}\n\ninterface ChartFigureProps extends Omit<HTMLAttributes<HTMLElement>, 'title' | 'children'> {\n title: string\n description?: ReactNode\n source?: ReactNode\n hideCaption?: boolean\n variant: ChartVariant\n motion: ChartMotionState\n legend?: ChartLegendItem[]\n table: ChartTableData\n announcement?: string\n /** Id da instrução de teclado (referenciada pelo `aria-describedby` do gráfico). */\n hintId?: string\n defaultShowData?: boolean\n children: ReactNode\n}\n\n/**\n * `<figure>` com título/subtítulo no `<figcaption>`, legenda acima do gráfico\n * (2+ séries), fonte, botão \"Ver dados\" e a tabela alternativa — sempre no DOM\n * para leitores de tela; o botão só a mostra visualmente.\n */\nexport const ChartFigure = forwardRef<HTMLElement, ChartFigureProps>(function ChartFigure(\n {\n title,\n description,\n source,\n hideCaption,\n variant,\n motion,\n legend,\n table,\n announcement,\n hintId,\n defaultShowData = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const dataId = useId('or-chart-data')\n const titleId = useId('or-chart-title')\n const [showData, setShowData] = useState(defaultShowData)\n const caption = t('chartDataCaption', { title })\n\n return (\n <figure\n ref={ref}\n className={cx('or-chart', `or-chart--${variant}`, className)}\n data-motion={motion}\n aria-labelledby={titleId}\n {...rest}\n >\n <figcaption className={cx('or-chart__caption', hideCaption && 'or-visually-hidden')}>\n <span id={titleId} className=\"or-chart__title\">\n {title}\n </span>\n {description && <span className=\"or-chart__description\">{description}</span>}\n </figcaption>\n {legend && legend.length > 1 && <ChartLegend items={legend} />}\n <div className=\"or-chart__body\">{children}</div>\n {hintId && (\n <VisuallyHidden id={hintId} className=\"or-chart__hint\">\n {t('chartKeyboardHint')}\n </VisuallyHidden>\n )}\n <VisuallyHidden role=\"status\" className=\"or-chart__live\">\n {announcement}\n </VisuallyHidden>\n {source && <p className=\"or-chart__source\">{source}</p>}\n <button\n type=\"button\"\n className=\"or-chart__toggle\"\n aria-expanded={showData}\n aria-controls={dataId}\n onClick={() => setShowData((v) => !v)}\n >\n <span>{showData ? t('chartHideData') : t('chartShowData')}</span>\n <Icon name=\"chevron-down\" size={16} className=\"or-chart__toggle-icon\" />\n </button>\n {/* Recolhida, a tabela fica com altura 0 mas continua na árvore de acessibilidade. */}\n <div\n id={dataId}\n className=\"or-collapse or-chart__data\"\n data-state={showData ? 'open' : 'closed'}\n >\n <div>\n <div\n className=\"or-chart__table-scroll\"\n {...(showData ? { tabIndex: 0, role: 'region', 'aria-label': caption } : null)}\n >\n <table className=\"or-chart__table\">\n <caption className=\"or-visually-hidden\">{caption}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{table.categoryLabel}</th>\n {table.columns.map((column, i) => (\n <th key={`${column}-${i}`} scope=\"col\" className=\"or-chart__num\">\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {table.rows.map((row, ri) => (\n <tr key={`${row.label}-${ri}`}>\n <th scope=\"row\">{row.label}</th>\n {row.cells.map((cell, ci) => (\n <td key={ci} className=\"or-chart__num\">\n {cell === null ? (\n <>\n <span aria-hidden=\"true\">—</span>\n <VisuallyHidden>{t('chartNoData')}</VisuallyHidden>\n </>\n ) : (\n table.format(cell)\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </figure>\n )\n})\n","/**\n * Utilitários internos dos gráficos (BarChart, LineChart, Sparkline).\n * Não são exportados pela biblioteca.\n */\n\n/** Formato dos valores: uma função ou opções de `Intl.NumberFormat` (ex.: moeda BRL). */\nexport type ChartValueFormat = ((value: number) => string) | Intl.NumberFormatOptions\n\n/** Uma série do gráfico: chave em `values`, rótulo e cor opcional. */\nexport interface ChartSeries {\n /** Chave do valor em `data[i].values`. */\n key: string\n /** Nome da série (legenda, dica, tabela). */\n label: string\n /** Cor da série. Padrão: `--or-color-viz-1…5`, na ordem das séries. */\n color?: string\n}\n\n/** Uma categoria (barra ou ponto do eixo X) com o valor de cada série. */\nexport interface ChartDatum {\n /** Rótulo da categoria: mês, canal, região… */\n label: string\n /** Valor de cada série pela `key`. `null`/ausente = sem dado. */\n values: Record<string, number | null | undefined>\n}\n\n/** Quantidade de cores categóricas: a partir da sexta série, use \"Outros\". */\nexport const VIZ_CATEGORICAL_COUNT = 5\n\n/** Cor da série na posição `index`: a da própria série ou o token categórico. */\nexport function seriesColor(series: Pick<ChartSeries, 'color'>, index: number): string {\n if (series.color) return series.color\n return index < VIZ_CATEGORICAL_COUNT\n ? `var(--or-color-viz-${index + 1})`\n : 'var(--or-color-viz-other)'\n}\n\n/** Número finito ou `null` (ausente, `NaN`, `Infinity`). */\nexport function valueOf(datum: ChartDatum, key: string): number | null {\n const value = datum.values[key]\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\nfunction numberFormat(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n try {\n return new Intl.NumberFormat(locale, options)\n } catch {\n return new Intl.NumberFormat('pt-BR', options)\n }\n}\n\n/** Formata valores completos (dica, tabela, anúncios). */\nexport function createValueFormatter(\n locale: string,\n format?: ChartValueFormat,\n): (value: number) => string {\n if (typeof format === 'function') return format\n const formatter = numberFormat(locale, format)\n return (value) => formatter.format(value)\n}\n\n/** Casas decimais de um número (`0.25` → 2). */\nfunction decimalsOf(value: number): number {\n if (!Number.isFinite(value) || Number.isInteger(value)) return 0\n const text = String(value)\n const exp = text.match(/e-(\\d+)$/)\n if (exp) return Number(exp[1])\n return text.split('.')[1]?.length ?? 0\n}\n\n/**\n * Formata os rótulos do eixo: mesmos estilo e moeda de `format`, sem casas decimais\n * desnecessárias e compactos (10 mil / 10K) quando o eixo chega a 10.000.\n */\nexport function createAxisFormatter(\n locale: string,\n format: ChartValueFormat | undefined,\n ticks: number[],\n step: number,\n): (value: number) => string {\n if (typeof format === 'function') return format\n const options: Intl.NumberFormatOptions = { ...format }\n delete options.minimumSignificantDigits\n delete options.maximumSignificantDigits\n const maxAbs = Math.max(0, ...ticks.map(Math.abs))\n if (!options.notation && maxAbs >= 10_000) {\n options.notation = 'compact'\n options.minimumFractionDigits = 0\n options.maximumFractionDigits = 1\n } else {\n const decimals = Math.max(0, decimalsOf(step) - (options.style === 'percent' ? 2 : 0))\n options.minimumFractionDigits = 0\n options.maximumFractionDigits = decimals\n }\n const formatter = numberFormat(locale, options)\n return (value) => formatter.format(value)\n}\n\nconst round = (value: number) => Number.parseFloat(value.toPrecision(12))\n\nexport interface NiceScale {\n min: number\n max: number\n step: number\n ticks: number[]\n}\n\n/**\n * Escala \"redonda\" para o eixo: passos de 1, 2, 2,5 ou 5 × 10ⁿ, cobrindo [min, max].\n * `target` é a quantidade aproximada de intervalos.\n */\nexport function niceScale(min: number, max: number, target = 4): NiceScale {\n let lo = Math.min(min, max)\n let hi = Math.max(min, max)\n if (!Number.isFinite(lo) || !Number.isFinite(hi)) {\n lo = 0\n hi = 1\n }\n if (lo === hi) {\n if (hi === 0) hi = 1\n else if (hi > 0) lo = 0\n else hi = 0\n }\n const rough = (hi - lo) / Math.max(1, target)\n const magnitude = 10 ** Math.floor(Math.log10(rough))\n const normalized = rough / magnitude\n const nice =\n normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 2.5 ? 2.5 : normalized <= 5 ? 5 : 10\n const step = round(nice * magnitude)\n const start = round(Math.floor(round(lo / step)) * step)\n const end = round(Math.ceil(round(hi / step)) * step)\n const ticks: number[] = []\n for (\n let i = 0, value = start;\n value <= end + step / 2 && i < 50;\n i++, value = round(start + i * step)\n ) {\n ticks.push(value)\n }\n return { min: start, max: end, step, ticks }\n}\n\n/** Quantidade de intervalos do eixo de valores para um comprimento em px. */\nexport function tickTarget(length: number): number {\n return Math.max(2, Math.min(6, Math.round(length / 56)))\n}\n\n/** Largura aproximada de um texto na fonte mono do eixo (12px: 0,6em por caractere). */\nexport function textWidth(text: string, fontSize = 12): number {\n return Math.ceil(text.length * fontSize * 0.6)\n}\n\n/** Encurta um texto (com reticências) para caber em `width` px na fonte mono. */\nexport function truncate(text: string, width: number, fontSize = 12): string {\n const max = Math.floor(width / (fontSize * 0.6))\n if (text.length <= max) return text\n return max <= 1 ? '…' : `${text.slice(0, max - 1).trimEnd()}…`\n}\n\n/** Junta nomes com a conjunção do idioma: \"Site, App e Marketplace\". */\nexport function formatList(locale: string, items: string[]): string {\n try {\n return new Intl.ListFormat(locale, { type: 'conjunction' }).format(items)\n } catch {\n return items.join(', ')\n }\n}\n\n/** Arredonda coordenadas a 2 casas (SVG mais limpo, sem 74.52000000000001). */\nexport const px = (value: number) => Math.round(value * 100) / 100\n\n/** Arredonda para meio pixel: linhas de 1px nítidas. */\nexport const crisp = (value: number) => Math.round(value) + 0.5\n\nexport interface ChartPoint {\n index: number\n series: number\n value: number\n}\n\n/** Maior e menor valor entre todas as séries (ignora vazios). */\nexport function extremes(\n data: ChartDatum[],\n series: ChartSeries[],\n): { max: ChartPoint; min: ChartPoint } | null {\n let max: ChartPoint | null = null\n let min: ChartPoint | null = null\n for (let index = 0; index < data.length; index++) {\n for (let si = 0; si < series.length; si++) {\n const value = valueOf(data[index], series[si].key)\n if (value === null) continue\n if (!max || value > max.value) max = { index, series: si, value }\n if (!min || value < min.value) min = { index, series: si, value }\n }\n }\n return max && min ? { max, min } : null\n}\n","import { forwardRef, useMemo, type CSSProperties, type PointerEvent, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport {\n ChartFigure,\n ChartTooltip,\n colorStyle,\n useChartExplorer,\n useChartMotion,\n useElementWidth,\n type ChartBaseProps,\n type ChartTooltipRow,\n} from './ChartFrame'\nimport {\n VIZ_CATEGORICAL_COUNT,\n createAxisFormatter,\n createValueFormatter,\n crisp,\n extremes,\n formatList,\n niceScale,\n px,\n seriesColor,\n textWidth,\n tickTarget,\n truncate,\n valueOf,\n type ChartDatum,\n type ChartSeries,\n} from './chartUtils'\nimport './BarChart.css'\n\nexport type BarChartOrientation = 'vertical' | 'horizontal'\nexport type BarChartLayout = 'grouped' | 'stacked'\nexport type BarChartSeries = ChartSeries\nexport type BarChartDatum = ChartDatum\n\nexport interface BarChartProps extends ChartBaseProps {\n /** Uma entrada por categoria: `{ label: 'jan', values: { site: 12400, app: 8100 } }`. */\n data: BarChartDatum[]\n /** Séries na ordem da legenda. As cores seguem `--or-color-viz-1…5`. */\n series: BarChartSeries[]\n /** `vertical` (colunas, padrão) ou `horizontal` (para rótulos longos). */\n orientation?: BarChartOrientation\n /** `grouped` (lado a lado, padrão) ou `stacked` (empilhadas, com total). */\n layout?: BarChartLayout\n /** Escreve o valor na ponta de cada barra (ou o total da pilha) quando couber. */\n showValues?: boolean\n /**\n * Destaca uma categoria (pelo `label`) com o acento; as demais ficam no neutro\n * `--or-color-viz-other`. Só para uma série. Ganha rótulo de valor.\n */\n highlight?: string\n}\n\ninterface Segment {\n series: number\n value: number | null\n start: number\n end: number\n}\n\nconst GAP = 2\nconst AXIS_BAND = 28\nconst DEFAULT_HEIGHT = 280\n\n/**\n * Gráfico de barras acessível, em SVG puro: compara quantidades entre categorias,\n * com eixo sempre a partir de zero. Agrupado ou empilhado, vertical ou horizontal.\n * Legenda com marcas, tabela de dados alternativa e exploração por teclado.\n */\nexport const BarChart = forwardRef<HTMLElement, BarChartProps>(function BarChart(\n {\n title,\n description,\n summary,\n source,\n hideCaption = false,\n variant = 'outline',\n height: heightProp,\n valueFormat,\n categoryLabel,\n defaultShowData,\n data,\n series,\n orientation = 'vertical',\n layout = 'grouped',\n showValues = false,\n highlight,\n ...rest\n },\n ref,\n) {\n const { t, locale } = useLocale()\n const hintId = useId('or-bar-chart-hint')\n const horizontal = orientation === 'horizontal'\n const stacked = layout === 'stacked'\n const n = data.length\n const k = series.length\n const format = createValueFormatter(locale, valueFormat)\n\n devWarning(\n k > VIZ_CATEGORICAL_COUNT && series.slice(VIZ_CATEGORICAL_COUNT).some((s) => !s.color),\n 'BarChart: a paleta categórica tem 5 cores. Agrupe a partir da sexta série em \"Outros\" ou divida o gráfico.',\n )\n\n const highlightIndex =\n highlight !== undefined && k === 1 ? data.findIndex((d) => d.label === highlight) : -1\n const colors = series.map((s, i) => seriesColor(s, i))\n const barColor = (index: number, si: number) =>\n highlightIndex >= 0\n ? index === highlightIndex\n ? 'var(--or-color-accent)'\n : 'var(--or-color-viz-other)'\n : colors[si]\n\n // Segmentos por categoria (em unidades de valor). Pilhas positivas e negativas crescem a partir de zero.\n const segments: Segment[][] = data.map((datum) => {\n let pos = 0\n let neg = 0\n return series.map((s, si) => {\n const value = valueOf(datum, s.key)\n if (value === null) return { series: si, value, start: 0, end: 0 }\n if (!stacked) return { series: si, value, start: 0, end: value }\n const start = value >= 0 ? pos : neg\n if (value >= 0) pos += value\n else neg += value\n return { series: si, value, start, end: start + value }\n })\n })\n const totals = data.map((datum) =>\n series.reduce<number | null>((sum, s) => {\n const value = valueOf(datum, s.key)\n return value === null ? sum : (sum ?? 0) + value\n }, null),\n )\n const ends = segments.flat().flatMap((seg) => [seg.start, seg.end])\n const domainMin = Math.min(0, ...ends)\n const domainMax = Math.max(0, ...ends)\n\n // Rótulos diretos: valor de cada barra (agrupado) ou total da pilha.\n const labelled = (index: number) => showValues || index === highlightIndex\n const anyLabels = showValues || highlightIndex >= 0\n const valueLabelOf = (index: number, si: number) => {\n const value = stacked && k > 1 ? totals[index] : segments[index][si].value\n return value === null ? '' : format(value)\n }\n\n // --- Geometria ---------------------------------------------------------\n const [plotRef, width] = useElementWidth<HTMLDivElement>()\n const rowHeight = stacked || k === 1 ? 36 : Math.max(36, k * 12 + (k - 1) * GAP + 16)\n const height = Math.max(\n 120,\n heightProp ?? (horizontal ? n * rowHeight + AXIS_BAND + 8 : DEFAULT_HEIGHT),\n )\n\n let top: number\n let left: number\n let right: number\n let plotW: number\n let plotH: number\n let scale = niceScale(domainMin, domainMax)\n\n const categoryWidths = data.map((d) => textWidth(d.label))\n const maxValueLabel = anyLabels\n ? Math.max(0, ...data.flatMap((_, i) => series.map((__, si) => textWidth(valueLabelOf(i, si)))))\n : 0\n\n if (horizontal) {\n top = 8\n plotH = height - top - AXIS_BAND\n left = Math.min(Math.max(...categoryWidths, 0) + 12, Math.round(width * 0.38))\n right = anyLabels ? maxValueLabel + 10 : 16\n plotW = Math.max(0, width - left - right)\n scale = niceScale(domainMin, domainMax, tickTarget(plotW))\n // O último rótulo do eixo é centralizado no fim: garante espaço para a metade dele.\n const axisProbe = createAxisFormatter(locale, valueFormat, scale.ticks, scale.step)\n const lastHalf = Math.ceil(textWidth(axisProbe(scale.max)) / 2)\n if (lastHalf > right) {\n right = lastHalf\n plotW = Math.max(0, width - left - right)\n }\n } else {\n top = anyLabels ? 22 : 10\n plotH = Math.max(0, height - top - AXIS_BAND)\n scale = niceScale(domainMin, domainMax, tickTarget(plotH))\n const probe = createAxisFormatter(locale, valueFormat, scale.ticks, scale.step)\n left = Math.max(...scale.ticks.map((tick) => textWidth(probe(tick)))) + 10\n right = 4\n plotW = Math.max(0, width - left - right)\n }\n\n const axisFormat = createAxisFormatter(locale, valueFormat, scale.ticks, scale.step)\n const span = scale.max - scale.min || 1\n const band = n ? (horizontal ? plotH : plotW) / n : 0\n const slots = stacked ? 1 : Math.max(1, k)\n const maxThickness = horizontal ? 24 : 56\n const groupSpan = band * (slots > 1 ? 0.78 : 0.62)\n const thickness = Math.max(1, Math.min(maxThickness, (groupSpan - GAP * (slots - 1)) / slots))\n const groupSize = thickness * slots + GAP * (slots - 1)\n const offset = (band - groupSize) / 2\n\n /** Posição (px) de um valor no eixo de valores. */\n const pos = (value: number) =>\n horizontal\n ? left + ((value - scale.min) / span) * plotW\n : top + ((scale.max - value) / span) * plotH\n /** Início (px) da categoria no eixo de categorias. */\n const bandStart = (index: number) => (horizontal ? top : left) + index * band\n const baseline = pos(0)\n\n interface BarRect {\n key: string\n series: number\n x: number\n y: number\n w: number\n h: number\n }\n\n const rects: BarRect[][] = segments.map((segs, index) =>\n segs.flatMap((seg) => {\n if (seg.value === null || seg.value === 0) return []\n const slot = stacked ? 0 : seg.series\n const cross = bandStart(index) + offset + slot * (thickness + GAP)\n let a = pos(seg.start)\n const b = pos(seg.end)\n // 2px de fundo entre segmentos empilhados (o lado voltado para a base recua).\n if (stacked && seg.start !== 0) {\n const towardBase = Math.sign(a - b) || 1\n a -= towardBase * GAP\n }\n const lo = Math.min(a, b)\n const length = Math.max(Math.abs(b - a), 1)\n return [\n horizontal\n ? {\n key: `${index}-${seg.series}`,\n series: seg.series,\n x: lo,\n y: cross,\n w: length,\n h: thickness,\n }\n : {\n key: `${index}-${seg.series}`,\n series: seg.series,\n x: cross,\n y: lo,\n w: thickness,\n h: length,\n },\n ]\n }),\n )\n\n // --- Exploração (teclado e ponteiro) -----------------------------------\n const describe = (index: number, si: number) => {\n const value = segments[index]?.[si]?.value\n return t('chartPoint', {\n category: data[index].label,\n series: series[si].label,\n value: value === null || value === undefined ? t('chartNoData') : format(value),\n })\n }\n const explorer = useChartExplorer({\n count: n,\n seriesCount: k,\n keys: horizontal\n ? { next: 'ArrowDown', prev: 'ArrowUp', seriesNext: 'ArrowRight', seriesPrev: 'ArrowLeft' }\n : stacked\n ? { next: 'ArrowRight', prev: 'ArrowLeft', seriesNext: 'ArrowUp', seriesPrev: 'ArrowDown' }\n : { next: 'ArrowRight', prev: 'ArrowLeft', seriesNext: 'ArrowDown', seriesPrev: 'ArrowUp' },\n describe,\n })\n const { active, last } = explorer\n\n const segmentAt = (index: number, value: number) => {\n const segs = segments[index]\n const hit = segs.find(\n (seg) =>\n seg.value !== null &&\n value >= Math.min(seg.start, seg.end) &&\n value <= Math.max(seg.start, seg.end),\n )\n if (hit) return hit.series\n const sameSide = segs.filter(\n (seg) => seg.value !== null && Math.sign(seg.value) === (value < 0 ? -1 : 1),\n )\n return (\n (sameSide[sameSide.length - 1] ?? segs.find((seg) => seg.value !== null) ?? segs[0])\n ?.series ?? 0\n )\n }\n\n const onPointer = (event: PointerEvent<SVGSVGElement>) => {\n if (!n || !band) return\n const box = event.currentTarget.getBoundingClientRect()\n const px = event.clientX - box.left\n const py = event.clientY - box.top\n const along = horizontal ? py - top : px - left\n const across = horizontal ? px : py\n if (along < 0 || along >= band * n) {\n explorer.handlers.onPointerLeave()\n return\n }\n const index = Math.min(n - 1, Math.floor(along / band))\n let si = 0\n if (k > 1) {\n if (stacked) {\n const value = horizontal\n ? scale.min + ((across - left) / (plotW || 1)) * span\n : scale.max - ((across - top) / (plotH || 1)) * span\n si = segmentAt(index, value)\n } else {\n const within = along - index * band - offset\n si = Math.max(0, Math.min(k - 1, Math.floor(within / (thickness + GAP))))\n }\n }\n explorer.point(index, si)\n }\n\n // --- Movimento ----------------------------------------------------------\n const [motionRef, motion] = useChartMotion<HTMLElement>()\n const rootRef = useMemo(() => mergeRefs(ref, motionRef), [ref, motionRef])\n const stagger = n > 8 ? 8 / n : 1\n\n // --- Textos acessíveis -------------------------------------------------\n const autoSummary = () => {\n const parts: string[] = []\n if (k > 1)\n parts.push(\n t('chartSeries', {\n series: formatList(\n locale,\n series.map((s) => s.label),\n ),\n }),\n )\n if (stacked && k > 1) {\n const valid = totals\n .map((total, index) => ({ total, index }))\n .filter((x): x is { total: number; index: number } => x.total !== null)\n if (valid.length) {\n const max = valid.reduce((a, b) => (b.total > a.total ? b : a))\n const min = valid.reduce((a, b) => (b.total < a.total ? b : a))\n const point = (x: { total: number; index: number }) =>\n t('chartPoint', {\n category: data[x.index].label,\n series: t('chartTotal'),\n value: format(x.total),\n })\n parts.push(\n t('chartHighest', { value: point(max) }),\n t('chartLowest', { value: point(min) }),\n )\n }\n } else {\n const ext = extremes(data, series)\n if (ext) {\n parts.push(t('chartHighest', { value: describe(ext.max.index, ext.max.series) }))\n parts.push(t('chartLowest', { value: describe(ext.min.index, ext.min.series) }))\n }\n }\n return parts.join(' ')\n }\n const label = [t('chartBarLabel', { title }), summary ?? (n ? autoSummary() : t('chartEmpty'))]\n .filter(Boolean)\n .join('. ')\n\n // --- Dica ---------------------------------------------------------------\n let tooltip: ReactNode = null\n if (last && last.index < n && last.series < k) {\n const index = last.index\n const outer = Math.max(0, ...segments[index].map((seg) => Math.max(seg.start, seg.end)))\n const rows: ChartTooltipRow[] = series.map((s, si) => {\n const value = segments[index][si].value\n return {\n key: s.key,\n label: s.label,\n value: value === null ? t('chartNoData') : format(value),\n color: barColor(index, si),\n active: k > 1 && si === last.series,\n }\n })\n const total = totals[index]\n tooltip = (\n <ChartTooltip\n open={active !== null}\n x={\n horizontal\n ? Math.min(left + plotW, Math.max(left, pos(outer)))\n : bandStart(index) + band / 2\n }\n y={horizontal ? bandStart(index) + offset : Math.min(pos(outer), baseline)}\n width={width}\n title={data[index].label}\n rows={rows}\n footer={\n stacked && k > 1 && total !== null\n ? { label: t('chartTotal'), value: format(total) }\n : undefined\n }\n />\n )\n }\n\n // --- Eixos ----------------------------------------------------------------\n const tickLabels = scale.ticks.map(axisFormat)\n const tickSpacing = scale.ticks.length > 1 ? plotW / (scale.ticks.length - 1) : plotW\n const tickEvery = horizontal\n ? Math.max(\n 1,\n Math.ceil((Math.max(...tickLabels.map((l) => textWidth(l))) + 8) / (tickSpacing || 1)),\n )\n : 1\n // Rótulos de categoria: inteiros quando cabem; senão encurtados (…) se ainda sobrarem ~4\n // letras por barra; só em faixas estreitas demais (muitos meses) eles se alternam.\n const widestCategory = Math.max(0, ...categoryWidths)\n const categoryEvery =\n horizontal || widestCategory + 8 <= band || band - 6 >= 30\n ? 1\n : Math.max(1, Math.ceil((widestCategory + 8) / (band || 1)))\n const categorySpace = horizontal ? left - 10 : band * categoryEvery - 6\n\n const emphasis = (index: number, si: number) => {\n if (!active) return undefined\n if (index !== active.index) return 'muted'\n return k > 1 && si !== active.series ? 'related' : 'active'\n }\n\n return (\n <ChartFigure\n ref={rootRef}\n title={title}\n description={description}\n source={source}\n hideCaption={hideCaption}\n variant={variant}\n motion={motion}\n legend={\n highlightIndex >= 0\n ? undefined\n : series.map((s, i) => ({ label: s.label, color: colors[i], mark: 'bar' as const }))\n }\n table={{\n categoryLabel: categoryLabel ?? t('chartCategory'),\n columns: [...series.map((s) => s.label), ...(stacked && k > 1 ? [t('chartTotal')] : [])],\n rows: data.map((datum, index) => ({\n label: datum.label,\n cells: [\n ...series.map((s) => valueOf(datum, s.key)),\n ...(stacked && k > 1 ? [totals[index]] : []),\n ],\n })),\n format,\n }}\n announcement={explorer.announcement}\n hintId={n ? hintId : undefined}\n defaultShowData={defaultShowData}\n data-orientation={orientation}\n data-layout={layout}\n {...rest}\n className={cx('or-bar-chart', `or-bar-chart--${orientation}`, rest.className)}\n >\n <div ref={plotRef} className=\"or-chart__plot\" style={{ height }}>\n {n === 0 ? (\n <p className=\"or-chart__empty\">{t('chartEmpty')}</p>\n ) : (\n // O SVG é a imagem do gráfico (role=\"img\" + resumo, como na diretriz) e também a área\n // explorável pelo teclado: Tab foca, setas movem o destaque, Escape limpa.\n <svg\n className=\"or-chart__svg\"\n width={width}\n height={height}\n role=\"img\"\n aria-label={label}\n aria-describedby={hintId}\n tabIndex={0}\n onKeyDown={explorer.handlers.onKeyDown}\n onBlur={explorer.handlers.onBlur}\n onPointerMove={onPointer}\n onPointerDown={onPointer}\n onPointerLeave={explorer.handlers.onPointerLeave}\n >\n {/* Grade e rótulos do eixo de valores */}\n <g className=\"or-bar-chart__axis\">\n {scale.ticks.map((tick, i) => {\n const p = crisp(pos(tick))\n return (\n <g key={tick}>\n {tick !== 0 &&\n (horizontal ? (\n <line className=\"or-chart__grid\" x1={p} x2={p} y1={top} y2={top + plotH} />\n ) : (\n <line\n className=\"or-chart__grid\"\n x1={left}\n x2={left + plotW}\n y1={p}\n y2={p}\n />\n ))}\n {i % tickEvery === 0 &&\n (horizontal ? (\n <text\n className=\"or-chart__tick\"\n x={px(pos(tick))}\n y={px(top + plotH + 18)}\n textAnchor=\"middle\"\n >\n {tickLabels[i]}\n </text>\n ) : (\n <text\n className=\"or-chart__tick\"\n x={left - 8}\n y={px(pos(tick))}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n >\n {tickLabels[i]}\n </text>\n ))}\n </g>\n )\n })}\n </g>\n\n {/* Faixa da categoria em destaque: desliza com --or-duration-fast */}\n {last && last.index < n && (\n <rect\n className=\"or-bar-chart__cursor\"\n data-state={active ? 'open' : 'closed'}\n width={px(horizontal ? plotW : band)}\n height={px(horizontal ? band : plotH)}\n style={{\n transform: horizontal\n ? `translate(${left}px, ${bandStart(last.index)}px)`\n : `translate(${bandStart(last.index)}px, ${top}px)`,\n }}\n />\n )}\n\n {/* Barras: cada categoria cresce a partir da base, escalonada */}\n {rects.map((bars, index) => (\n <g\n key={`${data[index].label}-${index}`}\n className=\"or-bar-chart__group or-chart__anim\"\n style={\n {\n '--_i': Math.round(index * stagger * 100) / 100,\n transformOrigin: horizontal ? `${baseline}px 0px` : `0px ${baseline}px`,\n } as CSSProperties\n }\n >\n {bars.map((bar) => (\n <rect\n key={bar.key}\n className=\"or-bar-chart__bar\"\n data-series={series[bar.series].key}\n data-emphasis={emphasis(index, bar.series)}\n x={px(bar.x)}\n y={px(bar.y)}\n width={px(bar.w)}\n height={px(bar.h)}\n style={colorStyle(barColor(index, bar.series))}\n />\n ))}\n </g>\n ))}\n\n {/* Base (zero) por cima das barras */}\n {horizontal ? (\n <line\n className=\"or-chart__baseline\"\n x1={crisp(baseline)}\n x2={crisp(baseline)}\n y1={top}\n y2={top + plotH}\n />\n ) : (\n <line\n className=\"or-chart__baseline\"\n x1={left}\n x2={left + plotW}\n y1={crisp(baseline)}\n y2={crisp(baseline)}\n />\n )}\n\n {/* Rótulos das categorias */}\n <g className=\"or-bar-chart__categories\">\n {data.map((datum, index) =>\n index % categoryEvery === 0 ? (\n horizontal ? (\n <text\n key={`${datum.label}-${index}`}\n className=\"or-chart__tick or-bar-chart__category\"\n x={left - 10}\n y={px(bandStart(index) + band / 2)}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n >\n {truncate(datum.label, categorySpace)}\n </text>\n ) : (\n <text\n key={`${datum.label}-${index}`}\n className=\"or-chart__tick or-bar-chart__category\"\n x={px(bandStart(index) + band / 2)}\n y={px(top + plotH + 18)}\n textAnchor=\"middle\"\n >\n {truncate(datum.label, categorySpace)}\n </text>\n )\n ) : null,\n )}\n </g>\n\n {/* Rótulos diretos (valor na ponta / total da pilha), só quando cabem */}\n {anyLabels && (\n <g className=\"or-bar-chart__values\">\n {data.map((_, index) => {\n if (!labelled(index)) return null\n const items =\n stacked && k > 1\n ? [{ si: -1, slot: 0, value: totals[index] }]\n : series.map((__, si) => ({\n si,\n slot: stacked ? 0 : si,\n value: segments[index][si].value,\n }))\n return items.map(({ si, slot, value }) => {\n if (value === null) return null\n const text = format(value)\n const end = pos(\n stacked && k > 1\n ? value >= 0\n ? Math.max(0, ...segments[index].map((s) => s.end))\n : Math.min(0, ...segments[index].map((s) => s.end))\n : value,\n )\n const center =\n bandStart(index) + offset + slot * (thickness + GAP) + thickness / 2\n const room = k > 1 && !stacked ? thickness + GAP * 2 : band - 4\n if (!horizontal && textWidth(text) > room) return null\n return horizontal ? (\n <text\n key={`${index}-${si}`}\n className=\"or-chart__value or-chart__anim\"\n style={{ '--_i': Math.round(index * stagger * 100) / 100 } as CSSProperties}\n x={px(value >= 0 ? end + 6 : end - 6)}\n y={px(center)}\n textAnchor={value >= 0 ? 'start' : 'end'}\n dominantBaseline=\"middle\"\n >\n {text}\n </text>\n ) : (\n <text\n key={`${index}-${si}`}\n className=\"or-chart__value or-chart__anim\"\n style={{ '--_i': Math.round(index * stagger * 100) / 100 } as CSSProperties}\n x={px(center)}\n y={px(value >= 0 ? end - 6 : end + 14)}\n textAnchor=\"middle\"\n >\n {text}\n </text>\n )\n })\n })}\n </g>\n )}\n </svg>\n )}\n {tooltip}\n </div>\n </ChartFigure>\n )\n})\n","import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { useControllableState } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning } from '../../utils'\nimport type { RenderLink } from '../Link'\nimport './BottomNavigation.css'\n\nexport interface BottomNavigationItem {\n /** Identificador do destino. */\n value: string\n /** Rótulo — sempre visível. */\n label: string\n /** Ícone (decorativo). */\n icon: ReactNode\n /** Destino. Sem `href`, o item é um botão que só chama `onChange`. */\n href?: string\n /** Contador ou ponto de notificação sobre o ícone. `true` mostra só o ponto. */\n badge?: number | boolean\n /** Texto para leitores de tela sobre o badge (ex.: \"3 não lidas\"). */\n badgeLabel?: string\n}\n\nexport interface BottomNavigationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange' | 'defaultValue'> {\n /** De 3 a 5 destinos principais. */\n items: BottomNavigationItem[]\n /** Destino ativo (controlado). */\n value?: string\n /** Destino ativo inicial (não controlado). */\n defaultValue?: string\n /** Chamado ao escolher um destino. */\n onChange?: (value: string) => void\n /** Prende a barra na parte inferior da janela (respeitando a área segura do iOS). */\n fixed?: boolean\n /** Renderiza os links com o componente do seu roteador. */\n renderLink?: RenderLink\n}\n\n/**\n * Barra de navegação inferior para telas pequenas: de 3 a 5 destinos\n * principais, com ícone e rótulo sempre visíveis.\n */\nexport const BottomNavigation = forwardRef<HTMLElement, BottomNavigationProps>(function BottomNavigation(\n {\n items,\n value: valueProp,\n defaultValue,\n onChange,\n fixed = false,\n renderLink,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const [value, setValue] = useControllableState<string | undefined>({\n value: valueProp,\n defaultValue,\n onChange: onChange as ((value: string | undefined) => void) | undefined,\n })\n\n const activeIndex = items.findIndex((item) => item.value === value)\n\n devWarning(\n items.length < 3 || items.length > 5,\n 'BottomNavigation funciona melhor com 3 a 5 destinos. Para mais opções, use um menu.',\n )\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel ?? t('mainNavigation')}\n className={cx('or-bottom-nav', fixed && 'or-bottom-nav--fixed', className)}\n {...rest}\n >\n {/* Indicador único: desliza até o destino ativo (células têm a mesma largura). */}\n <span\n className=\"or-bottom-nav__indicator\"\n aria-hidden=\"true\"\n data-visible={activeIndex >= 0 || undefined}\n style={{ '--_count': items.length, '--_index': Math.max(0, activeIndex) } as CSSProperties}\n />\n <ul className=\"or-bottom-nav__list\">\n {items.map((item) => {\n const active = item.value === value\n const hiddenBadge = item.badgeLabel ?? (typeof item.badge === 'number' ? String(item.badge) : undefined)\n const content = (\n <>\n <span className=\"or-bottom-nav__icon\" aria-hidden=\"true\">\n {item.icon}\n {item.badge !== undefined && item.badge !== false && (\n <span className={cx('or-bottom-nav__badge', item.badge === true && 'or-bottom-nav__badge--dot')}>\n {item.badge === true ? null : item.badge > 99 ? '99+' : item.badge}\n </span>\n )}\n </span>\n <span className=\"or-bottom-nav__label\">{item.label}</span>\n {hiddenBadge && <span className=\"or-visually-hidden\"> ({hiddenBadge})</span>}\n </>\n )\n const common = {\n className: 'or-bottom-nav__item',\n 'aria-current': active ? ('page' as const) : undefined,\n }\n const select = () => setValue(item.value)\n let control: ReactNode\n if (item.href) {\n const linkProps = {\n ...common,\n href: item.href,\n children: content,\n onClick: select,\n }\n control = renderLink ? renderLink(linkProps) : <a {...linkProps} />\n } else {\n control = (\n <button type=\"button\" {...common} onClick={select}>\n {content}\n </button>\n )\n }\n return (\n <li key={item.value} className=\"or-bottom-nav__cell\">\n {control}\n </li>\n )\n })}\n </ul>\n </nav>\n )\n})\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type CSSProperties,\n type LiHTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport type { RenderLink } from '../Link'\nimport './Breadcrumb.css'\n\nexport interface BreadcrumbEntry {\n /** Texto do nível. */\n label: ReactNode\n /** Destino. O último item (página atual) dispensa `href`. */\n href?: string\n /** Ícone decorativo antes do rótulo (ex.: casa no primeiro nível). */\n icon?: ReactNode\n}\n\ninterface ItemContextValue {\n isCurrent: boolean\n separator: ReactNode\n renderLink?: RenderLink\n /** Posição do item entre os revelados pelo \"…\" (para a entrada em cascata). */\n revealIndex?: number\n}\n\nconst ItemContext = createContext<ItemContextValue>({ isCurrent: false, separator: '/' })\n\nexport interface BreadcrumbItemProps extends LiHTMLAttributes<HTMLLIElement> {\n /** Destino do nível. Sem `href`, o item é renderizado como texto. */\n href?: string\n /** Ícone decorativo antes do rótulo. */\n icon?: ReactNode\n /** Força o estado de página atual. Padrão: o último item. */\n current?: boolean\n children?: ReactNode\n}\n\n/** Um nível da trilha. Use dentro de `Breadcrumb`. */\nexport const BreadcrumbItem = forwardRef<HTMLLIElement, BreadcrumbItemProps>(function BreadcrumbItem(\n { href, icon, current, className, style, children, ...rest },\n ref,\n) {\n const ctx = useContext(ItemContext)\n const isCurrent = current ?? ctx.isCurrent\n const content = (\n <>\n {icon && (\n <span className=\"or-breadcrumb__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"or-breadcrumb__label\">{children}</span>\n </>\n )\n const linkProps = {\n href: href ?? '',\n className: 'or-breadcrumb__link',\n 'aria-current': isCurrent ? ('page' as const) : undefined,\n children: content,\n }\n return (\n <li\n ref={ref}\n className={cx('or-breadcrumb__item', ctx.revealIndex !== undefined && 'or-breadcrumb__item--revealed', className)}\n style={ctx.revealIndex !== undefined ? ({ '--_i': ctx.revealIndex, ...style } as CSSProperties) : style}\n {...rest}\n >\n <span className=\"or-breadcrumb__separator\" aria-hidden=\"true\">\n {ctx.separator}\n </span>\n {href ? (\n ctx.renderLink ? (\n ctx.renderLink(linkProps)\n ) : (\n <a {...linkProps} />\n )\n ) : (\n <span className=\"or-breadcrumb__text\" aria-current={isCurrent ? 'page' : undefined}>\n {content}\n </span>\n )}\n </li>\n )\n})\n\nexport interface BreadcrumbProps extends HTMLAttributes<HTMLElement> {\n /** Níveis da trilha, do mais geral à página atual. Alternativa a `children`. */\n items?: BreadcrumbEntry[]\n /** Elementos `BreadcrumbItem`. */\n children?: ReactNode\n /**\n * Número máximo de níveis visíveis. Acima disso, os níveis do meio são\n * recolhidos em um botão \"…\" que os expande.\n */\n maxItems?: number\n /** Níveis mantidos antes do \"…\" ao recolher. Padrão: 1. */\n itemsBeforeCollapse?: number\n /** Níveis mantidos depois do \"…\" ao recolher. Padrão: 2. */\n itemsAfterCollapse?: number\n /** Separador decorativo entre níveis. Padrão: `/`. */\n separator?: ReactNode\n /**\n * Renderiza os links com o componente do seu roteador:\n * `renderLink={({ href, ...p }) => <RouterLink to={href} {...p} />}`.\n */\n renderLink?: RenderLink\n}\n\n/**\n * Trilha de navegação: mostra onde a página está na hierarquia do site e\n * permite voltar a níveis anteriores.\n */\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(function Breadcrumb(\n {\n items,\n children,\n maxItems,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 2,\n separator = '/',\n renderLink,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const [expanded, setExpanded] = useState(false)\n // Índices revelados pelo \"…\" (entram com fade + 4px, em cascata).\n const [revealed, setRevealed] = useState<{ start: number; end: number } | null>(null)\n const listRef = useRef<HTMLOListElement>(null)\n const focusAfterExpand = useRef(false)\n\n const elements: ReactElement[] = items\n ? items.map((item, i) => (\n <BreadcrumbItem key={i} href={item.href} icon={item.icon}>\n {item.label}\n </BreadcrumbItem>\n ))\n : (Children.toArray(children).filter(isValidElement) as ReactElement[])\n\n const total = elements.length\n const shouldCollapse =\n !expanded && maxItems !== undefined && total > maxItems && itemsBeforeCollapse + itemsAfterCollapse < total\n\n useEffect(() => {\n if (!expanded || !focusAfterExpand.current) return\n focusAfterExpand.current = false\n // Leva o foco ao primeiro nível revelado (o botão \"…\" deixou de existir).\n const list = listRef.current\n const revealed = list?.children[itemsBeforeCollapse]\n const target = revealed?.querySelector<HTMLElement>('a[href]') ?? list?.querySelector<HTMLElement>('a[href]')\n target?.focus()\n }, [expanded, itemsBeforeCollapse])\n\n const wrap = (element: ReactElement, index: number) => (\n <ItemContext.Provider\n key={element.key ?? index}\n value={{\n isCurrent: index === total - 1,\n separator,\n renderLink,\n revealIndex: revealed && index >= revealed.start && index < revealed.end ? index - revealed.start : undefined,\n }}\n >\n {element}\n </ItemContext.Provider>\n )\n\n let content: ReactNode\n if (shouldCollapse) {\n const before = elements.slice(0, itemsBeforeCollapse).map((el, i) => wrap(el, i))\n const afterStart = total - itemsAfterCollapse\n const after = elements.slice(afterStart).map((el, i) => wrap(el, afterStart + i))\n content = (\n <>\n {before}\n <li className=\"or-breadcrumb__item or-breadcrumb__item--collapsed\">\n <span className=\"or-breadcrumb__separator\" aria-hidden=\"true\">\n {separator}\n </span>\n <button\n type=\"button\"\n className=\"or-breadcrumb__expand\"\n aria-label={t('showFullPath')}\n onClick={() => {\n focusAfterExpand.current = true\n setRevealed({ start: itemsBeforeCollapse, end: total - itemsAfterCollapse })\n setExpanded(true)\n }}\n >\n <Icon name=\"more-horizontal\" size=\"sm\" />\n </button>\n </li>\n {after}\n </>\n )\n } else {\n content = elements.map((el, i) => wrap(el, i))\n }\n\n return (\n <nav ref={ref} aria-label={ariaLabel ?? t('breadcrumb')} className={cx('or-breadcrumb', className)} {...rest}>\n <ol ref={listRef} className=\"or-breadcrumb__list\">\n {content}\n </ol>\n </nav>\n )\n})\n","import { forwardRef, useMemo, type HTMLAttributes } from 'react'\nimport { cx, devWarning } from '../../utils'\nimport type { ButtonSize, ButtonVariant } from '../Button'\nimport {\n ActionGroupContext,\n applyGroupDefaults,\n useActionGroup,\n type ActionGroupContextValue,\n} from './context'\nimport './ButtonGroup.css'\n\nexport type ButtonGroupOrientation = 'horizontal' | 'vertical'\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Cola os botões: sem espaço entre eles e com bordas internas compartilhadas. */\n attached?: boolean\n /** Direção do grupo. Padrão: `horizontal` (ou a da Toolbar que o contém). */\n orientation?: ButtonGroupOrientation\n /** Tamanho aplicado a todos os botões que não definem o próprio `size`. */\n size?: ButtonSize\n /** Variante aplicada a todos os botões que não definem a própria `variant`. */\n variant?: ButtonVariant\n /** Desabilita todos os botões do grupo. */\n disabled?: boolean\n}\n\n/**\n * Agrupa botões relacionados (`role=\"group\"`). Informe `aria-label` para que\n * leitores de tela anunciem o propósito do grupo. `size`, `variant` e\n * `disabled` são repassados aos botões filhos que não os definem.\n */\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(function ButtonGroup(\n {\n attached = false,\n orientation: orientationProp,\n size,\n variant,\n disabled,\n role = 'group',\n className,\n children,\n ...rest\n },\n ref,\n) {\n const parent = useActionGroup()\n const orientation = orientationProp ?? parent?.orientation ?? 'horizontal'\n devWarning(\n role === 'group' && !parent?.roving && !rest['aria-label'] && !rest['aria-labelledby'],\n 'Grupos de botões (`role=\"group\"`) precisam de `aria-label` ou `aria-labelledby` para anunciar o seu propósito.',\n )\n\n const parentSize = parent?.size\n const parentVariant = parent?.variant\n const parentDisabled = parent?.disabled\n const roving = parent?.roving\n const ctx = useMemo<ActionGroupContextValue>(\n () => ({\n size: size ?? parentSize,\n variant: variant ?? parentVariant,\n disabled: disabled || parentDisabled || undefined,\n orientation,\n roving,\n }),\n [size, variant, disabled, parentSize, parentVariant, parentDisabled, orientation, roving],\n )\n\n return (\n <ActionGroupContext.Provider value={ctx}>\n <div\n ref={ref}\n role={role}\n className={cx(\n 'or-button-group',\n `or-button-group--${orientation}`,\n attached && 'or-button-group--attached',\n className,\n )}\n data-orientation={orientation}\n {...rest}\n >\n {applyGroupDefaults(children, ctx)}\n </div>\n </ActionGroupContext.Provider>\n )\n})\n","import {\n forwardRef,\n type AnchorHTMLAttributes,\n type CSSProperties,\n type ElementType,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { Icon } from '../../icons'\nimport { cx } from '../../utils'\nimport type { HeadingLevel } from '../Typography'\nimport './Card.css'\n\nexport type CardVariant = 'outline' | 'raised' | 'accent'\nexport type CardSize = 'sm' | 'md' | 'lg'\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n /** Elemento raiz. Use `article` para conteúdo independente e `li` dentro de listas. */\n as?: ElementType\n /** `outline` (borda 1px, padrão), `raised` (superfície elevada) ou `accent` (borda superior laranja). */\n variant?: CardVariant\n /** Espaçamento interno: `sm` 16px, `md` 24px, `lg` 32px. */\n size?: CardSize\n /**\n * Torna o cartão inteiro clicável. O alvo é o `CardLink` do título, que\n * ganha uma área estendida sobre o cartão (o título continua sendo o link).\n */\n interactive?: boolean\n}\n\n/** Contêiner de conteúdo relacionado: título, texto, mídia e ações. */\nexport const Card = forwardRef<HTMLElement, CardProps>(function Card(\n { as: Component = 'div', variant = 'outline', size = 'md', interactive = false, className, ...rest },\n ref,\n) {\n return (\n <Component\n ref={ref}\n className={cx(\n 'or-card',\n `or-card--${variant}`,\n `or-card--${size}`,\n interactive && 'or-card--interactive',\n className,\n )}\n {...rest}\n />\n )\n})\n\nexport interface CardLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Componente de link do roteador (ex.: `Link` do React Router). Padrão: `a`. */\n as?: ElementType\n /** Repassado ao componente de roteador. */\n to?: string\n /** Mostra uma seta após o texto, que desliza 4px no hover/foco do cartão. */\n arrow?: boolean\n}\n\n/**\n * Link do título do cartão. Em um `Card interactive`, sua área se estende por\n * todo o cartão (padrão \"stretched link\").\n */\nexport const CardLink = forwardRef<HTMLAnchorElement, CardLinkProps>(function CardLink(\n { as: Component = 'a', arrow = false, className, children, ...rest },\n ref,\n) {\n return (\n <Component ref={ref} className={cx('or-card__link', className)} {...rest}>\n {children}\n {arrow && (\n <span className=\"or-card__link-arrow\" aria-hidden=\"true\">\n <Icon name=\"arrow-right\" strokeWidth={2} />\n </span>\n )}\n </Component>\n )\n})\n\nexport interface CardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Rótulo curto em caixa alta acima do título. */\n eyebrow?: ReactNode\n /** Título do cartão (renderizado como heading). */\n title?: ReactNode\n /** Nível semântico do título. Padrão: 3. */\n headingLevel?: HeadingLevel\n /** Transforma o título em link (`CardLink`). */\n href?: string\n /** Atributos extras do link do título. */\n linkProps?: Omit<CardLinkProps, 'href' | 'children'>\n /** Texto de apoio abaixo do título. */\n description?: ReactNode\n /** Ações à direita do título (botões de ícone, menus). */\n actions?: ReactNode\n}\n\n/** Cabeçalho do cartão: eyebrow, título (opcionalmente link), descrição e ações. */\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(\n { eyebrow, title, headingLevel = 3, href, linkProps, description, actions, className, children, ...rest },\n ref,\n) {\n const Heading = `h${headingLevel}` as ElementType\n return (\n <div ref={ref} className={cx('or-card__header', className)} {...rest}>\n <div className=\"or-card__heading\">\n {eyebrow && <p className=\"or-card__eyebrow or-eyebrow\">{eyebrow}</p>}\n {title && (\n <Heading className=\"or-card__title\">\n {href || linkProps?.to ? (\n <CardLink href={href} {...linkProps}>\n {title}\n </CardLink>\n ) : (\n title\n )}\n </Heading>\n )}\n {description && <p className=\"or-card__description\">{description}</p>}\n {children}\n </div>\n {actions && <div className=\"or-card__actions\">{actions}</div>}\n </div>\n )\n})\n\nexport type CardBodyProps = HTMLAttributes<HTMLDivElement>\n\n/** Conteúdo principal do cartão. */\nexport const CardBody = forwardRef<HTMLDivElement, CardBodyProps>(function CardBody({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('or-card__body', className)} {...rest} />\n})\n\nexport interface CardFooterProps extends HTMLAttributes<HTMLDivElement> {\n /** Mostra uma linha divisória acima do rodapé. */\n divider?: boolean\n}\n\n/** Rodapé com ações ou metadados, sempre alinhado à base do cartão. */\nexport const CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(function CardFooter(\n { divider = false, className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('or-card__footer', divider && 'or-card__footer--divider', className)} {...rest} />\n})\n\nexport interface CardMediaProps extends HTMLAttributes<HTMLDivElement> {\n /** URL da imagem. Alternativamente, passe a mídia como `children`. */\n src?: string\n /** Texto alternativo da imagem. Use `\"\"` se for decorativa. */\n alt?: string\n /** Proporção da área de mídia (ex.: `16/9`, `4/3`, `1`). Padrão: `16/9`. */\n ratio?: string | number\n}\n\n/** Imagem ou mídia de borda a borda (no topo ou na base do cartão). */\nexport const CardMedia = forwardRef<HTMLDivElement, CardMediaProps>(function CardMedia(\n { src, alt = '', ratio = '16/9', className, style, children, ...rest },\n ref,\n) {\n const mediaStyle: CSSProperties = { aspectRatio: String(ratio), ...style }\n return (\n <div ref={ref} className={cx('or-card__media', className)} style={mediaStyle} {...rest}>\n {children ?? (src ? <img src={src} alt={alt} /> : null)}\n </div>\n )\n})\n","import { useCallback, useEffect, useState, type CSSProperties, type RefObject } from 'react'\nimport { useIsomorphicLayoutEffect } from '../../hooks'\n\n/**\n * Uso interno do grupo de navegação (Tabs, TableOfContents) — não é exportado\n * pela biblioteca.\n *\n * Mede o item ativo (`selector`) dentro de `containerRef` e devolve o estilo\n * de um indicador ÚNICO que desliza entre os itens. Só anima `transform`: o\n * indicador tem 1px no eixo de movimento e é escalado até o tamanho do item.\n * O contêiner precisa ser o `offsetParent` dos itens (`position: relative`).\n *\n * `ready` só fica verdadeiro um quadro depois do primeiro posicionamento, para\n * o indicador não \"voar\" da origem ao montar (a transição liga depois).\n */\nexport function useSlidingIndicator(\n containerRef: RefObject<HTMLElement | null>,\n selector: string,\n axis: 'x' | 'y',\n /** Qualquer valor que mude quando o item ativo muda (ex.: o `value`). */\n activeKey: unknown,\n): { style: CSSProperties | undefined; visible: boolean; ready: boolean } {\n const [rect, setRect] = useState<{ offset: number; size: number } | null>(null)\n const [ready, setReady] = useState(false)\n\n const measure = useCallback(() => {\n const container = containerRef.current\n const active = container?.querySelector<HTMLElement>(selector)\n if (!container || !active) {\n setRect(null)\n return\n }\n const next =\n axis === 'x'\n ? { offset: active.offsetLeft, size: active.offsetWidth }\n : { offset: active.offsetTop, size: active.offsetHeight }\n setRect((prev) => (prev && prev.offset === next.offset && prev.size === next.size ? prev : next))\n }, [containerRef, selector, axis])\n\n useIsomorphicLayoutEffect(() => {\n measure()\n }, [measure, activeKey])\n\n // Remede quando o contêiner ou os itens mudam de tamanho (fontes, resize, painel revelado).\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(() => measure()) : null\n if (observer) {\n observer.observe(container)\n Array.from(container.children).forEach((child) => observer.observe(child))\n }\n window.addEventListener('resize', measure)\n let cancelled = false\n document.fonts?.ready.then(() => {\n if (!cancelled) measure()\n })\n return () => {\n cancelled = true\n observer?.disconnect()\n window.removeEventListener('resize', measure)\n }\n }, [containerRef, measure])\n\n useEffect(() => {\n if (!rect || ready) return\n const raf = requestAnimationFrame(() => setReady(true))\n return () => cancelAnimationFrame(raf)\n }, [rect, ready])\n\n const style: CSSProperties | undefined = rect\n ? {\n transform:\n axis === 'x'\n ? `translateX(${rect.offset}px) scaleX(${rect.size})`\n : `translateY(${rect.offset}px) scaleY(${rect.size})`,\n }\n : undefined\n\n return { style, visible: rect !== null && rect.size > 0, ready }\n}\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n type TouchEvent,\n} from 'react'\nimport {\n useControllableState,\n useId,\n useIsomorphicLayoutEffect,\n useMediaQuery,\n useReducedMotion,\n} from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { clamp, cx, devWarning } from '../../utils'\nimport { IconButton } from '../IconButton'\nimport { useSlidingIndicator } from '../Tabs/useSlidingIndicator'\nimport './Carousel.css'\n\nexport type CarouselGap = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8\nexport type CarouselControlsPlacement = 'bottom' | 'top'\nexport type CarouselPicker = 'dots' | 'counter' | 'none'\nexport type CarouselAutoplay = boolean | { interval: number }\n\n/** Valores por breakpoint (largura mínima, mesmos de `@orangesys/tokens`). */\nexport interface CarouselResponsiveValue {\n /** Abaixo de 640px. */\n base?: number\n /** A partir de 640px. */\n sm?: number\n /** A partir de 768px. */\n md?: number\n /** A partir de 1024px. */\n lg?: number\n /** A partir de 1280px. */\n xl?: number\n}\n\nexport type CarouselSlidesPerView = number | CarouselResponsiveValue\n\n/* Espelha `breakpoints` de @orangesys/tokens (sm 640, md 768, lg 1024, xl 1280). */\nconst MEDIA = {\n sm: '(min-width: 640px)',\n md: '(min-width: 768px)',\n lg: '(min-width: 1024px)',\n xl: '(min-width: 1280px)',\n} as const\n\nconst DEFAULT_INTERVAL = 5000\nconst MIN_INTERVAL = 1000\n\nfunction useSlidesPerView(value: CarouselSlidesPerView): number {\n const sm = useMediaQuery(MEDIA.sm)\n const md = useMediaQuery(MEDIA.md)\n const lg = useMediaQuery(MEDIA.lg)\n const xl = useMediaQuery(MEDIA.xl)\n let resolved: number | undefined\n if (typeof value === 'number') resolved = value\n else {\n const steps: [boolean, number | undefined][] = [\n [xl, value.xl],\n [lg, value.lg],\n [md, value.md],\n [sm, value.sm],\n ]\n resolved = steps.find(([matches, n]) => matches && n !== undefined)?.[1] ?? value.base\n }\n return Number.isFinite(resolved) ? Math.max(1, resolved as number) : 1\n}\n\ninterface SlideContextValue {\n index: number\n total: number\n active: boolean\n id: string\n}\n\nconst SlideContext = createContext<SlideContextValue | null>(null)\n\nexport interface CarouselProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange' | 'children'> {\n /**\n * Nome acessível do carrossel (vira `aria-label`). Obrigatório. Não inclua a\n * palavra \"carrossel\": o papel já é anunciado. Com um título visível, passe\n * `aria-labelledby` — ele tem precedência.\n */\n label: string\n /** Posição atual (controlado). É o índice do primeiro slide visível. */\n index?: number\n /** Posição inicial (não controlado). Padrão: `0`. */\n defaultIndex?: number\n /** Chamado quando a posição muda (botões, seletor, swipe ou rotação). */\n onIndexChange?: (index: number) => void\n /** Anterior/próximo dão a volta nas pontas. A rotação automática sempre volta ao início. */\n loop?: boolean\n /**\n * Slides visíveis por vez. Frações deixam o próximo \"espiando\" (ex.: `1.2`,\n * `2.5`). Aceita valores por breakpoint: `{ base: 1.2, md: 2.5, lg: 4 }`.\n */\n slidesPerView?: CarouselSlidesPerView\n /** Espaço entre slides, na escala `--or-space-*`. Padrão: `4` (16px). */\n gap?: CarouselGap\n /**\n * Rotação automática. `true` usa 5s; `{ interval }` define o tempo em ms.\n * Sempre exibe o botão Pausar/Iniciar como primeiro controle; pausa no hover,\n * para quando o foco do teclado entra e nunca começa sozinha com movimento reduzido.\n */\n autoplay?: CarouselAutoplay\n /** Posição da barra de controles. Na ordem do Tab ela sempre vem antes dos slides. */\n controls?: CarouselControlsPlacement\n /**\n * Seletor de slides: `dots` (abas do APG, uma parada de Tab), `counter`\n * (\"02 / 05\", para muitos slides) ou `none` (só anterior/próximo).\n */\n picker?: CarouselPicker\n /** Slides (`CarouselSlide`) como filhos diretos. */\n children?: ReactNode\n}\n\n/**\n * Carrossel acessível (padrão Carousel do WAI-ARIA APG): região com\n * `aria-roledescription=\"carousel\"`, slides `role=\"group\"`, botões\n * anterior/próximo, seletor em abas e rotação opcional com botão de pausa.\n * O trilho usa scroll-snap nativo: swipe, trackpad e roda funcionam sem JS.\n */\nexport const Carousel = forwardRef<HTMLElement, CarouselProps>(function Carousel(\n {\n label,\n index: indexProp,\n defaultIndex = 0,\n onIndexChange,\n loop = false,\n slidesPerView = 1,\n gap = 4,\n autoplay = false,\n controls = 'bottom',\n picker = 'dots',\n className,\n style,\n children,\n onFocus,\n onBlur,\n onPointerEnter,\n onPointerLeave,\n onPointerDownCapture,\n onPointerCancel,\n onPointerUp,\n onClickCapture,\n onTouchStart,\n onTouchEnd,\n onTouchCancel,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const baseId = useId('or-carousel', rest.id)\n const trackId = `${baseId}-track`\n const reduced = useReducedMotion()\n const perView = useSlidesPerView(slidesPerView)\n const visibleCount = Math.floor(perView)\n\n devWarning(\n !label && !rest['aria-labelledby'],\n 'Carousel precisa de `label` (ou `aria-labelledby`) descrevendo o conjunto de slides.',\n )\n\n const slides = Children.toArray(children).filter(isValidElement)\n const count = slides.length\n const maxIndex = Math.max(0, count - visibleCount)\n const positions = maxIndex + 1\n const navigable = maxIndex > 0\n\n const [rawIndex, setIndex] = useControllableState({\n value: indexProp,\n defaultValue: defaultIndex,\n onChange: onIndexChange,\n })\n const index = clamp(Math.round(rawIndex) || 0, 0, maxIndex)\n const indexRef = useRef(index)\n indexRef.current = index\n const maxIndexRef = useRef(maxIndex)\n maxIndexRef.current = maxIndex\n\n /* --- Rotação automática ------------------------------------------------ */\n\n const interval =\n typeof autoplay === 'object' ? Math.max(MIN_INTERVAL, autoplay.interval || DEFAULT_INTERVAL) : DEFAULT_INTERVAL\n const hasAutoplay = Boolean(autoplay) && navigable\n // Com movimento reduzido a rotação nunca começa sozinha (o usuário ainda pode iniciá-la).\n const [playing, setPlaying] = useState(() => Boolean(autoplay) && !reduced)\n // \"Iniciar\" explícito vence hover e foco (APG); qualquer navegação manual zera.\n const [userStarted, setUserStarted] = useState(false)\n const [hovered, setHovered] = useState(false)\n const [touching, setTouching] = useState(false)\n const [focusWithin, setFocusWithin] = useState(false)\n const [pageHidden, setPageHidden] = useState(false)\n\n const [prevAutoplay, setPrevAutoplay] = useState(Boolean(autoplay))\n if (prevAutoplay !== Boolean(autoplay)) {\n setPrevAutoplay(Boolean(autoplay))\n setPlaying(Boolean(autoplay) && !reduced)\n setUserStarted(false)\n }\n\n useEffect(() => {\n if (reduced) setPlaying(false)\n }, [reduced])\n\n const paused = pageHidden || (!userStarted && (hovered || touching || focusWithin))\n const rotating = hasAutoplay && playing && !paused\n\n const stopRotation = useCallback(() => {\n setPlaying(false)\n setUserStarted(false)\n }, [])\n\n // Aba do navegador oculta: pausa (a barra de progresso pausa junto).\n useEffect(() => {\n if (!hasAutoplay || typeof document === 'undefined') return\n const update = () => setPageHidden(document.visibilityState === 'hidden')\n update()\n document.addEventListener('visibilitychange', update)\n return () => document.removeEventListener('visibilitychange', update)\n }, [hasAutoplay])\n\n // Timer com pausa: guarda o tempo restante entre pausas (hover, foco do mouse).\n const remainingRef = useRef(interval)\n useEffect(() => {\n remainingRef.current = interval\n }, [index, interval, playing])\n\n useEffect(() => {\n if (!rotating) return\n const startedAt = Date.now()\n const handle = window.setTimeout(() => {\n const current = indexRef.current\n setIndex(current >= maxIndexRef.current ? 0 : current + 1)\n }, remainingRef.current)\n return () => {\n window.clearTimeout(handle)\n remainingRef.current = Math.max(0, remainingRef.current - (Date.now() - startedAt))\n }\n }, [rotating, index, setIndex])\n\n /* --- Navegação ----------------------------------------------------------- */\n\n const goTo = useCallback(\n (target: number | ((current: number) => number)) => {\n // Toda navegação do usuário encerra a rotação (WCAG 2.2.2).\n stopRotation()\n setIndex((prev) => {\n const max = maxIndexRef.current\n const next = typeof target === 'function' ? target(clamp(Math.round(prev) || 0, 0, max)) : target\n return clamp(next, 0, max)\n })\n },\n [setIndex, stopRotation],\n )\n\n const canPrev = loop || index > 0\n const canNext = loop || index < maxIndex\n // Atualização funcional: cliques rápidos em sequência não perdem passos.\n const goPrev = () => {\n if (canPrev) goTo((current) => (current > 0 ? current - 1 : loop ? maxIndexRef.current : current))\n }\n const goNext = () => {\n if (canNext) goTo((current) => (current < maxIndexRef.current ? current + 1 : loop ? 0 : current))\n }\n\n /* --- Trilho com scroll-snap ---------------------------------------------- */\n\n const trackRef = useRef<HTMLDivElement>(null)\n /** Destino de uma rolagem programática em andamento (eventos de scroll dela são ignorados). */\n const pendingRef = useRef<number | null>(null)\n const pendingTimer = useRef<number | undefined>(undefined)\n /** Índice que veio da própria rolagem do usuário: não rola de volta para ele. */\n const fromScrollRef = useRef<number | null>(null)\n const lastScrolledRef = useRef<number | null>(null)\n const reducedRef = useRef(reduced)\n reducedRef.current = reduced\n\n const getSlideElements = useCallback(() => {\n const track = trackRef.current\n if (!track) return []\n return Array.from(track.children).filter((el): el is HTMLElement =>\n el.classList.contains('or-carousel__slide'),\n )\n }, [])\n\n const measure = useCallback(() => {\n const track = trackRef.current\n // Sem layout (SSR, jsdom, display: none): nada a medir.\n if (!track || track.clientWidth === 0) return null\n const els = getSlideElements()\n const first = els[0]\n if (!first) return null\n const rtl = getComputedStyle(track).direction === 'rtl'\n const max = Math.max(0, track.scrollWidth - track.clientWidth)\n const offsets = els.map((el) =>\n Math.min(\n max,\n rtl\n ? first.offsetLeft + first.offsetWidth - (el.offsetLeft + el.offsetWidth)\n : el.offsetLeft - first.offsetLeft,\n ),\n )\n return { track, rtl, max, offsets, scroll: rtl ? -track.scrollLeft : track.scrollLeft }\n }, [getSlideElements])\n\n const nearestIndex = (m: NonNullable<ReturnType<typeof measure>>) => {\n const last = Math.min(maxIndexRef.current, m.offsets.length - 1)\n if (m.scroll >= m.max - 1) return last\n let best = 0\n for (let i = 1; i <= last; i++) {\n if (Math.abs(m.offsets[i] - m.scroll) < Math.abs(m.offsets[best] - m.scroll)) best = i\n }\n return best\n }\n\n const clearPending = useCallback(() => {\n pendingRef.current = null\n window.clearTimeout(pendingTimer.current)\n }, [])\n\n // Posição mudou (botões, seletor, rotação, prop controlada): rola o trilho até ela.\n useIsomorphicLayoutEffect(() => {\n if (fromScrollRef.current === index) {\n fromScrollRef.current = null\n lastScrolledRef.current = index\n return\n }\n fromScrollRef.current = null\n const m = measure()\n if (!m) return\n const target = m.offsets[index] ?? 0\n // Montagem e ajustes de layout (breakpoint) são instantâneos; navegação é suave.\n const smooth = lastScrolledRef.current !== null && lastScrolledRef.current !== index && !reducedRef.current\n lastScrolledRef.current = index\n if (Math.abs(m.scroll - target) < 1) return\n pendingRef.current = index\n window.clearTimeout(pendingTimer.current)\n pendingTimer.current = window.setTimeout(clearPending, 1200)\n const left = m.rtl ? -target : target\n if (typeof m.track.scrollTo === 'function') m.track.scrollTo({ left, behavior: smooth ? 'smooth' : 'auto' })\n else m.track.scrollLeft = left\n }, [index, perView, count, measure, clearPending])\n\n const onUserScrollRef = useRef((_next: number) => {})\n onUserScrollRef.current = (next: number) => {\n fromScrollRef.current = next\n goTo(next)\n }\n\n // Swipe/trackpad/roda: mantém o índice em sincronia com a rolagem (1x por quadro).\n useEffect(() => {\n const track = trackRef.current\n if (!track) return\n let frame = 0\n const sync = () => {\n frame = 0\n const m = measure()\n if (!m) return\n const pending = pendingRef.current\n if (pending !== null) {\n if (Math.abs(m.scroll - (m.offsets[pending] ?? 0)) < 2) clearPending()\n return\n }\n const next = nearestIndex(m)\n if (next !== indexRef.current) onUserScrollRef.current(next)\n }\n const onScroll = () => {\n if (!frame) frame = requestAnimationFrame(sync)\n }\n const onScrollEnd = () => {\n clearPending()\n sync()\n }\n track.addEventListener('scroll', onScroll, { passive: true })\n track.addEventListener('scrollend', onScrollEnd)\n // Gesto do usuário interrompe uma rolagem programática.\n track.addEventListener('pointerdown', clearPending)\n track.addEventListener('wheel', clearPending, { passive: true })\n track.addEventListener('touchstart', clearPending, { passive: true })\n return () => {\n cancelAnimationFrame(frame)\n window.clearTimeout(pendingTimer.current)\n track.removeEventListener('scroll', onScroll)\n track.removeEventListener('scrollend', onScrollEnd)\n track.removeEventListener('pointerdown', clearPending)\n track.removeEventListener('wheel', clearPending)\n track.removeEventListener('touchstart', clearPending)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- nearestIndex só lê refs\n }, [measure, clearPending])\n\n // Clique num slide parcialmente visível (inerte, o clique cai no trilho): traz o slide para a vista.\n const handleTrackClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return\n const hit = getSlideElements().findIndex((el) => {\n const rect = el.getBoundingClientRect()\n return rect.width > 0 && event.clientX >= rect.left && event.clientX <= rect.right\n })\n if (hit === -1 || (hit >= index && hit < index + visibleCount)) return\n goTo(hit < index ? hit : hit - visibleCount + 1)\n }\n\n /* --- Foco, hover e toque ----------------------------------------------- */\n\n // Diferencia foco do teclado (para a rotação) de foco por clique/toque (só pausa).\n const pointerRef = useRef(false)\n const pointerTimer = useRef<number | undefined>(undefined)\n useEffect(\n () => () => {\n window.clearTimeout(pointerTimer.current)\n window.clearTimeout(pendingTimer.current)\n },\n [],\n )\n\n const handleFocus = (event: FocusEvent<HTMLElement>) => {\n onFocus?.(event)\n const from = event.relatedTarget as Node | null\n const entering = !from || !event.currentTarget.contains(from)\n setFocusWithin(true)\n // APG: o foco do teclado entrando no carrossel para a rotação até o usuário pedir de novo.\n if (entering && !pointerRef.current && hasAutoplay && playing) stopRotation()\n }\n\n const handleBlur = (event: FocusEvent<HTMLElement>) => {\n onBlur?.(event)\n const to = event.relatedTarget as Node | null\n if (!to || !event.currentTarget.contains(to)) setFocusWithin(false)\n }\n\n /* --- Seletor (abas) ---------------------------------------------------- */\n\n const pickerRef = useRef<HTMLDivElement>(null)\n const indicator = useSlidingIndicator(\n pickerRef,\n '[aria-selected=\"true\"] > .or-carousel__dot-mark',\n 'x',\n `${index}|${positions}`,\n )\n\n const handlePickerKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n let next: number\n if (event.key === 'ArrowRight') next = index >= maxIndex ? 0 : index + 1\n else if (event.key === 'ArrowLeft') next = index === 0 ? maxIndex : index - 1\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = maxIndex\n else return\n event.preventDefault()\n goTo(next)\n pickerRef.current?.querySelectorAll<HTMLElement>('[role=\"tab\"]')[next]?.focus()\n }\n\n const slideIds = slides.map((child, i) => {\n const own = (child.props as { id?: unknown }).id\n return typeof own === 'string' && own ? own : `${baseId}-slide-${i + 1}`\n })\n\n const pad = (n: number) => String(n).padStart(2, '0')\n\n const rootStyle = {\n '--_per-view': perView,\n '--_gap': `var(--or-space-${gap})`,\n ...style,\n } as CSSProperties\n\n return (\n <section\n ref={ref}\n aria-roledescription=\"carousel\"\n aria-label={label}\n className={cx('or-carousel', `or-carousel--controls-${controls}`, className)}\n data-autoplay={hasAutoplay ? (playing ? 'playing' : 'stopped') : undefined}\n data-paused={hasAutoplay && playing && paused ? '' : undefined}\n style={rootStyle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onPointerEnter={(event: PointerEvent<HTMLElement>) => {\n onPointerEnter?.(event)\n if (event.pointerType !== 'touch') setHovered(true)\n }}\n onPointerLeave={(event: PointerEvent<HTMLElement>) => {\n onPointerLeave?.(event)\n setHovered(false)\n }}\n onPointerDownCapture={(event: PointerEvent<HTMLElement>) => {\n onPointerDownCapture?.(event)\n window.clearTimeout(pointerTimer.current)\n pointerRef.current = true\n }}\n onPointerUp={(event: PointerEvent<HTMLElement>) => {\n onPointerUp?.(event)\n // No toque, o foco chega depois do pointerup: espera o clique (ou desiste).\n window.clearTimeout(pointerTimer.current)\n pointerTimer.current = window.setTimeout(() => {\n pointerRef.current = false\n }, 1000)\n }}\n onPointerCancel={(event: PointerEvent<HTMLElement>) => {\n onPointerCancel?.(event)\n pointerRef.current = false\n }}\n onClickCapture={(event: MouseEvent<HTMLElement>) => {\n onClickCapture?.(event)\n pointerRef.current = false\n }}\n onTouchStart={(event: TouchEvent<HTMLElement>) => {\n onTouchStart?.(event)\n setTouching(true)\n }}\n onTouchEnd={(event: TouchEvent<HTMLElement>) => {\n onTouchEnd?.(event)\n setTouching(false)\n }}\n onTouchCancel={(event: TouchEvent<HTMLElement>) => {\n onTouchCancel?.(event)\n setTouching(false)\n }}\n {...rest}\n >\n {navigable && (\n // Sempre antes dos slides no DOM: o botão de rotação é o primeiro controle (APG, WCAG 2.2.2).\n <div className=\"or-carousel__controls\">\n {hasAutoplay && (\n <IconButton\n className=\"or-carousel__rotation\"\n variant=\"outline\"\n icon={<Icon key={playing ? 'pause' : 'play'} name={playing ? 'pause' : 'play'} />}\n label={playing ? t('carouselPause') : t('carouselPlay')}\n onClick={() => {\n if (playing) stopRotation()\n else {\n setPlaying(true)\n setUserStarted(true)\n }\n }}\n />\n )}\n\n {picker === 'dots' && (\n // eslint-disable-next-line jsx-a11y/interactive-supports-focus -- o foco fica nas abas (roving tabindex); o tablist só delega as setas\n <div\n ref={pickerRef}\n role=\"tablist\"\n aria-label={t('carouselPicker')}\n className=\"or-carousel__picker\"\n data-indicator={indicator.ready ? 'ready' : undefined}\n onKeyDown={handlePickerKeyDown}\n >\n {Array.from({ length: positions }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${i + 1}`}\n aria-selected={i === index}\n aria-controls={slideIds[i]}\n aria-label={t('carouselSlideTab', { index: i + 1 })}\n tabIndex={i === index ? 0 : -1}\n className=\"or-carousel__dot\"\n onClick={() => goTo(i)}\n >\n <span className=\"or-carousel__dot-mark\" aria-hidden=\"true\" />\n </button>\n ))}\n <span\n className=\"or-carousel__dot-indicator\"\n aria-hidden=\"true\"\n data-visible={indicator.visible || undefined}\n data-ready={indicator.ready || undefined}\n style={indicator.style}\n />\n </div>\n )}\n\n {picker === 'counter' && (\n <span className=\"or-carousel__counter\" aria-hidden=\"true\">\n <span className=\"or-carousel__counter-current\">{pad(index + 1)}</span>\n <span className=\"or-carousel__counter-sep\">/</span>\n {pad(positions)}\n </span>\n )}\n\n <div className=\"or-carousel__nav\">\n <IconButton\n className=\"or-carousel__prev\"\n variant=\"outline\"\n icon=\"chevron-left\"\n label={t('carouselPrevious')}\n aria-controls={trackId}\n aria-disabled={!canPrev || undefined}\n onClick={goPrev}\n />\n <IconButton\n className=\"or-carousel__next\"\n variant=\"outline\"\n icon=\"chevron-right\"\n label={t('carouselNext')}\n aria-controls={trackId}\n aria-disabled={!canNext || undefined}\n onClick={goNext}\n />\n </div>\n\n {hasAutoplay && playing && (\n // Tempo até o próximo slide (or-fill-x); recomeça a cada slide e pausa com a rotação.\n <span\n key={index}\n className=\"or-carousel__progress\"\n aria-hidden=\"true\"\n style={{ '--_interval': `${interval}ms` } as CSSProperties}\n />\n )}\n </div>\n )}\n\n <div className=\"or-carousel__viewport\">\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- atalho de mouse; teclado usa anterior/próximo e o seletor */}\n <div\n ref={trackRef}\n id={trackId}\n className=\"or-carousel__track\"\n // APG: anúncios desligados enquanto gira; educados quando o usuário navega.\n aria-live={hasAutoplay && playing ? 'off' : 'polite'}\n aria-atomic=\"false\"\n onClick={handleTrackClick}\n >\n {slides.map((child, i) => {\n const active = i >= index && i < index + Math.max(1, visibleCount)\n return (\n <SlideContext.Provider key={child.key ?? i} value={{ index: i, total: count, active, id: slideIds[i] }}>\n {child}\n </SlideContext.Provider>\n )\n })}\n </div>\n </div>\n </section>\n )\n})\n\nexport interface CarouselSlideProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Nome acessível do slide. Padrão: a posição (\"2 de 5\"). Com um título\n * visível no slide, prefira `aria-labelledby`.\n */\n label?: string\n children?: ReactNode\n}\n\n/**\n * Um slide do `Carousel` (`role=\"group\"`, `aria-roledescription=\"slide\"`).\n * Fora da vista fica inerte: some dos leitores de tela e da ordem do Tab.\n */\nexport const CarouselSlide = forwardRef<HTMLDivElement, CarouselSlideProps>(function CarouselSlide(\n { label, className, children, ...rest },\n ref,\n) {\n const ctx = useContext(SlideContext)\n if (!ctx) throw new Error('<CarouselSlide> precisa estar dentro de <Carousel>.')\n const { t } = useLocale()\n const labelledBy = rest['aria-labelledby']\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={labelledBy ? undefined : (label ?? t('carouselSlideLabel', { index: ctx.index + 1, total: ctx.total }))}\n className={cx('or-carousel__slide', className)}\n data-state={ctx.active ? 'active' : 'inactive'}\n {...rest}\n id={ctx.id}\n inert={!ctx.active || undefined}\n aria-hidden={!ctx.active || undefined}\n >\n {children}\n </div>\n )\n})\n","import { useCallback, useRef, useState, type AnimationEvent } from 'react'\nimport { useIsomorphicLayoutEffect } from '../../hooks'\n\n/**\n * Tremor de validação (interno ao grupo de formulários). Liga a classe\n * `or-forms-shake` UMA vez quando `invalid` passa de `false` para `true` —\n * nunca na montagem já inválida nem enquanto o erro continua. A classe é\n * removida no `animationend` do próprio elemento (ou quando o erro some).\n */\nexport function useErrorShake(invalid: boolean) {\n const [shaking, setShaking] = useState(false)\n const previous = useRef(invalid)\n\n useIsomorphicLayoutEffect(() => {\n if (invalid && !previous.current) setShaking(true)\n if (!invalid) setShaking(false)\n previous.current = invalid\n }, [invalid])\n\n const onAnimationEnd = useCallback((event: AnimationEvent<HTMLElement>) => {\n if (event.target === event.currentTarget && event.animationName === 'or-shake') setShaking(false)\n }, [])\n\n return { shakeClassName: shaking ? 'or-forms-shake' : undefined, onAnimationEnd }\n}\n","import { forwardRef, type FieldsetHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { useErrorShake } from '../TextField/useErrorShake'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport '../TextField/FormMotion.css'\nimport './Fieldset.css'\n\n/**\n * Base interna de `<fieldset>` usada por Fieldset (aparência `section`) e por\n * CheckboxGroup/RadioGroup (aparência `group`, legenda com estilo de rótulo).\n * Não é exportada pela biblioteca.\n */\nexport interface FieldsetBaseProps extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'title'> {\n appearance: 'section' | 'group'\n legend?: ReactNode\n hideLegend?: boolean\n description?: ReactNode\n error?: ReactNode\n required?: boolean\n optional?: boolean\n /** Anuncia \"obrigatório\" na legenda (para grupos sem `required` nativo, como checkboxes). */\n announceRequired?: boolean\n /** Props do contêiner que envolve os filhos. */\n contentProps?: HTMLAttributes<HTMLDivElement> & Record<`data-${string}`, string | undefined>\n children?: ReactNode\n}\n\nexport function hasContent(node: ReactNode) {\n return node !== undefined && node !== null && node !== false && node !== ''\n}\n\nexport const FieldsetBase = forwardRef<HTMLFieldSetElement, FieldsetBaseProps>(function FieldsetBase(\n {\n appearance,\n legend,\n hideLegend = false,\n description,\n error,\n required = false,\n optional = false,\n announceRequired = false,\n contentProps,\n className,\n children,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const baseId = useId('or-fieldset')\n const hasDescription = hasContent(description)\n const hasError = hasContent(error)\n const descriptionId = hasDescription ? `${baseId}-description` : undefined\n const errorId = hasError ? `${baseId}-error` : undefined\n const describedBy = [ariaDescribedBy, descriptionId, errorId].filter(Boolean).join(' ') || undefined\n // Grupos de opções tremem uma vez quando o erro surge; seções só mostram a barra.\n const { shakeClassName, onAnimationEnd } = useErrorShake(appearance === 'group' && hasError)\n\n return (\n <fieldset\n ref={ref}\n className={cx('or-fieldset', `or-fieldset--${appearance}`, className)}\n aria-describedby={describedBy}\n data-invalid={hasError || undefined}\n {...rest}\n >\n {hasContent(legend) && (\n <legend className={cx('or-fieldset__legend', hideLegend && 'or-visually-hidden')}>\n {legend}\n {required && (\n <span className=\"or-fieldset__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n {required && announceRequired && <VisuallyHidden> ({t('required')})</VisuallyHidden>}\n {optional && !required && <span className=\"or-fieldset__optional\">({t('optional')})</span>}\n </legend>\n )}\n {hasDescription && (\n <p id={descriptionId} className=\"or-fieldset__description\">\n {description}\n </p>\n )}\n <div\n {...contentProps}\n className={cx('or-fieldset__content', contentProps?.className, shakeClassName)}\n onAnimationEnd={(event) => {\n contentProps?.onAnimationEnd?.(event)\n onAnimationEnd(event)\n }}\n >\n {children}\n </div>\n {hasError && (\n <p id={errorId} className=\"or-fieldset__error\">\n <Icon name=\"alert-circle\" size=\"sm\" />\n <span>{error}</span>\n </p>\n )}\n </fieldset>\n )\n})\n","import { createContext, useContext } from 'react'\n\nexport interface CheckboxGroupContextValue {\n name?: string\n value: string[]\n disabled: boolean\n invalid: boolean\n toggle: (value: string, checked: boolean) => void\n}\n\nexport const CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null)\n\nexport function useCheckboxGroup() {\n return useContext(CheckboxGroupContext)\n}\n","import { forwardRef, useMemo, useRef, type ChangeEvent, type InputHTMLAttributes, type ReactNode } from 'react'\nimport { useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport { hasContent } from '../Fieldset/FieldsetBase'\nimport { useErrorShake } from '../TextField/useErrorShake'\nimport { useCheckboxGroup } from './CheckboxGroupContext'\nimport '../TextField/FormMotion.css'\nimport './Checkbox.css'\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n /** Rótulo clicável ao lado da caixa. Sem rótulo visível, informe `aria-label`. */\n label?: ReactNode\n /** Texto de ajuda abaixo do rótulo, ligado por `aria-describedby`. */\n description?: ReactNode\n /** Mensagem de erro. Quando presente, a caixa fica inválida. */\n error?: ReactNode\n /** Força o estado inválido sem exibir mensagem. */\n invalid?: boolean\n /** Estado misto (ex.: \"selecionar todos\" com parte dos itens marcada). */\n indeterminate?: boolean\n /** Chamado com o novo estado marcado (atalho para `onChange`). */\n onCheckedChange?: (checked: boolean) => void\n}\n\n/**\n * Caixa de seleção nativa estilizada. Use sozinha (aceite de termos) ou dentro\n * de um `CheckboxGroup`. A `ref` e as props nativas vão para o `<input>`;\n * `className` e `style` vão para o contêiner.\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n label,\n description,\n error,\n invalid = false,\n indeterminate = false,\n required,\n disabled,\n id,\n className,\n style,\n checked,\n name,\n value,\n onChange,\n onCheckedChange,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n },\n ref,\n) {\n const group = useCheckboxGroup()\n const inputId = useId('or-checkbox', id)\n const innerRef = useRef<HTMLInputElement>(null)\n const mergedRef = useMemo(() => mergeRefs(ref, innerRef), [ref])\n const hasDescription = hasContent(description)\n const hasError = hasContent(error)\n const descriptionId = hasDescription ? `${inputId}-description` : undefined\n const errorId = hasError ? `${inputId}-error` : undefined\n const isInvalid = hasError || invalid\n const isDisabled = Boolean(disabled || group?.disabled)\n const inGroup = group !== null && value !== undefined\n const isChecked = inGroup ? group.value.includes(String(value)) : checked\n const { shakeClassName, onAnimationEnd } = useErrorShake(isInvalid)\n\n devWarning(group !== null && value === undefined, 'Checkbox dentro de CheckboxGroup precisa de `value`.')\n devWarning(\n !hasContent(label) && !rest['aria-label'] && !rest['aria-labelledby'],\n 'Checkbox sem `label` precisa de `aria-label` ou `aria-labelledby`.',\n )\n\n // `indeterminate` só existe como propriedade do DOM.\n useIsomorphicLayoutEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate\n }, [indeterminate, isChecked])\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event)\n onCheckedChange?.(event.target.checked)\n if (inGroup) group.toggle(String(value), event.target.checked)\n }\n\n return (\n <div\n className={cx('or-checkbox', className)}\n style={style}\n data-invalid={isInvalid || undefined}\n data-disabled={isDisabled || undefined}\n >\n <div className=\"or-checkbox__row\">\n <span className=\"or-checkbox__control\">\n <input\n ref={mergedRef}\n type=\"checkbox\"\n id={inputId}\n className=\"or-checkbox__input\"\n name={name ?? group?.name}\n value={value}\n checked={isChecked}\n required={required}\n disabled={isDisabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={[ariaDescribedBy, descriptionId, errorId].filter(Boolean).join(' ') || undefined}\n onChange={handleChange}\n {...rest}\n />\n <span className={cx('or-checkbox__box', shakeClassName)} aria-hidden=\"true\" onAnimationEnd={onAnimationEnd}>\n <Icon name=\"check\" size={14} strokeWidth={3} className=\"or-checkbox__check\" />\n <Icon name=\"minus\" size={14} strokeWidth={3} className=\"or-checkbox__dash\" />\n </span>\n </span>\n {hasContent(label) && (\n <label htmlFor={inputId} className=\"or-checkbox__label\">\n {label}\n {required && (\n <span className=\"or-checkbox__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n </div>\n {hasDescription && (\n <p id={descriptionId} className=\"or-checkbox__description\">\n {description}\n </p>\n )}\n {hasError && (\n <p id={errorId} className=\"or-checkbox__error\">\n <Icon name=\"alert-circle\" size=\"sm\" />\n <span>{error}</span>\n </p>\n )}\n </div>\n )\n})\n","import { forwardRef, useMemo, type FieldsetHTMLAttributes, type ReactNode } from 'react'\nimport { useControllableState } from '../../hooks'\nimport { cx } from '../../utils'\nimport { FieldsetBase, hasContent } from '../Fieldset/FieldsetBase'\nimport { Checkbox } from './Checkbox'\nimport { CheckboxGroupContext, type CheckboxGroupContextValue } from './CheckboxGroupContext'\n\nexport interface CheckboxGroupOption {\n value: string\n label: ReactNode\n description?: ReactNode\n disabled?: boolean\n}\n\nexport interface CheckboxGroupProps\n extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'defaultValue' | 'onChange' | 'title'> {\n /** Pergunta ou título do grupo, renderizado como `<legend>`. */\n label: ReactNode\n /** Oculta a legenda visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda do grupo, ligado por `aria-describedby`. */\n description?: ReactNode\n /** Mensagem de erro do grupo. */\n error?: ReactNode\n /** Mostra `*` e anuncia \"obrigatório\" na legenda. A validação fica com o formulário. */\n required?: boolean\n /** Mostra \"(opcional)\" ao lado da legenda. */\n optional?: boolean\n /** Desabilita nativamente todas as opções. */\n disabled?: boolean\n /** `name` aplicado a todas as caixas (envio de formulário). */\n name?: string\n /** Valores marcados (controlado). */\n value?: string[]\n /** Valores marcados inicialmente (não controlado). */\n defaultValue?: string[]\n /** Chamado com a lista de valores marcados. */\n onChange?: (value: string[]) => void\n /** Opções geradas automaticamente. Alternativa a passar `<Checkbox>` como filhos. */\n options?: CheckboxGroupOption[]\n /** Disposição das opções. Padrão: `vertical`. */\n orientation?: 'vertical' | 'horizontal'\n children?: ReactNode\n}\n\n/**\n * Grupo de caixas de seleção para escolhas múltiplas, com `<fieldset>` e\n * `<legend>` nativos. Recebe `options` ou `<Checkbox value=\"…\">` como filhos.\n */\nexport const CheckboxGroup = forwardRef<HTMLFieldSetElement, CheckboxGroupProps>(function CheckboxGroup(\n {\n label,\n hideLabel,\n description,\n error,\n required,\n optional,\n disabled = false,\n name,\n value: valueProp,\n defaultValue = [],\n onChange,\n options,\n orientation = 'vertical',\n className,\n children,\n ...rest\n },\n ref,\n) {\n const [value, setValue] = useControllableState<string[]>({ value: valueProp, defaultValue, onChange })\n const invalid = hasContent(error)\n\n const context = useMemo<CheckboxGroupContextValue>(\n () => ({\n name,\n value,\n disabled,\n invalid,\n toggle: (item, checked) =>\n setValue((prev) => (checked ? (prev.includes(item) ? prev : [...prev, item]) : prev.filter((v) => v !== item))),\n }),\n [name, value, disabled, invalid, setValue],\n )\n\n return (\n <CheckboxGroupContext.Provider value={context}>\n <FieldsetBase\n ref={ref}\n appearance=\"group\"\n legend={label}\n hideLegend={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n announceRequired\n disabled={disabled}\n className={cx('or-checkbox-group', className)}\n contentProps={{ 'data-orientation': orientation }}\n {...rest}\n >\n {options?.map((option) => (\n <Checkbox\n key={option.value}\n value={option.value}\n label={option.label}\n description={option.description}\n disabled={option.disabled}\n />\n ))}\n {children}\n </FieldsetBase>\n </CheckboxGroupContext.Provider>\n )\n})\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { composeEventHandlers, cx, devWarning } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Chip.css'\n\nexport type ChipSize = 'sm' | 'md'\n\ninterface ChipGroupContextValue {\n isSelected: (value: string) => boolean\n toggle: (value: string) => void\n size?: ChipSize\n disabled: boolean\n}\n\nconst ChipGroupContext = createContext<ChipGroupContextValue | null>(null)\n\nexport interface ChipProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Valor do chip dentro de um `ChipGroup`. */\n value?: string\n /** Selecionado (controlado, fora de um grupo). */\n selected?: boolean\n /** Selecionado inicialmente (não controlado, fora de um grupo). */\n defaultSelected?: boolean\n /** Chamado quando o chip é alternado (fora de um grupo). */\n onSelectedChange?: (selected: boolean) => void\n /** Ícone antes do rótulo. Quando selecionado, dá lugar ao check. */\n icon?: ReactNode\n /** Contagem exibida após o rótulo (ex.: resultados do filtro). */\n count?: number\n /** Altura: `sm` 28px ou `md` 32px. */\n size?: ChipSize\n}\n\n/**\n * Botão de alternância para filtros (`aria-pressed`). Mostra um check\n * quando selecionado. Agrupe com `ChipGroup`.\n */\nexport const Chip = forwardRef<HTMLButtonElement, ChipProps>(function Chip(\n {\n value,\n selected: selectedProp,\n defaultSelected = false,\n onSelectedChange,\n icon,\n count,\n size: sizeProp,\n disabled: disabledProp,\n className,\n children,\n onClick,\n ...rest\n },\n ref,\n) {\n const group = useContext(ChipGroupContext)\n devWarning(group !== null && value === undefined, 'Chip dentro de ChipGroup precisa de `value`.')\n const [ownSelected, setOwnSelected] = useControllableState({\n value: selectedProp,\n defaultValue: defaultSelected,\n onChange: onSelectedChange,\n })\n const inGroup = group !== null && value !== undefined\n const selected = inGroup ? group.isSelected(value) : ownSelected\n const disabled = disabledProp ?? group?.disabled ?? false\n const size = sizeProp ?? group?.size ?? 'md'\n // O check só anima depois de uma interação (não \"pisca\" no carregamento).\n const [touched, setTouched] = useState(false)\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cx('or-chip', `or-chip--${size}`, className)}\n aria-pressed={selected}\n disabled={disabled}\n data-touched={touched || undefined}\n onClick={composeEventHandlers(onClick, () => {\n setTouched(true)\n if (inGroup) group.toggle(value)\n else setOwnSelected(!selected)\n })}\n {...rest}\n >\n {(selected || icon) && (\n <span className={cx('or-chip__icon', selected && 'or-chip__icon--check')} aria-hidden=\"true\">\n {selected ? <Icon name=\"check\" strokeWidth={2.25} /> : icon}\n </span>\n )}\n <span className=\"or-chip__label\">{children}</span>\n {count !== undefined && (\n <>\n <span className=\"or-chip__count\" aria-hidden=\"true\">\n {count}\n </span>\n <VisuallyHidden>{`\\u00a0(${count})`}</VisuallyHidden>\n </>\n )}\n </button>\n )\n})\n\ninterface ChipGroupBaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n /** Rótulo do grupo (ex.: \"Status\"). */\n label?: ReactNode\n /** Esconde o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Tamanho aplicado a todos os chips. */\n size?: ChipSize\n /** Desabilita todos os chips. */\n disabled?: boolean\n}\n\nexport interface ChipGroupMultipleProps extends ChipGroupBaseProps {\n /** `multiple` (padrão): vários chips selecionados. */\n type?: 'multiple'\n value?: string[]\n defaultValue?: string[]\n onChange?: (value: string[]) => void\n}\n\nexport interface ChipGroupSingleProps extends ChipGroupBaseProps {\n /** `single`: no máximo um chip selecionado; clicar no selecionado o desmarca. */\n type: 'single'\n value?: string | null\n defaultValue?: string | null\n onChange?: (value: string | null) => void\n}\n\nexport type ChipGroupProps = ChipGroupMultipleProps | ChipGroupSingleProps\n\nfunction toArray(value: string | string[] | null | undefined): string[] | undefined {\n if (value === undefined) return undefined\n if (value === null) return []\n return Array.isArray(value) ? value : [value]\n}\n\n/** Agrupa chips de filtro (`role=\"group\"` rotulado) com seleção única ou múltipla. */\nexport const ChipGroup = forwardRef<HTMLDivElement, ChipGroupProps>(function ChipGroup(props, ref) {\n const {\n type = 'multiple',\n value,\n defaultValue,\n onChange,\n label,\n hideLabel = false,\n size,\n disabled = false,\n className,\n children,\n ...rest\n } = props\n const single = type === 'single'\n const labelId = useId('or-chip-group')\n devWarning(\n !label && !rest['aria-label'] && !rest['aria-labelledby'],\n 'ChipGroup precisa de `label` (ou `aria-label`/`aria-labelledby`).',\n )\n\n const [selected, setSelected] = useControllableState<string[]>({\n value: toArray(value),\n defaultValue: toArray(defaultValue) ?? [],\n onChange: (next) => {\n if (single) (onChange as ((v: string | null) => void) | undefined)?.(next[0] ?? null)\n else (onChange as ((v: string[]) => void) | undefined)?.(next)\n },\n })\n\n const toggle = useCallback(\n (chipValue: string) => {\n setSelected((prev) => {\n const isOn = prev.includes(chipValue)\n if (single) return isOn ? [] : [chipValue]\n return isOn ? prev.filter((v) => v !== chipValue) : [...prev, chipValue]\n })\n },\n [single, setSelected],\n )\n\n const context = useMemo<ChipGroupContextValue>(\n () => ({ isSelected: (v) => selected.includes(v), toggle, size, disabled }),\n [selected, toggle, size, disabled],\n )\n\n return (\n <ChipGroupContext.Provider value={context}>\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n className={cx('or-chip-group', className)}\n {...rest}\n >\n {label &&\n (hideLabel ? (\n <VisuallyHidden id={labelId}>{label}</VisuallyHidden>\n ) : (\n <span id={labelId} className=\"or-chip-group__label\">\n {label}\n </span>\n ))}\n {children}\n </div>\n </ChipGroupContext.Provider>\n )\n})\n","import { forwardRef, useMemo, useState, type CSSProperties, type HTMLAttributes } from 'react'\nimport { useClipboard, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './CodeBlock.css'\n\nexport interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title' | 'onCopy'> {\n /** Código exibido. Quebras de linha no final são removidas. */\n code: string\n /** Linguagem do trecho (`tsx`, `bash`, `json`…), exibida como rótulo no cabeçalho. */\n language?: string\n /** Nome do arquivo ou título do trecho, exibido no cabeçalho. */\n title?: string\n /** Mostra a numeração das linhas (não é copiada nem lida por leitores de tela). */\n showLineNumbers?: boolean\n /** Número da primeira linha — útil para trechos de um arquivo maior. Padrão: `1`. */\n startingLineNumber?: number\n /** Linhas destacadas, pelo número exibido (considera `startingLineNumber`). */\n highlightLines?: number[]\n /** Quebra linhas longas em vez de rolar horizontalmente. */\n wrap?: boolean\n /** Altura máxima da área de código antes de rolar (px ou valor CSS). */\n maxHeight?: number | string\n /** Mostra o botão de copiar. Padrão: `true`. */\n copyable?: boolean\n /** Chamado depois que o código é copiado com sucesso. */\n onCopy?: (code: string) => void\n /** Nome acessível da área rolável. Padrão: \"Código: {title ou language}\". */\n codeLabel?: string\n}\n\n/**\n * Exibe trechos de código em fonte monoespaçada sobre fundo escuro, com botão\n * de copiar, numeração e destaque de linhas. Não faz realce de sintaxe — mantém\n * a biblioteca leve e o código legível em qualquer linguagem.\n */\nexport const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(function CodeBlock(\n {\n code,\n language,\n title,\n showLineNumbers = false,\n startingLineNumber = 1,\n highlightLines,\n wrap = false,\n maxHeight,\n copyable = true,\n onCopy,\n codeLabel,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const { copy, copied } = useClipboard()\n // Depois da primeira cópia, a volta do ícone \"copiar\" também é animada.\n const [hasCopied, setHasCopied] = useState(false)\n const labelId = useId('or-code-block-label')\n const trimmed = useMemo(() => code.replace(/\\r\\n?/g, '\\n').replace(/\\n+$/, ''), [code])\n const lines = useMemo(() => trimmed.split('\\n'), [trimmed])\n const highlighted = useMemo(() => new Set(highlightLines ?? []), [highlightLines])\n const lastLineNumber = startingLineNumber + lines.length - 1\n const name = title ?? language\n const hasHeader = Boolean(title || language || copyable)\n\n const handleCopy = async () => {\n const ok = await copy(trimmed)\n if (ok) {\n setHasCopied(true)\n onCopy?.(trimmed)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'or-code-block',\n wrap && 'or-code-block--wrap',\n showLineNumbers && 'or-code-block--line-numbers',\n className,\n )}\n {...rest}\n >\n {hasHeader && (\n <div className=\"or-code-block__header\">\n <span className=\"or-code-block__meta\">\n {title && (\n <span className=\"or-code-block__title\" id={labelId}>\n {title}\n </span>\n )}\n {language && (\n <span className=\"or-code-block__language\" id={title ? undefined : labelId}>\n {language}\n </span>\n )}\n </span>\n {copyable && (\n <button\n type=\"button\"\n className=\"or-code-block__copy\"\n onClick={handleCopy}\n aria-describedby={name ? labelId : undefined}\n data-copied={copied || undefined}\n >\n <span\n key={copied ? 'check' : 'copy'}\n className={cx(\n 'or-code-block__copy-icon',\n copied && 'or-code-block__copy-icon--check',\n !copied && hasCopied && 'or-code-block__copy-icon--return',\n )}\n aria-hidden=\"true\"\n >\n <Icon name={copied ? 'check' : 'copy'} size=\"sm\" />\n </span>\n <span>{copied ? t('copied') : t('copy')}</span>\n </button>\n )}\n {copyable && (\n <VisuallyHidden role=\"status\" aria-live=\"polite\">\n {copied ? t('copied') : ''}\n </VisuallyHidden>\n )}\n </div>\n )}\n <pre\n className=\"or-code-block__pre\"\n tabIndex={0}\n role=\"group\"\n aria-label={codeLabel ?? (name ? t('codeBlockNamed', { name }) : t('codeBlock'))}\n style={\n {\n maxHeight,\n '--_digits': `${String(lastLineNumber).length}ch`,\n } as CSSProperties\n }\n data-language={language}\n >\n <code className=\"or-code-block__code\">\n {lines.map((line, index) => {\n const lineNumber = startingLineNumber + index\n const isHighlighted = highlighted.has(lineNumber)\n // A linha mantém o mesmo elemento (o fundo do destaque transiciona);\n // o texto destacado fica num <mark> para leitores de tela.\n const Text = isHighlighted ? 'mark' : 'span'\n return (\n <span\n key={index}\n className={cx('or-code-block__line', isHighlighted && 'or-code-block__line--highlighted')}\n >\n {showLineNumbers && (\n <span className=\"or-code-block__line-number\" aria-hidden=\"true\" data-line={lineNumber} />\n )}\n <Text className=\"or-code-block__line-text\">\n {line}\n {'\\n'}\n </Text>\n </span>\n )\n })}\n </code>\n </pre>\n </div>\n )\n})\n","import { createContext, useContext, useMemo, type HTMLAttributes, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport './Field.css'\n\nexport interface FieldContextValue {\n controlId: string\n labelId: string\n descriptionId?: string\n errorId?: string\n invalid: boolean\n required: boolean\n disabled: boolean\n}\n\nconst FieldContext = createContext<FieldContextValue | null>(null)\n\n/** Lê o contexto do `Field` mais próximo (ou `null`). */\nexport function useField(): FieldContextValue | null {\n return useContext(FieldContext)\n}\n\nexport interface FieldControlProps {\n id?: string\n 'aria-describedby'?: string\n 'aria-invalid'?: boolean\n 'aria-labelledby'?: string\n required?: boolean\n disabled?: boolean\n}\n\n/**\n * Retorna os atributos que ligam um controle (input, select, textarea) ao\n * rótulo, à descrição e à mensagem de erro do `Field` que o envolve.\n * Valores passados em `own` têm precedência.\n */\nexport function useFieldControlProps(own: FieldControlProps = {}): FieldControlProps {\n const field = useField()\n if (!field) return own\n const describedBy = [own['aria-describedby'], field.descriptionId, field.errorId].filter(Boolean).join(' ')\n return {\n id: own.id ?? field.controlId,\n 'aria-describedby': describedBy || undefined,\n 'aria-invalid': own['aria-invalid'] ?? (field.invalid || undefined),\n required: own.required ?? (field.required || undefined),\n disabled: own.disabled ?? (field.disabled || undefined),\n ...(own['aria-labelledby'] ? { 'aria-labelledby': own['aria-labelledby'] } : {}),\n }\n}\n\nexport interface FieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Rótulo visível do campo. Sempre informe um rótulo — mesmo que oculto. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda exibido abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. Quando presente, o campo fica inválido. */\n error?: ReactNode\n /** Campo obrigatório: mostra `*` e marca o controle como `required`. */\n required?: boolean\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n disabled?: boolean\n /** Id do controle. Gerado automaticamente se omitido. */\n controlId?: string\n /** Elemento extra à direita do rótulo (ex.: contador, link). */\n labelAside?: ReactNode\n children: ReactNode\n}\n\n/**\n * Estrutura padrão de campos de formulário: rótulo, descrição, controle e\n * erro, com todos os vínculos ARIA (`for`, `aria-describedby`, `aria-invalid`).\n */\nexport function Field({\n label,\n hideLabel = false,\n description,\n error,\n required = false,\n optional = false,\n disabled = false,\n controlId: controlIdProp,\n labelAside,\n className,\n children,\n ...rest\n}: FieldProps) {\n const { t } = useLocale()\n const controlId = useId('or-field', controlIdProp)\n const hasError = error !== undefined && error !== null && error !== false && error !== ''\n const value = useMemo<FieldContextValue>(\n () => ({\n controlId,\n labelId: `${controlId}-label`,\n descriptionId: description ? `${controlId}-description` : undefined,\n errorId: hasError ? `${controlId}-error` : undefined,\n invalid: hasError,\n required,\n disabled,\n }),\n [controlId, description, hasError, required, disabled],\n )\n\n return (\n <FieldContext.Provider value={value}>\n <div\n className={cx('or-field', className)}\n data-invalid={hasError || undefined}\n data-disabled={disabled || undefined}\n {...rest}\n >\n {label && (\n <div className={cx('or-field__label-row', hideLabel && 'or-visually-hidden')}>\n <label id={value.labelId} htmlFor={controlId} className=\"or-field__label\">\n {label}\n {required && (\n <span className=\"or-field__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n {optional && !required && <span className=\"or-field__optional\">({t('optional')})</span>}\n </label>\n {labelAside && <span className=\"or-field__label-aside\">{labelAside}</span>}\n </div>\n )}\n {description && (\n <p id={value.descriptionId} className=\"or-field__description\">\n {description}\n </p>\n )}\n {children}\n {hasError && (\n <p id={value.errorId} className=\"or-field__error\">\n <Icon name=\"alert-circle\" size=\"sm\" />\n <span>{error}</span>\n </p>\n )}\n </div>\n </FieldContext.Provider>\n )\n}\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport {\n Field,\n useField,\n useFieldControlProps,\n type FieldContextValue,\n type FieldControlProps,\n} from '../Field'\nimport './ColorField.css'\n\nexport interface ColorSwatch {\n /** Cor em hexadecimal (`#rrggbb` ou `#rgb`). */\n value: string\n /** Nome acessível da cor (\"Laranja Orange\"). Padrão: o próprio hexadecimal. */\n label?: string\n}\n\nexport type ColorFieldSize = 'sm' | 'md' | 'lg'\n\nexport interface ColorFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'type'\n> {\n /** Cor no formato `#rrggbb` (controlado). `''` = sem cor. */\n value?: string\n /** Cor inicial (não controlado). */\n defaultValue?: string\n /** Chamado com a cor normalizada (`#rrggbb`, minúsculas) sempre que ela for válida. */\n onChange?: (value: string) => void\n /** Cores sugeridas, exibidas como grupo de opções (radiogroup). */\n swatches?: (string | ColorSwatch)[]\n /** Rótulo visível do campo. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. Substitui a validação interna de formato. */\n error?: ReactNode\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n /** Altura do campo: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: ColorFieldSize\n}\n\n/** Normaliza `#RGB`, `RGB`, `#RRGGBB` ou `RRGGBB` para `#rrggbb`. Retorna `null` se inválido. */\nfunction normalizeHex(input: string): string | null {\n const match = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(input.trim())\n if (!match) return null\n const hex = match[1].length === 3 ? [...match[1]].map((c) => c + c).join('') : match[1]\n return `#${hex.toLowerCase()}`\n}\n\n/** Luminância relativa (WCAG) para escolher a cor do ícone sobre a amostra. */\nfunction isLightColor(hex: string): boolean {\n const channel = (i: number) => {\n const c = parseInt(hex.slice(i, i + 2), 16) / 255\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n }\n return 0.2126 * channel(1) + 0.7152 * channel(3) + 0.0722 * channel(5) > 0.4\n}\n\nfunction FieldSlot({\n id,\n children,\n}: {\n id?: string\n children: (field: FieldContextValue | null, controlProps: FieldControlProps) => ReactNode\n}) {\n return <>{children(useField(), useFieldControlProps({ id }))}</>\n}\n\n/**\n * Campo de cor: seletor nativo (`<input type=\"color\">`) sincronizado com um\n * campo hexadecimal validado e, opcionalmente, uma paleta de cores sugeridas.\n */\nexport const ColorField = forwardRef<HTMLInputElement, ColorFieldProps>(function ColorField(\n {\n value: valueProp,\n defaultValue = '',\n onChange,\n swatches,\n label,\n hideLabel,\n description,\n error,\n required,\n optional,\n disabled,\n readOnly,\n size = 'md',\n id,\n className,\n style,\n placeholder = '#rrggbb',\n onBlur,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const baseId = useId('or-color-field')\n const pickerTextId = `${baseId}-picker`\n const swatchesTextId = `${baseId}-swatches`\n const swatchesRef = useRef<HTMLDivElement>(null)\n\n const [value, setValue] = useControllableState({\n value: valueProp === undefined ? undefined : (normalizeHex(valueProp) ?? valueProp),\n defaultValue: normalizeHex(defaultValue) ?? '',\n onChange,\n })\n const [text, setText] = useState(value)\n const [formatError, setFormatError] = useState(false)\n\n // Valor alterado por fora → atualiza o texto (sem atropelar o que já é igual).\n useEffect(() => {\n setText((current) => (normalizeHex(current) === value ? current : value))\n if (value) setFormatError(false)\n }, [value])\n\n const options = (swatches ?? []).map((swatch) =>\n typeof swatch === 'string'\n ? { value: normalizeHex(swatch) ?? swatch, label: swatch }\n : {\n ...swatch,\n value: normalizeHex(swatch.value) ?? swatch.value,\n label: swatch.label ?? swatch.value,\n },\n )\n const checkedIndex = options.findIndex((option) => option.value === value)\n\n // Cor escolhida na paleta nesta sessão: a amostra ganha o \"pop\".\n const [popped, setPopped] = useState<string | null>(null)\n\n const commit = (next: string) => {\n setFormatError(false)\n setText(next)\n setValue(next)\n }\n\n const commitSwatch = (next: string) => {\n setPopped(next)\n commit(next)\n }\n\n const handleTextChange = (event: ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value\n setText(raw)\n if (raw.trim() === '') {\n setFormatError(false)\n setValue('')\n return\n }\n const normalized = normalizeHex(raw)\n if (normalized) {\n setFormatError(false)\n setValue(normalized)\n }\n }\n\n const handleTextBlur = (event: FocusEvent<HTMLInputElement>) => {\n onBlur?.(event)\n if (text.trim() === '') return\n const normalized = normalizeHex(text)\n if (normalized) setText(normalized)\n else setFormatError(true)\n }\n\n const swatchesDisabled = disabled || readOnly\n const handleSwatchKeyDown = (event: KeyboardEvent<HTMLButtonElement>, index: number) => {\n const last = options.length - 1\n let next = -1\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown')\n next = index === last ? 0 : index + 1\n else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp')\n next = index === 0 ? last : index - 1\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = last\n else return\n event.preventDefault()\n if (swatchesDisabled) return\n commitSwatch(options[next].value)\n swatchesRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]')[next]?.focus()\n }\n\n const errorMessage = error ?? (formatError ? t('invalidColor') : undefined)\n const invalid = !!errorMessage\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={errorMessage}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n className={cx('or-color-field', className)}\n style={style}\n >\n <FieldSlot id={id}>\n {(field, controlProps) => (\n <>\n <div\n className={cx(\n 'or-control-frame',\n `or-control-frame--${size}`,\n 'or-color-field__frame',\n )}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n >\n <span\n className=\"or-color-field__picker\"\n data-empty={!value || undefined}\n data-disabled={disabled || readOnly || undefined}\n >\n <input\n type=\"color\"\n className=\"or-color-field__native\"\n value={value || '#000000'}\n disabled={disabled || readOnly}\n aria-labelledby={[field?.labelId, pickerTextId].filter(Boolean).join(' ')}\n onChange={(event) => commit(event.target.value.toLowerCase())}\n />\n {/* Camada sobre a amostra nativa: faz o crossfade entre as cores. */}\n <span\n className=\"or-color-field__preview\"\n style={value ? { backgroundColor: value } : undefined}\n aria-hidden=\"true\"\n />\n </span>\n <span id={pickerTextId} hidden>\n {t('colorPicker')}\n </span>\n <input\n {...rest}\n {...controlProps}\n ref={ref}\n type=\"text\"\n className=\"or-control-frame__input or-color-field__input\"\n value={text}\n placeholder={placeholder}\n maxLength={7}\n spellCheck={false}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n readOnly={readOnly}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n onChange={handleTextChange}\n onBlur={handleTextBlur}\n />\n </div>\n {options.length > 0 && (\n <div\n ref={swatchesRef}\n role=\"radiogroup\"\n aria-labelledby={[field?.labelId, swatchesTextId].filter(Boolean).join(' ')}\n aria-disabled={swatchesDisabled || undefined}\n className=\"or-color-field__swatches\"\n >\n <span id={swatchesTextId} hidden>\n {t('suggestedColors')}\n </span>\n {options.map((option, index) => {\n const checked = index === checkedIndex\n const focusable = checkedIndex === -1 ? index === 0 : checked\n const valid = /^#[0-9a-f]{6}$/.test(option.value)\n return (\n <button\n key={`${option.value}-${index}`}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={option.label}\n tabIndex={focusable ? 0 : -1}\n disabled={disabled}\n aria-disabled={readOnly || undefined}\n className={cx(\n 'or-color-field__swatch',\n checked && popped === option.value && 'or-color-field__swatch--pop',\n )}\n style={{ '--_swatch': option.value } as CSSProperties}\n data-tone={valid && isLightColor(option.value) ? 'light' : 'dark'}\n onClick={() => {\n if (!swatchesDisabled) commitSwatch(option.value)\n }}\n onKeyDown={(event) => handleSwatchKeyDown(event, index)}\n >\n <span\n className=\"or-color-field__chip\"\n style={{ backgroundColor: option.value }}\n aria-hidden=\"true\"\n >\n {checked && <Icon name=\"check\" size=\"sm\" strokeWidth={2.5} />}\n </span>\n </button>\n )\n })}\n </div>\n )}\n </>\n )}\n </FieldSlot>\n </Field>\n )\n})\n","/**\n * Helpers internos de movimento do grupo \"Seleção e entrada\" (não exportados\n * pela biblioteca): saída animada de itens de lista (chips/tags) e tremor\n * de erro disparado uma vez quando o erro surge.\n */\nimport { useCallback, useEffect, useRef, useState, type AnimationEvent } from 'react'\nimport { usePresence } from '../../hooks'\nimport { canUseDOM } from '../../utils'\n\n/** `true` quando o elemento tem uma animação CSS com duração > 0 (falso no jsdom). */\nfunction hasRunningAnimation(el: Element): boolean {\n if (!canUseDOM) return false\n const style = getComputedStyle(el)\n if (!style.animationName || style.animationName === 'none') return false\n return style.animationDuration.split(',').some((d) => parseFloat(d) > 0)\n}\n\nexport interface ExitingEntry<T> {\n item: T\n key: string\n /** O item já foi removido e está tocando a animação de saída. */\n leaving: boolean\n}\n\n/**\n * Mantém na lista, por uma animação curta, os itens que acabaram de ser\n * removidos — na mesma posição — para que saiam com fade/scale em vez de\n * sumir de uma vez. Itens que saem são marcados `leaving` (renderize-os com\n * `aria-hidden`, `inert` e `data-state=\"closed\"`) e liberados no\n * `animationend` (ou na hora, se não houver animação).\n */\nexport function useExitingItems<T>(items: T[], keyOf: (item: T) => string) {\n const keys = items.map(keyOf)\n const signature = keys.join('\\u0000')\n const [prev, setPrev] = useState({ items, signature })\n const [leaving, setLeaving] = useState<{ item: T; key: string; index: number }[]>([])\n\n // Estado derivado durante a renderização (compara as chaves, não a identidade do array):\n // evita desmontar e remontar o item que sai.\n if (prev.signature !== signature) {\n const nextKeys = new Set(keys)\n const removed = prev.items\n .map((item, index) => ({ item, key: keyOf(item), index }))\n .filter((entry) => !nextKeys.has(entry.key))\n setPrev({ items, signature })\n setLeaving((current) => [\n ...current.filter(\n (entry) => !nextKeys.has(entry.key) && !removed.some((r) => r.key === entry.key),\n ),\n ...removed,\n ])\n }\n\n const release = useCallback((key: string) => {\n setLeaving((current) =>\n current.some((e) => e.key === key) ? current.filter((e) => e.key !== key) : current,\n )\n }, [])\n\n // Rede de segurança: libera tudo depois de 1s mesmo sem animationend.\n useEffect(() => {\n if (leaving.length === 0) return\n const timer = setTimeout(() => setLeaving([]), 1000)\n return () => clearTimeout(timer)\n }, [leaving])\n\n const entries: ExitingEntry<T>[] = items.map((item) => ({\n item,\n key: keyOf(item),\n leaving: false,\n }))\n for (const entry of [...leaving].sort((a, b) => a.index - b.index)) {\n entries.splice(Math.min(entry.index, entries.length), 0, {\n item: entry.item,\n key: entry.key,\n leaving: true,\n })\n }\n\n /** Props para o elemento de um item que está saindo. */\n const leavingProps = (key: string) => ({\n 'aria-hidden': true as const,\n inert: true,\n 'data-state': 'closed' as const,\n ref: (el: HTMLElement | null) => {\n if (el && !hasRunningAnimation(el)) release(key)\n },\n onAnimationEnd: (event: AnimationEvent<HTMLElement>) => {\n if (event.target === event.currentTarget) release(key)\n },\n })\n\n return { entries, leavingProps }\n}\n\n/**\n * Liga um tremor curto (`data-shake`) quando `signal` muda para um valor\n * verdadeiro — ex.: a mensagem de erro surge ou muda. Não dispara na\n * montagem, para que erros já presentes não \"pisquem\" ao carregar a página.\n */\nexport function useShake(signal: unknown) {\n const [shaking, setShaking] = useState(false)\n const previous = useRef(signal)\n useEffect(() => {\n if (signal && signal !== previous.current) setShaking(true)\n previous.current = signal\n }, [signal])\n useEffect(() => {\n if (!shaking) return\n const timer = setTimeout(() => setShaking(false), 800)\n return () => clearTimeout(timer)\n }, [shaking])\n const onAnimationEnd = useCallback((event: AnimationEvent<HTMLElement>) => {\n if (event.target === event.currentTarget) setShaking(false)\n }, [])\n return { 'data-shake': shaking || undefined, onAnimationEnd }\n}\n\n/**\n * `usePresence` para elementos pequenos dentro do campo (botão limpar):\n * `dataState` só é definido depois da primeira mudança, para que um botão\n * já visível ao carregar não anime na montagem.\n */\nexport function useInlinePresence<T extends HTMLElement = HTMLElement>(open: boolean) {\n const { present, state, nodeRef } = usePresence<T>(open)\n const initial = useRef(open)\n const changed = useRef(false)\n if (open !== initial.current) changed.current = true\n return { present, closing: !open, nodeRef, dataState: changed.current ? state : undefined }\n}\n","/**\n * Peças internas compartilhadas por Combobox e MultiSelect (não exportadas\n * pela biblioteca): normalização de texto, destaque do trecho buscado,\n * posicionamento do popup, região de anúncios e o item de opção.\n */\nimport { autoUpdate, flip, offset, shift, size, useFloating } from '@floating-ui/react-dom'\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { useIsomorphicLayoutEffect, usePresence } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './ListboxPopup.css'\n\nexport interface ListboxOptionData {\n value: string\n label: string\n disabled?: boolean\n description?: string\n}\n\n/** Remove acentos e caixa para comparar textos (\"São\" casa com \"sao\"). */\nexport function normalizeText(text: string): string {\n return text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n}\n\n/** Filtro padrão: o rótulo (ou a descrição) contém o texto buscado, ignorando acentos. */\nexport function defaultOptionFilter(option: ListboxOptionData, query: string): boolean {\n const q = normalizeText(query.trim())\n if (!q) return true\n return (\n normalizeText(option.label).includes(q) ||\n (option.description ? normalizeText(option.description).includes(q) : false)\n )\n}\n\n/** Localiza `query` em `text` ignorando acentos e devolve [início, fim] no texto original. */\nfunction findMatch(text: string, query: string): [number, number] | null {\n const q = normalizeText(query.trim())\n if (!q) return null\n let normalized = ''\n const map: number[] = []\n for (let i = 0; i < text.length; i++) {\n const n = normalizeText(text[i])\n for (let j = 0; j < n.length; j++) map.push(i)\n normalized += n\n }\n const start = normalized.indexOf(q)\n if (start < 0) return null\n return [map[start], map[start + q.length - 1] + 1]\n}\n\n/** Destaca (com <mark>) o trecho do rótulo que corresponde à busca. */\nexport function HighlightMatch({ text, query }: { text: string; query: string }) {\n const match = findMatch(text, query)\n if (!match) return <>{text}</>\n const [start, end] = match\n return (\n <>\n {text.slice(0, start)}\n <mark className=\"or-combobox-option__match\">{text.slice(start, end)}</mark>\n {text.slice(end)}\n </>\n )\n}\n\n/** Próximo índice habilitado a partir de `from`, andando `step` (±1), com volta. */\nexport function nextEnabledIndex(\n items: { disabled?: boolean }[],\n from: number,\n step: 1 | -1,\n loop = true,\n): number {\n const count = items.length\n if (count === 0) return -1\n let index = from\n for (let i = 0; i < count; i++) {\n index += step\n if (index >= count) {\n if (!loop) return from\n index = 0\n } else if (index < 0) {\n if (!loop) return from\n index = count - 1\n }\n if (!items[index].disabled) return index\n }\n return -1\n}\n\nexport function firstEnabledIndex(items: { disabled?: boolean }[]): number {\n return items.findIndex((item) => !item.disabled)\n}\n\nexport function lastEnabledIndex(items: { disabled?: boolean }[]): number {\n for (let i = items.length - 1; i >= 0; i--) if (!items[i].disabled) return i\n return -1\n}\n\n/**\n * Posiciona o popup sob o controle (com `flip`/`shift`), iguala a largura e\n * limita a altura ao espaço disponível. Também copia o `data-theme` mais\n * próximo do controle, para que o popup (renderizado no `body`) siga o tema\n * de uma área com tema próprio.\n *\n * Movimento: com `usePresence`, o popup continua montado durante a animação\n * de saída (`present` + `data-state`). `side` indica para que lado ele abriu\n * (a entrada desliza a partir do campo). O posicionamento usa `left/top`\n * (`transform: false`) para que o `transform` fique livre para a animação.\n */\nexport function useListboxPopup(open: boolean) {\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(open)\n const { refs, floatingStyles, elements, placement } = useFloating({\n open: present,\n placement: 'bottom-start',\n strategy: 'fixed',\n transform: false,\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n padding: 8,\n apply({ rects, availableHeight, elements: els }) {\n els.floating.style.width = `${rects.reference.width}px`\n els.floating.style.maxHeight = `${Math.max(140, Math.min(320, availableHeight))}px`\n },\n }),\n ],\n whileElementsMounted: autoUpdate,\n })\n const [theme, setTheme] = useState<string>()\n useIsomorphicLayoutEffect(() => {\n if (!open) return\n const reference = elements.reference as HTMLElement | null\n setTheme(reference?.closest?.('[data-theme]')?.getAttribute('data-theme') ?? undefined)\n }, [open, elements.reference])\n const side = placement.startsWith('top') ? 'top' : 'bottom'\n return { refs, floatingStyles, theme, present, state, nodeRef, side }\n}\n\n/**\n * Congela o conteúdo enquanto `frozen` for verdadeiro: durante a saída do\n * popup, a lista não pode mudar (ex.: a busca é limpa ao escolher) — senão\n * o conteúdo \"pisca\" antes de sumir.\n */\nexport function Freeze({ frozen, children }: { frozen: boolean; children: ReactNode }) {\n const last = useRef(children)\n if (!frozen) last.current = children\n return <>{last.current}</>\n}\n\n/**\n * Região `role=\"status\"` para anúncios de leitores de tela (contagem de\n * resultados, itens adicionados/removidos). Mensagens repetidas são\n * reanunciadas.\n */\nexport function useAnnouncer() {\n const [message, setMessage] = useState('')\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const announce = useCallback((text: string, delay = 0) => {\n clearTimeout(timer.current)\n const run = () => setMessage((prev) => (prev === text ? `${text}\\u00a0` : text))\n if (delay > 0) timer.current = setTimeout(run, delay)\n else run()\n }, [])\n useEffect(() => () => clearTimeout(timer.current), [])\n const region = (\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {message}\n </VisuallyHidden>\n )\n return { announce, region }\n}\n\n/** Mantém a opção ativa visível ao navegar por teclado. */\nexport function useScrollActiveIntoView(activeId: string | undefined) {\n useEffect(() => {\n if (!activeId) return\n document.getElementById(activeId)?.scrollIntoView?.({ block: 'nearest' })\n }, [activeId])\n}\n\nexport interface ListboxOptionItemProps {\n id: string\n option: ListboxOptionData\n active: boolean\n selected: boolean\n disabled?: boolean\n multiple?: boolean\n query: string\n onSelect: () => void\n onHover: () => void\n children?: ReactNode\n}\n\n/** Item `role=\"option\"` usado pelos popups do Combobox e do MultiSelect. */\nexport function ListboxOptionItem({\n id,\n option,\n active,\n selected,\n disabled,\n multiple,\n query,\n onSelect,\n onHover,\n}: ListboxOptionItemProps) {\n // O check só \"pula\" quando a seleção muda com a lista aberta (não ao abrir).\n const initialSelected = useRef(selected)\n const toggled = useRef(false)\n if (selected !== initialSelected.current) toggled.current = true\n return (\n // A opção é operada pelo teclado a partir do campo (aria-activedescendant); o clique é o atalho do mouse.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n <li\n id={id}\n role=\"option\"\n // Nome explícito: o destaque da busca (<mark>) não deve fragmentar a leitura.\n aria-label={option.description ? `${option.label}, ${option.description}` : option.label}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n data-active={active || undefined}\n data-pop={(toggled.current && selected) || undefined}\n className={cx('or-combobox-option', multiple && 'or-combobox-option--multiple')}\n // Mantém o foco no campo de texto ao clicar em uma opção.\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => {\n if (!active && !disabled) onHover()\n }}\n onClick={() => {\n if (!disabled) onSelect()\n }}\n >\n {multiple && (\n <span className=\"or-combobox-option__checkbox\" aria-hidden=\"true\">\n {selected && <Icon name=\"check\" size={12} strokeWidth={2.5} />}\n </span>\n )}\n <span className=\"or-combobox-option__text\">\n <span className=\"or-combobox-option__label\">\n <HighlightMatch text={option.label} query={query} />\n </span>\n {option.description && (\n <span className=\"or-combobox-option__description\">\n <HighlightMatch text={option.description} query={query} />\n </span>\n )}\n </span>\n {!multiple && selected && (\n <Icon name=\"check\" size=\"sm\" className=\"or-combobox-option__check\" />\n )}\n </li>\n )\n}\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { useClickOutside, useControllableState, useDisclosure, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { Field, useField, useFieldControlProps } from '../Field'\nimport { Portal } from '../Portal'\nimport { useInlinePresence } from './motion'\nimport {\n defaultOptionFilter,\n Freeze,\n firstEnabledIndex,\n lastEnabledIndex,\n ListboxOptionItem,\n nextEnabledIndex,\n normalizeText,\n useAnnouncer,\n useListboxPopup,\n useScrollActiveIntoView,\n} from './shared'\nimport './Combobox.css'\n\nexport type ComboboxSize = 'sm' | 'md' | 'lg'\n\nexport interface ComboboxOption {\n /** Valor da opção (único). */\n value: string\n /** Texto exibido e usado na busca. */\n label: string\n /** Texto secundário exibido abaixo do rótulo (também entra na busca). */\n description?: string\n disabled?: boolean\n}\n\nexport interface ComboboxProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'children'\n> {\n /** Opções disponíveis. */\n options: ComboboxOption[]\n /** Valor selecionado (controlado). `null` = nenhum. */\n value?: string | null\n /** Valor inicial (não controlado). */\n defaultValue?: string | null\n /** Chamado quando o usuário escolhe ou limpa uma opção. */\n onChange?: (value: string | null, option: ComboboxOption | null) => void\n /** Chamado a cada alteração do texto digitado — use para busca assíncrona. */\n onInputChange?: (inputValue: string) => void\n /** Estado aberto da lista (controlado). */\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /**\n * Função de filtro. Padrão: o rótulo contém o texto, ignorando acentos e caixa.\n * Passe `false` quando as opções já vierem filtradas (busca no servidor).\n */\n filter?: ((option: ComboboxOption, query: string) => boolean) | false\n /** Mostra \"Carregando…\" na lista (busca assíncrona em andamento). */\n loading?: boolean\n /** Mensagem quando nenhuma opção corresponde. Padrão: \"Nenhum resultado encontrado\". */\n emptyMessage?: ReactNode\n /** Mostra o botão de limpar quando há valor. Padrão: `true`. */\n clearable?: boolean\n /** Rótulo visível do campo. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda exibido abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. Quando presente, o campo fica inválido. */\n error?: ReactNode\n /** Marca o campo como inválido sem exibir mensagem. */\n invalid?: boolean\n /** Altura do controle: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: ComboboxSize\n /** Classe aplicada ao contêiner externo. */\n className?: string\n}\n\ntype ControlProps = Omit<\n ComboboxProps,\n 'label' | 'hideLabel' | 'description' | 'error' | 'className'\n> & {\n inputRef: React.Ref<HTMLInputElement>\n hasLabel: boolean\n}\n\nfunction ComboboxControl({\n inputRef,\n hasLabel,\n options,\n value: valueProp,\n defaultValue = null,\n onChange,\n onInputChange,\n open: openProp,\n defaultOpen,\n onOpenChange,\n filter,\n loading = false,\n emptyMessage,\n clearable = true,\n invalid,\n size = 'md',\n required,\n disabled,\n readOnly,\n name,\n placeholder,\n onKeyDown,\n onBlur,\n onClick,\n ...rest\n}: ControlProps) {\n const { t } = useLocale()\n const field = useField()\n const controlProps = useFieldControlProps({\n required,\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': rest['aria-describedby'],\n })\n const isDisabled = Boolean(controlProps.disabled)\n const listboxId = useId('or-combobox-listbox')\n const inputEl = useRef<HTMLInputElement>(null)\n const frameEl = useRef<HTMLDivElement>(null)\n const popupEl = useRef<HTMLDivElement>(null)\n const { announce, region } = useAnnouncer()\n\n const [value, setValue] = useControllableState<string | null>({ value: valueProp, defaultValue })\n const { isOpen, setOpen } = useDisclosure({ open: openProp, defaultOpen, onOpenChange })\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(-1)\n\n // Guarda a última opção escolhida: com busca assíncrona, ela pode sumir de `options`.\n const lastSelected = useRef<ComboboxOption | null>(null)\n const selectedOption =\n options.find((o) => o.value === value) ??\n (lastSelected.current?.value === value ? lastSelected.current : null)\n if (selectedOption) lastSelected.current = selectedOption\n const selectedLabel = selectedOption?.label ?? ''\n\n const [inputText, setInputText] = useState(selectedLabel)\n const typing = useRef(false)\n // Sincroniza o texto quando o valor muda por fora (ex.: reset do formulário).\n useEffect(() => {\n if (!typing.current) setInputText(selectedLabel)\n }, [value, selectedLabel])\n\n const filtered = useMemo(() => {\n if (filter === false || !query.trim()) return options\n const fn = filter ?? defaultOptionFilter\n return options.filter((o) => fn(o, query))\n }, [options, query, filter])\n const visible = loading ? [] : filtered\n\n const optionId = (option: ComboboxOption) => `${listboxId}-${options.indexOf(option)}`\n const activeOption = isOpen && activeIndex >= 0 ? visible[activeIndex] : undefined\n const activeId = activeOption ? optionId(activeOption) : undefined\n useScrollActiveIntoView(activeId)\n\n const { refs, floatingStyles, theme, present, state, nodeRef, side } = useListboxPopup(isOpen)\n useClickOutside([frameEl, popupEl], () => setOpen(false), isOpen)\n\n // Anuncia a quantidade de resultados quando a lista muda (com atraso para não interromper a digitação).\n useEffect(() => {\n if (!isOpen || loading) return\n const count = visible.length\n announce(\n count === 0\n ? t('noResults')\n : count === 1\n ? t('resultsCountOne')\n : t('resultsCount', { count }),\n 400,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, loading, visible.length, query])\n\n // Ao terminar uma busca assíncrona, destaca o primeiro resultado do texto digitado.\n useEffect(() => {\n if (!loading && isOpen && query.trim() && activeIndex < 0)\n setActiveIndex(firstEnabledIndex(visible))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loading])\n\n const interactive = !isDisabled && !readOnly\n\n const openList = (focus: 'selected' | 'first' | 'last' | 'none') => {\n if (!interactive) return\n setQuery('')\n let index = -1\n if (focus === 'selected') {\n index = selectedOption ? options.indexOf(selectedOption) : -1\n if (index < 0 || options[index]?.disabled) index = firstEnabledIndex(options)\n } else if (focus === 'first') index = firstEnabledIndex(options)\n else if (focus === 'last') index = lastEnabledIndex(options)\n setActiveIndex(loading ? -1 : index)\n setOpen(true)\n }\n\n const closeList = () => {\n setOpen(false)\n setActiveIndex(-1)\n }\n\n const commit = (option: ComboboxOption | null) => {\n typing.current = false\n if (option) lastSelected.current = option\n const next = option?.value ?? null\n if (next !== value) {\n setValue(next)\n onChange?.(next, option)\n }\n setInputText(option?.label ?? '')\n setQuery('')\n }\n\n const selectOption = (option: ComboboxOption) => {\n if (option.disabled) return\n commit(option)\n closeList()\n }\n\n const clear = () => {\n commit(null)\n onInputChange?.('')\n inputEl.current?.focus()\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || !interactive) return\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault()\n if (!isOpen) {\n openList(event.altKey ? 'none' : 'selected')\n } else if (!event.altKey) {\n setActiveIndex((i) => nextEnabledIndex(visible, i, 1))\n }\n break\n }\n case 'ArrowUp': {\n event.preventDefault()\n if (!isOpen) {\n openList(event.altKey ? 'none' : 'last')\n } else if (event.altKey) {\n closeList()\n } else {\n setActiveIndex((i) => nextEnabledIndex(visible, i < 0 ? visible.length : i, -1))\n }\n break\n }\n case 'Home':\n case 'End': {\n // Com uma opção ativa, Home/End navegam na lista; sem ela, movem o cursor no texto.\n if (!isOpen || activeIndex < 0) break\n event.preventDefault()\n setActiveIndex(\n event.key === 'Home' ? firstEnabledIndex(visible) : lastEnabledIndex(visible),\n )\n break\n }\n case 'ArrowLeft':\n case 'ArrowRight': {\n // Devolve o foco visual para o campo de texto.\n if (activeIndex >= 0) setActiveIndex(-1)\n break\n }\n case 'Enter': {\n if (!isOpen) {\n // Texto apagado + Enter (ex.: envio do formulário) também limpa o valor.\n if (!inputText.trim() && value !== null) commit(null)\n break\n }\n event.preventDefault()\n if (activeOption) selectOption(activeOption)\n else closeList()\n break\n }\n case 'Escape': {\n if (isOpen) {\n event.preventDefault()\n event.stopPropagation()\n closeList()\n } else if (inputText || value !== null) {\n event.preventDefault()\n event.stopPropagation()\n clear()\n }\n break\n }\n case 'Tab': {\n if (isOpen) closeList()\n break\n }\n }\n }\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(event)\n closeList()\n typing.current = false\n const text = inputText.trim()\n if (!text) {\n if (value !== null) commit(null)\n else setInputText('')\n setQuery('')\n return\n }\n if (text === selectedLabel) {\n setQuery('')\n return\n }\n // Texto idêntico a uma opção (ignorando acentos/caixa) é aceito; caso contrário, volta ao valor anterior.\n const exact = options.find((o) => !o.disabled && normalizeText(o.label) === normalizeText(text))\n if (exact) commit(exact)\n else {\n setInputText(selectedLabel)\n setQuery('')\n }\n }\n\n const showClear = clearable && interactive && (inputText !== '' || value !== null)\n const clearPresence = useInlinePresence<HTMLButtonElement>(showClear)\n const labelledBy = hasLabel && field ? field.labelId : undefined\n\n return (\n <div\n ref={mergeRefs(frameEl, refs.setReference)}\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-combobox')}\n data-invalid={controlProps['aria-invalid'] || undefined}\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled || undefined}\n data-open={isOpen || undefined}\n >\n <input\n ref={mergeRefs(inputEl, inputRef)}\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={activeId}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n className=\"or-control-frame__input or-combobox__input\"\n value={inputText}\n placeholder={placeholder}\n readOnly={readOnly}\n onChange={(event) => {\n const text = event.target.value\n typing.current = true\n setInputText(text)\n setQuery(text)\n onInputChange?.(text)\n if (!isOpen) setOpen(true)\n // Destaca automaticamente a primeira opção que corresponde ao texto.\n if (text.trim()) {\n const fn = filter === false ? () => true : (filter ?? defaultOptionFilter)\n const matches = options.filter((o) => fn(o, text))\n setActiveIndex(loading ? -1 : firstEnabledIndex(matches))\n } else setActiveIndex(-1)\n }}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onClick={(event) => {\n onClick?.(event)\n if (!isOpen) openList('none')\n }}\n {...rest}\n {...controlProps}\n />\n {name && <input type=\"hidden\" name={name} value={value ?? ''} disabled={isDisabled} />}\n {loading && <span className=\"or-combobox__spinner\" aria-hidden=\"true\" />}\n {clearPresence.present && (\n <button\n ref={clearPresence.nodeRef}\n type=\"button\"\n tabIndex={-1}\n className=\"or-combobox__clear\"\n aria-label={t('clear')}\n aria-hidden={clearPresence.closing || undefined}\n data-state={clearPresence.dataState}\n onMouseDown={(event) => event.preventDefault()}\n onClick={clear}\n >\n <Icon name=\"close\" size=\"sm\" />\n </button>\n )}\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"or-control-frame__button or-combobox__toggle\"\n aria-label={t('showOptions')}\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n disabled={isDisabled || readOnly}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (isOpen) closeList()\n else openList('selected')\n inputEl.current?.focus()\n }}\n >\n <Icon name=\"chevron-down\" size=\"sm\" className=\"or-combobox__chevron\" />\n </button>\n {region}\n {present && (\n <Portal>\n {/* O mousedown só impede que o clique na lista tire o foco do campo (o teclado age no campo). */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={mergeRefs(popupEl, refs.setFloating, nodeRef)}\n className=\"or-combobox-popup\"\n style={floatingStyles}\n data-theme={theme}\n data-state={state}\n data-side={side}\n onMouseDown={(event) => event.preventDefault()}\n >\n <Freeze frozen={!isOpen}>\n {loading ? (\n <div className=\"or-combobox-popup__message\">\n <span className=\"or-combobox-popup__spinner\" aria-hidden=\"true\" />\n {t('loading')}\n </div>\n ) : visible.length === 0 ? (\n <div className=\"or-combobox-popup__message\">{emptyMessage ?? t('noResults')}</div>\n ) : null}\n <ul\n id={listboxId}\n role=\"listbox\"\n className=\"or-combobox-listbox\"\n aria-labelledby={labelledBy}\n aria-label={labelledBy ? undefined : rest['aria-label']}\n aria-busy={loading || undefined}\n >\n {visible.map((option, index) => (\n <ListboxOptionItem\n key={option.value}\n id={optionId(option)}\n option={option}\n query={query}\n active={index === activeIndex}\n selected={option.value === value}\n disabled={option.disabled}\n onHover={() => setActiveIndex(index)}\n onSelect={() => selectOption(option)}\n />\n ))}\n </ul>\n </Freeze>\n </div>\n </Portal>\n )}\n </div>\n )\n}\n\n/**\n * Campo de texto com lista de sugestões filtrada enquanto se digita (padrão\n * WAI-ARIA \"combobox com listbox\"). Use para escolher uma opção em listas\n * longas; para poucas opções, prefira `Select`.\n */\nexport const Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n { label, hideLabel, description, error, required, disabled, id, className, ...rest },\n ref,\n) {\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n controlId={id}\n className={cx('or-combobox-field', className)}\n >\n <ComboboxControl\n inputRef={ref}\n hasLabel={Boolean(label)}\n required={required}\n disabled={disabled}\n {...rest}\n />\n </Field>\n )\n})\n","import {\n cloneElement,\n forwardRef,\n isValidElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { flushSync } from 'react-dom'\nimport { useDisclosure, useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon, type IconName } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx } from '../../utils'\nimport { DialogShell } from '../Modal/DialogShell'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './CommandPalette.css'\n\nexport interface CommandItem {\n /** Identificador único em toda a paleta. */\n id: string\n /** Nome do comando, em forma de ação: \"Criar projeto\". */\n label: string\n /** Detalhe opcional exibido abaixo do rótulo (também é pesquisável). */\n description?: string\n /** Ícone: nome da biblioteca do Orange ou um elemento. */\n icon?: IconName | ReactElement\n /** Atalho exibido à direita: `'⌘ N'` ou `['G', 'P']`. */\n shortcut?: string | string[]\n /** Sinônimos que também encontram o comando na busca. */\n keywords?: string[]\n /** Exibido, mas não pode ser escolhido. */\n disabled?: boolean\n /** Executado ao escolher o comando (depois que a paleta fecha). */\n onSelect?: () => void\n}\n\nexport interface CommandGroup {\n /** Título do grupo (ex.: \"Navegação\"). */\n label: string\n items: CommandItem[]\n}\n\nexport interface CommandPaletteProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'title' | 'children'\n> {\n /** Comandos agrupados. */\n groups: CommandGroup[]\n /** Aberta (controlado). Use com `onOpenChange`. */\n open?: boolean\n /** Aberta inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando a paleta pede para abrir ou fechar. */\n onOpenChange?: (open: boolean) => void\n /**\n * Atalho global que abre/fecha a paleta: `'mod+k'` (⌘K no Mac, Ctrl+K nos\n * demais), `'ctrl+shift+p'`… Desligado por padrão.\n */\n hotkey?: string\n /** Texto de exemplo do campo de busca. */\n placeholder?: string\n /** Nome acessível da paleta. Padrão: \"Paleta de comandos\". */\n label?: string\n /** Mensagem quando a busca não encontra nada. Padrão: \"Nenhum resultado encontrado\". */\n emptyMessage?: ReactNode\n /** Chamado com o comando escolhido (além do `onSelect` do próprio item). */\n onSelect?: (item: CommandItem) => void\n /** Elemento que abre a paleta (modo não controlado). */\n trigger?: ReactElement\n}\n\n/** Remove acentos e caixa: \"Configurações\" → \"configuracoes\". */\nfunction normalize(text: string) {\n return text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n}\n\nfunction matchesHotkey(event: KeyboardEvent, hotkey: string) {\n const parts = hotkey\n .toLowerCase()\n .split('+')\n .map((part) => part.trim())\n const key = parts.pop()\n const mods = new Set(parts)\n const meta = mods.has('meta') || mods.has('cmd')\n const ctrl = mods.has('ctrl') || mods.has('control')\n if (mods.has('mod')) {\n if (!event.metaKey && !event.ctrlKey) return false\n } else if (event.metaKey !== meta || event.ctrlKey !== ctrl) {\n return false\n }\n if (event.shiftKey !== mods.has('shift')) return false\n if (event.altKey !== (mods.has('alt') || mods.has('option'))) return false\n return event.key.toLowerCase() === key\n}\n\nfunction toDomId(value: string) {\n return value.replace(/[^\\w-]/g, '_')\n}\n\n/**\n * Paleta de comandos: um diálogo com busca para encontrar e executar ações\n * pelo teclado. Abre por um gatilho ou por um atalho global como ⌘K.\n */\nexport const CommandPalette = forwardRef<HTMLDivElement, CommandPaletteProps>(\n function CommandPalette(\n {\n groups,\n open,\n defaultOpen,\n onOpenChange,\n hotkey,\n placeholder,\n label,\n emptyMessage,\n onSelect,\n trigger,\n className,\n ...rest\n },\n ref,\n ) {\n const { t } = useLocale()\n const disclosure = useDisclosure({ open, defaultOpen, onOpenChange })\n const [query, setQuery] = useState('')\n const [activeId, setActiveId] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const resultsRef = useRef<HTMLDivElement>(null)\n const highlightRef = useRef<HTMLDivElement>(null)\n const baseId = useId('or-command')\n const listboxId = `${baseId}-listbox`\n const name = label ?? t('commandPalette')\n\n const toggleRef = useRef(disclosure.toggle)\n toggleRef.current = disclosure.toggle\n useEffect(() => {\n if (!hotkey) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.defaultPrevented || event.repeat || !matchesHotkey(event, hotkey)) return\n event.preventDefault()\n toggleRef.current()\n }\n window.addEventListener('keydown', onKeyDown)\n return () => window.removeEventListener('keydown', onKeyDown)\n }, [hotkey])\n\n // A cada abertura, a busca começa do zero.\n const [wasOpen, setWasOpen] = useState(disclosure.isOpen)\n if (wasOpen !== disclosure.isOpen) {\n setWasOpen(disclosure.isOpen)\n if (disclosure.isOpen) {\n setQuery('')\n setActiveId(null)\n }\n }\n\n const filtered = useMemo(() => {\n const terms = normalize(query).split(/\\s+/).filter(Boolean)\n return groups\n .map((group, groupIndex) => ({\n ...group,\n key: `${groupIndex}`,\n items: terms.length\n ? group.items.filter((item) => {\n const haystack = normalize(\n [item.label, item.description ?? '', ...(item.keywords ?? [])].join(' '),\n )\n return terms.every((term) => haystack.includes(term))\n })\n : group.items,\n }))\n .filter((group) => group.items.length > 0)\n }, [groups, query])\n\n const enabledItems = useMemo(\n () => filtered.flatMap((group) => group.items).filter((item) => !item.disabled),\n [filtered],\n )\n const total = filtered.reduce((sum, group) => sum + group.items.length, 0)\n\n // Mantém um item ativo válido sempre que a lista muda.\n const active = enabledItems.find((item) => item.id === activeId) ?? enabledItems[0] ?? null\n const optionId = (item: CommandItem) => `${baseId}-option-${toDomId(item.id)}`\n const activeOptionId = active ? optionId(active) : undefined\n\n useEffect(() => {\n setActiveId(enabledItems[0]?.id ?? null)\n }, [query]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (!activeOptionId) return\n document.getElementById(activeOptionId)?.scrollIntoView({ block: 'nearest' })\n }, [activeOptionId])\n\n // Posiciona o destaque sobre o item ativo. A primeira medida é instantânea\n // (sem deslizar a partir do topo); as seguintes deslizam com transição.\n useIsomorphicLayoutEffect(() => {\n const highlight = highlightRef.current\n const results = resultsRef.current\n if (!highlight || !results) return\n const option = activeOptionId ? document.getElementById(activeOptionId) : null\n if (!option || !results.contains(option)) {\n highlight.removeAttribute('data-visible')\n return\n }\n highlight.style.setProperty('--_y', `${option.offsetTop}px`)\n highlight.style.setProperty('--_h', `${option.offsetHeight}px`)\n highlight.setAttribute('data-visible', '')\n if (!highlight.hasAttribute('data-ready')) {\n const frame = requestAnimationFrame(() => highlight.setAttribute('data-ready', ''))\n return () => cancelAnimationFrame(frame)\n }\n })\n\n const select = (item: CommandItem) => {\n if (item.disabled) return\n // Fecha e devolve o foco antes de executar o comando (que pode abrir outro diálogo).\n flushSync(() => disclosure.close())\n item.onSelect?.()\n onSelect?.(item)\n }\n\n const move = (delta: 1 | -1) => {\n if (enabledItems.length === 0) return\n const index = active ? enabledItems.indexOf(active) : -1\n const next = (index + delta + enabledItems.length) % enabledItems.length\n setActiveId(enabledItems[next].id)\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.nativeEvent.isComposing) return\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n move(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n move(-1)\n break\n case 'PageDown':\n case 'PageUp':\n if (enabledItems.length) {\n event.preventDefault()\n setActiveId(enabledItems[event.key === 'PageDown' ? enabledItems.length - 1 : 0].id)\n }\n break\n case 'Enter':\n if (active) {\n event.preventDefault()\n select(active)\n }\n break\n }\n }\n\n const announcement = !query\n ? ''\n : total === 0\n ? t('noResults')\n : total === 1\n ? t('resultsCountOne')\n : t('resultsCount', { count: total })\n\n const triggerElement = trigger\n ? cloneElement(trigger as ReactElement<HTMLAttributes<HTMLElement>>, {\n 'aria-haspopup': 'dialog',\n onClick: composeEventHandlers(\n (trigger.props as HTMLAttributes<HTMLElement>).onClick,\n (_event: ReactMouseEvent<HTMLElement>) => disclosure.open(),\n ),\n })\n : null\n\n return (\n <>\n {triggerElement}\n <DialogShell\n open={disclosure.isOpen}\n onDismiss={disclosure.close}\n initialFocus={inputRef}\n rootClassName=\"or-command-palette-root\"\n panelRef={ref}\n className={cx('or-command-palette', className)}\n aria-label={name}\n {...rest}\n >\n <div className=\"or-command-palette__search\">\n <Icon name=\"search\" size=\"md\" className=\"or-command-palette__search-icon\" />\n <input\n ref={inputRef}\n className=\"or-command-palette__input\"\n type=\"text\"\n role=\"combobox\"\n aria-label={t('searchCommands')}\n aria-expanded={total > 0}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeOptionId}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n placeholder={placeholder ?? t('searchPlaceholder')}\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setQuery(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n </div>\n\n <div ref={resultsRef} className=\"or-command-palette__results\">\n {/* Destaque único que desliza até o item ativo (só visual). */}\n <div ref={highlightRef} className=\"or-command-palette__highlight\" aria-hidden=\"true\" />\n <div\n role=\"listbox\"\n id={listboxId}\n aria-label={name}\n className=\"or-command-palette__listbox\"\n hidden={total === 0}\n >\n {filtered.map((group) => {\n const groupLabelId = `${baseId}-group-${group.key}`\n return (\n <div\n key={group.key}\n role=\"group\"\n aria-labelledby={groupLabelId}\n className=\"or-command-palette__group\"\n >\n <div\n id={groupLabelId}\n role=\"presentation\"\n className=\"or-command-palette__group-label\"\n >\n {group.label}\n </div>\n {group.items.map((item) => {\n const id = optionId(item)\n const isActive = active?.id === item.id\n const shortcut =\n typeof item.shortcut === 'string'\n ? item.shortcut.split(/\\s+/)\n : item.shortcut\n return (\n // As opções não recebem foco: o teclado fica no combobox (aria-activedescendant).\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/interactive-supports-focus\n <div\n key={item.id}\n id={id}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={item.disabled || undefined}\n aria-labelledby={`${id}-label`}\n aria-describedby={item.description ? `${id}-description` : undefined}\n data-active={isActive || undefined}\n className=\"or-command-palette__option\"\n onMouseDown={(event) => event.preventDefault()}\n onPointerMove={() => {\n if (!item.disabled && !isActive) setActiveId(item.id)\n }}\n onClick={() => select(item)}\n >\n {item.icon && (\n <span className=\"or-command-palette__icon\" aria-hidden=\"true\">\n {isValidElement(item.icon) ? (\n item.icon\n ) : (\n <Icon name={item.icon as IconName} size=\"sm\" />\n )}\n </span>\n )}\n <span className=\"or-command-palette__text\">\n <span id={`${id}-label`} className=\"or-command-palette__label\">\n {item.label}\n </span>\n {item.description && (\n <span\n id={`${id}-description`}\n className=\"or-command-palette__description\"\n >\n {item.description}\n </span>\n )}\n </span>\n {shortcut && shortcut.length > 0 && (\n <span className=\"or-command-palette__shortcut\" aria-hidden=\"true\">\n {shortcut.map((key, index) => (\n <kbd key={index}>{key}</kbd>\n ))}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n {total === 0 && (\n <div className=\"or-command-palette__empty\">\n <Icon name=\"search\" size=\"lg\" />\n <p>{emptyMessage ?? t('noResults')}</p>\n </div>\n )}\n </div>\n\n <div className=\"or-command-palette__footer\" aria-hidden=\"true\">\n <span>\n <kbd>↑</kbd>\n <kbd>↓</kbd>\n {t('paletteNavigate')}\n </span>\n <span>\n <kbd>↵</kbd>\n {t('paletteSelect')}\n </span>\n <span>\n <kbd>Esc</kbd>\n {t('close')}\n </span>\n </div>\n <VisuallyHidden role=\"status\" aria-live=\"polite\">\n {announcement}\n </VisuallyHidden>\n </DialogShell>\n </>\n )\n },\n)\n","import {\n cloneElement,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useDisclosure, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx } from '../../utils'\nimport { Button } from '../Button'\nimport { DialogShell } from '../Modal/DialogShell'\nimport './ConfirmDialog.css'\n\nexport type ConfirmDialogTone = 'neutral' | 'danger'\n\nexport interface ConfirmDialogProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title' | 'children'\n> {\n /** Aberto (controlado). Use com `onOpenChange`. */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o diálogo pede para abrir ou fechar. */\n onOpenChange?: (open: boolean) => void\n /** Pergunta direta: \"Excluir projeto?\". Nomeia o diálogo. */\n title: ReactNode\n /** Consequência da ação. Descreve o diálogo via `aria-describedby`. */\n description?: ReactNode\n /** Conteúdo extra entre a descrição e as ações (ex.: lista de itens afetados). */\n children?: ReactNode\n /** Rótulo do botão de confirmação. Padrão: \"Confirmar\". Prefira o verbo da ação. */\n confirmLabel?: string\n /** Rótulo do botão de cancelar. Padrão: \"Cancelar\". */\n cancelLabel?: string\n /**\n * `danger` para ações destrutivas: botão vermelho e foco inicial em Cancelar.\n * `neutral` foca o botão de confirmação.\n */\n tone?: ConfirmDialogTone\n /**\n * Executa a ação. Se retornar uma Promise, o botão fica em loading até ela\n * resolver; se ela rejeitar, o diálogo continua aberto.\n */\n onConfirm?: () => void | Promise<unknown>\n /** Chamado ao cancelar (botão, Escape). */\n onCancel?: () => void\n /** Texto anunciado enquanto `onConfirm` está pendente. */\n loadingText?: string\n /** Elemento que abre o diálogo (modo não controlado). */\n trigger?: ReactElement\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return !!value && typeof (value as PromiseLike<unknown>).then === 'function'\n}\n\n/**\n * Diálogo de alerta (`role=\"alertdialog\"`) que pede confirmação antes de uma\n * ação importante ou irreversível.\n */\nexport const ConfirmDialog = forwardRef<HTMLDivElement, ConfirmDialogProps>(function ConfirmDialog(\n {\n open,\n defaultOpen,\n onOpenChange,\n title,\n description,\n children,\n confirmLabel,\n cancelLabel,\n tone = 'neutral',\n onConfirm,\n onCancel,\n loadingText,\n trigger,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const disclosure = useDisclosure({ open, defaultOpen, onOpenChange })\n const [pending, setPending] = useState(false)\n const titleId = useId('or-confirm-title')\n const descriptionId = useId('or-confirm-description')\n const cancelRef = useRef<HTMLButtonElement>(null)\n const confirmRef = useRef<HTMLButtonElement>(null)\n const mountedRef = useRef(true)\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const cancel = () => {\n if (pending) return\n onCancel?.()\n disclosure.close()\n }\n\n const confirm = async () => {\n if (pending) return\n const result = onConfirm?.()\n if (!isPromiseLike(result)) {\n disclosure.close()\n return\n }\n setPending(true)\n try {\n await result\n if (!mountedRef.current) return\n setPending(false)\n disclosure.close()\n } catch {\n if (mountedRef.current) setPending(false)\n }\n }\n\n const triggerElement = trigger\n ? cloneElement(trigger as ReactElement<HTMLAttributes<HTMLElement>>, {\n 'aria-haspopup': 'dialog',\n onClick: composeEventHandlers(\n (trigger.props as HTMLAttributes<HTMLElement>).onClick,\n (_event: ReactMouseEvent<HTMLElement>) => disclosure.open(),\n ),\n })\n : null\n\n return (\n <>\n {triggerElement}\n <DialogShell\n open={disclosure.isOpen}\n onDismiss={cancel}\n role=\"alertdialog\"\n initialFocus={tone === 'danger' ? cancelRef : confirmRef}\n closeOnEscape={!pending}\n closeOnOverlayClick={false}\n rootClassName=\"or-confirm-dialog-root\"\n panelRef={ref}\n className={cx('or-confirm-dialog', `or-confirm-dialog--${tone}`, className)}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n aria-busy={pending || undefined}\n {...rest}\n >\n <div className=\"or-confirm-dialog__content\">\n {tone === 'danger' && (\n <span className=\"or-confirm-dialog__icon\" aria-hidden=\"true\">\n <Icon name=\"alert-triangle\" size=\"md\" />\n </span>\n )}\n <div className=\"or-confirm-dialog__text\">\n <h2 id={titleId} className=\"or-confirm-dialog__title\">\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className=\"or-confirm-dialog__description\">\n {description}\n </p>\n )}\n {children && <div className=\"or-confirm-dialog__extra\">{children}</div>}\n </div>\n </div>\n <div className=\"or-confirm-dialog__actions\">\n <Button ref={cancelRef} variant=\"outline\" disabled={pending} onClick={cancel}>\n {cancelLabel ?? t('cancel')}\n </Button>\n <Button\n ref={confirmRef}\n variant={tone === 'danger' ? 'danger' : 'primary'}\n loading={pending}\n loadingText={loadingText}\n onClick={confirm}\n >\n {confirmLabel ?? t('confirm')}\n </Button>\n </div>\n </DialogShell>\n </>\n )\n})\n\n/** Opções aceitas por `confirm()` do hook `useConfirm`. */\nexport type ConfirmOptions = Pick<\n ConfirmDialogProps,\n | 'title'\n | 'description'\n | 'children'\n | 'confirmLabel'\n | 'cancelLabel'\n | 'tone'\n | 'onConfirm'\n | 'loadingText'\n>\n\n/**\n * Confirmação imperativa: `const [confirm, confirmDialog] = useConfirm()`.\n * Renderize `confirmDialog` uma vez e use `await confirm({ … })`, que resolve\n * `true` (confirmou) ou `false` (cancelou).\n */\nexport function useConfirm(): [(options: ConfirmOptions) => Promise<boolean>, ReactElement] {\n const [open, setOpen] = useState(false)\n const [options, setOptions] = useState<ConfirmOptions>({ title: '' })\n const resolveRef = useRef<((value: boolean) => void) | null>(null)\n\n const settle = (value: boolean) => {\n resolveRef.current?.(value)\n resolveRef.current = null\n }\n\n const confirm = useCallback((next: ConfirmOptions) => {\n resolveRef.current?.(false)\n setOptions(next)\n setOpen(true)\n return new Promise<boolean>((resolve) => {\n resolveRef.current = resolve\n })\n }, [])\n\n // Diálogo desmontado com uma confirmação pendente: resolve como cancelada.\n useEffect(() => () => resolveRef.current?.(false), [])\n\n const element = (\n <ConfirmDialog\n {...options}\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (!next) settle(false)\n }}\n onConfirm={() => {\n const result = options.onConfirm?.()\n if (isPromiseLike(result)) return Promise.resolve(result).then(() => settle(true))\n settle(true)\n }}\n />\n )\n\n return [confirm, element]\n}\n","import { forwardRef, type ElementType, type HTMLAttributes } from 'react'\nimport { cx } from '../../utils'\nimport './Container.css'\n\nexport type ContainerSize = 'sm' | 'md' | 'lg' | 'xl' | 'full'\n\nexport interface ContainerProps extends HTMLAttributes<HTMLElement> {\n /**\n * Elemento renderizado. Padrão: `div`. Use `main` para o conteúdo principal\n * da página ou `section` com um título.\n */\n as?: ElementType\n /**\n * Largura máxima do conteúdo: `sm` 640px (formulários, texto), `md` 768px,\n * `lg` 1024px, `xl` 1200px (`--or-layout-max-width`, padrão) ou `full`\n * (sem limite, só com as margens laterais).\n */\n size?: ContainerSize\n}\n\n/**\n * Centraliza o conteúdo da página com largura máxima e margens laterais\n * (gutter) que encolhem no celular: 16px, 24px a partir de 768px e 32px\n * (`--or-layout-gutter`) a partir de 1024px.\n */\nexport const Container = forwardRef<HTMLElement, ContainerProps>(function Container(\n { as: Component = 'div', size = 'xl', className, ...rest },\n ref,\n) {\n return (\n <Component\n ref={ref}\n className={cx('or-container', `or-container--${size}`, className)}\n {...rest}\n />\n )\n})\n","/*\n * Posicionamento interno das sobreposições ancoradas (Popover, Tooltip,\n * Toggletip, HoverCard, Dropdown, ContextMenu). Não é exportado pela biblioteca.\n */\nimport {\n arrow as arrowMiddleware,\n autoUpdate,\n flip,\n offset as offsetMiddleware,\n shift,\n size,\n useFloating,\n type Placement,\n type ReferenceType,\n type Strategy,\n} from '@floating-ui/react-dom'\nimport { useMemo, useRef, useState, type CSSProperties, type ReactElement, type Ref } from 'react'\nimport { mergeRefs } from '../../utils'\nimport { getElementRef } from '../Modal/overlay'\nimport './floating.css'\n\nexport type FloatingPlacement = Placement\nexport type FloatingSide = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface UseFloatingPanelOptions {\n open: boolean\n reference: ReferenceType | null\n floating: HTMLElement | null\n placement?: Placement\n /** Distância entre o gatilho e o painel, em px. */\n offset?: number\n /** Calcula a posição da seta. */\n arrow?: boolean\n strategy?: Strategy\n}\n\n/**\n * Posiciona `floating` junto de `reference` com flip/shift e expõe, como\n * variáveis CSS no painel, o espaço disponível e a largura da referência.\n */\nexport function useFloatingPanel({\n open,\n reference,\n floating,\n placement = 'bottom',\n offset = 8,\n arrow = false,\n strategy = 'absolute',\n}: UseFloatingPanelOptions) {\n const arrowRef = useRef<HTMLSpanElement | null>(null)\n const result = useFloating({\n open,\n placement,\n strategy,\n transform: false,\n elements: { reference, floating: open ? floating : null },\n whileElementsMounted: autoUpdate,\n middleware: [\n offsetMiddleware(offset),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n padding: 8,\n apply({ availableHeight, availableWidth, rects, elements }) {\n const style = elements.floating.style\n style.setProperty(\n '--or-floating-available-height',\n `${Math.max(0, Math.floor(availableHeight))}px`,\n )\n style.setProperty(\n '--or-floating-available-width',\n `${Math.max(0, Math.floor(availableWidth))}px`,\n )\n style.setProperty(\n '--or-floating-reference-width',\n `${Math.round(rects.reference.width)}px`,\n )\n },\n }),\n ...(arrow ? [arrowMiddleware({ element: arrowRef, padding: 6 })] : []),\n ],\n })\n\n const side = result.placement.split('-')[0] as FloatingSide\n const arrowData = result.middlewareData.arrow\n const arrowStyle: CSSProperties = {\n left: arrowData?.x != null ? `${arrowData.x}px` : undefined,\n top: arrowData?.y != null ? `${arrowData.y}px` : undefined,\n }\n return { ...result, side, arrowRef, arrowStyle }\n}\n\n/** Guarda o elemento DOM do gatilho em estado e devolve uma ref combinada com a do filho. */\nexport function useTriggerElement<T extends HTMLElement = HTMLElement>(child: ReactElement) {\n const [element, setElement] = useState<T | null>(null)\n const childRef = getElementRef(child)\n const ref = useMemo(() => mergeRefs<T>(childRef as Ref<T>, setElement), [childRef])\n return [element, ref] as const\n}\n\n/**\n * Depois de um clique fora, devolve o foco ao gatilho se ele tiver se perdido\n * (foi para o `body`). Roda após o `mousedown`, que é quem move o foco.\n */\nexport function returnFocusIfLost(target: HTMLElement | null | undefined) {\n window.setTimeout(() => {\n const current = document.activeElement\n if ((!current || current === document.body) && target?.isConnected)\n target.focus({ preventScroll: true })\n }, 0)\n}\n\n/** Junta ids de `aria-describedby`/`aria-labelledby` sem duplicar. */\nexport function joinIds(...ids: (string | undefined | null | false)[]) {\n const unique = Array.from(new Set(ids.filter(Boolean).join(' ').split(/\\s+/).filter(Boolean)))\n return unique.length ? unique.join(' ') : undefined\n}\n","/*\n * Núcleo interno dos menus (Dropdown e ContextMenu): painel `role=\"menu\"`\n * posicionado, navegação por setas/Home/End, typeahead e as partes\n * (DropdownItem, DropdownCheckboxItem, DropdownRadioGroup…).\n */\nimport type { ReferenceType, Strategy } from '@floating-ui/react-dom'\nimport {\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MutableRefObject,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n type SyntheticEvent,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect, usePresence } from '../../hooks'\nimport { Icon, type IconName } from '../../icons'\nimport { composeEventHandlers, cx, mergeRefs } from '../../utils'\nimport { focusElement, getThemeScope, useLayer } from '../Modal/overlay'\nimport { useFloatingPanel, type FloatingPlacement } from '../Popover/floating'\nimport { Portal } from '../Portal'\nimport './Dropdown.css'\n\n/* -------------------------------------------------------------------------- */\n/* Contexto */\n/* -------------------------------------------------------------------------- */\n\n/** Motivo do fechamento: decide para onde o foco vai. */\nexport type MenuCloseReason = 'select' | 'escape' | 'tab' | 'outside' | 'focus-outside'\n\ninterface MenuContextValue {\n /** Fecha o menu depois de escolher um item (o foco volta ao gatilho/origem). */\n close: () => void\n /** Foca o próprio menu (nenhum item destacado). */\n focusMenu: () => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nexport type MenuFocusTarget = 'first' | 'last' | 'menu'\n\nconst ITEM_SELECTOR = '[role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"]'\n\nfunction getItems(menu: HTMLElement | null): HTMLElement[] {\n return menu ? Array.from(menu.querySelectorAll<HTMLElement>(ITEM_SELECTOR)) : []\n}\n\nfunction getTextValue(item: HTMLElement) {\n return (item.dataset.textValue ?? item.textContent ?? '').trim().toLowerCase()\n}\n\n/* -------------------------------------------------------------------------- */\n/* Painel */\n/* -------------------------------------------------------------------------- */\n\nexport interface MenuPanelProps extends HTMLAttributes<HTMLDivElement> {\n open: boolean\n reference: ReferenceType | null\n /** Elemento cujo `[data-theme]` o menu herda. */\n themeOrigin: Element | null\n placement: FloatingPlacement\n offset: number\n strategy?: Strategy\n /** Para onde o foco vai ao abrir. */\n focusOnOpen: MutableRefObject<MenuFocusTarget>\n /** Pedido de fechamento. */\n onClose: (reason: MenuCloseReason) => void\n /** Elemento(s) considerados \"dentro\" (o gatilho). */\n insideElements?: () => (Element | null | undefined)[]\n}\n\nexport const MenuPanel = forwardRef<HTMLDivElement, MenuPanelProps>(function MenuPanel(\n {\n open,\n reference,\n themeOrigin,\n placement,\n offset,\n strategy,\n focusOnOpen,\n onClose,\n insideElements,\n className,\n style,\n onKeyDown,\n children,\n ...rest\n },\n ref,\n) {\n const [menuEl, setMenuEl] = useState<HTMLDivElement | null>(null)\n const typeahead = useRef({ buffer: '', timer: 0 })\n const closeRef = useRef(onClose)\n closeRef.current = onClose\n // O menu continua montado (inerte) durante a animação de saída.\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(open)\n\n const floating = useFloatingPanel({\n open: present,\n reference,\n floating: menuEl,\n placement,\n offset,\n strategy,\n })\n\n const { setNode, layerProps } = useLayer(open, {\n onEscape: () => closeRef.current('escape'),\n onPointerDownOutside: () => closeRef.current('outside'),\n onFocusOutside: () => closeRef.current('focus-outside'),\n insideElements,\n })\n\n useIsomorphicLayoutEffect(() => {\n if (!open || !menuEl) return\n const items = getItems(menuEl)\n const target = focusOnOpen.current\n focusElement(\n target === 'first'\n ? (items[0] ?? menuEl)\n : target === 'last'\n ? (items[items.length - 1] ?? menuEl)\n : menuEl,\n )\n }, [open, menuEl])\n\n const context = useMemo<MenuContextValue>(\n () => ({ close: () => closeRef.current('select'), focusMenu: () => focusElement(menuEl) }),\n [menuEl],\n )\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || !menuEl) return\n const items = getItems(menuEl)\n if (items.length === 0) return\n const index = items.indexOf(document.activeElement as HTMLElement)\n const focusAt = (i: number) => {\n event.preventDefault()\n focusElement(items[(i + items.length) % items.length])\n }\n switch (event.key) {\n case 'ArrowDown':\n return focusAt(index < 0 ? 0 : index + 1)\n case 'ArrowUp':\n return focusAt(index < 0 ? items.length - 1 : index - 1)\n case 'Home':\n case 'PageUp':\n return focusAt(0)\n case 'End':\n case 'PageDown':\n return focusAt(items.length - 1)\n case 'Tab':\n // Fecha e devolve o foco ao gatilho; o Tab segue dali para o próximo elemento.\n closeRef.current('tab')\n return\n }\n // Typeahead: letras focam o próximo item que começa com elas.\n if (event.key.length !== 1 || event.ctrlKey || event.metaKey || event.altKey) return\n if (event.key === ' ' && !typeahead.current.buffer) return\n event.preventDefault()\n const state = typeahead.current\n window.clearTimeout(state.timer)\n state.buffer += event.key.toLowerCase()\n state.timer = window.setTimeout(() => (state.buffer = ''), 500)\n const repeated = state.buffer.split('').every((char) => char === state.buffer[0])\n const search = repeated ? state.buffer[0] : state.buffer\n const start = index < 0 ? 0 : repeated ? index + 1 : index\n const ordered = [...items.slice(start), ...items.slice(0, start)]\n const match = ordered.find((item) => getTextValue(item).startsWith(search))\n if (match) focusElement(match)\n }\n\n const menuRef = useMemo(\n () => mergeRefs<HTMLDivElement>(setMenuEl, setNode, nodeRef, ref),\n [setNode, nodeRef, ref],\n )\n\n return (\n <Portal>\n {present && (\n <MenuContext.Provider value={context}>\n <div\n ref={menuRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n data-state={state}\n inert={state === 'closed' || undefined}\n data-side={floating.side}\n data-theme={getThemeScope(themeOrigin)}\n className={cx('or-floating', 'or-menu', className)}\n style={{ ...floating.floatingStyles, ...style }}\n onKeyDown={handleKeyDown}\n onContextMenu={(event) => event.preventDefault()}\n {...rest}\n {...layerProps}\n >\n {children}\n </div>\n </MenuContext.Provider>\n )}\n </Portal>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* Itens */\n/* -------------------------------------------------------------------------- */\n\ntype ItemEvent = SyntheticEvent<HTMLDivElement>\n\ninterface BaseItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onSelect' | 'role'> {\n role: 'menuitem' | 'menuitemcheckbox' | 'menuitemradio'\n disabled?: boolean\n closeOnSelect: boolean\n textValue?: string\n onActivate: (event: ItemEvent) => void\n}\n\nconst MenuItemBase = forwardRef<HTMLDivElement, BaseItemProps>(function MenuItemBase(\n {\n role,\n disabled,\n closeOnSelect,\n textValue,\n onActivate,\n className,\n onClick,\n onKeyDown,\n onKeyUp,\n onPointerMove,\n onPointerLeave,\n ...rest\n },\n ref,\n) {\n const context = useContext(MenuContext)\n const spacePressed = useRef(false)\n\n const activate = (event: ItemEvent) => {\n if (disabled) return\n // Fecha e devolve o foco antes de executar a ação (que pode abrir um diálogo).\n if (closeOnSelect) context?.close()\n onActivate(event)\n }\n\n return (\n <div\n ref={ref}\n role={role}\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n data-text-value={textValue}\n className={cx('or-menu__item', className)}\n onClick={composeEventHandlers(onClick, activate)}\n onKeyDown={composeEventHandlers(onKeyDown, (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n activate(event)\n } else if (event.key === ' ') {\n // Espaço ativa no keyup, para o keyup não \"clicar\" no gatilho que recebe o foco.\n event.preventDefault()\n spacePressed.current = true\n }\n })}\n onKeyUp={composeEventHandlers(onKeyUp, (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key === ' ' && spacePressed.current) {\n spacePressed.current = false\n event.preventDefault()\n activate(event)\n }\n })}\n onPointerMove={composeEventHandlers(\n onPointerMove,\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.pointerType === 'touch') return\n if (document.activeElement !== event.currentTarget) focusElement(event.currentTarget)\n },\n )}\n onPointerLeave={composeEventHandlers(\n onPointerLeave,\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.pointerType === 'touch') return\n if (document.activeElement === event.currentTarget) context?.focusMenu()\n },\n )}\n {...rest}\n />\n )\n})\n\n/** `true` depois que `value` muda pela primeira vez (não anima o estado inicial ao abrir). */\nfunction useChangedSinceMount(value: unknown) {\n const [initial] = useState(value)\n const [changed, setChanged] = useState(false)\n if (!changed && value !== initial) setChanged(true)\n return changed\n}\n\nfunction renderIcon(icon: IconName | ReactElement | undefined) {\n if (!icon) return null\n return (\n <span className=\"or-menu__icon\" aria-hidden=\"true\">\n {isValidElement(icon) ? icon : <Icon name={icon as IconName} size=\"sm\" />}\n </span>\n )\n}\n\nexport interface DropdownItemProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'role'\n> {\n /** Ícone à esquerda: nome da biblioteca do Orange ou um elemento. */\n icon?: IconName | ReactElement\n /** Atalho de teclado exibido à direita (apenas visual — implemente o atalho à parte). */\n shortcut?: string\n /** `danger` para ações destrutivas. */\n tone?: 'neutral' | 'danger'\n /** Visível e focável, mas não pode ser ativado. */\n disabled?: boolean\n /** Executado ao ativar o item (clique, Enter ou Espaço). */\n onSelect?: (event: SyntheticEvent<HTMLDivElement>) => void\n /** Fecha o menu ao ativar. Padrão: `true`. */\n closeOnSelect?: boolean\n /** Texto usado pelo typeahead quando o conteúdo não é texto simples. */\n textValue?: string\n}\n\n/** Item de ação do menu (`role=\"menuitem\"`). */\nexport const DropdownItem = forwardRef<HTMLDivElement, DropdownItemProps>(function DropdownItem(\n {\n icon,\n shortcut,\n tone = 'neutral',\n disabled,\n onSelect,\n closeOnSelect = true,\n textValue,\n className,\n children,\n ...rest\n },\n ref,\n) {\n return (\n <MenuItemBase\n ref={ref}\n role=\"menuitem\"\n disabled={disabled}\n closeOnSelect={closeOnSelect}\n textValue={textValue}\n onActivate={(event) => onSelect?.(event)}\n className={cx(tone === 'danger' && 'or-menu__item--danger', className)}\n {...rest}\n >\n {renderIcon(icon)}\n <span className=\"or-menu__text\">{children}</span>\n {shortcut && (\n <span className=\"or-menu__shortcut\" aria-hidden=\"true\">\n {shortcut}\n </span>\n )}\n </MenuItemBase>\n )\n})\n\nexport interface DropdownCheckboxItemProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'role'\n> {\n /** Marcado (controlado). */\n checked?: boolean\n /** Marcado inicialmente (não controlado). */\n defaultChecked?: boolean\n /** Chamado com o novo estado. */\n onCheckedChange?: (checked: boolean) => void\n disabled?: boolean\n /** Atalho exibido à direita (apenas visual). */\n shortcut?: string\n /** Fecha o menu ao alternar. Padrão: `false` (permite marcar vários). */\n closeOnSelect?: boolean\n textValue?: string\n}\n\n/** Opção liga/desliga do menu (`role=\"menuitemcheckbox\"`). */\nexport const DropdownCheckboxItem = forwardRef<HTMLDivElement, DropdownCheckboxItemProps>(\n function DropdownCheckboxItem(\n {\n checked,\n defaultChecked = false,\n onCheckedChange,\n disabled,\n shortcut,\n closeOnSelect = false,\n textValue,\n className,\n children,\n ...rest\n },\n ref,\n ) {\n const [isChecked, setChecked] = useControllableState({\n value: checked,\n defaultValue: defaultChecked,\n onChange: onCheckedChange,\n })\n const animate = useChangedSinceMount(isChecked)\n return (\n <MenuItemBase\n ref={ref}\n role=\"menuitemcheckbox\"\n aria-checked={isChecked}\n disabled={disabled}\n closeOnSelect={closeOnSelect}\n textValue={textValue}\n onActivate={() => setChecked((v) => !v)}\n className={cx('or-menu__item--checkable', className)}\n {...rest}\n >\n <span className=\"or-menu__indicator\" data-animate={animate || undefined} aria-hidden=\"true\">\n {isChecked && <Icon name=\"check\" size=\"sm\" strokeWidth={2.25} />}\n </span>\n <span className=\"or-menu__text\">{children}</span>\n {shortcut && (\n <span className=\"or-menu__shortcut\" aria-hidden=\"true\">\n {shortcut}\n </span>\n )}\n </MenuItemBase>\n )\n },\n)\n\ninterface RadioGroupContextValue {\n value: string | undefined\n setValue: (value: string) => void\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\n\nexport interface DropdownRadioGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Valor selecionado (controlado). */\n value?: string\n /** Valor selecionado inicialmente (não controlado). */\n defaultValue?: string\n /** Chamado com o novo valor. */\n onValueChange?: (value: string) => void\n /** Rótulo visível do grupo (ex.: \"Ordenar por\"). Também nomeia o grupo. */\n label?: ReactNode\n}\n\n/** Grupo de opções exclusivas (`role=\"group\"` com `menuitemradio`). */\nexport const DropdownRadioGroup = forwardRef<HTMLDivElement, DropdownRadioGroupProps>(\n function DropdownRadioGroup(\n { value, defaultValue, onValueChange, label, className, children, ...rest },\n ref,\n ) {\n const [current, setCurrent] = useControllableState<string | undefined>({\n value,\n defaultValue,\n onChange: onValueChange as ((value: string | undefined) => void) | undefined,\n })\n const labelId = useId('or-menu-group')\n const context = useMemo<RadioGroupContextValue>(\n () => ({ value: current, setValue: setCurrent }),\n [current, setCurrent],\n )\n return (\n <RadioGroupContext.Provider value={context}>\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={label && !rest['aria-label'] ? labelId : undefined}\n className={cx('or-menu__group', className)}\n {...rest}\n >\n {label && (\n <div id={labelId} role=\"presentation\" className=\"or-menu__group-label\">\n {label}\n </div>\n )}\n {children}\n </div>\n </RadioGroupContext.Provider>\n )\n },\n)\n\nexport interface DropdownRadioItemProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'role'\n> {\n /** Valor desta opção dentro do `DropdownRadioGroup`. */\n value: string\n disabled?: boolean\n /** Fecha o menu ao escolher. Padrão: `true`. */\n closeOnSelect?: boolean\n textValue?: string\n}\n\n/** Opção exclusiva dentro de `DropdownRadioGroup` (`role=\"menuitemradio\"`). */\nexport const DropdownRadioItem = forwardRef<HTMLDivElement, DropdownRadioItemProps>(\n function DropdownRadioItem(\n { value, disabled, closeOnSelect = true, textValue, className, children, ...rest },\n ref,\n ) {\n const group = useContext(RadioGroupContext)\n const checked = group?.value === value\n const animate = useChangedSinceMount(checked)\n return (\n <MenuItemBase\n ref={ref}\n role=\"menuitemradio\"\n aria-checked={checked}\n disabled={disabled}\n closeOnSelect={closeOnSelect}\n textValue={textValue}\n onActivate={() => group?.setValue(value)}\n className={cx('or-menu__item--checkable', className)}\n {...rest}\n >\n <span\n className=\"or-menu__indicator or-menu__indicator--radio\"\n data-animate={animate || undefined}\n aria-hidden=\"true\"\n >\n {checked && <span className=\"or-menu__dot\" />}\n </span>\n <span className=\"or-menu__text\">{children}</span>\n </MenuItemBase>\n )\n },\n)\n\nexport type DropdownSeparatorProps = HTMLAttributes<HTMLDivElement>\n\n/** Linha divisória entre grupos de itens (`role=\"separator\"`). */\nexport const DropdownSeparator = forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n function DropdownSeparator({ className, ...rest }, ref) {\n return (\n <div ref={ref} role=\"separator\" className={cx('or-menu__separator', className)} {...rest} />\n )\n },\n)\n\nexport type DropdownLabelProps = HTMLAttributes<HTMLDivElement>\n\n/** Título não interativo de uma seção do menu. */\nexport const DropdownLabel = forwardRef<HTMLDivElement, DropdownLabelProps>(function DropdownLabel(\n { className, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n role=\"presentation\"\n className={cx('or-menu__group-label', className)}\n {...rest}\n />\n )\n})\n","import type { VirtualElement } from '@floating-ui/react-dom'\nimport {\n cloneElement,\n forwardRef,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useDisclosure, useMounted } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx } from '../../utils'\nimport { MenuPanel, type MenuCloseReason, type MenuFocusTarget } from '../Dropdown/Menu'\nimport { focusElement } from '../Modal/overlay'\nimport { returnFocusIfLost, useTriggerElement } from '../Popover/floating'\nimport './ContextMenu.css'\n\nexport interface ContextMenuProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children' | 'content'\n> {\n /**\n * Área que abre o menu com o botão direito (ou Shift+F10 / tecla Menu quando\n * ela ou algo dentro dela está focado). Um único elemento.\n */\n children: ReactElement\n /** Itens do menu — as mesmas partes do Dropdown (`DropdownItem`, `DropdownSeparator`…). */\n content: ReactNode\n /** Aberto (controlado). */\n open?: boolean\n /** Chamado quando o menu abre ou fecha. */\n onOpenChange?: (open: boolean) => void\n /** Desliga o menu de contexto (o menu nativo do navegador volta a aparecer). */\n disabled?: boolean\n}\n\ninterface Point {\n /** Posição relativa à área, para acompanhar o scroll. */\n dx: number\n dy: number\n}\n\n/**\n * Menu aberto com o botão direito sobre uma área, posicionado no ponteiro.\n * Pelo teclado, abre com Shift+F10 ou a tecla Menu. Mesma semântica e\n * navegação do Dropdown.\n */\nexport const ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(function ContextMenu(\n { children, content, open, onOpenChange, disabled = false, className, ...rest },\n ref,\n) {\n const { t } = useLocale()\n const disclosure = useDisclosure({ open, onOpenChange })\n const mounted = useMounted()\n const active = disclosure.isOpen && mounted && !disabled\n const [areaEl, areaRef] = useTriggerElement(children)\n const [point, setPoint] = useState<Point>({ dx: 0, dy: 0 })\n const focusOnOpen = useRef<MenuFocusTarget>('menu')\n const restoreRef = useRef<HTMLElement | null>(null)\n\n const reference = useMemo<VirtualElement | null>(() => {\n if (!areaEl) return null\n return {\n contextElement: areaEl,\n getBoundingClientRect: () => {\n const rect = areaEl.getBoundingClientRect()\n const x = rect.left + point.dx\n const y = rect.top + point.dy\n return { x, y, left: x, top: y, right: x, bottom: y, width: 0, height: 0 }\n },\n }\n }, [areaEl, point])\n\n const openAt = (clientX: number, clientY: number, target: MenuFocusTarget) => {\n if (!areaEl) return\n const rect = areaEl.getBoundingClientRect()\n const current = document.activeElement\n restoreRef.current =\n current instanceof HTMLElement && current !== document.body ? current : null\n setPoint({ dx: clientX - rect.left, dy: clientY - rect.top })\n focusOnOpen.current = target\n disclosure.open()\n }\n\n const returnTarget = () => {\n const saved = restoreRef.current\n if (saved?.isConnected) return saved\n return areaEl && areaEl.tabIndex >= 0 ? areaEl : null\n }\n\n const handleClose = (reason: MenuCloseReason) => {\n disclosure.close()\n if (reason === 'select' || reason === 'escape' || reason === 'tab') focusElement(returnTarget())\n else if (reason === 'outside') returnFocusIfLost(returnTarget())\n }\n\n const childProps = children.props as HTMLAttributes<HTMLElement>\n const area = cloneElement(\n children as ReactElement<HTMLAttributes<HTMLElement> & { ref?: unknown }>,\n {\n ref: areaRef,\n onContextMenu: composeEventHandlers(\n childProps.onContextMenu,\n (event: ReactMouseEvent<HTMLElement>) => {\n if (disabled) return\n event.preventDefault()\n openAt(event.clientX, event.clientY, 'menu')\n },\n ),\n onKeyDown: composeEventHandlers(\n childProps.onKeyDown,\n (event: ReactKeyboardEvent<HTMLElement>) => {\n if (disabled) return\n if ((event.key === 'F10' && event.shiftKey) || event.key === 'ContextMenu') {\n event.preventDefault()\n const rect = (event.target as HTMLElement).getBoundingClientRect()\n openAt(\n rect.left + Math.min(rect.width / 2, 24),\n rect.top + Math.min(rect.height / 2, 24),\n 'first',\n )\n }\n },\n ),\n },\n )\n\n return (\n <>\n {area}\n <MenuPanel\n ref={ref}\n aria-label={rest['aria-labelledby'] ? undefined : t('contextMenu')}\n open={active}\n reference={reference}\n themeOrigin={areaEl}\n placement=\"bottom-start\"\n offset={2}\n focusOnOpen={focusOnOpen}\n onClose={handleClose}\n className={cx('or-context-menu', className)}\n {...rest}\n >\n {content}\n </MenuPanel>\n </>\n )\n})\n","import { forwardRef, type MouseEvent, type ReactNode } from 'react'\nimport { useClipboard } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { Button, type ButtonProps } from '../Button'\nimport { rovingItemProps, useActionGroup } from '../ButtonGroup/context'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './CopyButton.css'\n\nexport interface CopyButtonProps extends Omit<\n ButtonProps,\n 'value' | 'onCopy' | 'iconOnly' | 'startIcon' | 'endIcon' | 'loading' | 'loadingText'\n> {\n /** Texto copiado para a área de transferência. */\n value: string\n /**\n * Rótulo visível. Sem `children`, o botão mostra só o ícone e usa\n * `t('copyToClipboard')` como nome acessível.\n */\n children?: ReactNode\n /** Texto exibido e anunciado após copiar. Padrão: `t('copied')` (\"Copiado!\"). */\n copiedLabel?: string\n /** Tempo (ms) em que o estado \"copiado\" permanece visível. */\n timeout?: number\n /** Chamado com o valor depois de copiar com sucesso. */\n onCopy?: (value: string) => void\n}\n\n/**\n * Copia `value` para a área de transferência. O ícone vira um check e a\n * confirmação é anunciada em uma região `aria-live=\"polite\"`.\n */\nexport const CopyButton = forwardRef<HTMLButtonElement, CopyButtonProps>(function CopyButton(\n {\n value,\n children,\n copiedLabel,\n timeout = 2000,\n onCopy,\n onClick,\n variant,\n size,\n disabled,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const group = useActionGroup()\n const { copy, copied } = useClipboard(timeout)\n const iconOnly = children === undefined || children === null || children === false\n const doneLabel = copiedLabel ?? t('copied')\n\n const handleClick = async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n const ok = await copy(value)\n if (ok) onCopy?.(value)\n }\n\n const icon = (\n <span className=\"or-copy-button__icons\">\n <Icon name=\"copy\" className=\"or-copy-button__icon or-copy-button__icon--copy\" />\n <Icon\n name=\"check\"\n strokeWidth={2.25}\n className=\"or-copy-button__icon or-copy-button__icon--check\"\n />\n </span>\n )\n\n return (\n <>\n <Button\n ref={ref}\n variant={variant ?? group?.variant ?? (iconOnly ? 'ghost' : 'outline')}\n size={size ?? group?.size ?? 'md'}\n disabled={disabled ?? group?.disabled}\n iconOnly={iconOnly}\n aria-label={iconOnly ? t('copyToClipboard') : undefined}\n startIcon={icon}\n className={cx('or-copy-button', className)}\n data-copied={copied ? '' : undefined}\n onClick={handleClick}\n {...rovingItemProps(group)}\n {...rest}\n >\n {iconOnly ? undefined : (\n <span className=\"or-copy-button__labels\">\n <span className=\"or-copy-button__text\" aria-hidden={copied || undefined}>\n {children}\n </span>\n <span className=\"or-copy-button__text\" aria-hidden={!copied || undefined}>\n {doneLabel}\n </span>\n </span>\n )}\n </Button>\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {copied ? doneLabel : ''}\n </VisuallyHidden>\n </>\n )\n})\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { clamp, cx, mergeRefs } from '../../utils'\nimport { useShake } from '../Combobox/motion'\nimport { Field, useFieldControlProps } from '../Field'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './CurrencyField.css'\n\nexport type CurrencyFieldSize = 'sm' | 'md' | 'lg'\n\nexport interface CurrencyFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'type' | 'min' | 'max' | 'step' | 'inputMode'\n> {\n /** Valor numérico (controlado). `null` = vazio. */\n value?: number | null\n /** Valor inicial (não controlado). */\n defaultValue?: number | null\n /** Chamado com o número interpretado a cada digitação e com o valor final ao sair do campo. */\n onChange?: (value: number | null) => void\n /** Código ISO 4217 da moeda. Padrão: `'BRL'`. */\n currency?: string\n /** Locale da formatação. Padrão: o idioma do `OrangeProvider` (pt-BR). */\n locale?: string\n /** Como exibir a moeda: símbolo (`R$`), símbolo curto (`$`) ou código (`BRL`). */\n currencyDisplay?: 'symbol' | 'narrowSymbol' | 'code'\n /** Valor mínimo (aplicado ao sair do campo). Valores negativos só são aceitos se `min < 0`. */\n min?: number\n /** Valor máximo (aplicado ao sair do campo). */\n max?: number\n label?: ReactNode\n hideLabel?: boolean\n description?: ReactNode\n error?: ReactNode\n invalid?: boolean\n /** Altura do controle: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: CurrencyFieldSize\n /** Classe aplicada ao contêiner externo. */\n className?: string\n}\n\ninterface CurrencyFormat {\n symbol: string\n symbolAfter: boolean\n fractionDigits: number\n decimal: string\n group: string\n currencyName: string\n display: Intl.NumberFormat\n}\n\nfunction getCurrencyFormat(\n locale: string,\n currency: string,\n currencyDisplay: CurrencyFieldProps['currencyDisplay'],\n): CurrencyFormat {\n const currencyFormatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n currencyDisplay,\n })\n const parts = currencyFormatter.formatToParts(1234.5)\n const symbolIndex = parts.findIndex((p) => p.type === 'currency')\n const integerIndex = parts.findIndex((p) => p.type === 'integer')\n const fractionDigits = currencyFormatter.resolvedOptions().maximumFractionDigits ?? 2\n let currencyName = currency\n try {\n currencyName = new Intl.DisplayNames(locale, { type: 'currency' }).of(currency) ?? currency\n } catch {\n // Intl.DisplayNames indisponível: usa o código ISO.\n }\n return {\n symbol: parts[symbolIndex]?.value ?? currency,\n symbolAfter: symbolIndex > integerIndex,\n fractionDigits,\n decimal: parts.find((p) => p.type === 'decimal')?.value ?? '.',\n group: parts.find((p) => p.type === 'group')?.value ?? ',',\n currencyName,\n display: new Intl.NumberFormat(locale, {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n }),\n }\n}\n\n/**\n * Interpreta o texto digitado. Aceita o separador decimal do locale e também\n * o \"outro\" (ponto ou vírgula): `1.234,5`, `1234,5`, `1234.5` e `1,5` viram\n * números; um único separador seguido de exatamente 3 dígitos é tratado como\n * milhar (`1.500` → 1500 em pt-BR).\n */\nfunction parseAmount(text: string, decimal: string): number | null {\n let s = text.replace(/[\\s\\u00a0\\u202f']/g, '')\n const negative = s.includes('-')\n s = s.replace(/-/g, '')\n if (!/[0-9]/.test(s)) return null\n const lastDot = s.lastIndexOf('.')\n const lastComma = s.lastIndexOf(',')\n let decimalIndex = -1\n if (lastDot >= 0 && lastComma >= 0) decimalIndex = Math.max(lastDot, lastComma)\n else if (lastDot >= 0 || lastComma >= 0) {\n const sep = lastDot >= 0 ? '.' : ','\n const index = s.lastIndexOf(sep)\n const occurrences = s.split(sep).length - 1\n const digitsAfter = s.length - index - 1\n if (sep === decimal || (occurrences === 1 && digitsAfter !== 3)) decimalIndex = index\n }\n const integer = (decimalIndex >= 0 ? s.slice(0, decimalIndex) : s).replace(/[.,]/g, '')\n const fraction = decimalIndex >= 0 ? s.slice(decimalIndex + 1).replace(/[.,]/g, '') : ''\n const n = Number(`${integer || '0'}.${fraction || '0'}`)\n if (!Number.isFinite(n)) return null\n return negative ? -n : n\n}\n\nconst round = (n: number, digits: number) => {\n const f = 10 ** digits\n return Math.round(n * f) / f\n}\n\n/**\n * Campo de valor monetário: digitação natural (vírgula ou ponto), símbolo da\n * moeda no campo e formatação com `Intl.NumberFormat` ao sair. Entrega um\n * `number` (ou `null`) — nunca uma string formatada.\n */\nexport const CurrencyField = forwardRef<HTMLInputElement, CurrencyFieldProps>(\n function CurrencyField(\n { label, hideLabel, description, error, required, disabled, id, className, ...rest },\n ref,\n ) {\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n controlId={id}\n className={cx('or-currency-field', className)}\n >\n <CurrencyFieldControl\n inputRef={ref}\n required={required}\n disabled={disabled}\n errorSignal={typeof error === 'string' ? error : Boolean(error)}\n {...rest}\n />\n </Field>\n )\n },\n)\n\ntype ControlProps = Omit<\n CurrencyFieldProps,\n 'label' | 'hideLabel' | 'description' | 'error' | 'className' | 'id'\n> & {\n inputRef: React.Ref<HTMLInputElement>\n /** Muda quando a mensagem de erro surge/muda — dispara o tremor do campo. */\n errorSignal: string | boolean\n}\n\nfunction CurrencyFieldControl({\n inputRef,\n errorSignal,\n value: valueProp,\n defaultValue = null,\n onChange,\n currency = 'BRL',\n locale: localeProp,\n currencyDisplay = 'symbol',\n min,\n max,\n invalid,\n size = 'md',\n required,\n disabled,\n readOnly,\n name,\n placeholder,\n onFocus,\n onBlur,\n ...rest\n}: ControlProps) {\n const { locale: providerLocale, t } = useLocale()\n const locale = localeProp ?? providerLocale\n const format = useMemo(\n () => getCurrencyFormat(locale, currency, currencyDisplay),\n [locale, currency, currencyDisplay],\n )\n const hintId = useId('or-currency-hint')\n const controlProps = useFieldControlProps({\n required,\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': [rest['aria-describedby'], hintId].filter(Boolean).join(' '),\n })\n const isDisabled = Boolean(controlProps.disabled)\n const shake = useShake(errorSignal)\n const allowNegative = min !== undefined && min < 0\n\n const [value, setValue] = useControllableState<number | null>({ value: valueProp, defaultValue })\n const [focused, setFocused] = useState(false)\n const [text, setText] = useState('')\n const inputEl = useRef<HTMLInputElement>(null)\n const caret = useRef<number | null>(null)\n\n const formatted = value === null || Number.isNaN(value) ? '' : format.display.format(value)\n const display = focused ? text : formatted\n\n // Restaura a posição do cursor depois de descartar caracteres inválidos.\n useIsomorphicLayoutEffect(() => {\n if (caret.current === null || !inputEl.current) return\n inputEl.current.setSelectionRange(caret.current, caret.current)\n caret.current = null\n })\n\n const emit = (next: number | null) => {\n if (next === value) return\n setValue(next)\n onChange?.(next)\n }\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value\n const allowed = allowNegative ? /[^0-9.,\\-\\s\\u00a0\\u202f]/g : /[^0-9.,\\s\\u00a0\\u202f]/g\n const position = event.target.selectionStart ?? raw.length\n const removedBefore = (raw.slice(0, position).match(allowed) ?? []).length\n let next = raw.replace(allowed, '')\n // Só um sinal de menos, sempre no início.\n if (allowNegative && next.includes('-')) next = `-${next.replace(/-/g, '')}`\n if (next !== raw) caret.current = Math.max(0, position - removedBefore)\n setText(next)\n const parsed = parseAmount(next, format.decimal)\n emit(parsed === null ? null : round(parsed, format.fractionDigits))\n }\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(event)\n setFocused(false)\n const parsed = parseAmount(text, format.decimal)\n if (parsed === null) {\n emit(null)\n return\n }\n let next = round(parsed, format.fractionDigits)\n if (min !== undefined || max !== undefined)\n next = clamp(next, min ?? -Infinity, max ?? Infinity)\n if (!allowNegative && next < 0) next = Math.abs(next)\n emit(next)\n }\n\n const addon = (\n <span\n className={cx(\n 'or-control-frame__addon',\n format.symbolAfter ? 'or-control-frame__addon--end' : 'or-control-frame__addon--start',\n 'or-currency-field__symbol',\n )}\n aria-hidden=\"true\"\n >\n {format.symbol}\n </span>\n )\n\n return (\n // O mousedown só amplia a área de clique do input (que já é focável por teclado).\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-currency-field__frame')}\n data-invalid={controlProps['aria-invalid'] || undefined}\n {...shake}\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled || undefined}\n onMouseDown={(event) => {\n if (event.target !== inputEl.current) {\n event.preventDefault()\n inputEl.current?.focus()\n }\n }}\n >\n {!format.symbolAfter && addon}\n <input\n ref={mergeRefs(inputEl, inputRef)}\n type=\"text\"\n inputMode={allowNegative ? 'text' : 'decimal'}\n autoComplete=\"off\"\n className=\"or-control-frame__input or-currency-field__input\"\n value={display}\n placeholder={placeholder ?? format.display.format(0)}\n readOnly={readOnly}\n onFocus={(event) => {\n onFocus?.(event)\n setText(formatted)\n setFocused(true)\n }}\n onChange={handleChange}\n onBlur={handleBlur}\n {...rest}\n {...controlProps}\n />\n {format.symbolAfter && addon}\n <VisuallyHidden id={hintId}>\n {t('currencyLabel', { currency: format.currencyName })}\n </VisuallyHidden>\n {name && <input type=\"hidden\" name={name} value={value ?? ''} disabled={isDisabled} />}\n </div>\n )\n}\n","/*\n * Utilitários de datas internos do DatePicker/Calendar (não exportados pela\n * biblioteca). Todas as datas são tratadas no fuso local, à meia-noite.\n */\n\nexport type WeekDay = 0 | 1 | 2 | 3 | 4 | 5 | 6\n\n/** Zera horas, minutos, segundos e milissegundos. */\nexport function startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nexport function addDays(date: Date, amount: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + amount)\n}\n\n/** Soma meses mantendo o dia, limitado ao último dia do mês de destino. */\nexport function addMonths(date: Date, amount: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + amount, 1)\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth())\n return new Date(target.getFullYear(), target.getMonth(), Math.min(date.getDate(), lastDay))\n}\n\nexport function addYears(date: Date, amount: number): Date {\n return addMonths(date, amount * 12)\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n return (\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth()\n}\n\n/** Compara apenas o dia (ignora horário). */\nexport function compareDay(a: Date, b: Date): number {\n return startOfDay(a).getTime() - startOfDay(b).getTime()\n}\n\nexport function startOfWeek(date: Date, weekStartsOn: WeekDay): Date {\n const diff = (date.getDay() - weekStartsOn + 7) % 7\n return addDays(date, -diff)\n}\n\nexport function endOfWeek(date: Date, weekStartsOn: WeekDay): Date {\n return addDays(startOfWeek(date, weekStartsOn), 6)\n}\n\n/** Limita `date` ao intervalo [min, max] (comparando apenas o dia). */\nexport function clampDate(date: Date, min?: Date | null, max?: Date | null): Date {\n if (min && compareDay(date, min) < 0) return startOfDay(min)\n if (max && compareDay(date, max) > 0) return startOfDay(max)\n return date\n}\n\nexport function isOutOfRange(date: Date, min?: Date | null, max?: Date | null): boolean {\n return (!!min && compareDay(date, min) < 0) || (!!max && compareDay(date, max) > 0)\n}\n\n/** Semanas (linhas de 7 dias) exibidas na grade do mês. Sempre 6 linhas. */\nexport function getMonthGrid(year: number, month: number, weekStartsOn: WeekDay): Date[][] {\n const first = startOfWeek(new Date(year, month, 1), weekStartsOn)\n return Array.from({ length: 6 }, (_, w) =>\n Array.from({ length: 7 }, (_, d) => addDays(first, w * 7 + d)),\n )\n}\n\n/** `aaaa-mm-dd` (formato ISO de data, usado no input oculto de formulário). */\nexport function toISODate(date: Date): string {\n const y = String(date.getFullYear()).padStart(4, '0')\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n return `${y}-${m}-${d}`\n}\n\n/** Primeira letra em maiúscula, respeitando o locale. */\nexport function capitalize(text: string, locale: string): string {\n return text.charAt(0).toLocaleUpperCase(locale) + text.slice(1)\n}\n\nexport type DateSegment = 'day' | 'month' | 'year'\n\nexport interface DateFormatPattern {\n /** Ordem dos segmentos conforme o locale (ex.: pt-BR → dia, mês, ano). */\n order: DateSegment[]\n /** Separador entre segmentos (`/`, `.`, `-`). */\n separator: string\n}\n\nconst patternCache = new Map<string, DateFormatPattern>()\n\n/** Descobre a ordem dia/mês/ano e o separador usados pelo locale. */\nexport function getDateFormatPattern(locale: string): DateFormatPattern {\n const cached = patternCache.get(locale)\n if (cached) return cached\n let pattern: DateFormatPattern = { order: ['day', 'month', 'year'], separator: '/' }\n try {\n const parts = new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }).formatToParts(new Date(2026, 10, 23))\n const order = parts\n .filter((p) => p.type === 'day' || p.type === 'month' || p.type === 'year')\n .map((p) => p.type as DateSegment)\n const literal = parts.find((p) => p.type === 'literal')?.value.trim()\n if (order.length === 3)\n pattern = { order, separator: literal && literal.length === 1 ? literal : '/' }\n } catch {\n // locale inválido: mantém o padrão dd/mm/aaaa\n }\n patternCache.set(locale, pattern)\n return pattern\n}\n\nconst segmentLength: Record<DateSegment, number> = { day: 2, month: 2, year: 4 }\n\n/**\n * Aplica a máscara de data ao texto digitado: mantém só dígitos (até 8) e\n * insere o separador entre os segmentos conforme a ordem do locale.\n */\nexport function maskDateInput(raw: string, pattern: DateFormatPattern): string {\n // Um separador digitado depois de um só dígito completa o segmento com zero\n // (\"5/3/2026\" → \"05/03/2026\").\n const groups = raw.split(/\\D+/)\n let digits = ''\n groups.forEach((group, i) => {\n const isLast = i === groups.length - 1\n let consumed = 0\n let segment = 0\n while (\n segment < pattern.order.length &&\n consumed + segmentLength[pattern.order[segment]] <= digits.length\n ) {\n consumed += segmentLength[pattern.order[segment]]\n segment++\n }\n const needed = segment < pattern.order.length ? segmentLength[pattern.order[segment]] : 0\n const atBoundary = consumed === digits.length\n if (\n !isLast &&\n atBoundary &&\n group.length > 0 &&\n group.length < needed &&\n segment < pattern.order.length - 1\n ) {\n digits += group.padStart(needed, '0')\n } else {\n digits += group\n }\n })\n digits = digits.slice(0, 8)\n let out = ''\n let index = 0\n for (let i = 0; i < pattern.order.length; i++) {\n const len = segmentLength[pattern.order[i]]\n const chunk = digits.slice(index, index + len)\n if (!chunk) break\n out += chunk\n index += len\n if (chunk.length === len && i < pattern.order.length - 1 && digits.length > index)\n out += pattern.separator\n }\n return out\n}\n\n/** Formata uma data no padrão numérico do locale (ex.: 23/11/2026). */\nexport function formatDateInput(date: Date, pattern: DateFormatPattern): string {\n const values: Record<DateSegment, string> = {\n day: String(date.getDate()).padStart(2, '0'),\n month: String(date.getMonth() + 1).padStart(2, '0'),\n year: String(date.getFullYear()).padStart(4, '0'),\n }\n return pattern.order.map((s) => values[s]).join(pattern.separator)\n}\n\n/**\n * Converte o texto mascarado em data. Retorna `null` se incompleto ou se a\n * data não existir (ex.: 31/02/2026).\n */\nexport function parseDateInput(text: string, pattern: DateFormatPattern): Date | null {\n const digits = text.replace(/\\D/g, '')\n if (digits.length !== 8) return null\n const values: Partial<Record<DateSegment, number>> = {}\n let index = 0\n for (const segment of pattern.order) {\n const len = segmentLength[segment]\n values[segment] = Number(digits.slice(index, index + len))\n index += len\n }\n const { day = 0, month = 0, year = 0 } = values\n if (year < 1000 || month < 1 || month > 12 || day < 1) return null\n const date = new Date(year, month - 1, day)\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day)\n return null\n return date\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport {\n addDays,\n addMonths,\n addYears,\n capitalize,\n clampDate,\n daysInMonth,\n endOfWeek,\n getMonthGrid,\n isOutOfRange,\n isSameDay,\n isSameMonth,\n startOfDay,\n startOfWeek,\n toISODate,\n type WeekDay,\n} from './dateUtils'\nimport './Calendar.css'\n\nexport type CalendarWeekDay = WeekDay\n\nexport interface CalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue' | 'children'\n> {\n /** Data selecionada (controlado). `null` = nenhuma. */\n value?: Date | null\n /** Data selecionada inicial (não controlado). */\n defaultValue?: Date | null\n /** Chamado quando o usuário escolhe um dia (clique, Enter ou Espaço). */\n onChange?: (date: Date) => void\n /** Mês exibido inicialmente quando não há valor. Padrão: mês atual. */\n defaultMonth?: Date\n /** Primeira data selecionável. */\n min?: Date\n /** Última data selecionável. */\n max?: Date\n /** Desabilita datas específicas (feriados, fins de semana…). */\n isDateDisabled?: (date: Date) => boolean\n /** Primeiro dia da semana: 0 = domingo (padrão), 1 = segunda… */\n weekStartsOn?: CalendarWeekDay\n /** Mostra o botão \"Hoje\" no rodapé. */\n showTodayButton?: boolean\n /** Foca o dia ativo ao montar. */\n autoFocus?: boolean\n}\n\ninterface CalendarView {\n date: Date\n direction: 'next' | 'prev' | null\n /** Mês exibido antes da última troca (título que sai no crossfade). */\n from: Date | null\n}\n\nconst monthIndex = (date: Date) => date.getFullYear() * 12 + date.getMonth()\nconst monthKey = (date: Date) => `${date.getFullYear()}-${date.getMonth()}`\n\n/** Props internas usadas pelo DatePicker (não fazem parte da API pública). */\ninterface CalendarInternalProps {\n /** Id do título \"mês de ano\" — o diálogo do DatePicker usa como rótulo. */\n headingId?: string\n}\n\n/**\n * Grade mensal de datas com navegação completa por teclado (padrão \"grid\"\n * do WAI-ARIA). Use sozinha em painéis de agenda ou dentro do `DatePicker`.\n */\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps & CalendarInternalProps>(\n function Calendar(\n {\n value: valueProp,\n defaultValue = null,\n onChange,\n defaultMonth,\n min,\n max,\n isDateDisabled,\n weekStartsOn = 0,\n showTodayButton = false,\n autoFocus = false,\n headingId: headingIdProp,\n className,\n ...rest\n },\n ref,\n ) {\n const { t, locale } = useLocale()\n const generatedId = useId('or-calendar')\n const headingId = headingIdProp ?? `${generatedId}-heading`\n const gridRef = useRef<HTMLTableElement>(null)\n const shouldFocusRef = useRef(autoFocus)\n\n const [value, setValue] = useControllableState<Date | null>({\n value: valueProp,\n defaultValue,\n onChange: onChange as ((date: Date | null) => void) | undefined,\n })\n\n const today = startOfDay(new Date())\n // Dia ativo (roving tabindex) + direção da última troca de mês, usada\n // para deslizar a grade e fazer o crossfade do título.\n const [view, setView] = useState<CalendarView>(() => ({\n date: clampDate(startOfDay(value ?? defaultMonth ?? today), min, max),\n direction: null,\n from: null,\n }))\n const focusedDate = view.date\n // Dia escolhido nesta sessão: ganha o \"pop\" ao ser selecionado.\n const [popped, setPopped] = useState<string | null>(null)\n\n const updateFocused = useCallback(\n (next: Date) =>\n setView((prev) => {\n if (prev.date.getTime() === next.getTime()) return prev\n const diff = monthIndex(next) - monthIndex(prev.date)\n if (diff === 0) return { ...prev, date: next }\n return { date: next, direction: diff > 0 ? 'next' : 'prev', from: prev.date }\n }),\n [],\n )\n\n // Quando o valor muda por fora (ex.: digitado no campo), acompanha o mês.\n const valueKey = value ? startOfDay(value).getTime() : null\n useEffect(() => {\n if (valueKey === null) return\n updateFocused(new Date(valueKey))\n }, [valueKey, updateFocused])\n\n const formatters = useMemo(() => {\n const make = (options: Intl.DateTimeFormatOptions) => {\n try {\n return new Intl.DateTimeFormat(locale, options)\n } catch {\n return new Intl.DateTimeFormat('pt-BR', options)\n }\n }\n return {\n monthYear: make({ month: 'long', year: 'numeric' }),\n day: make({ weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }),\n weekdayShort: make({ weekday: 'short' }),\n weekdayLong: make({ weekday: 'long' }),\n }\n }, [locale])\n\n const isDisabled = (date: Date) => isOutOfRange(date, min, max) || !!isDateDisabled?.(date)\n\n const year = focusedDate.getFullYear()\n const month = focusedDate.getMonth()\n const weeks = useMemo(\n () => getMonthGrid(year, month, weekStartsOn),\n [year, month, weekStartsOn],\n )\n const weekdays = weeks[0]\n\n // Foca a célula ativa depois de navegar pelo teclado.\n useEffect(() => {\n if (!shouldFocusRef.current) return\n shouldFocusRef.current = false\n const cell = gridRef.current?.querySelector<HTMLElement>(\n `[data-date=\"${toISODate(focusedDate)}\"]`,\n )\n cell?.focus({ preventScroll: true })\n }, [focusedDate])\n\n const moveFocus = (next: Date, focus = true) => {\n const target = clampDate(startOfDay(next), min, max)\n shouldFocusRef.current = focus\n if (!isSameMonth(target, focusedDate)) setPopped(null)\n updateFocused(target)\n }\n\n const select = (date: Date) => {\n if (isDisabled(date)) return\n moveFocus(date, false)\n setPopped(toISODate(date))\n // Sempre um novo objeto Date: o onChange dispara mesmo ao reescolher o dia.\n setValue(startOfDay(date))\n }\n\n // Um mês é navegável se tiver ao menos um dia dentro de [min, max].\n const canShowMonth = (target: Date) => {\n const first = new Date(target.getFullYear(), target.getMonth(), 1)\n const last = new Date(\n target.getFullYear(),\n target.getMonth(),\n daysInMonth(target.getFullYear(), target.getMonth()),\n )\n return !(min && last < startOfDay(min)) && !(max && first > startOfDay(max))\n }\n\n const navigation = [\n {\n key: 'prev-year',\n label: t('previousYear'),\n icon: 'chevrons-left' as const,\n target: addYears(focusedDate, -1),\n },\n {\n key: 'prev-month',\n label: t('previousMonth'),\n icon: 'chevron-left' as const,\n target: addMonths(focusedDate, -1),\n },\n {\n key: 'next-month',\n label: t('nextMonth'),\n icon: 'chevron-right' as const,\n target: addMonths(focusedDate, 1),\n },\n {\n key: 'next-year',\n label: t('nextYear'),\n icon: 'chevrons-right' as const,\n target: addYears(focusedDate, 1),\n },\n ].map((item) => ({ ...item, disabled: !canShowMonth(item.target) }))\n\n const renderNavButton = (item: (typeof navigation)[number]) => (\n <button\n key={item.key}\n type=\"button\"\n className={cx('or-calendar__nav', `or-calendar__nav--${item.key}`)}\n aria-label={item.label}\n aria-disabled={item.disabled || undefined}\n onClick={() => {\n if (!item.disabled) moveFocus(item.target, false)\n }}\n >\n <Icon name={item.icon} size=\"sm\" />\n </button>\n )\n\n const onDayKeyDown = (event: KeyboardEvent<HTMLTableCellElement>) => {\n let next: Date | null = null\n switch (event.key) {\n case 'ArrowLeft':\n next = addDays(focusedDate, -1)\n break\n case 'ArrowRight':\n next = addDays(focusedDate, 1)\n break\n case 'ArrowUp':\n next = addDays(focusedDate, -7)\n break\n case 'ArrowDown':\n next = addDays(focusedDate, 7)\n break\n case 'Home':\n next = startOfWeek(focusedDate, weekStartsOn)\n break\n case 'End':\n next = endOfWeek(focusedDate, weekStartsOn)\n break\n case 'PageUp':\n next = event.shiftKey ? addYears(focusedDate, -1) : addMonths(focusedDate, -1)\n break\n case 'PageDown':\n next = event.shiftKey ? addYears(focusedDate, 1) : addMonths(focusedDate, 1)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n select(focusedDate)\n return\n default:\n return\n }\n event.preventDefault()\n moveFocus(next)\n }\n\n const todayDisabled = isDisabled(today)\n const title = capitalize(formatters.monthYear.format(focusedDate), locale)\n const currentKey = monthKey(focusedDate)\n const direction = view.direction\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={headingId}\n className={cx('or-calendar', className)}\n {...rest}\n >\n <div className=\"or-calendar__header\">\n <div className=\"or-calendar__nav-group\">\n {navigation.slice(0, 2).map(renderNavButton)}\n </div>\n <div id={headingId} className=\"or-calendar__title\" aria-live=\"polite\" aria-atomic=\"true\">\n {/* Crossfade: o mês anterior sai enquanto o novo entra pela direção da navegação. */}\n {view.from && direction && (\n <span\n key={`out-${monthKey(view.from)}-${currentKey}`}\n className={cx(\n 'or-calendar__title-text',\n `or-calendar__title-text--out-${direction}`,\n )}\n aria-hidden=\"true\"\n >\n {capitalize(formatters.monthYear.format(view.from), locale)}\n </span>\n )}\n <span\n key={`in-${currentKey}`}\n className={cx(\n 'or-calendar__title-text',\n direction && `or-calendar__title-text--in-${direction}`,\n )}\n >\n {title}\n </span>\n </div>\n <div className=\"or-calendar__nav-group\">{navigation.slice(2).map(renderNavButton)}</div>\n </div>\n\n <table ref={gridRef} role=\"grid\" aria-labelledby={headingId} className=\"or-calendar__grid\">\n <thead>\n <tr role=\"row\">\n {weekdays.map((day) => {\n const long = formatters.weekdayLong.format(day)\n return (\n <th\n key={day.getDay()}\n scope=\"col\"\n role=\"columnheader\"\n abbr={long}\n className=\"or-calendar__weekday\"\n >\n <span aria-hidden=\"true\">\n {formatters.weekdayShort.format(day).replace(/\\.$/, '')}\n </span>\n <span className=\"or-visually-hidden\">{long}</span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody\n key={currentKey}\n className={cx('or-calendar__body', direction && `or-calendar__body--${direction}`)}\n >\n {weeks.map((week) => (\n <tr key={toISODate(week[0])} role=\"row\">\n {week.map((date) => {\n const iso = toISODate(date)\n const selected = isSameDay(date, value)\n const focused = isSameDay(date, focusedDate)\n const disabled = isDisabled(date)\n const outside = !isSameMonth(date, focusedDate)\n const isToday = isSameDay(date, today)\n return (\n <td\n key={iso}\n role=\"gridcell\"\n data-date={iso}\n tabIndex={focused ? 0 : -1}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n aria-current={isToday ? 'date' : undefined}\n aria-label={formatters.day.format(date)}\n className={cx(\n 'or-calendar__day',\n selected && 'or-calendar__day--selected',\n isToday && 'or-calendar__day--today',\n outside && 'or-calendar__day--outside',\n disabled && 'or-calendar__day--disabled',\n selected && popped === iso && 'or-calendar__day--pop',\n )}\n onClick={() => select(date)}\n onKeyDown={onDayKeyDown}\n >\n <span aria-hidden=\"true\">{date.getDate()}</span>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n {showTodayButton && (\n <div className=\"or-calendar__footer\">\n <button\n type=\"button\"\n className=\"or-calendar__today\"\n aria-disabled={todayDisabled || undefined}\n onClick={() => select(today)}\n >\n {t('today')}\n </button>\n </div>\n )}\n </div>\n )\n },\n)\n","import { autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react-dom'\nimport {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport {\n useClickOutside,\n useControllableState,\n useDisclosure,\n useEventListener,\n useId,\n useIsomorphicLayoutEffect,\n usePresence,\n} from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, getFocusableElements, mergeRefs } from '../../utils'\nimport { Field, useFieldControlProps, type FieldControlProps } from '../Field'\nimport { Portal } from '../Portal'\nimport { Calendar, type CalendarWeekDay } from './Calendar'\nimport {\n formatDateInput,\n getDateFormatPattern,\n isOutOfRange,\n maskDateInput,\n parseDateInput,\n startOfDay,\n toISODate,\n} from './dateUtils'\nimport './DatePicker.css'\n\nexport type DatePickerSize = 'sm' | 'md' | 'lg'\n\nexport interface DatePickerProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'min' | 'max' | 'type'\n> {\n /** Data selecionada (controlado). `null` = vazio. */\n value?: Date | null\n /** Data inicial (não controlado). */\n defaultValue?: Date | null\n /**\n * Chamado com a nova data — ou `null` quando o campo fica vazio ou o texto\n * digitado não forma uma data válida/disponível.\n */\n onChange?: (date: Date | null) => void\n /** Primeira data permitida. */\n min?: Date\n /** Última data permitida. */\n max?: Date\n /** Desabilita datas específicas (feriados, fins de semana…). */\n isDateDisabled?: (date: Date) => boolean\n /** Primeiro dia da semana no calendário: 0 = domingo (padrão), 1 = segunda… */\n weekStartsOn?: CalendarWeekDay\n /** Rótulo visível do campo. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. Substitui a validação interna de formato. */\n error?: ReactNode\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n /** Altura do campo: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: DatePickerSize\n /** Calendário aberto (controlado). */\n open?: boolean\n /** Calendário aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\n/** Renderiza os filhos com os atributos ARIA do `Field` que os envolve. */\nfunction FieldControl({\n id,\n children,\n}: {\n id?: string\n children: (props: FieldControlProps) => ReactNode\n}) {\n return <>{children(useFieldControlProps({ id }))}</>\n}\n\ntype InternalError = 'invalid' | 'unavailable' | null\n\n/**\n * Campo de data com máscara conforme o idioma (dd/mm/aaaa em pt-BR,\n * mm/dd/yyyy em en-US) e um calendário em diálogo, seguindo o padrão\n * \"Date Picker Dialog\" do WAI-ARIA.\n */\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(function DatePicker(\n {\n value: valueProp,\n defaultValue = null,\n onChange,\n min,\n max,\n isDateDisabled,\n weekStartsOn = 0,\n label,\n hideLabel,\n description,\n error,\n required,\n optional,\n disabled,\n readOnly,\n size = 'md',\n open: openProp,\n defaultOpen,\n onOpenChange,\n id,\n name,\n placeholder,\n className,\n style,\n onBlur,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const { t, locale } = useLocale()\n const pattern = useMemo(() => getDateFormatPattern(locale), [locale])\n const formatHint = useMemo(() => {\n const letters = {\n day: t('dayPlaceholder'),\n month: t('monthPlaceholder'),\n year: t('yearPlaceholder'),\n }\n return pattern.order.map((segment) => letters[segment]).join(pattern.separator)\n }, [pattern, t])\n const longFormatter = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n })\n } catch {\n return new Intl.DateTimeFormat('pt-BR', {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n })\n }\n }, [locale])\n\n const baseId = useId('or-date-picker')\n const hintId = `${baseId}-hint`\n const dialogId = `${baseId}-dialog`\n const headingId = `${baseId}-heading`\n\n const [value, setValue] = useControllableState<Date | null>({\n value: valueProp,\n defaultValue,\n onChange,\n })\n const { isOpen, setOpen, close } = useDisclosure({ open: openProp, defaultOpen, onOpenChange })\n const [text, setText] = useState(() => (value ? formatDateInput(value, pattern) : ''))\n const [internalError, setInternalError] = useState<InternalError>(null)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const frameRef = useRef<HTMLDivElement>(null)\n const dialogRef = useRef<HTMLDivElement>(null)\n const caretRef = useRef<number | null>(null)\n const emittedRef = useRef<number | null | undefined>(undefined)\n\n // Saída animada: o diálogo continua montado (data-state=\"closed\") até a animação acabar.\n const presence = usePresence<HTMLDivElement>(isOpen)\n const { refs, floatingStyles, placement } = useFloating({\n open: presence.present,\n placement: 'bottom-start',\n // top/left em vez de transform: o transform fica livre para a animação.\n transform: false,\n middleware: [offset(4), flip({ padding: 8 }), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n })\n const side = placement.split('-')[0]\n\n const isUnavailable = (date: Date) => isOutOfRange(date, min, max) || !!isDateDisabled?.(date)\n\n const emit = (date: Date | null) => {\n emittedRef.current = date ? startOfDay(date).getTime() : null\n setValue(date)\n }\n\n // Valor alterado por fora (controlado) ou troca de idioma → reescreve o texto.\n const valueKey = value ? startOfDay(value).getTime() : null\n useEffect(() => {\n if (emittedRef.current !== undefined && emittedRef.current === valueKey) {\n emittedRef.current = undefined\n return\n }\n emittedRef.current = undefined\n setText(valueKey === null ? '' : formatDateInput(new Date(valueKey), pattern))\n setInternalError(null)\n }, [valueKey, pattern])\n\n // Mantém o cursor no lugar depois de aplicar a máscara.\n useIsomorphicLayoutEffect(() => {\n const input = inputRef.current\n if (caretRef.current === null || !input || document.activeElement !== input) return\n input.setSelectionRange(caretRef.current, caretRef.current)\n caretRef.current = null\n })\n\n const handleTextChange = (event: ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value\n const iso = /^\\s*(\\d{4})-(\\d{2})-(\\d{2})\\s*$/.exec(raw)\n const masked = iso\n ? formatDateInput(new Date(Number(iso[1]), Number(iso[2]) - 1, Number(iso[3])), pattern)\n : maskDateInput(raw, pattern)\n\n const caret = event.target.selectionStart ?? raw.length\n const digitsBefore = raw.slice(0, caret).replace(/\\D/g, '').length\n let position = 0\n for (let count = 0; position < masked.length && count < digitsBefore; position++) {\n if (/\\d/.test(masked[position])) count++\n }\n // Digitando no fim (caso comum) o cursor acompanha o fim do texto mascarado.\n caretRef.current = iso || caret >= raw.length ? masked.length : position\n\n setText(masked)\n const digits = masked.replace(/\\D/g, '').length\n if (digits === 0) {\n setInternalError(null)\n emit(null)\n return\n }\n if (digits < 8) {\n setInternalError(null)\n emit(null)\n return\n }\n const parsed = parseDateInput(masked, pattern)\n if (!parsed) {\n setInternalError('invalid')\n emit(null)\n } else if (isUnavailable(parsed)) {\n setInternalError('unavailable')\n emit(null)\n } else {\n setInternalError(null)\n emit(parsed)\n }\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n onBlur?.(event)\n const digits = text.replace(/\\D/g, '').length\n if (digits > 0 && digits < 8) setInternalError('invalid')\n }\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented) return\n if (event.altKey && event.key === 'ArrowDown' && !disabled && !readOnly) {\n event.preventDefault()\n setOpen(true)\n }\n }\n\n const closeAndFocusButton = () => {\n close()\n buttonRef.current?.focus({ preventScroll: true })\n }\n\n const handleSelect = (date: Date) => {\n setInternalError(null)\n setText(formatDateInput(date, pattern))\n emit(date)\n closeAndFocusButton()\n }\n\n useClickOutside([frameRef, dialogRef], () => close(), isOpen)\n\n // Fecha o calendário se o campo for desabilitado enquanto aberto.\n useEffect(() => {\n if ((disabled || readOnly) && isOpen) close()\n }, [disabled, readOnly, isOpen, close])\n\n // Listener nativo no diálogo: Escape para aqui (não fecha um Modal por trás).\n const [dialogElement, setDialogElement] = useState<HTMLDivElement | null>(null)\n const frameRefCallback = useMemo(\n () => mergeRefs(frameRef, refs.setReference),\n [refs.setReference],\n )\n const presenceRef = presence.nodeRef\n const dialogRefCallback = useMemo(\n () => mergeRefs<HTMLDivElement>(dialogRef, presenceRef, refs.setFloating, setDialogElement),\n [refs.setFloating, presenceRef],\n )\n\n // Reaberto durante a animação de saída: o Calendar não remonta, então\n // o foco volta ao dia ativo aqui.\n useEffect(() => {\n if (!isOpen) return\n const cell = dialogRef.current?.querySelector<HTMLElement>('[role=\"gridcell\"][tabindex=\"0\"]')\n if (cell && !dialogRef.current?.contains(document.activeElement))\n cell.focus({ preventScroll: true })\n }, [isOpen])\n useEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n closeAndFocusButton()\n return\n }\n if (event.key !== 'Tab') return\n // Prende o foco dentro do diálogo modal.\n const focusables = getFocusableElements(dialogRef.current)\n if (focusables.length === 0) return\n const first = focusables[0]\n const last = focusables[focusables.length - 1]\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n },\n dialogElement,\n )\n\n const errorMessage =\n error ??\n (internalError === 'invalid'\n ? t('invalidDate', { format: formatHint })\n : internalError === 'unavailable'\n ? t('dateUnavailable')\n : undefined)\n\n const buttonLabel = value\n ? t('changeDate', { date: longFormatter.format(value) })\n : t('chooseDate')\n const invalid = !!errorMessage\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={errorMessage}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n className={cx('or-date-picker', className)}\n style={style}\n >\n <FieldControl id={id}>\n {(fieldProps) => (\n <div\n ref={frameRefCallback}\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-date-picker__frame')}\n data-invalid={invalid || undefined}\n aria-disabled={disabled || undefined}\n data-disabled={disabled || undefined}\n >\n <input\n {...rest}\n {...fieldProps}\n ref={mergeRefs(inputRef, ref)}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n className=\"or-control-frame__input or-date-picker__input\"\n placeholder={placeholder ?? formatHint}\n value={text}\n maxLength={10}\n readOnly={readOnly}\n disabled={disabled}\n aria-describedby={[fieldProps['aria-describedby'], hintId].filter(Boolean).join(' ')}\n aria-invalid={invalid || undefined}\n onChange={handleTextChange}\n onBlur={handleBlur}\n onKeyDown={handleInputKeyDown}\n />\n <span id={hintId} className=\"or-visually-hidden\">\n {t('dateFormatHint', { format: formatHint })}\n </span>\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"or-control-frame__button or-date-picker__button\"\n aria-label={buttonLabel}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? dialogId : undefined}\n disabled={disabled || readOnly}\n onClick={() => setOpen(!isOpen)}\n >\n <Icon name=\"calendar\" size=\"sm\" />\n </button>\n </div>\n )}\n </FieldControl>\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={value ? toISODate(value) : ''}\n disabled={disabled}\n />\n )}\n {presence.present && (\n <Portal>\n <div\n ref={dialogRefCallback}\n id={dialogId}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={headingId}\n className=\"or-date-picker__dialog\"\n data-state={presence.state}\n data-side={side}\n inert={presence.state === 'closed' || undefined}\n style={floatingStyles}\n >\n <Calendar\n headingId={headingId}\n value={value}\n onChange={handleSelect}\n min={min}\n max={max}\n isDateDisabled={isDateDisabled}\n weekStartsOn={weekStartsOn}\n showTodayButton\n autoFocus\n />\n </div>\n </Portal>\n )}\n </Field>\n )\n})\n","/*\n * Utilitários internos do DateRangePicker/RangeCalendar (não exportados pela\n * biblioteca, exceto os tipos públicos reexportados no index). Complementam\n * `../DatePicker/dateUtils` — todas as datas no fuso local, à meia-noite.\n */\nimport type { MessageKey } from '../../providers'\nimport {\n addDays,\n addMonths,\n addYears,\n daysInMonth,\n endOfWeek,\n formatDateInput,\n isOutOfRange,\n maskDateInput,\n parseDateInput,\n startOfDay,\n startOfWeek,\n type DateFormatPattern,\n type WeekDay,\n} from '../DatePicker/dateUtils'\n\n/** Período com início e fim (cada um pode estar vazio enquanto é preenchido). */\nexport interface DateRange {\n start: Date | null\n end: Date | null\n}\n\n/** Período completo — o que o `RangeCalendar` emite e um atalho retorna. */\nexport interface CompleteDateRange {\n start: Date\n end: Date\n}\n\n/** Atalhos prontos, com rótulos traduzidos pelo `OrangeProvider`. */\nexport type DateRangePresetKey =\n | 'today'\n | 'last7Days'\n | 'last30Days'\n | 'thisWeek'\n | 'thisMonth'\n | 'lastMonth'\n | 'thisYear'\n\n/** Atalho de período exibido ao lado do calendário. */\nexport interface DateRangePreset {\n /** Texto do botão (\"Últimos 7 dias\"). */\n label: string\n /** Calcula o período na hora (datas relativas a hoje). */\n range: () => CompleteDateRange\n}\n\nexport const presetLabelKeys: Record<DateRangePresetKey, MessageKey> = {\n today: 'today',\n last7Days: 'dateRangeLast7Days',\n last30Days: 'dateRangeLast30Days',\n thisWeek: 'dateRangeThisWeek',\n thisMonth: 'dateRangeThisMonth',\n lastMonth: 'dateRangeLastMonth',\n thisYear: 'dateRangeThisYear',\n}\n\n/**\n * Períodos dos atalhos prontos. \"Esta semana\", \"Este mês\" e \"Este ano\" vão\n * do primeiro dia até hoje (filtros de relatório olham para o passado).\n */\nexport function resolvePresetRange(\n key: DateRangePresetKey,\n today: Date,\n weekStartsOn: WeekDay,\n): CompleteDateRange {\n const day = startOfDay(today)\n const year = day.getFullYear()\n const month = day.getMonth()\n switch (key) {\n case 'today':\n return { start: day, end: day }\n case 'last7Days':\n return { start: addDays(day, -6), end: day }\n case 'last30Days':\n return { start: addDays(day, -29), end: day }\n case 'thisWeek':\n return { start: startOfWeek(day, weekStartsOn), end: day }\n case 'thisMonth':\n return { start: new Date(year, month, 1), end: day }\n case 'lastMonth': {\n const previous = new Date(year, month - 1, 1)\n return {\n start: previous,\n end: new Date(\n previous.getFullYear(),\n previous.getMonth(),\n daysInMonth(previous.getFullYear(), previous.getMonth()),\n ),\n }\n }\n case 'thisYear':\n return { start: new Date(year, 0, 1), end: day }\n }\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000\n\n/** `a − b` em dias inteiros (seguro com horário de verão). */\nexport function differenceInDays(a: Date, b: Date): number {\n return Math.round((startOfDay(a).getTime() - startOfDay(b).getTime()) / DAY_MS)\n}\n\n/** Chave numérica do dia (ou `null`), para comparar e usar em dependências. */\nexport function dayKey(date: Date | null | undefined): number | null {\n return date ? startOfDay(date).getTime() : null\n}\n\nexport function isSameRange(a: DateRange, b: DateRange): boolean {\n return dayKey(a.start) === dayKey(b.start) && dayKey(a.end) === dayKey(b.end)\n}\n\n/** Primeiro dia do mês de `date`. */\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nexport type RangeErrorKind = 'order' | 'tooShort' | 'tooLong'\n\n/**\n * Valida um período completo. O comprimento é medido em dias entre as datas\n * (`fim − início`), como noites de hospedagem: 10/03 → 12/03 = 2.\n */\nexport function getRangeError(\n start: Date,\n end: Date,\n minLength?: number,\n maxLength?: number,\n): RangeErrorKind | null {\n const length = differenceInDays(end, start)\n if (length < 0) return 'order'\n if (minLength !== undefined && length < minLength) return 'tooShort'\n if (maxLength !== undefined && length > maxLength) return 'tooLong'\n return null\n}\n\nexport interface RangeConstraints {\n min?: Date\n max?: Date\n isDateDisabled?: (date: Date) => boolean\n minLength?: number\n maxLength?: number\n}\n\nexport function isDateUnavailable(date: Date, { min, max, isDateDisabled }: RangeConstraints) {\n return isOutOfRange(date, min, max) || !!isDateDisabled?.(date)\n}\n\n/** O período inteiro respeita min/max, datas desabilitadas nas pontas e o comprimento. */\nexport function isRangeAllowed(range: CompleteDateRange, constraints: RangeConstraints): boolean {\n return (\n !isDateUnavailable(range.start, constraints) &&\n !isDateUnavailable(range.end, constraints) &&\n getRangeError(range.start, range.end, constraints.minLength, constraints.maxLength) === null\n )\n}\n\n/**\n * Destino do foco para uma tecla na grade (padrão \"grid\" do WAI-ARIA APG).\n * Retorna `null` para teclas que não navegam.\n */\nexport function getKeyboardTarget(\n key: string,\n shiftKey: boolean,\n date: Date,\n weekStartsOn: WeekDay,\n): Date | null {\n switch (key) {\n case 'ArrowLeft':\n return addDays(date, -1)\n case 'ArrowRight':\n return addDays(date, 1)\n case 'ArrowUp':\n return addDays(date, -7)\n case 'ArrowDown':\n return addDays(date, 7)\n case 'Home':\n return startOfWeek(date, weekStartsOn)\n case 'End':\n return endOfWeek(date, weekStartsOn)\n case 'PageUp':\n return shiftKey ? addYears(date, -1) : addMonths(date, -1)\n case 'PageDown':\n return shiftKey ? addYears(date, 1) : addMonths(date, 1)\n default:\n return null\n }\n}\n\n/**\n * Aplica a máscara do locale (a mesma do DatePicker) e calcula onde o cursor\n * deve ficar. Aceita colar uma data ISO (`aaaa-mm-dd`).\n */\nexport function applyDateMask(\n raw: string,\n caret: number,\n pattern: DateFormatPattern,\n): { text: string; caret: number } {\n const iso = /^\\s*(\\d{4})-(\\d{2})-(\\d{2})\\s*$/.exec(raw)\n const text = iso\n ? formatDateInput(new Date(Number(iso[1]), Number(iso[2]) - 1, Number(iso[3])), pattern)\n : maskDateInput(raw, pattern)\n const digitsBefore = raw.slice(0, caret).replace(/\\D/g, '').length\n let position = 0\n for (let count = 0; position < text.length && count < digitsBefore; position++) {\n if (/\\d/.test(text[position])) count++\n }\n // Digitando no fim (caso comum) o cursor acompanha o fim do texto mascarado.\n return { text, caret: iso || caret >= raw.length ? text.length : position }\n}\n\nexport type DateInputStatus = 'empty' | 'incomplete' | 'invalid' | 'unavailable' | 'valid'\n\n/** Lê o texto mascarado de um dos campos do período. */\nexport function readDateInput(\n text: string,\n pattern: DateFormatPattern,\n isUnavailable: (date: Date) => boolean,\n): { status: DateInputStatus; date: Date | null } {\n const digits = text.replace(/\\D/g, '').length\n if (digits === 0) return { status: 'empty', date: null }\n if (digits < 8) return { status: 'incomplete', date: null }\n const date = parseDateInput(text, pattern)\n if (!date) return { status: 'invalid', date: null }\n return { status: isUnavailable(date) ? 'unavailable' : 'valid', date }\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { useControllableState, useId, useMediaQuery } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport type { CalendarWeekDay } from '../DatePicker'\nimport {\n addMonths,\n capitalize,\n clampDate,\n compareDay,\n daysInMonth,\n getMonthGrid,\n isSameDay,\n startOfDay,\n toISODate,\n} from '../DatePicker/dateUtils'\nimport {\n dayKey,\n differenceInDays,\n getKeyboardTarget,\n isDateUnavailable,\n startOfMonth,\n type CompleteDateRange,\n type DateRange,\n} from './rangeUtils'\nimport '../DatePicker/Calendar.css'\nimport './RangeCalendar.css'\n\nexport interface RangeCalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue' | 'children'\n> {\n /** Período selecionado (controlado). `null` = nenhum. */\n value?: DateRange | null\n /** Período inicial (não controlado). */\n defaultValue?: DateRange | null\n /**\n * Chamado quando o período fica completo: o 1º clique/Enter marca o início\n * e o 2º, o fim (se vier antes do início, as datas são trocadas).\n */\n onChange?: (range: CompleteDateRange) => void\n /** Mês exibido inicialmente quando não há valor. Padrão: mês atual. */\n defaultMonth?: Date\n /**\n * Meses lado a lado. Com `2`, telas estreitas (< 768px) continuam mostrando\n * um mês só — sem rolagem horizontal.\n */\n visibleMonths?: 1 | 2\n /** Primeira data selecionável. */\n min?: Date\n /** Última data selecionável. */\n max?: Date\n /** Desabilita datas específicas (feriados, fins de semana…). */\n isDateDisabled?: (date: Date) => boolean\n /**\n * Comprimento mínimo em dias entre início e fim (`fim − início`, como\n * noites). Depois de escolher o início, datas mais próximas ficam desabilitadas.\n */\n minLength?: number\n /** Comprimento máximo em dias entre início e fim. */\n maxLength?: number\n /** Primeiro dia da semana: 0 = domingo (padrão), 1 = segunda… */\n weekStartsOn?: CalendarWeekDay\n /** Foca o dia ativo ao montar. */\n autoFocus?: boolean\n}\n\ninterface RangeView {\n /** Dia ativo (roving tabindex). */\n date: Date\n /** Primeiro mês visível. */\n first: Date\n /** Direção da última troca de mês (desliza a grade e o título). */\n direction: 'next' | 'prev' | null\n /** Primeiro mês visível antes da última troca (títulos que saem no crossfade). */\n from: Date | null\n}\n\nconst monthIndex = (date: Date) => date.getFullYear() * 12 + date.getMonth()\nconst monthKey = (date: Date) => `${date.getFullYear()}-${date.getMonth()}`\nconst rangeKey = (start: number | null, end: number | null) => `${start}|${end}`\n\n/** Primeiro mês visível ajustado para que `date` apareça entre os `count` meses. */\nfunction fitView(first: Date, date: Date, count: number): Date {\n const diff = monthIndex(date) - monthIndex(first)\n if (diff < 0) return startOfMonth(date)\n if (diff >= count) return addMonths(startOfMonth(date), -(count - 1))\n return first\n}\n\nconst isBetween = (date: Date, start: Date, end: Date) =>\n compareDay(date, start) >= 0 && compareDay(date, end) <= 0\n\n/**\n * Calendário de período: o primeiro clique (ou Enter) marca o início, o\n * segundo marca o fim, com prévia da faixa ao passar o mouse ou mover o foco.\n * Mesma navegação por teclado do `Calendar` (padrão \"grid\" do WAI-ARIA).\n */\nexport const RangeCalendar = forwardRef<HTMLDivElement, RangeCalendarProps>(\n function RangeCalendar(\n {\n value: valueProp,\n defaultValue = null,\n onChange,\n defaultMonth,\n visibleMonths = 1,\n min,\n max,\n isDateDisabled,\n minLength,\n maxLength,\n weekStartsOn = 0,\n autoFocus = false,\n className,\n ...rest\n },\n ref,\n ) {\n const { t, locale } = useLocale()\n const baseId = useId('or-range-calendar')\n const startDescriptionId = `${baseId}-start`\n const endDescriptionId = `${baseId}-end`\n const rootRef = useRef<HTMLDivElement>(null)\n const shouldFocusRef = useRef(autoFocus)\n // Último período emitido por este calendário: não reposiciona a visão no eco do valor.\n const emittedRef = useRef<string | undefined>(undefined)\n\n const wide = useMediaQuery('(min-width: 48rem)')\n const monthCount = visibleMonths === 2 && wide ? 2 : 1\n // Lido no updater de setView: girar a tela não recria updateView nem reinicia a seleção.\n const monthCountRef = useRef(monthCount)\n monthCountRef.current = monthCount\n\n const [value, setValue] = useControllableState<DateRange | null>({\n value: valueProp,\n defaultValue,\n onChange: onChange as ((range: DateRange | null) => void) | undefined,\n })\n\n const today = startOfDay(new Date())\n // Início já escolhido, aguardando o fim. Um valor parcial (só início,\n // ex.: digitado no DateRangePicker) já abre aguardando a data final.\n const [anchor, setAnchor] = useState<Date | null>(() =>\n value?.start && !value.end ? startOfDay(value.start) : null,\n )\n const [hovered, setHovered] = useState<Date | null>(null)\n // Ponta escolhida nesta sessão: ganha o \"pop\" ao ser marcada.\n const [popped, setPopped] = useState<string | null>(null)\n const [announcement, setAnnouncement] = useState('')\n const [view, setView] = useState<RangeView>(() => {\n const date = clampDate(\n startOfDay(value?.start ?? value?.end ?? defaultMonth ?? today),\n min,\n max,\n )\n return { date, first: startOfMonth(date), direction: null, from: null }\n })\n const focusedDate = view.date\n const first = fitView(view.first, view.date, monthCount)\n\n const updateView = useCallback(\n (next: Date, firstOverride?: Date) =>\n setView((prev) => {\n const count = monthCountRef.current\n const prevFirst = fitView(prev.first, prev.date, count)\n const nextFirst = fitView(firstOverride ?? prevFirst, next, count)\n const diff = monthIndex(nextFirst) - monthIndex(prevFirst)\n if (diff === 0) {\n if (\n prev.date.getTime() === next.getTime() &&\n prev.first.getTime() === nextFirst.getTime()\n )\n return prev\n return { ...prev, date: next, first: nextFirst }\n }\n return {\n date: next,\n first: nextFirst,\n direction: diff > 0 ? 'next' : 'prev',\n from: prevFirst,\n }\n }),\n [],\n )\n\n // Valor alterado por fora (digitado no campo, atalho, controlado): acompanha.\n const startKey = dayKey(value?.start)\n const endKey = dayKey(value?.end)\n const valueKey = rangeKey(startKey, endKey)\n useEffect(() => {\n if (emittedRef.current === valueKey) {\n emittedRef.current = undefined\n return\n }\n emittedRef.current = undefined\n const nextAnchor = startKey !== null && endKey === null ? startKey : null\n setAnchor((prev) =>\n dayKey(prev) === nextAnchor ? prev : nextAnchor === null ? null : new Date(nextAnchor),\n )\n setHovered(null)\n const target = startKey ?? endKey\n if (target === null) return\n setPopped(null)\n updateView(clampDate(new Date(target), min, max))\n // min/max entram só no clamp do momento da troca.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueKey, updateView])\n\n const formatters = useMemo(() => {\n const make = (options: Intl.DateTimeFormatOptions) => {\n try {\n return new Intl.DateTimeFormat(locale, options)\n } catch {\n return new Intl.DateTimeFormat('pt-BR', options)\n }\n }\n return {\n monthYear: make({ month: 'long', year: 'numeric' }),\n day: make({ weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }),\n long: make({ day: 'numeric', month: 'long', year: 'numeric' }),\n weekdayShort: make({ weekday: 'short' }),\n weekdayLong: make({ weekday: 'long' }),\n }\n }, [locale])\n\n const isUnavailable = (date: Date) => isDateUnavailable(date, { min, max, isDateDisabled })\n /** Com o início escolhido, o fim precisa respeitar minLength/maxLength. */\n const breaksLength = (date: Date) => {\n if (!anchor) return false\n const length = Math.abs(differenceInDays(date, anchor))\n return (\n (minLength !== undefined && length < minLength) ||\n (maxLength !== undefined && length > maxLength)\n )\n }\n const isDisabled = (date: Date) =>\n isUnavailable(date) || (breaksLength(date) && !isSameDay(date, anchor))\n\n // Foca a célula ativa depois de navegar pelo teclado.\n useEffect(() => {\n if (!shouldFocusRef.current) return\n shouldFocusRef.current = false\n const cell = rootRef.current?.querySelector<HTMLElement>(\n `[data-date=\"${toISODate(focusedDate)}\"]`,\n )\n cell?.focus({ preventScroll: true })\n }, [focusedDate])\n\n const months = Array.from({ length: monthCount }, (_, i) => addMonths(first, i))\n const lastMonth = months[months.length - 1]\n const isVisible = (date: Date) =>\n monthIndex(date) >= monthIndex(first) && monthIndex(date) <= monthIndex(lastMonth)\n\n const moveFocus = (next: Date, focus = true, firstOverride?: Date) => {\n const target = clampDate(startOfDay(next), min, max)\n shouldFocusRef.current = focus\n if (firstOverride || !isVisible(target)) setPopped(null)\n updateView(target, firstOverride)\n }\n\n const select = (date: Date) => {\n const day = startOfDay(date)\n if (isUnavailable(day)) return\n if (!anchor) {\n setAnchor(day)\n setHovered(null)\n setPopped(toISODate(day))\n moveFocus(day, false)\n setAnnouncement(t('dateRangeStartSelected', { date: formatters.long.format(day) }))\n return\n }\n if (breaksLength(day)) return\n const [start, end] = compareDay(day, anchor) < 0 ? [day, anchor] : [anchor, day]\n setAnchor(null)\n setHovered(null)\n setPopped(toISODate(day))\n moveFocus(day, false)\n emittedRef.current = rangeKey(start.getTime(), end.getTime())\n setValue({ start, end })\n setAnnouncement(\n t('dateRangeSelected', {\n start: formatters.long.format(start),\n end: formatters.long.format(end),\n }),\n )\n }\n\n // Um mês é navegável se tiver ao menos um dia dentro de [min, max].\n const canShowMonth = (target: Date) => {\n const firstDay = new Date(target.getFullYear(), target.getMonth(), 1)\n const lastDay = new Date(\n target.getFullYear(),\n target.getMonth(),\n daysInMonth(target.getFullYear(), target.getMonth()),\n )\n return !(min && lastDay < startOfDay(min)) && !(max && firstDay > startOfDay(max))\n }\n\n const navigation = [\n { key: 'prev-year', label: t('previousYear'), icon: 'chevrons-left' as const, shift: -12 },\n { key: 'prev-month', label: t('previousMonth'), icon: 'chevron-left' as const, shift: -1 },\n { key: 'next-month', label: t('nextMonth'), icon: 'chevron-right' as const, shift: 1 },\n { key: 'next-year', label: t('nextYear'), icon: 'chevrons-right' as const, shift: 12 },\n ].map((item) => ({\n ...item,\n disabled: !canShowMonth(addMonths(item.shift < 0 ? first : lastMonth, item.shift)),\n }))\n\n const renderNavButton = (item: (typeof navigation)[number]) => (\n <button\n key={item.key}\n type=\"button\"\n className={cx('or-calendar__nav', `or-calendar__nav--${item.key}`)}\n aria-label={item.label}\n aria-disabled={item.disabled || undefined}\n onClick={() => {\n if (!item.disabled)\n moveFocus(addMonths(focusedDate, item.shift), false, addMonths(first, item.shift))\n }}\n >\n <Icon name={item.icon} size=\"sm\" />\n </button>\n )\n\n const onDayKeyDown = (event: KeyboardEvent<HTMLTableCellElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n select(focusedDate)\n return\n }\n if (event.key === 'Escape' && anchor) {\n // Cancela o início pendente (no DateRangePicker, Escape fecha o diálogo).\n event.preventDefault()\n event.stopPropagation()\n setAnchor(null)\n setHovered(null)\n setAnnouncement('')\n return\n }\n const next = getKeyboardTarget(event.key, event.shiftKey, focusedDate, weekStartsOn)\n if (!next) return\n event.preventDefault()\n setHovered(null)\n moveFocus(next)\n }\n\n // Pontas e faixa exibidas: prévia (início pendente → dia sob o mouse/foco)\n // ou o período confirmado.\n const previewTarget = anchor ? (hovered ?? focusedDate) : null\n const previewEdge =\n anchor && previewTarget && !isSameDay(previewTarget, anchor) && !isDisabled(previewTarget)\n ? previewTarget\n : null\n let rangeStart: Date | null\n let rangeEnd: Date | null\n if (anchor) {\n const other = previewEdge ?? anchor\n ;[rangeStart, rangeEnd] = compareDay(other, anchor) < 0 ? [other, anchor] : [anchor, other]\n } else {\n rangeStart = value?.start ?? null\n rangeEnd = value?.end ?? null\n if (rangeStart && rangeEnd && compareDay(rangeEnd, rangeStart) < 0)\n [rangeStart, rangeEnd] = [rangeEnd, rangeStart]\n }\n const previewing = !!anchor\n const backward = !!anchor && !!previewEdge && compareDay(previewEdge, anchor) < 0\n const weekdays = getMonthGrid(first.getFullYear(), first.getMonth(), weekStartsOn)[0]\n const headingIds = months.map((_, i) => `${baseId}-heading-${i}`)\n const direction = view.direction\n\n const renderDay = (date: Date) => {\n const iso = toISODate(date)\n const inBand = !!rangeStart && !!rangeEnd && isBetween(date, rangeStart, rangeEnd)\n const isAnchor = isSameDay(date, anchor)\n const isPreviewEdge = isSameDay(date, previewEdge)\n // Pontas preenchidas: o início pendente ou as datas confirmadas.\n const filled = previewing\n ? isAnchor\n : isSameDay(date, rangeStart) || isSameDay(date, rangeEnd)\n const isStart = filled && isSameDay(date, rangeStart)\n const isEnd = filled && isSameDay(date, rangeEnd) && !(previewing && !previewEdge)\n const selected = previewing ? isAnchor : inBand || filled\n const describedBy = previewing\n ? isAnchor\n ? startDescriptionId\n : undefined\n : [\n isSameDay(date, value?.start) && startDescriptionId,\n isSameDay(date, value?.end) && endDescriptionId,\n ]\n .filter(Boolean)\n .join(' ') || undefined\n const focused = isSameDay(date, focusedDate)\n const disabled = isDisabled(date)\n const isToday = isSameDay(date, today)\n return (\n <td\n key={iso}\n role=\"gridcell\"\n data-date={iso}\n tabIndex={focused ? 0 : -1}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n aria-current={isToday ? 'date' : undefined}\n aria-label={formatters.day.format(date)}\n aria-describedby={describedBy}\n className={cx(\n 'or-calendar__day',\n 'or-range-calendar__day',\n isToday && 'or-calendar__day--today',\n disabled && 'or-calendar__day--disabled',\n inBand && 'or-range-calendar__day--in-range',\n inBand && previewing && 'or-range-calendar__day--preview',\n isStart && 'or-range-calendar__day--start',\n isEnd && 'or-range-calendar__day--end',\n isPreviewEdge && 'or-range-calendar__day--preview-edge',\n )}\n onClick={() => select(date)}\n onKeyDown={onDayKeyDown}\n onFocus={() => {\n // Foco vindo de fora do teclado da grade (clique, script): vira o dia ativo.\n if (!focused) moveFocus(date, false)\n }}\n onMouseEnter={() => {\n if (anchor) setHovered(date)\n }}\n >\n <span\n className={cx(\n 'or-range-calendar__mark',\n filled && popped === iso && 'or-range-calendar__mark--pop',\n )}\n aria-hidden=\"true\"\n >\n {date.getDate()}\n </span>\n </td>\n )\n }\n\n const renderMonth = (month: Date, index: number) => {\n const key = monthKey(month)\n const from = view.from && direction ? addMonths(view.from, index) : null\n const weeks = getMonthGrid(month.getFullYear(), month.getMonth(), weekStartsOn)\n const isFirst = index === 0\n const isLast = index === months.length - 1\n return (\n <div key={index} className=\"or-range-calendar__month\">\n <div className=\"or-calendar__header\">\n {isFirst ? (\n <div className=\"or-calendar__nav-group\">\n {navigation.slice(0, 2).map(renderNavButton)}\n </div>\n ) : (\n <span className=\"or-range-calendar__nav-spacer\" />\n )}\n <div\n id={headingIds[index]}\n className=\"or-calendar__title\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {from && (\n <span\n key={`out-${monthKey(from)}-${key}`}\n className={cx(\n 'or-calendar__title-text',\n `or-calendar__title-text--out-${direction}`,\n )}\n aria-hidden=\"true\"\n >\n {capitalize(formatters.monthYear.format(from), locale)}\n </span>\n )}\n <span\n key={`in-${key}`}\n className={cx(\n 'or-calendar__title-text',\n direction && `or-calendar__title-text--in-${direction}`,\n )}\n >\n {capitalize(formatters.monthYear.format(month), locale)}\n </span>\n </div>\n {isLast ? (\n <div className=\"or-calendar__nav-group\">\n {navigation.slice(2).map(renderNavButton)}\n </div>\n ) : (\n <span className=\"or-range-calendar__nav-spacer\" />\n )}\n </div>\n\n <table\n role=\"grid\"\n aria-labelledby={headingIds[index]}\n aria-multiselectable=\"true\"\n className=\"or-calendar__grid\"\n >\n <thead>\n <tr role=\"row\">\n {weekdays.map((day) => {\n const long = formatters.weekdayLong.format(day)\n return (\n <th\n key={day.getDay()}\n scope=\"col\"\n role=\"columnheader\"\n abbr={long}\n className=\"or-calendar__weekday\"\n >\n <span aria-hidden=\"true\">\n {formatters.weekdayShort.format(day).replace(/\\.$/, '')}\n </span>\n <span className=\"or-visually-hidden\">{long}</span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody\n key={key}\n className={cx('or-calendar__body', direction && `or-calendar__body--${direction}`)}\n >\n {weeks.map((week) => (\n <tr key={toISODate(week[0])} role=\"row\">\n {week.map((date) =>\n date.getMonth() === month.getMonth() ? (\n renderDay(date)\n ) : (\n // Dias de outros meses ficam vazios: cada data aparece uma vez só.\n <td key={toISODate(date)} className=\"or-range-calendar__blank\" />\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n\n return (\n <div\n ref={mergeRefs(rootRef, ref)}\n role=\"group\"\n aria-labelledby={rest['aria-label'] ? undefined : headingIds.join(' ')}\n className={cx('or-calendar', 'or-range-calendar', className)}\n data-months={monthCount}\n data-preview={backward ? 'backward' : previewing ? 'forward' : undefined}\n {...rest}\n >\n <div className=\"or-range-calendar__months\" onMouseLeave={() => setHovered(null)}>\n {months.map(renderMonth)}\n </div>\n <span id={startDescriptionId} hidden>\n {t('dateRangeStartMarker')}\n </span>\n <span id={endDescriptionId} hidden>\n {t('dateRangeEndMarker')}\n </span>\n <div role=\"status\" className=\"or-visually-hidden\">\n {announcement}\n </div>\n </div>\n )\n },\n)\n","import { autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react-dom'\nimport {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport {\n useClickOutside,\n useControllableState,\n useDisclosure,\n useEventListener,\n useId,\n useIsomorphicLayoutEffect,\n usePresence,\n} from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, getFocusableElements, mergeRefs } from '../../utils'\nimport { useShake } from '../Combobox/motion'\nimport type { CalendarWeekDay } from '../DatePicker'\nimport {\n formatDateInput,\n getDateFormatPattern,\n startOfDay,\n toISODate,\n} from '../DatePicker/dateUtils'\nimport { Field, useField, useFieldControlProps, type FieldControlProps } from '../Field'\nimport { Portal } from '../Portal'\nimport { RangeCalendar } from './RangeCalendar'\nimport {\n applyDateMask,\n dayKey,\n getRangeError,\n isDateUnavailable,\n isRangeAllowed,\n isSameRange,\n presetLabelKeys,\n readDateInput,\n resolvePresetRange,\n type CompleteDateRange,\n type DateRange,\n type DateRangePreset,\n type DateRangePresetKey,\n} from './rangeUtils'\nimport './DateRangePicker.css'\n\nexport type DateRangePickerSize = 'sm' | 'md' | 'lg'\n\nexport interface DateRangePickerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'defaultValue' | 'onChange' | 'children'\n> {\n /** Período (controlado). Use `{ start: null, end: null }` para vazio. */\n value?: DateRange\n /** Período inicial (não controlado). */\n defaultValue?: DateRange\n /**\n * Chamado com o novo período. Cada ponta vira `null` enquanto estiver vazia,\n * incompleta, inválida ou indisponível; o fim também vira `null` quando\n * quebra a ordem (fim antes do início) ou os limites de comprimento.\n */\n onChange?: (range: DateRange) => void\n /** Primeira data permitida. */\n min?: Date\n /** Última data permitida. */\n max?: Date\n /** Desabilita datas específicas (feriados, fins de semana…). */\n isDateDisabled?: (date: Date) => boolean\n /** Comprimento mínimo em dias entre início e fim (`fim − início`, como noites). */\n minLength?: number\n /** Comprimento máximo em dias entre início e fim. */\n maxLength?: number\n /** Primeiro dia da semana no calendário: 0 = domingo (padrão), 1 = segunda… */\n weekStartsOn?: CalendarWeekDay\n /** Meses lado a lado no calendário (em telas estreitas, sempre 1). Padrão: 2. */\n visibleMonths?: 1 | 2\n /**\n * Atalhos ao lado do calendário: chaves prontas (`'last7Days'`,\n * `'thisMonth'`, `'lastMonth'`…) e/ou `{ label, range }` próprios.\n */\n presets?: (DateRangePreset | DateRangePresetKey)[]\n /** Rótulo visível do campo (também nomeia o grupo dos dois campos). */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. Substitui a validação interna. */\n error?: ReactNode\n /** Marca os dois campos como obrigatórios. */\n required?: boolean\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n /** Desabilita os campos e o botão do calendário. */\n disabled?: boolean\n /** Somente leitura: os campos não editam e o calendário não abre. */\n readOnly?: boolean\n /** Altura do campo: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: DateRangePickerSize\n /**\n * Envia o período no formulário em dois inputs ocultos, `name[start]` e\n * `name[end]`, no formato ISO `aaaa-mm-dd`.\n */\n name?: string\n /** Calendário aberto (controlado). */\n open?: boolean\n /** Calendário aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nconst EMPTY_RANGE: DateRange = { start: null, end: null }\nconst rangeKey = (range: DateRange) => `${dayKey(range.start)}|${dayKey(range.end)}`\n\ntype Edge = 'start' | 'end'\n\n/** Renderiza os filhos com os atributos ARIA do `Field` e o id do rótulo. */\nfunction FieldControl({\n id,\n children,\n}: {\n id?: string\n children: (props: FieldControlProps, labelId: string | undefined) => ReactNode\n}) {\n const field = useField()\n return <>{children(useFieldControlProps({ id }), field?.labelId)}</>\n}\n\n/**\n * Campo de período: duas datas com máscara conforme o idioma dentro de um\n * só controle, um calendário de período em diálogo (um ou dois meses) e\n * atalhos opcionais (\"Últimos 7 dias\", \"Mês passado\").\n */\nexport const DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(\n function DateRangePicker(\n {\n value: valueProp,\n defaultValue = EMPTY_RANGE,\n onChange,\n min,\n max,\n isDateDisabled,\n minLength,\n maxLength,\n weekStartsOn = 0,\n visibleMonths = 2,\n presets,\n label,\n hideLabel,\n description,\n error,\n required,\n optional,\n disabled,\n readOnly,\n size = 'md',\n name,\n open: openProp,\n defaultOpen,\n onOpenChange,\n id,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const { t, locale } = useLocale()\n const pattern = useMemo(() => getDateFormatPattern(locale), [locale])\n const formatHint = useMemo(() => {\n const letters = {\n day: t('dayPlaceholder'),\n month: t('monthPlaceholder'),\n year: t('yearPlaceholder'),\n }\n return pattern.order.map((segment) => letters[segment]).join(pattern.separator)\n }, [pattern, t])\n const longFormatter = useMemo(() => {\n const options: Intl.DateTimeFormatOptions = { day: 'numeric', month: 'long', year: 'numeric' }\n try {\n return new Intl.DateTimeFormat(locale, options)\n } catch {\n return new Intl.DateTimeFormat('pt-BR', options)\n }\n }, [locale])\n\n const baseId = useId('or-date-range-picker')\n const hintId = `${baseId}-hint`\n const dialogId = `${baseId}-dialog`\n\n const [value, setValue] = useControllableState<DateRange>({\n value: valueProp,\n defaultValue,\n onChange,\n })\n const { isOpen, setOpen, close } = useDisclosure({ open: openProp, defaultOpen, onOpenChange })\n const [texts, setTexts] = useState<Record<Edge, string>>(() => ({\n start: value.start ? formatDateInput(value.start, pattern) : '',\n end: value.end ? formatDateInput(value.end, pattern) : '',\n }))\n // Campo deixado incompleto (erro só aparece depois de sair dele).\n const [blurred, setBlurred] = useState<Record<Edge, boolean>>({ start: false, end: false })\n const [announcement, setAnnouncement] = useState('')\n\n const buttonRef = useRef<HTMLButtonElement>(null)\n const frameRef = useRef<HTMLDivElement>(null)\n const dialogRef = useRef<HTMLDivElement>(null)\n const caretRef = useRef<{ input: HTMLInputElement; position: number } | null>(null)\n const emittedRef = useRef<string | undefined>(undefined)\n\n // Saída animada: o diálogo continua montado (data-state=\"closed\") até a animação acabar.\n const presence = usePresence<HTMLDivElement>(isOpen)\n const { refs, floatingStyles, placement } = useFloating({\n open: presence.present,\n placement: 'bottom-start',\n // top/left em vez de transform: o transform fica livre para a animação.\n transform: false,\n middleware: [offset(4), flip({ padding: 8 }), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n })\n const side = placement.split('-')[0]\n\n const constraints = { min, max, isDateDisabled, minLength, maxLength }\n const isUnavailable = (date: Date) => isDateUnavailable(date, constraints)\n const read = (text: string) => readDateInput(text, pattern, isUnavailable)\n\n /** Período válido descrito pelos textos (pontas inválidas viram `null`). */\n const rangeFromTexts = (next: Record<Edge, string>): DateRange => {\n const start = read(next.start)\n const end = read(next.end)\n const startDate = start.status === 'valid' ? start.date : null\n let endDate = end.status === 'valid' ? end.date : null\n if (startDate && endDate && getRangeError(startDate, endDate, minLength, maxLength))\n endDate = null\n return { start: startDate, end: endDate }\n }\n\n const emit = (next: DateRange) => {\n if (isSameRange(next, value)) return\n emittedRef.current = rangeKey(next)\n setValue(next)\n }\n\n // Valor alterado por fora (controlado, atalho) ou troca de idioma → reescreve os textos.\n const valueKey = rangeKey(value)\n useEffect(() => {\n if (emittedRef.current !== undefined && emittedRef.current === valueKey) {\n emittedRef.current = undefined\n return\n }\n emittedRef.current = undefined\n const [startKey, endKey] = valueKey.split('|')\n const format = (key: string) =>\n key === 'null' ? '' : formatDateInput(new Date(Number(key)), pattern)\n setTexts({ start: format(startKey), end: format(endKey) })\n setBlurred({ start: false, end: false })\n }, [valueKey, pattern])\n\n // Mantém o cursor no lugar depois de aplicar a máscara.\n useIsomorphicLayoutEffect(() => {\n const caret = caretRef.current\n if (!caret || document.activeElement !== caret.input) return\n caret.input.setSelectionRange(caret.position, caret.position)\n caretRef.current = null\n })\n\n const handleTextChange = (edge: Edge) => (event: ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value\n const masked = applyDateMask(raw, event.target.selectionStart ?? raw.length, pattern)\n caretRef.current = { input: event.target, position: masked.caret }\n const next = { ...texts, [edge]: masked.text }\n setTexts(next)\n setBlurred((prev) => (prev[edge] ? { ...prev, [edge]: false } : prev))\n emit(rangeFromTexts(next))\n }\n\n const handleBlur = (edge: Edge) => (event: FocusEvent<HTMLInputElement>) => {\n if (read(event.target.value).status === 'incomplete')\n setBlurred((prev) => ({ ...prev, [edge]: true }))\n }\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.altKey && event.key === 'ArrowDown' && !disabled && !readOnly) {\n event.preventDefault()\n setOpen(true)\n }\n }\n\n const closeAndFocusButton = () => {\n close()\n buttonRef.current?.focus({ preventScroll: true })\n }\n\n /** Período escolhido no calendário ou por um atalho. */\n const applyRange = (range: CompleteDateRange) => {\n const start = startOfDay(range.start)\n const end = startOfDay(range.end)\n setTexts({ start: formatDateInput(start, pattern), end: formatDateInput(end, pattern) })\n setBlurred({ start: false, end: false })\n emit({ start, end })\n setAnnouncement(\n t('dateRangeSelected', {\n start: longFormatter.format(start),\n end: longFormatter.format(end),\n }),\n )\n closeAndFocusButton()\n }\n\n useClickOutside([frameRef, dialogRef], () => close(), isOpen)\n\n // Fecha o calendário se o campo for desabilitado enquanto aberto.\n useEffect(() => {\n if ((disabled || readOnly) && isOpen) close()\n }, [disabled, readOnly, isOpen, close])\n\n // Listener nativo no diálogo: Escape para aqui (não fecha um Modal por trás).\n const [dialogElement, setDialogElement] = useState<HTMLDivElement | null>(null)\n const frameRefCallback = useMemo(\n () => mergeRefs(frameRef, refs.setReference, ref),\n [refs.setReference, ref],\n )\n const presenceRef = presence.nodeRef\n const dialogRefCallback = useMemo(\n () =>\n mergeRefs<HTMLDivElement>(dialogRef, presenceRef, refs.setFloating, setDialogElement),\n [refs.setFloating, presenceRef],\n )\n\n // Reaberto durante a animação de saída: o calendário não remonta, então\n // o foco volta ao dia ativo aqui.\n useEffect(() => {\n if (!isOpen) return\n const cell = dialogRef.current?.querySelector<HTMLElement>(\n '[role=\"gridcell\"][tabindex=\"0\"]',\n )\n if (cell && !dialogRef.current?.contains(document.activeElement))\n cell.focus({ preventScroll: true })\n }, [isOpen])\n useEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n closeAndFocusButton()\n return\n }\n if (event.key !== 'Tab') return\n // Prende o foco dentro do diálogo modal.\n const focusables = getFocusableElements(dialogRef.current)\n if (focusables.length === 0) return\n const first = focusables[0]\n const last = focusables[focusables.length - 1]\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n },\n dialogElement,\n )\n\n // Validação derivada dos textos ------------------------------------------------\n const startInput = read(texts.start)\n const endInput = read(texts.end)\n const edgeError = (edge: Edge, status: string) => {\n if (status === 'invalid' || (status === 'incomplete' && blurred[edge]))\n return t(edge === 'start' ? 'dateRangeInvalidStart' : 'dateRangeInvalidEnd', {\n format: formatHint,\n })\n if (status === 'unavailable')\n return t(edge === 'start' ? 'dateRangeUnavailableStart' : 'dateRangeUnavailableEnd')\n return null\n }\n const startError = edgeError('start', startInput.status)\n const endError = edgeError('end', endInput.status)\n const rangeError =\n startInput.status === 'valid' && endInput.status === 'valid'\n ? getRangeError(startInput.date as Date, endInput.date as Date, minLength, maxLength)\n : null\n const days = (count = 0) =>\n count === 1 ? t('dateRangeDayCountOne') : t('dateRangeDayCount', { count })\n const rangeMessage =\n rangeError === 'order'\n ? t('dateRangeEndBeforeStart')\n : rangeError === 'tooShort'\n ? t('dateRangeTooShort', { length: days(minLength) })\n : rangeError === 'tooLong'\n ? t('dateRangeTooLong', { length: days(maxLength) })\n : null\n const errorMessage = error ?? startError ?? endError ?? rangeMessage ?? undefined\n const hasExternalError = error !== undefined && error !== null && error !== false && error !== ''\n const invalid = {\n start: hasExternalError || !!startError,\n end: hasExternalError || !!endError || !!rangeError,\n }\n const shake = useShake(typeof errorMessage === 'string' ? errorMessage : !!errorMessage)\n\n const buttonLabel =\n value.start && value.end\n ? t('dateRangeChange', {\n start: longFormatter.format(value.start),\n end: longFormatter.format(value.end),\n })\n : t('dateRangeChoose')\n\n const resolvedPresets = (presets ?? []).map((preset) =>\n typeof preset === 'string'\n ? {\n key: preset,\n label: t(presetLabelKeys[preset]),\n range: resolvePresetRange(preset, new Date(), weekStartsOn),\n }\n : { key: preset.label, label: preset.label, range: preset.range() },\n )\n\n const renderInput = (edge: Edge, fieldProps: FieldControlProps) => (\n <input\n id={edge === 'start' ? fieldProps.id : `${fieldProps.id}-end`}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n className={cx(\n 'or-control-frame__input',\n 'or-date-range-picker__input',\n `or-date-range-picker__input--${edge}`,\n )}\n placeholder={formatHint}\n value={texts[edge]}\n maxLength={10}\n readOnly={readOnly}\n disabled={disabled}\n required={fieldProps.required}\n aria-label={t(edge === 'start' ? 'dateRangeStart' : 'dateRangeEnd')}\n aria-describedby={[fieldProps['aria-describedby'], hintId].filter(Boolean).join(' ')}\n aria-invalid={invalid[edge] || undefined}\n onChange={handleTextChange(edge)}\n onBlur={handleBlur(edge)}\n onKeyDown={handleInputKeyDown}\n />\n )\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={errorMessage}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n className={cx('or-date-range-picker', className)}\n style={style}\n >\n <FieldControl id={id}>\n {(fieldProps, labelId) => (\n <div\n ref={frameRefCallback}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n className={cx(\n 'or-control-frame',\n `or-control-frame--${size}`,\n 'or-date-range-picker__frame',\n )}\n data-invalid={!!errorMessage || undefined}\n aria-disabled={disabled || undefined}\n data-disabled={disabled || undefined}\n {...shake}\n {...rest}\n >\n {renderInput('start', fieldProps)}\n <span className=\"or-date-range-picker__separator\" aria-hidden=\"true\">\n –\n </span>\n {renderInput('end', fieldProps)}\n <span id={hintId} className=\"or-visually-hidden\">\n {t('dateFormatHint', { format: formatHint })}\n </span>\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"or-control-frame__button or-date-range-picker__button\"\n aria-label={buttonLabel}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? dialogId : undefined}\n disabled={disabled || readOnly}\n onClick={() => setOpen(!isOpen)}\n >\n <Icon name=\"calendar\" size=\"sm\" />\n </button>\n </div>\n )}\n </FieldControl>\n {name && (\n <>\n <input\n type=\"hidden\"\n name={`${name}[start]`}\n value={value.start ? toISODate(value.start) : ''}\n disabled={disabled}\n />\n <input\n type=\"hidden\"\n name={`${name}[end]`}\n value={value.end ? toISODate(value.end) : ''}\n disabled={disabled}\n />\n </>\n )}\n <div role=\"status\" className=\"or-visually-hidden\">\n {announcement}\n </div>\n {presence.present && (\n <Portal>\n <div\n ref={dialogRefCallback}\n id={dialogId}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('dateRangeChoose')}\n className=\"or-date-range-picker__dialog\"\n data-state={presence.state}\n data-side={side}\n inert={presence.state === 'closed' || undefined}\n style={floatingStyles}\n >\n <div className=\"or-date-range-picker__panel\">\n {resolvedPresets.length > 0 && (\n <ul\n role=\"list\"\n className=\"or-date-range-picker__presets\"\n aria-label={t('dateRangePresets')}\n >\n {resolvedPresets.map((preset) => {\n const allowed = isRangeAllowed(preset.range, constraints)\n const current = isSameRange(preset.range, value)\n return (\n <li key={preset.key}>\n <button\n type=\"button\"\n className=\"or-date-range-picker__preset\"\n aria-disabled={!allowed || undefined}\n aria-current={current || undefined}\n onClick={() => {\n if (allowed) applyRange(preset.range)\n }}\n >\n {preset.label}\n </button>\n </li>\n )\n })}\n </ul>\n )}\n <RangeCalendar\n value={value}\n onChange={applyRange}\n min={min}\n max={max}\n isDateDisabled={isDateDisabled}\n minLength={minLength}\n maxLength={maxLength}\n weekStartsOn={weekStartsOn}\n visibleMonths={visibleMonths}\n autoFocus\n />\n </div>\n </div>\n </Portal>\n )}\n </Field>\n )\n },\n)\n","import {\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type Key,\n type ReactNode,\n} from 'react'\nimport { cx } from '../../utils'\nimport './DescriptionList.css'\n\nexport type DescriptionListLayout = 'horizontal' | 'vertical' | 'grid'\nexport type DescriptionTermVariant = 'eyebrow' | 'strong'\n\nexport interface DescriptionListItem {\n /** Termo (rótulo) — vira um `<dt>`. */\n term: ReactNode\n /** Descrição (valor) — vira um `<dd>`. Use um array para vários valores do mesmo termo. */\n description: ReactNode | ReactNode[]\n /** Chave estável (padrão: índice). */\n key?: Key\n}\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n /** Pares termo/descrição. Alternativa a compor com `DescriptionGroup`/`DescriptionTerm`/`DescriptionDetails`. */\n items?: DescriptionListItem[]\n /**\n * `horizontal` (termo à esquerda, padrão), `vertical` (termo acima) ou\n * `grid` (células com bordas de 1px — exige `items` ou `DescriptionGroup`).\n */\n layout?: DescriptionListLayout\n /** Estilo dos termos: `eyebrow` (caixa alta, padrão) ou `strong` (negrito). */\n termVariant?: DescriptionTermVariant\n /** Colunas do layout `grid` em telas largas. Padrão: `3`. */\n columns?: 1 | 2 | 3 | 4 | 5 | 6\n /** Largura da coluna de termos no layout `horizontal` (valor CSS). Padrão: `12rem`. */\n termWidth?: string\n /** Linhas de 1px entre os pares (layouts `horizontal` e `vertical`). Padrão: `true`. */\n divided?: boolean\n /** Tamanho do texto. Padrão: `md`. */\n size?: 'sm' | 'md'\n}\n\n/**\n * Lista de pares termo/descrição (`<dl>`) para metadados, especificações e\n * resumos — \"Plano: Pro\", \"Vencimento: 12/03\".\n */\nexport const DescriptionList = forwardRef<HTMLDListElement, DescriptionListProps>(function DescriptionList(\n {\n items,\n layout = 'horizontal',\n termVariant = 'eyebrow',\n columns = 3,\n termWidth,\n divided = true,\n size = 'md',\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const vars = {\n ...(layout === 'grid' ? { '--_cols': columns } : null),\n ...(termWidth ? { '--_term-width': termWidth } : null),\n ...style,\n } as CSSProperties\n\n return (\n <dl\n ref={ref}\n className={cx(\n 'or-dl',\n `or-dl--${layout}`,\n `or-dl--term-${termVariant}`,\n `or-dl--${size}`,\n divided && layout !== 'grid' && 'or-dl--divided',\n className,\n )}\n style={vars}\n {...rest}\n >\n {items\n ? items.map((item, index) => (\n <DescriptionGroup key={item.key ?? index}>\n <DescriptionTerm>{item.term}</DescriptionTerm>\n {Array.isArray(item.description) ? (\n item.description.map((d, i) => <DescriptionDetails key={i}>{d}</DescriptionDetails>)\n ) : (\n <DescriptionDetails>{item.description}</DescriptionDetails>\n )}\n </DescriptionGroup>\n ))\n : children}\n </dl>\n )\n})\n\nexport type DescriptionGroupProps = HTMLAttributes<HTMLDivElement>\n\n/** Agrupa um termo e suas descrições (`<div>` dentro do `<dl>`). Necessário no layout `grid`. */\nexport const DescriptionGroup = forwardRef<HTMLDivElement, DescriptionGroupProps>(function DescriptionGroup(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('or-dl__group', className)} {...rest} />\n})\n\nexport type DescriptionTermProps = HTMLAttributes<HTMLElement>\n\n/** Termo de uma `DescriptionList` (`<dt>`). */\nexport const DescriptionTerm = forwardRef<HTMLElement, DescriptionTermProps>(function DescriptionTerm(\n { className, ...rest },\n ref,\n) {\n return <dt ref={ref} className={cx('or-dl__term', className)} {...rest} />\n})\n\nexport type DescriptionDetailsProps = HTMLAttributes<HTMLElement>\n\n/** Descrição de um termo (`<dd>`). */\nexport const DescriptionDetails = forwardRef<HTMLElement, DescriptionDetailsProps>(function DescriptionDetails(\n { className, ...rest },\n ref,\n) {\n return <dd ref={ref} className={cx('or-dl__details', className)} {...rest} />\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode, type Ref } from 'react'\nimport { useId } from '../../hooks'\nimport { cx } from '../../utils'\nimport './Divider.css'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\nexport type DividerTone = 'subtle' | 'default' | 'strong' | 'accent'\nexport type DividerSpacing = 0 | 1 | 2 | 3 | 4 | 6 | 8\n\nexport interface DividerProps extends HTMLAttributes<HTMLElement> {\n /** Direção da linha. Na vertical, o divisor ocupa a altura do contêiner flex. */\n orientation?: DividerOrientation\n /** Intensidade da linha: `subtle`, `default`, `strong` ou `accent` (laranja). */\n tone?: DividerTone\n /** Espessura: `thin` (1px, padrão) ou `thick` (2px). */\n thickness?: 'thin' | 'thick'\n /** Margem ao redor da linha, na escala de espaço (`4` = 1rem). Padrão: `4`. */\n spacing?: DividerSpacing\n /**\n * Rótulo curto exibido sobre a linha em caixa alta (ex.: \"ou\", \"Hoje\").\n * Só para divisores horizontais.\n */\n label?: ReactNode\n /** Posição do rótulo. Padrão: `center`. */\n labelPosition?: 'start' | 'center' | 'end'\n /**\n * Divisor puramente visual: fica oculto para leitores de tela. Use quando a\n * separação já é clara pela estrutura (títulos, listas, landmarks).\n */\n decorative?: boolean\n}\n\n/**\n * Separa visualmente grupos de conteúdo. Usa `<hr>` (ou `role=\"separator\"`)\n * para que a separação também seja percebida por leitores de tela, a menos que\n * seja marcado como `decorative`.\n */\nexport const Divider = forwardRef<HTMLElement, DividerProps>(function Divider(\n {\n orientation = 'horizontal',\n tone = 'default',\n thickness = 'thin',\n spacing = 4,\n label,\n labelPosition = 'center',\n decorative = false,\n className,\n ...rest\n },\n ref,\n) {\n const labelId = useId('or-divider-label')\n const hasLabel = label !== undefined && label !== null && label !== false && orientation === 'horizontal'\n const classes = cx(\n 'or-divider',\n `or-divider--${orientation}`,\n `or-divider--${tone}`,\n `or-divider--${thickness}`,\n `or-divider--spacing-${spacing}`,\n hasLabel && 'or-divider--labelled',\n hasLabel && `or-divider--label-${labelPosition}`,\n className,\n )\n\n if (hasLabel) {\n // Linhas desenhadas por pseudo-elementos; o rótulo é o conteúdo lido.\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={classes}\n {...(decorative\n ? {}\n : { role: 'separator', 'aria-orientation': 'horizontal' as const, 'aria-labelledby': labelId })}\n {...rest}\n >\n <span id={labelId} className=\"or-divider__label\">\n {label}\n </span>\n </div>\n )\n }\n\n if (orientation === 'vertical') {\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={classes}\n {...(decorative ? { 'aria-hidden': true } : { role: 'separator', 'aria-orientation': 'vertical' as const })}\n {...rest}\n />\n )\n }\n\n return (\n <hr\n ref={ref as Ref<HTMLHRElement>}\n className={classes}\n {...(decorative ? { 'aria-hidden': true } : {})}\n {...rest}\n />\n )\n})\n","import {\n cloneElement,\n forwardRef,\n useRef,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useDisclosure, useId, useMounted } from '../../hooks'\nimport { composeEventHandlers } from '../../utils'\nimport { focusElement } from '../Modal/overlay'\nimport { returnFocusIfLost, useTriggerElement, type FloatingPlacement } from '../Popover/floating'\nimport { MenuPanel, type MenuCloseReason, type MenuFocusTarget } from './Menu'\n\nexport type DropdownPlacement = FloatingPlacement\n\nexport interface DropdownProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * Botão que abre o menu. Recebe `aria-haspopup=\"menu\"`, `aria-expanded`,\n * `aria-controls` e a navegação por teclado.\n */\n trigger: ReactElement\n /** Itens: `DropdownItem`, `DropdownCheckboxItem`, `DropdownRadioGroup`, `DropdownSeparator`, `DropdownLabel`. */\n children: ReactNode\n /** Aberto (controlado). Use com `onOpenChange`. */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o menu pede para abrir ou fechar. */\n onOpenChange?: (open: boolean) => void\n /** Posição preferida; inverte sozinha se faltar espaço. */\n placement?: DropdownPlacement\n /** Distância do gatilho, em px. */\n offset?: number\n}\n\n/**\n * Menu de ações aberto por um botão (padrão \"menu button\" do WAI-ARIA):\n * setas navegam, letras buscam, Enter/Espaço ativam, Escape fecha.\n */\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(function Dropdown(\n {\n trigger,\n children,\n open,\n defaultOpen,\n onOpenChange,\n placement = 'bottom-start',\n offset = 4,\n ...rest\n },\n ref,\n) {\n const disclosure = useDisclosure({ open, defaultOpen, onOpenChange })\n const mounted = useMounted()\n const active = disclosure.isOpen && mounted\n const [triggerEl, triggerRef] = useTriggerElement(trigger)\n const triggerProps = trigger.props as HTMLAttributes<HTMLElement>\n const triggerId = useId('or-dropdown-trigger', triggerProps.id)\n const menuId = useId('or-dropdown-menu')\n const focusOnOpen = useRef<MenuFocusTarget>('first')\n const keyboardClick = useRef(false)\n\n const openMenu = (target: MenuFocusTarget) => {\n focusOnOpen.current = target\n disclosure.open()\n }\n\n const handleClose = (reason: MenuCloseReason) => {\n disclosure.close()\n if (reason === 'select' || reason === 'escape' || reason === 'tab') focusElement(triggerEl)\n else if (reason === 'outside') returnFocusIfLost(triggerEl)\n }\n\n const handleClick = (event: ReactMouseEvent<HTMLElement>) => {\n const viaKeyboard = keyboardClick.current || event.detail === 0\n keyboardClick.current = false\n if (active) disclosure.close()\n else openMenu(viaKeyboard ? 'first' : 'menu')\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n openMenu(event.key === 'ArrowDown' ? 'first' : 'last')\n } else if (event.key === 'Enter' || event.key === ' ') {\n keyboardClick.current = true\n }\n }\n\n const triggerElement = cloneElement(\n trigger as ReactElement<HTMLAttributes<HTMLElement> & { ref?: unknown }>,\n {\n ref: triggerRef,\n id: triggerId,\n 'aria-haspopup': 'menu',\n 'aria-expanded': active,\n 'aria-controls': active ? menuId : undefined,\n onClick: composeEventHandlers(triggerProps.onClick, handleClick),\n onKeyDown: composeEventHandlers(triggerProps.onKeyDown, handleKeyDown),\n },\n )\n\n return (\n <>\n {triggerElement}\n <MenuPanel\n ref={ref}\n id={menuId}\n aria-labelledby={rest['aria-label'] ? undefined : triggerId}\n open={active}\n reference={triggerEl}\n themeOrigin={triggerEl}\n placement={placement}\n offset={offset}\n focusOnOpen={focusOnOpen}\n onClose={handleClose}\n insideElements={() => [triggerEl]}\n {...rest}\n >\n {children}\n </MenuPanel>\n </>\n )\n})\n","import { forwardRef, type ElementType, type HTMLAttributes, type ReactNode } from 'react'\nimport { Icon, iconPaths, type IconName } from '../../icons'\nimport { cx } from '../../utils'\nimport './EmptyState.css'\n\nexport type EmptyStateVariant = 'default' | 'compact'\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Título curto que explica o que está vazio. */\n title: ReactNode\n /** Nível semântico do título (`h2`–`h6`). Escolha pela hierarquia da página. */\n headingLevel?: 2 | 3 | 4 | 5 | 6\n /** Texto de apoio: por que está vazio e o que fazer. */\n description?: ReactNode\n /** Nome de um ícone do Orange ou um elemento. Fica dentro da ilustração geométrica. */\n icon?: IconName | ReactNode\n /** Substitui toda a ilustração. `false` remove a ilustração. */\n illustration?: ReactNode | false\n /** Ação principal (ex.: `<Button>Criar projeto</Button>`). */\n action?: ReactNode\n /** Ação secundária (ex.: um link para a documentação). */\n secondaryAction?: ReactNode\n /** `compact`: horizontal e menor, para painéis, listas e células. */\n variant?: EmptyStateVariant\n /**\n * Entrada ao montar: os quadrados da ilustração \"caem\" no lugar, um depois\n * do outro, e o texto sobe 8px. Desligado automaticamente com movimento\n * reduzido.\n */\n animated?: boolean\n}\n\n/**\n * Estado vazio: explica por que não há conteúdo (primeiro uso, busca sem\n * resultados, filtro restritivo) e oferece o próximo passo.\n */\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n {\n title,\n headingLevel = 3,\n description,\n icon = 'inbox',\n illustration,\n action,\n secondaryAction,\n variant = 'default',\n animated = true,\n className,\n ...rest\n },\n ref,\n) {\n const Heading: ElementType = `h${headingLevel}`\n const iconNode =\n typeof icon === 'string' && icon in iconPaths ? (\n <Icon name={icon as IconName} size={variant === 'compact' ? 'md' : 28} />\n ) : (\n icon\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'or-empty-state',\n `or-empty-state--${variant}`,\n animated && 'or-empty-state--animated',\n className,\n )}\n {...rest}\n >\n {illustration !== false &&\n (illustration ?? (\n <div className=\"or-empty-state__art\" aria-hidden=\"true\">\n <span className=\"or-empty-state__shape or-empty-state__shape--back\" />\n <span className=\"or-empty-state__shape or-empty-state__shape--front\">{iconNode}</span>\n <span className=\"or-empty-state__shape or-empty-state__shape--dot\" />\n </div>\n ))}\n <div className=\"or-empty-state__body\">\n <Heading className=\"or-empty-state__title\">{title}</Heading>\n {description && <div className=\"or-empty-state__description\">{description}</div>}\n {(action || secondaryAction) && (\n <div className=\"or-empty-state__actions\">\n {action}\n {secondaryAction}\n </div>\n )}\n </div>\n </div>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n type CSSProperties,\n type ElementType,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { useId, usePresence } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, getFocusableElements, mergeRefs } from '../../utils'\nimport './ErrorSummary.css'\n\nexport interface ErrorSummaryItem {\n /** Id do campo com erro. O link aponta para `#id` e foca esse campo. */\n id: string\n /** Mensagem de erro — de preferência a mesma exibida junto ao campo. */\n message: ReactNode\n}\n\nexport interface ErrorSummaryProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Lista de erros. Com a lista vazia, nada é renderizado. */\n errors: ErrorSummaryItem[]\n /** Título do painel. Padrão: \"Corrija os seguintes erros\". */\n title?: ReactNode\n /** Texto opcional entre o título e a lista. */\n description?: ReactNode\n /**\n * Move o foco para o painel quando ele aparece, para que leitores de tela o\n * anunciem. Sem foco automático, o painel usa `role=\"alert\"`. Padrão: `true`.\n */\n autoFocus?: boolean\n /** Nível do título (h2–h6). Padrão: 2. */\n headingLevel?: 2 | 3 | 4 | 5 | 6\n /** Chamado ao clicar em um erro (antes de focar o campo). */\n onItemClick?: (item: ErrorSummaryItem, event: MouseEvent<HTMLAnchorElement>) => void\n}\n\nconst NATIVE_FOCUSABLE = 'input:not([type=\"hidden\"]), select, textarea, button, a[href], [tabindex]'\n\n/** Encontra o elemento a focar: o próprio alvo ou, num grupo, a opção marcada/primeira. */\nfunction resolveFocusTarget(target: HTMLElement): HTMLElement | null {\n if (target.matches(NATIVE_FOCUSABLE) && !(target as HTMLInputElement).disabled) return target\n const checked = target.querySelector<HTMLElement>('input:checked:not(:disabled)')\n if (checked) return checked\n return getFocusableElements(target)[0] ?? null\n}\n\n/**\n * Resumo de erros de um formulário: título, lista de links para os campos\n * inválidos e foco automático ao aparecer. Coloque-o no topo do formulário e\n * mostre-o após uma tentativa de envio.\n */\nexport const ErrorSummary = forwardRef<HTMLElement, ErrorSummaryProps>(function ErrorSummary(\n {\n errors,\n title,\n description,\n autoFocus = true,\n headingLevel = 2,\n onItemClick,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const titleId = useId('or-error-summary')\n const innerRef = useRef<HTMLElement>(null)\n const hasErrors = errors.length > 0\n // Saída animada (mais curta que a entrada): mantém a última lista enquanto some.\n const { present, state, nodeRef } = usePresence<HTMLElement>(hasErrors)\n const mergedRef = useMemo(() => mergeRefs(ref, innerRef, nodeRef), [ref, nodeRef])\n const lastErrors = useRef(errors)\n if (hasErrors) lastErrors.current = errors\n const shownErrors = hasErrors ? errors : lastErrors.current\n const Heading = `h${headingLevel}` as ElementType\n\n // Foca o painel quando ele aparece (montagem com erros ou lista que deixa de ser vazia).\n useEffect(() => {\n if (autoFocus && hasErrors) innerRef.current?.focus()\n }, [autoFocus, hasErrors])\n\n const handleClick = (item: ErrorSummaryItem) => (event: MouseEvent<HTMLAnchorElement>) => {\n onItemClick?.(item, event)\n if (event.defaultPrevented) return\n const target = document.getElementById(item.id)\n if (!target) return\n const focusTarget = resolveFocusTarget(target)\n if (!focusTarget) return\n event.preventDefault()\n // Mostra a pergunta junto com o campo: legenda do grupo ou rótulo do campo.\n const legend = target.tagName === 'FIELDSET' ? target.querySelector('legend') : null\n const label = (focusTarget as HTMLInputElement).labels?.[0] ?? null\n const anchor = legend ?? label ?? focusTarget\n anchor.scrollIntoView?.({ block: 'center' })\n focusTarget.focus({ preventScroll: true })\n }\n\n if (!present) return null\n\n return (\n <section\n ref={mergedRef}\n tabIndex={-1}\n role={autoFocus ? undefined : 'alert'}\n aria-labelledby={titleId}\n className={cx('or-error-summary', className)}\n data-state={state}\n inert={state === 'closed' || undefined}\n {...rest}\n >\n <Heading id={titleId} className=\"or-error-summary__title\">\n <Icon name=\"alert-circle\" size=\"md\" className=\"or-error-summary__icon\" />\n <span>{title ?? t('errorSummaryTitle')}</span>\n </Heading>\n {description && <div className=\"or-error-summary__description\">{description}</div>}\n <ul className=\"or-error-summary__list\">\n {shownErrors.map((item, index) => (\n <li key={item.id} style={{ '--_i': index } as CSSProperties}>\n <a href={`#${item.id}`} className=\"or-error-summary__link\" onClick={handleClick(item)}>\n {item.message}\n </a>\n </li>\n ))}\n </ul>\n </section>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ElementType,\n type HTMLAttributes,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect, usePresence } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport './ExpandableText.css'\n\nexport interface ExpandableTextProps extends HTMLAttributes<HTMLDivElement> {\n /** Linhas visíveis quando recolhido. Padrão: `3`. */\n lines?: number\n /** Estado expandido (controlado). */\n expanded?: boolean\n /** Estado inicial (não controlado). Padrão: `false`. */\n defaultExpanded?: boolean\n /** Chamado ao expandir/recolher. */\n onExpandedChange?: (expanded: boolean) => void\n /** Elemento que envolve o texto. Padrão: `div` (aceita vários parágrafos). */\n as?: ElementType\n /** Rótulo do botão quando recolhido. Padrão: `t('showMore')`. */\n showMoreLabel?: string\n /** Rótulo do botão quando expandido. Padrão: `t('showLess')`. */\n showLessLabel?: string\n}\n\nfunction lineHeightOf(el: HTMLElement): number {\n const style = getComputedStyle(el)\n const lineHeight = parseFloat(style.lineHeight)\n if (!Number.isNaN(lineHeight)) return lineHeight\n return parseFloat(style.fontSize) * 1.2\n}\n\n/**\n * Texto longo recolhido em algumas linhas, com botão \"Mostrar mais\". O botão\n * só aparece quando o conteúdo realmente não cabe.\n */\nexport const ExpandableText = forwardRef<HTMLDivElement, ExpandableTextProps>(function ExpandableText(\n {\n lines = 3,\n expanded: expandedProp,\n defaultExpanded = false,\n onExpandedChange,\n as: Content = 'div',\n showMoreLabel,\n showLessLabel,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const contentId = useId('or-expandable-text')\n const contentRef = useRef<HTMLElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const [overflowing, setOverflowing] = useState(false)\n const [expanded, setExpanded] = useControllableState({\n value: expandedProp,\n defaultValue: defaultExpanded,\n onChange: onExpandedChange,\n })\n const clamp = Math.max(1, Math.floor(lines))\n // `unclamped` continua verdadeiro durante a transição de recolher: o texto só\n // volta ao line-clamp (com reticências) quando a altura chega a `lines` linhas.\n const { present: unclamped, state, nodeRef } = usePresence<HTMLDivElement>(expanded)\n\n useIsomorphicLayoutEffect(() => {\n const el = contentRef.current\n if (!el) return\n const measure = () => {\n // Compara a altura total do texto (scrollHeight inclui as linhas cortadas)\n // com `lines` linhas — vale em qualquer estado, inclusive no meio da\n // transição de altura.\n const lineHeight = lineHeightOf(el)\n if (Number.isFinite(lineHeight) && lineHeight > 0) {\n setOverflowing(el.scrollHeight > lineHeight * clamp + 1)\n } else if (!unclamped) {\n setOverflowing(el.scrollHeight > el.clientHeight + 1)\n }\n }\n measure()\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n return () => observer.disconnect()\n }, [unclamped, clamp, children])\n\n // Ao terminar de recolher um texto longo, mantém o botão (com foco) na tela.\n const wasUnclamped = useRef(unclamped)\n useEffect(() => {\n if (wasUnclamped.current && !unclamped && document.activeElement === buttonRef.current) {\n buttonRef.current?.scrollIntoView({ block: 'nearest' })\n }\n wasUnclamped.current = unclamped\n }, [unclamped])\n\n const showButton = overflowing\n\n return (\n <div ref={ref} className={cx('or-expandable-text', className)} {...rest}>\n <div\n ref={nodeRef}\n className=\"or-expandable-text__viewport\"\n // Só anima a altura quando há o que expandir (sem botão, nada muda).\n data-state={overflowing ? state : undefined}\n style={{ '--_lines': clamp } as CSSProperties}\n >\n <Content\n ref={contentRef}\n id={contentId}\n className=\"or-expandable-text__content\"\n data-expanded={expanded || undefined}\n data-clamped={unclamped ? undefined : true}\n >\n {children}\n </Content>\n </div>\n {showButton && (\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"or-expandable-text__toggle\"\n aria-expanded={expanded}\n aria-controls={contentId}\n onClick={() => setExpanded(!expanded)}\n >\n {expanded ? (showLessLabel ?? t('showLess')) : (showMoreLabel ?? t('showMore'))}\n <Icon name=\"chevron-down\" size=\"sm\" />\n </button>\n )}\n </div>\n )\n})\n","import { forwardRef, type FieldsetHTMLAttributes, type ReactNode } from 'react'\nimport { cx } from '../../utils'\nimport { FieldsetBase } from './FieldsetBase'\n\nexport type FieldsetGap = 'sm' | 'md' | 'lg'\n\nexport interface FieldsetProps extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'title'> {\n /** Título do grupo, renderizado como `<legend>`. Leitores de tela o anunciam ao entrar no grupo. */\n legend: ReactNode\n /** Oculta a legenda visualmente (continua acessível). */\n hideLegend?: boolean\n /** Texto de ajuda do grupo, ligado por `aria-describedby`. */\n description?: ReactNode\n /** Erro que vale para o grupo inteiro (ex.: \"Informe ao menos um telefone\"). */\n error?: ReactNode\n /** Desabilita nativamente todos os controles internos. */\n disabled?: boolean\n /** Espaçamento entre os campos: `sm` 12px, `md` 20px, `lg` 32px. Padrão: `md`. */\n gap?: FieldsetGap\n children?: ReactNode\n}\n\n/**\n * Agrupa campos relacionados com `<fieldset>` e `<legend>` nativos — por\n * exemplo, \"Endereço de entrega\". `disabled` desabilita todos os controles\n * internos de uma vez.\n */\nexport const Fieldset = forwardRef<HTMLFieldSetElement, FieldsetProps>(function Fieldset(\n { legend, gap = 'md', className, children, ...rest },\n ref,\n) {\n return (\n <FieldsetBase\n ref={ref}\n appearance=\"section\"\n legend={legend}\n className={cx(`or-fieldset--gap-${gap}`, className)}\n {...rest}\n >\n {children}\n </FieldsetBase>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type DragEvent,\n type HTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { Button } from '../Button'\nimport { Field, useField, type FieldContextValue } from '../Field'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './FileUploader.css'\n\nexport type FileUploaderStatus = 'idle' | 'uploading' | 'success' | 'error'\n\n/** Um arquivo da lista. Atualize `status`/`progress` (modo controlado) durante o envio. */\nexport interface FileUploaderItem {\n /** Identificador estável do item. */\n id: string\n file: File\n /** Estado do envio. Padrão: `idle`. Arquivos recusados chegam como `error`. */\n status?: FileUploaderStatus\n /** Progresso de 0 a 100, exibido quando `status` é `uploading`. */\n progress?: number\n /** Mensagem exibida quando `status` é `error`. */\n error?: string\n}\n\nexport interface FileUploaderProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue' | 'children'\n> {\n /** Rótulo visível do campo. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda — informe aqui os tipos e o tamanho aceitos. */\n description?: ReactNode\n /** Mensagem de erro do campo. */\n error?: ReactNode\n required?: boolean\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n disabled?: boolean\n /** Tipos aceitos, como no atributo nativo: `.pdf,image/*`. */\n accept?: string\n /** Permite vários arquivos. Sem `multiple`, um novo arquivo substitui o anterior. */\n multiple?: boolean\n /** Tamanho máximo por arquivo, em bytes. Arquivos maiores entram na lista com erro. */\n maxSize?: number\n /** Quantidade máxima de arquivos válidos (com `multiple`). */\n maxFiles?: number\n /** Lista de arquivos (controlado). */\n value?: FileUploaderItem[]\n /** Lista inicial (não controlado). */\n defaultValue?: FileUploaderItem[]\n /** Chamado com a lista completa sempre que arquivos entram ou saem. */\n onFilesChange?: (items: FileUploaderItem[]) => void\n /** Chamado só com os arquivos aceitos de cada seleção — útil para iniciar o envio. */\n onFilesAdded?: (items: FileUploaderItem[]) => void\n /** Chamado quando o usuário remove um arquivo. */\n onFileRemove?: (item: FileUploaderItem) => void\n /** Nome do campo para envio em formulários nativos. */\n name?: string\n /** Id do `<input type=\"file\">`. */\n id?: string\n}\n\nlet itemCounter = 0\nconst createId = () => `or-file-${Date.now().toString(36)}-${(itemCounter++).toString(36)}`\n\n/** Verifica um arquivo contra o atributo `accept` (extensões e tipos MIME, com curinga). */\nfunction matchesAccept(file: File, accept?: string): boolean {\n if (!accept) return true\n const tokens = accept\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean)\n if (tokens.length === 0) return true\n const name = file.name.toLowerCase()\n const type = (file.type || '').toLowerCase()\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token)\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, -1))\n return type === token\n })\n}\n\n/** \"512 bytes\", \"48 kB\", \"2,4 MB\" — formatado conforme o locale. */\nfunction formatFileSize(bytes: number, locale: string): string {\n const units = ['byte', 'kilobyte', 'megabyte', 'gigabyte'] as const\n let value = bytes\n let index = 0\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024\n index++\n }\n const options: Intl.NumberFormatOptions = {\n style: 'unit',\n unit: units[index],\n unitDisplay: index === 0 ? 'long' : 'short',\n maximumFractionDigits: index < 2 ? 0 : 1,\n }\n try {\n return new Intl.NumberFormat(locale, options).format(value)\n } catch {\n return new Intl.NumberFormat('pt-BR', options).format(value)\n }\n}\n\ninterface DropzoneProps {\n field: FieldContextValue | null\n inputId?: string\n disabled: boolean\n multiple: boolean\n accept?: string\n name?: string\n items: FileUploaderItem[]\n onFiles: (files: File[]) => void\n buttonRef: Ref<HTMLButtonElement>\n}\n\n/** Área de soltar + botão + input nativo (lê os ids do Field para os vínculos ARIA). */\nfunction Dropzone({\n field,\n inputId,\n disabled,\n multiple,\n accept,\n name,\n items,\n onFiles,\n buttonRef,\n}: DropzoneProps) {\n const { t } = useLocale()\n const inputRef = useRef<HTMLInputElement>(null)\n const dragDepth = useRef(0)\n const [dragging, setDragging] = useState(false)\n const buttonTextId = useId('or-file-uploader-button')\n const describedBy = [field?.descriptionId, field?.errorId].filter(Boolean).join(' ') || undefined\n\n // Mantém o FileList do input nativo em sincronia para envio em <form>.\n useEffect(() => {\n const input = inputRef.current\n if (!input || !name || typeof DataTransfer === 'undefined') return\n try {\n const transfer = new DataTransfer()\n items\n .filter((item) => item.status !== 'error')\n .forEach((item) => transfer.items.add(item.file))\n input.files = transfer.files\n } catch {\n // navegadores sem DataTransfer construível: o envio fica a cargo da aplicação.\n }\n }, [items, name])\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? [])\n if (!name) event.target.value = '' // permite escolher o mesmo arquivo de novo\n if (files.length > 0) onFiles(files)\n }\n\n const hasFiles = (event: DragEvent) =>\n Array.from(event.dataTransfer?.types ?? []).includes('Files')\n\n return (\n <div\n className=\"or-file-uploader__dropzone\"\n data-dragging={dragging || undefined}\n data-disabled={disabled || undefined}\n data-invalid={field?.invalid || undefined}\n onDragEnter={(event) => {\n if (disabled || !hasFiles(event)) return\n event.preventDefault()\n dragDepth.current += 1\n setDragging(true)\n }}\n onDragOver={(event) => {\n if (disabled || !hasFiles(event)) return\n event.preventDefault()\n event.dataTransfer.dropEffect = 'copy'\n }}\n onDragLeave={() => {\n if (disabled) return\n dragDepth.current = Math.max(0, dragDepth.current - 1)\n if (dragDepth.current === 0) setDragging(false)\n }}\n onDrop={(event) => {\n if (disabled) return\n event.preventDefault()\n dragDepth.current = 0\n setDragging(false)\n const files = Array.from(event.dataTransfer?.files ?? [])\n if (files.length > 0) onFiles(files)\n }}\n >\n <span className=\"or-file-uploader__glyph\" aria-hidden=\"true\">\n <Icon name=\"upload\" size=\"lg\" />\n </span>\n <p className=\"or-file-uploader__prompt\">\n <span>{t('dropFiles')}</span>{' '}\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"or-file-uploader__button\"\n disabled={disabled}\n aria-labelledby={[field?.labelId, buttonTextId].filter(Boolean).join(' ')}\n aria-describedby={describedBy}\n onClick={() => inputRef.current?.click()}\n >\n <span id={buttonTextId}>{t(multiple ? 'chooseFiles' : 'chooseFile')}</span>\n </button>\n </p>\n <input\n ref={inputRef}\n id={inputId ?? field?.controlId}\n type=\"file\"\n className=\"or-visually-hidden\"\n tabIndex={-1}\n accept={accept}\n multiple={multiple}\n name={name}\n disabled={disabled}\n aria-describedby={describedBy}\n onChange={handleChange}\n />\n </div>\n )\n}\n\ninterface FileStatusProps {\n status: FileUploaderStatus\n progress: number\n error?: string\n /** Anima ao montar (status que mudou depois da primeira renderização). */\n animate: boolean\n}\n\n/** Texto de status. Montado de novo a cada troca de status (key), anima uma vez. */\nfunction FileStatus({ status, progress, error, animate }: FileStatusProps) {\n const { t } = useLocale()\n // Decide na montagem: re-renderizações não reiniciam a animação.\n const [play] = useState(animate)\n if (status === 'uploading') return <span>{progress}%</span>\n if (status === 'success')\n return (\n <span\n className={cx(\n 'or-file-uploader__status',\n 'or-file-uploader__status--success',\n play && 'or-file-uploader__status--animate',\n )}\n >\n <Icon name=\"check\" size=\"xs\" />\n {t('uploadComplete')}\n </span>\n )\n if (status === 'error')\n return (\n <span\n className={cx(\n 'or-file-uploader__status',\n 'or-file-uploader__status--error',\n play && 'or-file-uploader__status--animate',\n )}\n >\n {error ?? t('uploadFailed')}\n </span>\n )\n return null\n}\n\ninterface FileRowProps {\n item: FileUploaderItem\n disabled: boolean\n /** Entra com slide/fade (arquivo adicionado depois da montagem). */\n animate: boolean\n /** Posição no lote adicionado — atraso escalonado da entrada. */\n order: number\n /** Item removido: anima a saída e some ao terminar. */\n leaving: boolean\n onRemove: (item: FileUploaderItem) => void\n onExited: (id: string) => void\n}\n\nfunction FileRow({ item, disabled, animate, order, leaving, onRemove, onExited }: FileRowProps) {\n const { t, locale } = useLocale()\n const [enter] = useState(animate)\n const status = item.status ?? 'idle'\n const progress = Math.round(Math.min(100, Math.max(0, item.progress ?? 0)))\n return (\n <li\n className={cx('or-file-uploader__item', enter && 'or-file-uploader__item--enter')}\n data-status={status}\n data-state={leaving ? 'closed' : undefined}\n style={enter ? ({ '--_i': order } as CSSProperties) : undefined}\n aria-hidden={leaving || undefined}\n inert={leaving || undefined}\n onAnimationEnd={(event) => {\n if (leaving && event.target === event.currentTarget) onExited(item.id)\n }}\n >\n <div className=\"or-file-uploader__row\">\n <Icon\n name={status === 'error' ? 'alert-circle' : 'file'}\n className=\"or-file-uploader__file-icon\"\n />\n <div className=\"or-file-uploader__meta\">\n <span className=\"or-file-uploader__name\" title={item.file.name}>\n {item.file.name}\n </span>\n <span className=\"or-file-uploader__details\">\n <span>{formatFileSize(item.file.size, locale)}</span>\n <FileStatus\n key={status}\n status={status}\n progress={progress}\n error={item.error}\n animate={animate && !leaving}\n />\n </span>\n {status === 'uploading' && (\n <div\n className=\"or-file-uploader__progress\"\n role=\"progressbar\"\n aria-label={t('uploadingFile', { name: item.file.name })}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n >\n {/* scaleX em vez de width: a barra cresce com transform. */}\n <span\n className=\"or-file-uploader__progress-bar\"\n style={{ transform: `scaleX(${progress / 100})` }}\n />\n </div>\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n className=\"or-file-uploader__remove\"\n aria-label={t('removeItem', { label: item.file.name })}\n startIcon={<Icon name=\"close\" />}\n disabled={disabled}\n onClick={() => onRemove(item)}\n />\n </div>\n </li>\n )\n}\n\n/** Lê o contexto do Field (precisa estar dentro dele). */\nfunction WithField({ children }: { children: (field: FieldContextValue | null) => ReactNode }) {\n return <>{children(useField())}</>\n}\n\n/**\n * Envio de arquivos com área de arrastar e soltar, botão nativo, validação\n * de tipo/tamanho/quantidade, lista com progresso e anúncios para leitores\n * de tela.\n */\nexport const FileUploader = forwardRef<HTMLDivElement, FileUploaderProps>(function FileUploader(\n {\n label,\n hideLabel,\n description,\n error,\n required,\n optional,\n disabled = false,\n accept,\n multiple = false,\n maxSize,\n maxFiles,\n value,\n defaultValue = [],\n onFilesChange,\n onFilesAdded,\n onFileRemove,\n name,\n id,\n className,\n ...rest\n },\n ref,\n) {\n const { t, locale } = useLocale()\n const [items, setItems] = useControllableState<FileUploaderItem[]>({\n value,\n defaultValue,\n onChange: onFilesChange,\n })\n const [countError, setCountError] = useState<string | null>(null)\n const [announcement, setAnnouncement] = useState('')\n const buttonRef = useRef<HTMLButtonElement>(null)\n const listRef = useRef<HTMLUListElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n // Motion: itens que já estavam na primeira renderização não animam a entrada.\n const [ready, setReady] = useState(false)\n useEffect(() => setReady(true), [])\n // Posição de cada arquivo no lote adicionado (stagger da entrada).\n const [order, setOrder] = useState<Record<string, number>>({})\n // Itens removidos que ainda animam a saída (fora da lista real).\n const [leaving, setLeaving] = useState<{ item: FileUploaderItem; index: number }[]>([])\n const dropGhost = (id: string) => setLeaving((list) => list.filter((g) => g.item.id !== id))\n const maxSizeLabel = useMemo(\n () => (maxSize ? formatFileSize(maxSize, locale) : ''),\n [maxSize, locale],\n )\n\n const announce = (message: string) =>\n setAnnouncement((prev) => (prev === message ? `${message}\\u00a0` : message))\n\n const addFiles = (files: File[]) => {\n if (disabled) return\n const incoming = multiple ? files : files.slice(0, 1)\n const kept = multiple ? items : []\n let validCount = kept.filter((item) => item.status !== 'error').length\n let overflow = false\n const added: FileUploaderItem[] = []\n for (const file of incoming) {\n let fileError: string | undefined\n if (!matchesAccept(file, accept)) fileError = t('fileTypeNotAccepted')\n else if (maxSize !== undefined && file.size > maxSize)\n fileError = t('fileTooLarge', { size: maxSizeLabel })\n if (!fileError && multiple && maxFiles !== undefined && validCount >= maxFiles) {\n overflow = true\n continue\n }\n if (!fileError) validCount++\n added.push({ id: createId(), file, status: fileError ? 'error' : 'idle', error: fileError })\n }\n setCountError(overflow ? t('tooManyFiles', { max: maxFiles ?? 0 }) : null)\n if (added.length === 0) {\n if (overflow) announce(t('tooManyFiles', { max: maxFiles ?? 0 }))\n return\n }\n setItems([...kept, ...added])\n setOrder((prev) => {\n const next = { ...prev }\n added.forEach((item, i) => (next[item.id] = i))\n return next\n })\n\n const accepted = added.filter((item) => item.status !== 'error')\n const rejected = added.filter((item) => item.status === 'error')\n if (accepted.length > 0) onFilesAdded?.(accepted)\n const parts: string[] = []\n if (added.length === 1) {\n const [only] = added\n parts.push(\n only.error ? `${only.file.name}: ${only.error}` : t('fileAdded', { name: only.file.name }),\n )\n } else {\n if (accepted.length === 1) parts.push(t('fileAdded', { name: accepted[0].file.name }))\n else if (accepted.length > 1) parts.push(t('filesAdded', { count: accepted.length }))\n if (rejected.length > 0) parts.push(t('filesRejected', { count: rejected.length }))\n }\n if (overflow) parts.push(t('tooManyFiles', { max: maxFiles ?? 0 }))\n announce(parts.join('. '))\n }\n\n // Lista exibida: itens reais + itens saindo, na posição em que estavam.\n const rows = items.map((item) => ({ item, leaving: false }))\n for (const ghost of [...leaving].sort((a, b) => a.index - b.index)) {\n rows.splice(Math.min(ghost.index, rows.length), 0, { item: ghost.item, leaving: true })\n }\n\n const removeItem = (item: FileUploaderItem) => {\n const index = items.findIndex((i) => i.id === item.id)\n const next = items.filter((i) => i.id !== item.id)\n setItems(next)\n setCountError(null)\n onFileRemove?.(item)\n announce(t('fileRemoved', { name: item.file.name }))\n // Com movimento ativo, o item fica na tela animando a saída (inerte).\n const root = rootRef.current\n const exitDuration = root\n ? parseFloat(getComputedStyle(root).getPropertyValue('--or-duration-fast'))\n : 0\n if (exitDuration > 0) {\n const position = rows.findIndex((row) => row.item.id === item.id)\n setLeaving((list) => [...list, { item, index: position }])\n window.setTimeout(() => dropGhost(item.id), exitDuration * 4)\n }\n // Leva o foco ao próximo \"remover\" (ou ao botão de escolher arquivos).\n requestAnimationFrame(() => {\n const buttons = listRef.current?.querySelectorAll<HTMLButtonElement>(\n '.or-file-uploader__item:not([data-state=\"closed\"]) .or-file-uploader__remove',\n )\n const target = buttons?.[Math.min(index, buttons.length - 1)] ?? buttonRef.current\n target?.focus()\n })\n }\n\n const fieldError = error ?? countError ?? undefined\n\n return (\n <div ref={mergeRefs(rootRef, ref)} className={cx('or-file-uploader', className)} {...rest}>\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={fieldError}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n >\n <WithField>\n {(field) => (\n <Dropzone\n field={field}\n inputId={id}\n disabled={disabled}\n multiple={multiple}\n accept={accept}\n name={name}\n items={items}\n onFiles={addFiles}\n buttonRef={buttonRef}\n />\n )}\n </WithField>\n\n {rows.length > 0 && (\n <ul ref={listRef} className=\"or-file-uploader__list\" aria-label={t('selectedFiles')}>\n {rows.map(({ item, leaving: isLeaving }) => (\n <FileRow\n key={item.id}\n item={item}\n disabled={disabled}\n animate={ready}\n order={order[item.id] ?? 0}\n leaving={isLeaving}\n onRemove={removeItem}\n onExited={dropGhost}\n />\n ))}\n </ul>\n )}\n <VisuallyHidden role=\"status\" aria-live=\"polite\">\n {announcement}\n </VisuallyHidden>\n </Field>\n </div>\n )\n})\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n type FormHTMLAttributes,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n type SyntheticEvent,\n} from 'react'\nimport { cx, getFocusableElements, mergeRefs } from '../../utils'\nimport { ErrorSummary, type ErrorSummaryItem } from '../ErrorSummary'\nimport './Form.css'\n\n/** Valor de um campo: texto (ou `File`), ou uma lista quando vários controles têm o mesmo `name`. */\nexport type FormValue = FormDataEntryValue | FormDataEntryValue[]\n\n/** Valores do formulário por `name`, lidos com `FormData`. Campos ausentes (caixa desmarcada) ficam de fora. */\nexport type FormValues = Record<string, FormValue | undefined>\n\n/** Mensagens de erro por `name`. `undefined` ou `''` = sem erro. */\nexport type FormErrors = Record<string, string | undefined>\n\n/** Estado exposto pelo render-prop `children` e pelo hook `useForm()`. */\nexport interface FormState {\n /** Erros visíveis agora (validação depois do envio + erros externos), por `name`. */\n errors: Record<string, string>\n /** `true` enquanto a promessa retornada por `onSubmit` está pendente. */\n isSubmitting: boolean\n /** Número de tentativas de envio (válidas ou não). */\n submitCount: number\n /** `true` quando não há erros visíveis. Antes do primeiro envio, é sempre `true`. */\n isValid: boolean\n /** Mensagem de erro visível de um campo. */\n getError: (name: string) => string | undefined\n}\n\nexport interface FormProps extends Omit<FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'children'> {\n /**\n * Validação síncrona, chamada no envio com os valores do formulário. Retorne\n * uma mensagem por `name` inválido. Depois de um envio com erros, roda de novo\n * a cada alteração para tirar os erros já corrigidos.\n */\n validate?: (values: FormValues) => FormErrors\n /**\n * Chamado só quando não há erros de validação. Se retornar uma promessa, o\n * formulário fica `aria-busy` e bloqueia novos envios até ela terminar. Sem\n * `onSubmit`, um envio válido segue o caminho nativo (`action`/`method`).\n */\n onSubmit?: (values: FormValues, event: FormEvent<HTMLFormElement>) => unknown\n /**\n * Erros externos (ex.: retornados pela API), somados aos de validação. Cada um\n * some quando o valor daquele campo muda e volta se `errors` mudar.\n */\n errors?: FormErrors\n /** Mostra o `ErrorSummary` no topo depois de um envio com erros. Padrão: `true`. */\n errorSummary?: boolean\n /** Título do resumo. Padrão: \"Corrija os seguintes erros\" (dicionário de mensagens). */\n errorSummaryTitle?: ReactNode\n /** Espaçamento entre os filhos: `sm` 12px, `md` 20px, `lg` 32px. Padrão: `md`. */\n gap?: 'sm' | 'md' | 'lg'\n /** Conteúdo do formulário, ou uma função que recebe o `FormState`. */\n children?: ReactNode | ((state: FormState) => ReactNode)\n}\n\nconst FormContext = createContext<FormState | null>(null)\n\n/**\n * Lê o estado do `Form` mais próximo: `{ errors, isSubmitting, submitCount, isValid, getError }`.\n * @example const { getError } = useForm(); <TextField name=\"email\" error={getError('email')} />\n */\nexport function useForm(): FormState {\n const ctx = useContext(FormContext)\n if (!ctx) throw new Error('[Orange] useForm precisa estar dentro de <Form>.')\n return ctx\n}\n\n/* -------------------------------------------------------------------------- */\n/* Valores */\n/* -------------------------------------------------------------------------- */\n\nfunction collectValues(form: HTMLFormElement, submitter?: HTMLElement | null): FormValues {\n let data: FormData\n try {\n data = submitter ? new FormData(form, submitter) : new FormData(form)\n } catch {\n data = new FormData(form)\n }\n const values: FormValues = {}\n data.forEach((value, key) => {\n // Campo de arquivo sem arquivo escolhido: fica de fora, como uma caixa desmarcada.\n if (typeof value !== 'string' && value.name === '' && value.size === 0) return\n const current = Object.prototype.hasOwnProperty.call(values, key) ? values[key] : undefined\n if (current === undefined) values[key] = value\n else values[key] = Array.isArray(current) ? [...current, value] : [current, value]\n })\n return values\n}\n\nfunction valueKey(value: FormValue | undefined): string {\n const one = (v: FormDataEntryValue) => (typeof v === 'string' ? v : `file:${v.name}:${v.size}:${v.lastModified}`)\n if (value === undefined) return ''\n return JSON.stringify(Array.isArray(value) ? value.map(one) : one(value))\n}\n\n/** Mantém só mensagens não vazias. */\nfunction cleanErrors(errors: FormErrors | undefined): Record<string, string> {\n const out: Record<string, string> = {}\n if (!errors) return out\n for (const [name, message] of Object.entries(errors)) {\n if (typeof message === 'string' && message.trim() !== '') out[name] = message\n }\n return out\n}\n\nfunction sameErrors(a: Record<string, string>, b: Record<string, string>) {\n const keys = Object.keys(a)\n return keys.length === Object.keys(b).length && keys.every((k) => a[k] === b[k])\n}\n\n/* -------------------------------------------------------------------------- */\n/* Campos no DOM */\n/* -------------------------------------------------------------------------- */\n\ninterface FieldTarget {\n /** Elemento que recebe o foco. */\n element: HTMLElement\n /** Grupo de opções (radios/caixas com o mesmo `name`): rola até a legenda. */\n group: boolean\n /** Id estável para o link do resumo (num grupo, o do `<fieldset>` ou da primeira opção). */\n id: string\n}\n\n/** Controle que a pessoa alcança com Tab (exclui ocultos, desabilitados e `tabIndex=-1`). */\nfunction isVisibleControl(el: Element): el is HTMLElement {\n if (!(el instanceof HTMLElement) || el.tagName === 'FIELDSET' || el.tagName === 'OUTPUT') return false\n if (el instanceof HTMLInputElement && el.type === 'hidden') return false\n return !(el as HTMLInputElement).disabled && el.tabIndex >= 0\n}\n\nconst firstTabbable = (root: HTMLElement) => getFocusableElements(root).find((el) => el.tabIndex >= 0) ?? null\n\n/**\n * Controle visível de um campo que envia o valor por um input que a pessoa não\n * alcança (`type=\"hidden\"` no Combobox, DatePicker, NumberField, Switch…; o\n * `<input type=\"file\">` oculto do FileUploader): o controle do `Field` que o\n * contém ou, fora de um `Field`, o primeiro focável do ancestral mais próximo.\n */\nfunction visibleControlFor(hidden: HTMLElement, form: HTMLFormElement): HTMLElement | null {\n const field = hidden.closest<HTMLElement>('.or-field')\n if (field && form.contains(field)) {\n const label = field.querySelector('label[for]') as HTMLLabelElement | null\n const control = label ? form.ownerDocument.getElementById(label.htmlFor) : null\n if (control && isVisibleControl(control)) return control\n const first = firstTabbable(field)\n if (first) return first\n }\n for (let node = hidden.parentElement; node && node !== form; node = node.parentElement) {\n const first = firstTabbable(node)\n if (first) return first\n }\n return null\n}\n\n/** Encontra o controle de um `name` (ou `id`) com `form.elements.namedItem`. */\nfunction findField(form: HTMLFormElement, name: string): FieldTarget | null {\n const item = form.elements.namedItem(name)\n const list: Element[] = !item ? [] : item instanceof Element ? [item] : Array.from(item)\n if (list.length === 0) {\n const byId = form.ownerDocument.getElementById(name)\n return byId && form.contains(byId) ? { element: byId, group: false, id: byId.id } : null\n }\n const visible = list.filter(isVisibleControl)\n if (visible.length > 0) {\n // Grupo de opções: a marcada ou a primeira.\n const checked = visible.find((el) => (el as HTMLInputElement).checked)\n const element = checked ?? visible[0]\n const isOption = element instanceof HTMLInputElement && (element.type === 'radio' || element.type === 'checkbox')\n const group = isOption && visible.length > 1\n const fieldset = group ? element.closest('fieldset') : null\n const id = (fieldset && visible.every((el) => fieldset.contains(el)) && fieldset.id) || visible[0].id || name\n return { element, group, id }\n }\n const control = list[0] instanceof HTMLElement ? visibleControlFor(list[0], form) : null\n return control ? { element: control, group: false, id: control.id || list[0].id || name } : null\n}\n\nfunction byDocumentOrder(a: HTMLElement | null, b: HTMLElement | null) {\n if (!a || !b) return a ? -1 : b ? 1 : 0\n if (a === b) return 0\n return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n}\n\n/** Erros na ordem dos campos no formulário; os sem campo encontrado vão para o fim. */\nfunction orderFields(form: HTMLFormElement | null, errors: Record<string, string>) {\n return Object.entries(errors)\n .map(([name, message]) => ({ name, message, target: form ? findField(form, name) : null }))\n .sort((a, b) => byDocumentOrder(a.target?.element ?? null, b.target?.element ?? null))\n}\n\n/** Rola até o rótulo (ou a legenda do grupo) e foca o controle. */\nfunction focusField({ element, group }: FieldTarget) {\n const legend = group ? element.closest('fieldset')?.querySelector('legend') : null\n const anchor = legend ?? (element as HTMLInputElement).labels?.[0] ?? element\n anchor.scrollIntoView?.({ block: 'center' })\n element.focus({ preventScroll: true })\n}\n\n/* -------------------------------------------------------------------------- */\n/* Form */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Orquestra um formulário no padrão GOV.UK: valida no envio, mostra um\n * `ErrorSummary` no topo com links para cada campo inválido, move o foco para\n * ele e, depois do primeiro envio, tira os erros conforme são corrigidos. Os\n * erros chegam aos campos pelo render-prop `children` ou por `useForm()`.\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n {\n validate,\n onSubmit,\n errors: errorsProp,\n errorSummary = true,\n errorSummaryTitle,\n gap = 'md',\n className,\n children,\n onReset,\n onInputCapture,\n onChangeCapture,\n onClickCapture,\n onKeyUpCapture,\n onBlurCapture,\n ...rest\n },\n ref,\n) {\n const formRef = useRef<HTMLFormElement>(null)\n const mergedRef = useMemo(() => mergeRefs(ref, formRef), [ref])\n const summaryRef = useRef<HTMLElement>(null)\n const submittingRef = useRef(false)\n\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({})\n const [submitCount, setSubmitCount] = useState(0)\n const [isSubmitting, setSubmitting] = useState(false)\n const [focusRequest, setFocusRequest] = useState(0)\n const [revalidateTick, setRevalidateTick] = useState(0)\n\n // Erros externos: estáveis enquanto o conteúdo não muda (objetos inline não disparam efeitos).\n const externalKey = JSON.stringify(Object.entries(cleanErrors(errorsProp)).sort(([a], [b]) => a.localeCompare(b)))\n const externalErrors = useMemo<Record<string, string>>(() => Object.fromEntries(JSON.parse(externalKey)), [externalKey])\n // Campos editados depois que os erros externos chegaram (valem só para aquele conjunto de erros).\n const [dismissed, setDismissed] = useState<{ key: string; names: string[] }>({ key: '', names: [] })\n const dismissedNames = useMemo(\n () => (dismissed.key === externalKey ? dismissed.names : []),\n [dismissed, externalKey],\n )\n const snapshotRef = useRef<FormValues>({})\n const previousExternal = useRef<Record<string, string>>({})\n\n const errors = useMemo(() => {\n const merged: Record<string, string> = {}\n for (const [name, message] of Object.entries(externalErrors)) {\n if (!dismissedNames.includes(name)) merged[name] = message\n }\n return Object.assign(merged, validationErrors)\n }, [externalErrors, dismissedNames, validationErrors])\n const errorCount = Object.keys(errors).length\n const armed = errorCount > 0\n\n // Erros externos novos: guarda os valores atuais (para saber quando o campo muda) e move o foco.\n useEffect(() => {\n const form = formRef.current\n snapshotRef.current = form ? collectValues(form) : {}\n const previous = previousExternal.current\n previousExternal.current = externalErrors\n if (Object.entries(externalErrors).some(([name, message]) => previous[name] !== message)) {\n setFocusRequest((n) => n + 1)\n }\n }, [externalErrors])\n\n // Revalidação depois do envio: só atualiza ou remove erros que já estão visíveis.\n const handledTick = useRef(0)\n useEffect(() => {\n if (revalidateTick === handledTick.current) return\n handledTick.current = revalidateTick\n const form = formRef.current\n if (!form) return\n const values = collectValues(form)\n if (validate && Object.keys(validationErrors).length > 0) {\n const fresh = cleanErrors(validate(values))\n const next: Record<string, string> = {}\n for (const name of Object.keys(validationErrors)) if (fresh[name]) next[name] = fresh[name]\n if (!sameErrors(next, validationErrors)) setValidationErrors(next)\n }\n const changed = Object.keys(externalErrors).filter(\n (name) => !dismissedNames.includes(name) && valueKey(values[name]) !== valueKey(snapshotRef.current[name]),\n )\n if (changed.length > 0) setDismissed({ key: externalKey, names: [...dismissedNames, ...changed] })\n }, [revalidateTick, validate, validationErrors, externalErrors, externalKey, dismissedNames])\n\n // Foco depois de um envio com erros (ou de erros externos novos): resumo ou primeiro campo inválido.\n const handledFocus = useRef(0)\n useEffect(() => {\n if (focusRequest === handledFocus.current) return\n handledFocus.current = focusRequest\n if (errorSummary && summaryRef.current) {\n summaryRef.current.focus()\n return\n }\n const first = orderFields(formRef.current, errors).find((item) => item.target)\n if (first?.target) focusField(first.target)\n }, [focusRequest, errorSummary, errors])\n\n const scheduleRevalidation = <E extends SyntheticEvent>(external?: (event: E) => void) => (event: E) => {\n external?.(event)\n if (armed) setRevalidateTick((n) => n + 1)\n }\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n if (submittingRef.current) {\n event.preventDefault()\n return\n }\n const form = event.currentTarget\n const submitter = (event.nativeEvent as SubmitEvent).submitter ?? null\n const values = collectValues(form, submitter)\n const fresh = validate ? cleanErrors(validate(values)) : {}\n setSubmitCount((n) => n + 1)\n setValidationErrors(fresh)\n if (Object.keys(fresh).length > 0) {\n event.preventDefault()\n setFocusRequest((n) => n + 1)\n return\n }\n if (!onSubmit) return // envio nativo\n event.preventDefault()\n const result = onSubmit(values, event)\n if (result && typeof (result as PromiseLike<void>).then === 'function') {\n submittingRef.current = true\n setSubmitting(true)\n const done = () => {\n submittingRef.current = false\n setSubmitting(false)\n }\n Promise.resolve(result).then(done, (error: unknown) => {\n done()\n throw error\n })\n }\n }\n\n const handleReset = (event: FormEvent<HTMLFormElement>) => {\n onReset?.(event)\n if (event.defaultPrevented) return\n setValidationErrors({})\n setSubmitCount(0)\n setDismissed({ key: externalKey, names: Object.keys(externalErrors) })\n }\n\n const getError = useCallback((name: string) => errors[name], [errors])\n const state = useMemo<FormState>(\n () => ({ errors, isSubmitting, submitCount, isValid: errorCount === 0, getError }),\n [errors, isSubmitting, submitCount, errorCount, getError],\n )\n\n // Itens do resumo na ordem do formulário; o link aponta para o id do controle.\n const fields = orderFields(formRef.current, errors)\n const nameById = new Map<string, string>()\n const summaryItems: ErrorSummaryItem[] = fields.map(({ name, message, target }) => {\n const id = target?.id || name\n nameById.set(id, name)\n return { id, message }\n })\n\n const handleItemClick = (item: ErrorSummaryItem, event: MouseEvent<HTMLAnchorElement>) => {\n const name = nameById.get(item.id)\n const target = name !== undefined && formRef.current ? findField(formRef.current, name) : null\n if (!target) return // segue o comportamento padrão do ErrorSummary (#id)\n event.preventDefault()\n focusField(target)\n }\n\n return (\n <FormContext.Provider value={state}>\n <form\n ref={mergedRef}\n noValidate\n {...rest}\n className={cx('or-form', `or-form--gap-${gap}`, className)}\n aria-busy={isSubmitting || rest['aria-busy'] || undefined}\n onSubmit={handleSubmit}\n onReset={handleReset}\n onInputCapture={scheduleRevalidation(onInputCapture)}\n onChangeCapture={scheduleRevalidation(onChangeCapture)}\n onClickCapture={scheduleRevalidation(onClickCapture)}\n onKeyUpCapture={scheduleRevalidation(onKeyUpCapture)}\n onBlurCapture={scheduleRevalidation(onBlurCapture)}\n >\n {errorSummary && (\n <ErrorSummary\n ref={summaryRef}\n errors={summaryItems}\n title={errorSummaryTitle}\n onItemClick={handleItemClick}\n />\n )}\n {typeof children === 'function' ? children(state) : children}\n </form>\n </FormContext.Provider>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* FormActions */\n/* -------------------------------------------------------------------------- */\n\nexport interface FormActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Alinhamento dos botões: `start` (padrão), `end` ou `between` (ex.: Voltar … Continuar). */\n align?: 'start' | 'end' | 'between'\n}\n\n/**\n * Linha de botões no fim do formulário: espaçamento padrão, quebra de linha em\n * telas estreitas e alinhamento. Coloque o botão de envio primeiro na ordem de leitura.\n */\nexport const FormActions = forwardRef<HTMLDivElement, FormActionsProps>(function FormActions(\n { align = 'start', className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('or-form-actions', `or-form-actions--${align}`, className)} {...rest} />\n})\n","/**\n * Utilitários internos dos componentes de layout (Stack, Grid, Container).\n * Não são exportados pela biblioteca — só os tipos `ResponsiveValue` e\n * `LayoutGap` são públicos (via `Stack/index.ts`).\n */\n\n/** Breakpoints de `@orangesys/tokens` (`breakpoints`), do menor para o maior. */\nconst BREAKPOINTS = ['sm', 'md', 'lg', 'xl'] as const\n\n/**\n * Valor que pode mudar conforme a largura da janela. Mobile-first: `base` vale\n * sempre e cada breakpoint vale daquela largura para cima (sm 640px, md 768px,\n * lg 1024px, xl 1280px), até o próximo breakpoint definido.\n *\n * `direction={{ base: 'vertical', md: 'horizontal' }}`\n */\nexport type ResponsiveValue<T> = T | BreakpointMap<T>\n\ntype BreakpointMap<T> = { base?: T; sm?: T; md?: T; lg?: T; xl?: T }\n\n/** Escala de espaço dos componentes de layout: `4` = `--or-space-4` (1rem). */\nexport type LayoutGap = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16\n\n/** Custom properties inline e classes de presença geradas pelas props responsivas. */\nexport interface ResponsiveStyles {\n style: Record<string, string>\n classes: string[]\n}\n\nexport const createResponsiveStyles = (): ResponsiveStyles => ({ style: {}, classes: [] })\n\nexport const gapToCss = (gap: LayoutGap) => `var(--or-space-${gap})`\n\n/** Inteiro ≥ 1 (colunas e spans). */\nexport const toTrackCount = (value: number) => String(Math.max(1, Math.round(value)))\n\nfunction isBreakpointMap<T>(value: ResponsiveValue<T>): value is BreakpointMap<T> {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * Registra uma prop responsiva:\n * - o valor base vira `<varName>` (o CSS do componente o reseta para `initial`\n * na raiz, então valores de um ancestral nunca vazam para dentro);\n * - cada breakpoint vira `<varName>-<bp>` + a classe `<classPrefix>-<bp>`,\n * que liga a regra `@media (min-width: …)` correspondente no CSS.\n *\n * Breakpoints omitidos herdam o anterior (mobile-first), sem JavaScript de mídia.\n */\nexport function addResponsive<T>(\n out: ResponsiveStyles,\n value: ResponsiveValue<T> | undefined,\n varName: string,\n classPrefix: string,\n toCss: (value: T) => string,\n) {\n if (value === undefined || value === null) return\n if (!isBreakpointMap(value)) {\n out.style[varName] = toCss(value as T)\n return\n }\n if (value.base !== undefined) out.style[varName] = toCss(value.base)\n for (const bp of BREAKPOINTS) {\n const v = value[bp]\n if (v === undefined) continue\n out.style[`${varName}-${bp}`] = toCss(v)\n out.classes.push(`${classPrefix}-${bp}`)\n }\n}\n\n/** Elementos de lista: o `list-style: none` do CSS tira a semântica no Safari, então ganham `role=\"list\"`. */\nexport const isListElement = (as: unknown) => as === 'ul' || as === 'ol' || as === 'menu'\n","import { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes } from 'react'\nimport { cx, devWarning } from '../../utils'\nimport {\n addResponsive,\n createResponsiveStyles,\n gapToCss,\n isListElement,\n toTrackCount,\n type LayoutGap,\n type ResponsiveValue,\n} from '../Stack/responsive'\nimport './Grid.css'\n\nexport type GridVariant = 'plain' | 'bordered'\nexport type GridSpan = number | 'full'\n\nexport interface GridProps extends HTMLAttributes<HTMLElement> {\n /**\n * Elemento renderizado. Padrão: `div`. Use `ul`/`ol` (com itens `li`) para\n * coleções e `dl` para pares rótulo/valor; listas ganham `role=\"list\"`.\n */\n as?: ElementType\n /**\n * Número de colunas de mesma largura. Responsivo:\n * `{ base: 1, sm: 2, lg: 4 }`. Padrão: `1`.\n */\n columns?: ResponsiveValue<number>\n /**\n * Largura mínima de cada item (`'16rem'`, `'240px'`). Cabem quantas colunas\n * a largura permitir — sem media queries. Tem prioridade sobre `columns`.\n */\n minItemWidth?: string\n /** Espaço entre linhas e colunas na escala de espaço (`4` = 1rem). Responsivo. Padrão: `4`. */\n gap?: ResponsiveValue<LayoutGap>\n /** Espaço só entre linhas (substitui `gap` nesse eixo). Responsivo. */\n rowGap?: ResponsiveValue<LayoutGap>\n /** Espaço só entre colunas (substitui `gap` nesse eixo). Responsivo. */\n columnGap?: ResponsiveValue<LayoutGap>\n /**\n * `plain` (padrão) ou `bordered`: as células encostam, separadas por linhas\n * de 1px e com moldura externa, como as grades de números do zop.dev. Em\n * `bordered`, `gap`/`rowGap`/`columnGap` viram o respiro interno de cada\n * célula (o espaço entre a linha e o conteúdo).\n */\n variant?: GridVariant\n}\n\n/**\n * Layout em duas dimensões: colunas de mesma largura (fixas por breakpoint ou\n * automáticas por largura mínima) com espaçamento da escala do sistema.\n */\nexport const Grid = forwardRef<HTMLElement, GridProps>(function Grid(\n {\n as: Component = 'div',\n columns,\n minItemWidth,\n gap,\n rowGap,\n columnGap,\n variant = 'plain',\n className,\n style,\n ...rest\n },\n ref,\n) {\n devWarning(\n columns !== undefined && minItemWidth !== undefined,\n 'Grid: use `columns` ou `minItemWidth`, não os dois — `minItemWidth` tem prioridade.',\n )\n const responsive = createResponsiveStyles()\n if (minItemWidth) responsive.style['--_grid-min'] = minItemWidth\n else addResponsive(responsive, columns, '--_grid-cols', 'or-grid--cols', toTrackCount)\n addResponsive(responsive, rowGap ?? gap, '--_grid-row-gap', 'or-grid--row-gap', gapToCss)\n addResponsive(responsive, columnGap ?? gap, '--_grid-col-gap', 'or-grid--col-gap', gapToCss)\n\n const hasVars = Object.keys(responsive.style).length > 0\n return (\n <Component\n ref={ref}\n className={cx(\n 'or-grid',\n `or-grid--${variant}`,\n minItemWidth && 'or-grid--auto',\n ...responsive.classes,\n className,\n )}\n style={hasVars || style ? ({ ...responsive.style, ...style } as CSSProperties) : undefined}\n role={isListElement(Component) ? 'list' : undefined}\n {...rest}\n />\n )\n})\n\nexport interface GridItemProps extends HTMLAttributes<HTMLElement> {\n /** Elemento renderizado. Padrão: `div`. Dentro de `Grid as=\"ul\"`, use `li`. */\n as?: ElementType\n /**\n * Quantas colunas o item ocupa, ou `full` para a linha inteira. Responsivo:\n * `{ base: 'full', lg: 2 }`. Não passe de `columns` no mesmo breakpoint.\n */\n span?: ResponsiveValue<GridSpan>\n}\n\nconst spanToCss = (span: GridSpan) => {\n if (span === 'full') return '1 / -1'\n const count = toTrackCount(span)\n return `span ${count} / span ${count}`\n}\n\n/** Item de `Grid` que ocupa mais de uma coluna. Itens simples não precisam dele. */\nexport const GridItem = forwardRef<HTMLElement, GridItemProps>(function GridItem(\n { as: Component = 'div', span, className, style, ...rest },\n ref,\n) {\n const responsive = createResponsiveStyles()\n addResponsive(responsive, span, '--_grid-span', 'or-grid-item--span', spanToCss)\n const hasVars = Object.keys(responsive.style).length > 0\n return (\n <Component\n ref={ref}\n className={cx('or-grid-item', ...responsive.classes, className)}\n style={hasVars || style ? ({ ...responsive.style, ...style } as CSSProperties) : undefined}\n {...rest}\n />\n )\n})\n","import { forwardRef, useMemo, type ElementType, type HTMLAttributes, type ReactNode } from 'react'\nimport { cx } from '../../utils'\nimport './Highlight.css'\n\nexport interface HighlightProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n /** Texto em que os termos serão destacados. */\n children: string\n /** Termo ou lista de termos a destacar. Termos vazios são ignorados. */\n query: string | string[]\n /** Elemento que envolve o texto. Padrão: `span`. */\n as?: ElementType\n /** Diferencia maiúsculas de minúsculas. Padrão: `false`. */\n caseSensitive?: boolean\n /** Diferencia letras acentuadas (\"é\" ≠ \"e\"). Padrão: `false`. */\n accentSensitive?: boolean\n /** Classe extra aplicada a cada `<mark>`. */\n markClassName?: string\n}\n\ninterface FoldOptions {\n caseSensitive: boolean\n accentSensitive: boolean\n}\n\nconst COMBINING_MARK = /\\p{M}/u\n\nfunction fold(value: string, { caseSensitive, accentSensitive }: FoldOptions) {\n let out = value\n if (!accentSensitive) out = out.normalize('NFD').replace(/\\p{M}/gu, '')\n if (!caseSensitive) out = out.toLocaleLowerCase()\n return out\n}\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/**\n * Encontra os intervalos [início, fim) do texto original que correspondem aos\n * termos, comparando versões \"dobradas\" (sem acento/caixa) e mapeando os\n * índices de volta ao texto original.\n */\nfunction findRanges(text: string, queries: string[], options: FoldOptions): [number, number][] {\n const terms = Array.from(new Set(queries.map((q) => fold(q.trim(), options)).filter(Boolean)))\n if (terms.length === 0 || !text) return []\n\n let folded = ''\n const starts: number[] = []\n const ends: number[] = []\n for (let i = 0; i < text.length; ) {\n const char = String.fromCodePoint(text.codePointAt(i)!)\n const piece = fold(char, options)\n for (let k = 0; k < piece.length; k++) {\n starts.push(i)\n ends.push(i + char.length)\n }\n folded += piece\n i += char.length\n }\n\n // Cada termo é buscado separadamente para que ocorrências sobrepostas\n // (\"ab\" e \"bc\" em \"abc\") sejam unidas em um único destaque.\n const found: [number, number][] = []\n for (const term of terms) {\n const pattern = new RegExp(escapeRegExp(term), 'g')\n let match: RegExpExecArray | null\n while ((match = pattern.exec(folded))) {\n let end = ends[match.index + match[0].length - 1]\n // inclui acentos combinantes que seguem a última letra (texto em NFD)\n while (end < text.length && COMBINING_MARK.test(text[end])) end += 1\n found.push([starts[match.index], end])\n }\n }\n found.sort((a, b) => a[0] - b[0] || b[1] - a[1])\n const ranges: [number, number][] = []\n for (const [start, end] of found) {\n const last = ranges[ranges.length - 1]\n if (last && start <= last[1]) last[1] = Math.max(last[1], end)\n else ranges.push([start, end])\n }\n return ranges\n}\n\n/**\n * Destaca termos de busca dentro de um texto com `<mark>`. A comparação ignora\n * acentos e maiúsculas por padrão, e os termos são tratados como texto literal.\n */\nexport const Highlight = forwardRef<HTMLElement, HighlightProps>(function Highlight(\n {\n children,\n query,\n as: Component = 'span',\n caseSensitive = false,\n accentSensitive = false,\n markClassName,\n className,\n ...rest\n },\n ref,\n) {\n const text = typeof children === 'string' ? children : String(children ?? '')\n const queries = Array.isArray(query) ? query : [query]\n const queryKey = queries.join('\\u0000')\n\n const parts = useMemo(() => {\n const ranges = findRanges(text, queryKey.split('\\u0000'), { caseSensitive, accentSensitive })\n const out: ReactNode[] = []\n let cursor = 0\n ranges.forEach(([start, end]) => {\n if (start > cursor) out.push(text.slice(cursor, start))\n // A chave pelo intervalo mantém as marcas que não mudaram; só as novas\n // montam (e fazem o fade de entrada) quando a busca muda.\n out.push(\n <mark key={`${start}-${end}`} className={cx('or-highlight__mark', markClassName)}>\n {text.slice(start, end)}\n </mark>,\n )\n cursor = end\n })\n if (cursor < text.length) out.push(text.slice(cursor))\n return out\n }, [text, queryKey, caseSensitive, accentSensitive, markClassName])\n\n return (\n <Component ref={ref} className={cx('or-highlight', className)} {...rest}>\n {parts}\n </Component>\n )\n})\n","import {\n cloneElement,\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type FocusEvent as ReactFocusEvent,\n type HTMLAttributes,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId, useMounted, usePresence } from '../../hooks'\nimport { composeEventHandlers, cx, mergeRefs } from '../../utils'\nimport { getThemeScope, isFocusVisible, useLayer } from '../Modal/overlay'\nimport { useFloatingPanel, useTriggerElement, type FloatingPlacement } from '../Popover/floating'\nimport { Portal } from '../Portal'\nimport './HoverCard.css'\n\nexport type HoverCardPlacement = FloatingPlacement\n\nexport interface HoverCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Link ou elemento focável que mostra o cartão (ex.: `<a href=\"/u/ana\">@ana</a>`). */\n trigger: ReactElement\n /** Pré-visualização complementar. Não coloque aqui nada essencial. */\n children: ReactNode\n /** Atraso para abrir, em ms. */\n openDelay?: number\n /** Atraso para fechar ao sair, em ms (tempo para alcançar o cartão). */\n closeDelay?: number\n /** Posição preferida; inverte sozinha se faltar espaço. */\n placement?: HoverCardPlacement\n /** Distância do gatilho, em px. */\n offset?: number\n /** Mostra uma seta apontando para o gatilho. */\n arrow?: boolean\n /** Aberto (controlado). */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o cartão abre ou fecha. */\n onOpenChange?: (open: boolean) => void\n}\n\n/**\n * Cartão de pré-visualização exibido ao passar o ponteiro ou focar um link —\n * perfil de uma pessoa, resumo de um item. Conteúdo complementar: tudo nele\n * também precisa estar disponível no destino do link.\n */\nexport const HoverCard = forwardRef<HTMLDivElement, HoverCardProps>(function HoverCard(\n {\n trigger,\n children,\n openDelay = 600,\n closeDelay = 300,\n placement = 'bottom',\n offset = 8,\n arrow = false,\n open,\n defaultOpen = false,\n onOpenChange,\n className,\n style,\n onPointerEnter,\n onPointerLeave,\n ...rest\n },\n ref,\n) {\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const mounted = useMounted()\n const visible = isOpen && mounted\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(visible)\n const cardId = useId('or-hover-card')\n const [triggerEl, triggerRef] = useTriggerElement(trigger)\n const [cardEl, setCardEl] = useState<HTMLDivElement | null>(null)\n const openTimer = useRef<number | undefined>(undefined)\n const closeTimer = useRef<number | undefined>(undefined)\n const pointerFocus = useRef(false)\n\n const floating = useFloatingPanel({\n open: present,\n reference: triggerEl,\n floating: cardEl,\n placement,\n offset,\n arrow,\n })\n\n const scheduleOpen = () => {\n window.clearTimeout(closeTimer.current)\n if (isOpen) return\n window.clearTimeout(openTimer.current)\n openTimer.current = window.setTimeout(() => setOpen(true), openDelay)\n }\n\n const scheduleClose = (immediate = false) => {\n window.clearTimeout(openTimer.current)\n window.clearTimeout(closeTimer.current)\n if (immediate) setOpen(false)\n else closeTimer.current = window.setTimeout(() => setOpen(false), closeDelay)\n }\n\n useEffect(\n () => () => {\n window.clearTimeout(openTimer.current)\n window.clearTimeout(closeTimer.current)\n },\n [],\n )\n\n const { setNode, layerProps } = useLayer(visible, {\n onEscape: () => scheduleClose(true),\n onPointerDownOutside: () => scheduleClose(true),\n insideElements: () => [triggerEl],\n })\n\n const cardRef = useMemo(\n () => mergeRefs<HTMLDivElement>(setCardEl, setNode, nodeRef, ref),\n [setNode, nodeRef, ref],\n )\n\n const triggerProps = trigger.props as HTMLAttributes<HTMLElement>\n const triggerElement = cloneElement(\n trigger as ReactElement<HTMLAttributes<HTMLElement> & { ref?: unknown }>,\n {\n ref: triggerRef,\n onPointerEnter: composeEventHandlers(\n triggerProps.onPointerEnter,\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.pointerType !== 'touch') scheduleOpen()\n },\n ),\n onPointerLeave: composeEventHandlers(\n triggerProps.onPointerLeave,\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.pointerType !== 'touch') scheduleClose()\n },\n ),\n onPointerDown: composeEventHandlers(triggerProps.onPointerDown, () => {\n // o foco que vem do clique não abre o cartão\n pointerFocus.current = true\n window.setTimeout(() => (pointerFocus.current = false), 0)\n }),\n onFocus: composeEventHandlers(triggerProps.onFocus, (event: ReactFocusEvent<HTMLElement>) => {\n if (!pointerFocus.current && isFocusVisible(event.currentTarget)) scheduleOpen()\n }),\n onBlur: composeEventHandlers(triggerProps.onBlur, (event: ReactFocusEvent<HTMLElement>) => {\n const next = event.relatedTarget as Node | null\n if (!next || !cardEl?.contains(next)) scheduleClose(true)\n }),\n },\n )\n\n return (\n <>\n {triggerElement}\n <Portal>\n {present && (\n <div\n ref={cardRef}\n id={cardId}\n data-state={state}\n inert={state === 'closed' || undefined}\n data-side={floating.side}\n data-theme={getThemeScope(triggerEl)}\n className={cx('or-floating', 'or-hover-card', className)}\n style={{ ...floating.floatingStyles, ...style }}\n onPointerEnter={composeEventHandlers(onPointerEnter, () =>\n window.clearTimeout(closeTimer.current),\n )}\n onPointerLeave={composeEventHandlers(\n onPointerLeave,\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.pointerType !== 'touch') scheduleClose()\n },\n )}\n {...rest}\n {...layerProps}\n >\n {arrow && (\n <span\n ref={floating.arrowRef}\n className=\"or-floating-arrow\"\n data-side={floating.side}\n style={floating.arrowStyle}\n aria-hidden=\"true\"\n />\n )}\n {children}\n </div>\n )}\n </Portal>\n </>\n )\n})\n","import { forwardRef, useState, type HTMLAttributes, type ReactNode, type Ref } from 'react'\nimport { usePresence } from '../../hooks'\nimport { cx } from '../../utils'\nimport './Skeleton.css'\n\nexport type SkeletonVariant = 'text' | 'rect' | 'circle'\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLElement> {\n /** Forma: linha de texto, retângulo (imagens, cartões) ou círculo (avatares). */\n variant?: SkeletonVariant\n /** Largura (número = px). Padrão: 100% (`text`/`rect`) ou 40px (`circle`). */\n width?: number | string\n /** Altura (número = px). Padrão: 1 linha (`text`), 120px (`rect`) ou igual à largura (`circle`). */\n height?: number | string\n /** Brilho animado. Desligado automaticamente com movimento reduzido. */\n animated?: boolean\n /**\n * Modo de troca: com `loaded`, o Skeleton envolve o conteúdo real\n * (`children`) e faz um crossfade do placeholder para ele quando `loaded`\n * vira `true`. Enquanto carrega, o contêiner recebe `aria-busy`.\n */\n loaded?: boolean\n /** Conteúdo real, exibido quando `loaded` é `true`. */\n children?: ReactNode\n}\n\nconst toSize = (value: number | string | undefined) =>\n typeof value === 'number' ? `${value}px` : value\n\ninterface SkeletonSwapProps extends HTMLAttributes<HTMLDivElement> {\n loaded: boolean\n placeholder: ReactNode\n}\n\n/**\n * Crossfade placeholder → conteúdo. As duas camadas ocupam a mesma célula do\n * grid; quem sai esmaece em --or-duration-fast (usePresence espera o fim) e\n * quem entra aparece em --or-duration-medium.\n */\nconst SkeletonSwap = forwardRef<HTMLDivElement, SkeletonSwapProps>(function SkeletonSwap(\n { loaded, placeholder, className, children, ...rest },\n ref,\n) {\n const skeleton = usePresence<HTMLDivElement>(!loaded)\n const content = usePresence<HTMLDivElement>(loaded)\n // só anima depois de uma troca: conteúdo que já chega carregado não \"pisca\"\n const [previousLoaded, setPreviousLoaded] = useState(loaded)\n const [changed, setChanged] = useState(false)\n if (previousLoaded !== loaded) {\n setPreviousLoaded(loaded)\n setChanged(true)\n }\n\n return (\n <div\n ref={ref}\n className={cx('or-skeleton-swap', className)}\n aria-busy={!loaded || undefined}\n data-changed={changed || undefined}\n {...rest}\n >\n {skeleton.present && (\n <div\n ref={skeleton.nodeRef}\n className=\"or-skeleton-swap__layer\"\n data-state={skeleton.state}\n aria-hidden=\"true\"\n >\n {placeholder}\n </div>\n )}\n {content.present && (\n <div\n ref={content.nodeRef}\n className=\"or-skeleton-swap__layer or-skeleton-swap__content\"\n data-state={content.state}\n aria-hidden={content.state === 'closed' || undefined}\n >\n {children}\n </div>\n )}\n </div>\n )\n})\n\n/**\n * Espaço reservado com a forma do conteúdo que está carregando. É decorativo\n * (`aria-hidden`): marque o contêiner com `aria-busy` e anuncie o carregamento\n * numa região `role=\"status\"` fora dele. Com `loaded`, troca sozinho pelo\n * conteúdo real com crossfade.\n */\nexport const Skeleton = forwardRef<HTMLElement, SkeletonProps>(function Skeleton(\n { variant = 'text', width, height, animated = true, loaded, className, style, children, ...rest },\n ref,\n) {\n const w = toSize(width)\n const h = toSize(height) ?? (variant === 'circle' ? w : undefined)\n const shapeClassName = cx(\n 'or-skeleton',\n `or-skeleton--${variant}`,\n animated && 'or-skeleton--animated',\n )\n\n if (loaded === undefined) {\n return (\n <span\n ref={ref as Ref<HTMLSpanElement>}\n aria-hidden=\"true\"\n className={cx(shapeClassName, className)}\n style={{ width: w, height: h, ...style }}\n {...rest}\n />\n )\n }\n\n return (\n <SkeletonSwap\n ref={ref as Ref<HTMLDivElement>}\n loaded={loaded}\n placeholder={\n <span aria-hidden=\"true\" className={shapeClassName} style={{ width: w, height: h }} />\n }\n className={className}\n style={style}\n {...rest}\n >\n {children}\n </SkeletonSwap>\n )\n})\n\nexport interface SkeletonTextProps extends HTMLAttributes<HTMLElement> {\n /** Número de linhas. */\n lines?: number\n /** Largura da última linha, para parecer um parágrafo real. */\n lastLineWidth?: number | string\n /** Largura do bloco. */\n width?: number | string\n /** Brilho animado. */\n animated?: boolean\n /** Modo de troca: faz crossfade das linhas para `children` quando `true`. */\n loaded?: boolean\n /** Conteúdo real, exibido quando `loaded` é `true`. */\n children?: ReactNode\n}\n\n/** Bloco de várias linhas de `Skeleton` imitando um parágrafo. */\nexport const SkeletonText = forwardRef<HTMLElement, SkeletonTextProps>(function SkeletonText(\n {\n lines = 3,\n lastLineWidth = '60%',\n width,\n animated = true,\n loaded,\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const count = Math.max(1, Math.floor(lines))\n const lineNodes = Array.from({ length: count }, (_, i) => (\n <Skeleton\n key={i}\n variant=\"text\"\n animated={animated}\n width={count > 1 && i === count - 1 ? lastLineWidth : undefined}\n />\n ))\n\n if (loaded === undefined) {\n return (\n <span\n ref={ref as Ref<HTMLSpanElement>}\n aria-hidden=\"true\"\n className={cx('or-skeleton-text', className)}\n style={{ width: toSize(width), ...style }}\n {...rest}\n >\n {lineNodes}\n </span>\n )\n }\n\n return (\n <SkeletonSwap\n ref={ref as Ref<HTMLDivElement>}\n loaded={loaded}\n placeholder={\n <span className=\"or-skeleton-text\" style={{ width: toSize(width) }} aria-hidden=\"true\">\n {lineNodes}\n </span>\n }\n className={className}\n style={style}\n {...rest}\n >\n {children}\n </SkeletonSwap>\n )\n})\n","import {\n forwardRef,\n useRef,\n useState,\n type CSSProperties,\n type ImgHTMLAttributes,\n type ReactNode,\n type SyntheticEvent,\n} from 'react'\nimport { useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport { Skeleton } from '../Skeleton'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Image.css'\n\nexport type ImageRatio = '1/1' | '4/3' | '3/2' | '16/9' | '21/9' | number\nexport type ImageFit = 'cover' | 'contain'\nexport type ImageState = 'loading' | 'loaded' | 'error'\n\nexport interface ImageProps\n extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'src' | 'alt' | 'children' | 'placeholder'> {\n /** URL da imagem. `srcSet` e `sizes` são repassados à `<img>`. */\n src: string\n /**\n * Texto alternativo — obrigatório. Descreva o que a imagem comunica no\n * contexto. Use `alt=\"\"` só quando ela for decorativa (o mesmo conteúdo já\n * está no texto ao lado, ou é puro ornamento): assim leitores de tela a ignoram.\n */\n alt: string\n /**\n * Proporção reservada antes do carregamento (`aspect-ratio`), evitando\n * deslocamento de layout. Sem `ratio`, usa `width`/`height` numéricos se houver.\n */\n ratio?: ImageRatio\n /** Como a imagem preenche a área: `cover` (recorta, padrão) ou `contain` (mostra inteira). */\n fit?: ImageFit\n /** Ponto focal do recorte (`object-position`), ex.: `'top'`, `'50% 30%'`. */\n position?: string\n /** Conteúdo exibido se a imagem (e o `fallbackSrc`) falharem. Substitui o padrão. */\n fallback?: ReactNode\n /** Segunda tentativa: carregada uma vez quando `src` falha, antes do `fallback`. */\n fallbackSrc?: string\n /** Legenda visível. Envolve a imagem em `<figure>` com `<figcaption>`. */\n caption?: ReactNode\n /** Borda de 1px (`--or-color-border`) desenhada sobre a borda da imagem. */\n bordered?: boolean\n}\n\nconst toNumber = (value: number | string | undefined) => {\n const n = typeof value === 'string' ? Number(value) : value\n return typeof n === 'number' && Number.isFinite(n) && n > 0 ? n : undefined\n}\n\n/**\n * Imagem robusta: reserva a proporção (sem CLS), carrega sob demanda\n * (`loading=\"lazy\"`, `decoding=\"async\"`), mostra um skeleton até carregar e\n * entra com fade. Se falhar, tenta `fallbackSrc` uma vez e depois exibe um\n * substituto acessível. A `ref` e os demais atributos vão para a `<img>`;\n * `className` e `style` vão para o contêiner (que define tamanho e proporção).\n */\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n {\n src,\n alt,\n ratio,\n fit = 'cover',\n position,\n fallback,\n fallbackSrc,\n caption,\n bordered = false,\n loading = 'lazy',\n decoding = 'async',\n className,\n style,\n onLoad,\n onError,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n devWarning(alt === undefined, 'Image precisa de `alt`. Use `alt=\"\"` apenas para imagens decorativas.')\n\n const imgRef = useRef<HTMLImageElement>(null)\n const initialSrc = src || fallbackSrc || ''\n const [currentSrc, setCurrentSrc] = useState(initialSrc)\n const [state, setState] = useState<ImageState>(initialSrc ? 'loading' : 'error')\n\n // Nova origem: recomeça do `src` (derivado na renderização, sem piscar o estado antigo).\n const [sources, setSources] = useState({ src, fallbackSrc })\n if (sources.src !== src || sources.fallbackSrc !== fallbackSrc) {\n setSources({ src, fallbackSrc })\n setCurrentSrc(initialSrc)\n setState(initialSrc ? 'loading' : 'error')\n }\n\n // Imagem já em cache (ou carregada antes da hidratação): o onLoad não chega.\n useIsomorphicLayoutEffect(() => {\n const img = imgRef.current\n if (img?.complete && img.naturalWidth > 0) setState('loaded')\n }, [currentSrc])\n\n const handleLoad = (event: SyntheticEvent<HTMLImageElement>) => {\n onLoad?.(event)\n setState('loaded')\n }\n\n const handleError = (event: SyntheticEvent<HTMLImageElement>) => {\n onError?.(event)\n // Uma única nova tentativa com o fallbackSrc antes de mostrar o substituto.\n if (fallbackSrc && currentSrc !== fallbackSrc) {\n setCurrentSrc(fallbackSrc)\n setState('loading')\n return\n }\n setState('error')\n }\n\n const width = toNumber(rest.width)\n const height = toNumber(rest.height)\n const aspectRatio = ratio ?? (width && height ? `${width} / ${height}` : undefined)\n const decorative = alt === ''\n\n const frameStyle: CSSProperties = { aspectRatio: aspectRatio === undefined ? undefined : String(aspectRatio) }\n\n const frame = (\n <div\n className={cx(\n 'or-image',\n `or-image--${fit}`,\n aspectRatio === undefined && 'or-image--auto',\n bordered && 'or-image--bordered',\n !caption && className,\n )}\n data-state={state}\n style={caption ? frameStyle : { ...frameStyle, ...style }}\n >\n {state === 'loading' && <Skeleton variant=\"rect\" className=\"or-image__skeleton\" />}\n {currentSrc && (\n <img\n ref={mergeRefs(ref, imgRef)}\n loading={loading}\n decoding={decoding}\n {...rest}\n src={currentSrc}\n alt={alt}\n className=\"or-image__img\"\n style={position ? { objectPosition: position } : undefined}\n hidden={state === 'error'}\n onLoad={handleLoad}\n onError={handleError}\n />\n )}\n {state === 'error' && (\n <div className=\"or-image__fallback\" aria-hidden={fallback === undefined && decorative ? true : undefined}>\n {fallback ?? (\n <>\n <Icon name=\"image\" size=\"lg\" />\n {!decorative && <VisuallyHidden>{t('imageUnavailable', { alt })}</VisuallyHidden>}\n </>\n )}\n </div>\n )}\n </div>\n )\n\n if (!caption) return frame\n\n return (\n <figure className={cx('or-image-figure', className)} style={style}>\n {frame}\n <figcaption className=\"or-image__caption\">{caption}</figcaption>\n </figure>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type FocusEvent,\n type HTMLAttributes,\n type InputHTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { Button } from '../Button'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport '../Field/Field.css'\nimport './InlineEdit.css'\n\nexport type InlineEditSize = 'sm' | 'md' | 'lg'\n\nexport interface InlineEditProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** Nome do campo, usado nos nomes acessíveis (\"Editar <label>: <valor>\"). */\n label: string\n /** Mostra o rótulo acima do valor (estilo eyebrow). */\n showLabel?: boolean\n /** Valor salvo (controlado). */\n value?: string\n /** Valor inicial (não controlado). */\n defaultValue?: string\n /**\n * Chamado ao salvar (Enter, sair do campo ou botão Salvar) com o novo\n * valor. Pode retornar uma Promise: o campo mostra o carregamento e, se ela\n * for rejeitada, continua em edição exibindo o erro.\n */\n onSave?: (value: string) => void | Promise<void>\n /** Chamado quando a edição é cancelada (Escape ou botão Cancelar). */\n onCancel?: () => void\n /** Retorna uma mensagem de erro para impedir o salvamento. */\n validate?: (value: string) => string | null | undefined\n /** Texto exibido quando não há valor (\"Adicionar descrição\"). */\n placeholder?: string\n /** Mostra botões Salvar/Cancelar durante a edição. */\n showButtons?: boolean\n /** Salva ao tirar o foco do campo. Padrão: `true`. */\n saveOnBlur?: boolean\n disabled?: boolean\n /** Altura: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: InlineEditSize\n /** Atributos extras do `<input>` (maxLength, type, inputMode…). */\n inputProps?: Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange'>\n}\n\ntype SaveSource = 'enter' | 'blur' | 'button'\n\n/**\n * Edição no lugar: o valor aparece como texto clicável e vira um campo ao\n * ser ativado. Enter ou sair do campo salva, Escape cancela.\n */\nexport const InlineEdit = forwardRef<HTMLDivElement, InlineEditProps>(function InlineEdit(\n {\n label,\n showLabel = false,\n value: valueProp,\n defaultValue = '',\n onSave,\n onCancel,\n validate,\n placeholder,\n showButtons = false,\n saveOnBlur = true,\n disabled = false,\n size = 'md',\n inputProps,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const baseId = useId('or-inline-edit')\n const inputId = `${baseId}-input`\n const labelId = `${baseId}-label`\n const errorId = `${baseId}-error`\n\n const [value, setValue] = useControllableState({ value: valueProp, defaultValue })\n const [editing, setEditing] = useState(false)\n const [draft, setDraft] = useState(value)\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n // Motion: só anima a troca leitura ↔ edição depois da primeira interação\n // (nada se move no carregamento da página).\n const [interacted, setInteracted] = useState(false)\n // Flash de sucesso no valor recém-salvo.\n const [flash, setFlash] = useState(false)\n // Cada tentativa de salvar com erro faz o campo tremer de novo.\n const [errorCount, setErrorCount] = useState(0)\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const displayRef = useRef<HTMLButtonElement>(null)\n const focusDisplayRef = useRef(false)\n const savingRef = useRef(false)\n const editingRef = useRef(false)\n editingRef.current = editing\n const mountedRef = useRef(true)\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n useEffect(() => {\n if (editing) {\n inputRef.current?.focus()\n inputRef.current?.select()\n } else if (focusDisplayRef.current) {\n focusDisplayRef.current = false\n displayRef.current?.focus()\n }\n }, [editing])\n\n const startEditing = () => {\n if (disabled) return\n setDraft(value)\n setError(null)\n setErrorCount(0)\n setFlash(false)\n setInteracted(true)\n setEditing(true)\n }\n\n const finish = (source: SaveSource) => {\n editingRef.current = false\n focusDisplayRef.current = source !== 'blur'\n setEditing(false)\n setError(null)\n }\n\n const cancel = () => {\n if (savingRef.current) return\n setDraft(value)\n editingRef.current = false\n focusDisplayRef.current = true\n setFlash(false)\n setEditing(false)\n setError(null)\n onCancel?.()\n }\n\n const save = async (source: SaveSource) => {\n if (savingRef.current) return\n const next = draft\n const validationError = validate?.(next)\n if (validationError) {\n setError(validationError)\n setErrorCount((count) => count + 1)\n if (source !== 'blur') inputRef.current?.focus()\n return\n }\n if (next === value) {\n finish(source)\n return\n }\n try {\n const result = onSave?.(next)\n if (result && typeof (result as Promise<void>).then === 'function') {\n savingRef.current = true\n setSaving(true)\n await result\n }\n if (!mountedRef.current) return\n setValue(next)\n setFlash(true)\n finish(source)\n } catch (reason) {\n if (!mountedRef.current) return\n setError(reason instanceof Error && reason.message ? reason.message : t('saveFailed'))\n setErrorCount((count) => count + 1)\n if (source !== 'blur') requestAnimationFrame(() => inputRef.current?.focus())\n } finally {\n savingRef.current = false\n if (mountedRef.current) setSaving(false)\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n inputProps?.onKeyDown?.(event)\n if (event.defaultPrevented) return\n if (event.key === 'Enter') {\n event.preventDefault()\n void save('enter')\n } else if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n cancel()\n }\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n inputProps?.onBlur?.(event)\n // Foco indo para os botões Salvar/Cancelar do próprio componente: não salva.\n if (rootRef.current?.contains(event.relatedTarget as Node | null)) return\n if (saveOnBlur && editingRef.current) void save('blur')\n }\n\n const shown = value || placeholder || ''\n const accessibleName = t('editValue', { label, value: value || placeholder || t('emptyValue') })\n\n return (\n <div\n ref={mergeRefs(rootRef, ref)}\n className={cx(\n 'or-inline-edit',\n `or-inline-edit--${size}`,\n interacted && 'or-inline-edit--animated',\n className,\n )}\n data-state={editing ? 'editing' : 'display'}\n data-disabled={disabled || undefined}\n {...rest}\n >\n {showLabel &&\n (editing ? (\n <label id={labelId} htmlFor={inputId} className=\"or-eyebrow or-inline-edit__label\">\n {label}\n </label>\n ) : (\n <span className=\"or-eyebrow or-inline-edit__label\" aria-hidden=\"true\">\n {label}\n </span>\n ))}\n\n {editing ? (\n <div className=\"or-inline-edit__editor\">\n <div\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-inline-edit__frame')}\n data-invalid={error ? true : undefined}\n // Alterna entre duas animações idênticas para repetir o tremor.\n data-shake={errorCount > 0 ? (errorCount % 2 ? 'a' : 'b') : undefined}\n >\n <input\n {...inputProps}\n ref={inputRef}\n id={inputId}\n type={inputProps?.type ?? 'text'}\n className={cx(\n 'or-control-frame__input',\n 'or-inline-edit__input',\n inputProps?.className,\n )}\n value={draft}\n placeholder={inputProps?.placeholder ?? placeholder}\n aria-label={showLabel ? undefined : label}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n aria-busy={saving || undefined}\n readOnly={saving}\n onChange={(event) => {\n setDraft(event.target.value)\n if (error) setError(validate?.(event.target.value) || null)\n }}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n />\n {saving && !showButtons && (\n <span className=\"or-inline-edit__spinner\" aria-hidden=\"true\" />\n )}\n </div>\n {showButtons && (\n <div className=\"or-inline-edit__actions\">\n <Button\n size={size}\n iconOnly\n aria-label={t('save')}\n startIcon={<Icon name=\"check\" />}\n loading={saving}\n loadingText={t('saving')}\n onClick={() => void save('button')}\n />\n <Button\n size={size}\n variant=\"outline\"\n iconOnly\n aria-label={t('cancel')}\n startIcon={<Icon name=\"close\" />}\n disabled={saving}\n onClick={cancel}\n />\n </div>\n )}\n </div>\n ) : (\n <button\n ref={displayRef}\n type=\"button\"\n className={cx('or-inline-edit__display', flash && 'or-inline-edit__display--saved')}\n aria-label={accessibleName}\n disabled={disabled}\n onClick={startEditing}\n >\n <span className=\"or-inline-edit__value\" data-empty={!value || undefined}>\n {shown}\n </span>\n <Icon name=\"edit\" size=\"sm\" className=\"or-inline-edit__icon\" />\n </button>\n )}\n\n {editing && error && (\n <p id={errorId} className=\"or-field__error or-inline-edit__error\">\n <Icon name=\"alert-circle\" size=\"sm\" />\n <span>{error}</span>\n </p>\n )}\n {!showButtons && (\n <VisuallyHidden role=\"status\" aria-live=\"polite\">\n {saving ? t('saving') : ''}\n </VisuallyHidden>\n )}\n </div>\n )\n})\n","import { forwardRef, Fragment, type HTMLAttributes, type ReactNode } from 'react'\nimport { useLocale } from '../../providers'\nimport type { MessageKey } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Kbd.css'\n\nexport type KbdSize = 'sm' | 'md'\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n /**\n * Combinação de teclas: `['Ctrl', 'K']`. Nomes reconhecidos: `Mod` (Ctrl ou\n * ⌘), `Meta`/`Cmd`, `Ctrl`, `Alt`/`Option`, `Shift`, `Enter`, `Backspace`,\n * `Delete`, `Esc`, `Tab`, `Space`, `ArrowUp`/`Down`/`Left`/`Right`.\n */\n keys?: string[]\n /** Separador visual entre as teclas. Padrão: `+`. */\n separator?: ReactNode\n /** Usa os símbolos do macOS (⌘ ⌥ ⇧ ⌃), com rótulos acessíveis. */\n symbols?: boolean\n /** Tamanho: `sm` (20px) ou `md` (24px, padrão). */\n size?: KbdSize\n /**\n * Mostra teclas pressionadas (a tecla \"afunda\"): `true` para todas ou uma\n * lista de nomes (`['Ctrl']`). Útil para demonstrar atalhos.\n */\n pressed?: boolean | string[]\n}\n\ninterface KeyInfo {\n /** Texto visível. */\n text: string\n /** Nome falado (quando o texto é um símbolo). */\n label?: string\n}\n\ntype Resolver = (symbols: boolean, t: (key: MessageKey) => string) => KeyInfo\n\nconst KEYS: Record<string, Resolver> = {\n mod: (s) => (s ? { text: '⌘', label: 'Command' } : { text: 'Ctrl' }),\n meta: (s) => (s ? { text: '⌘', label: 'Command' } : { text: 'Cmd' }),\n ctrl: (s) => (s ? { text: '⌃', label: 'Control' } : { text: 'Ctrl' }),\n alt: (s) => (s ? { text: '⌥', label: 'Option' } : { text: 'Alt' }),\n shift: (s) => (s ? { text: '⇧', label: 'Shift' } : { text: 'Shift' }),\n enter: (s) => (s ? { text: '↵', label: 'Enter' } : { text: 'Enter' }),\n backspace: (s) => (s ? { text: '⌫', label: 'Backspace' } : { text: 'Backspace' }),\n delete: (s) => (s ? { text: '⌦', label: 'Delete' } : { text: 'Delete' }),\n tab: (s) => (s ? { text: '⇥', label: 'Tab' } : { text: 'Tab' }),\n capslock: (s) => (s ? { text: '⇪', label: 'Caps Lock' } : { text: 'Caps Lock' }),\n escape: () => ({ text: 'Esc' }),\n space: (_, t) => ({ text: t('keySpace') }),\n arrowup: (_, t) => ({ text: '↑', label: t('keyArrowUp') }),\n arrowdown: (_, t) => ({ text: '↓', label: t('keyArrowDown') }),\n arrowleft: (_, t) => ({ text: '←', label: t('keyArrowLeft') }),\n arrowright: (_, t) => ({ text: '→', label: t('keyArrowRight') }),\n}\n\nconst ALIASES: Record<string, string> = {\n cmd: 'meta',\n command: 'meta',\n '⌘': 'meta',\n control: 'ctrl',\n option: 'alt',\n opt: 'alt',\n return: 'enter',\n del: 'delete',\n esc: 'escape',\n up: 'arrowup',\n down: 'arrowdown',\n left: 'arrowleft',\n right: 'arrowright',\n ' ': 'space',\n spacebar: 'space',\n}\n\nfunction normalizeKey(name: string): string {\n const lower = name.toLowerCase()\n return ALIASES[lower] ?? lower\n}\n\nfunction resolveKey(name: string, symbols: boolean, t: (key: MessageKey) => string): KeyInfo {\n const resolver = KEYS[normalizeKey(name)]\n if (resolver) return resolver(symbols, t)\n return { text: name.length === 1 ? name.toUpperCase() : name }\n}\n\n/**\n * Representa teclas e atalhos de teclado (`<kbd>`). Use `keys` para\n * combinações; símbolos do macOS ganham nomes acessíveis.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(function Kbd(\n { keys, separator = '+', symbols = false, size = 'md', pressed = false, className, children, ...rest },\n ref,\n) {\n const { t } = useLocale()\n const pressedKeys = Array.isArray(pressed) ? new Set(pressed.map(normalizeKey)) : null\n const isPressed = (name: string) => pressed === true || (pressedKeys?.has(normalizeKey(name)) ?? false)\n\n if (!keys) {\n const single = typeof children === 'string' ? children : ''\n return (\n <kbd\n ref={ref}\n className={cx('or-kbd', 'or-kbd__key', `or-kbd--${size}`, className)}\n data-pressed={isPressed(single) || undefined}\n {...rest}\n >\n {children}\n </kbd>\n )\n }\n\n return (\n <kbd ref={ref} className={cx('or-kbd', 'or-kbd--combo', `or-kbd--${size}`, className)} {...rest}>\n {keys.map((name, index) => {\n const { text, label } = resolveKey(name, symbols, t)\n return (\n <Fragment key={`${name}-${index}`}>\n {index > 0 && separator !== null && separator !== '' && (\n <span className=\"or-kbd__separator\">{separator}</span>\n )}\n {label ? (\n <kbd\n className=\"or-kbd__key or-kbd__key--symbol\"\n title={label}\n data-pressed={isPressed(name) || undefined}\n >\n <span aria-hidden=\"true\">{text}</span>\n <VisuallyHidden>{label}</VisuallyHidden>\n </kbd>\n ) : (\n <kbd className=\"or-kbd__key\" data-pressed={isPressed(name) || undefined}>\n {text}\n </kbd>\n )}\n </Fragment>\n )\n })}\n </kbd>\n )\n})\n","import { forwardRef, useMemo, type CSSProperties, type PointerEvent, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport {\n ChartFigure,\n ChartTooltip,\n LINE_DASHES,\n MARKER_SHAPES,\n colorStyle,\n markerPath,\n useChartExplorer,\n useChartMotion,\n useElementWidth,\n type ChartBaseProps,\n} from '../BarChart/ChartFrame'\nimport {\n VIZ_CATEGORICAL_COUNT,\n createAxisFormatter,\n createValueFormatter,\n crisp,\n extremes,\n formatList,\n niceScale,\n px,\n seriesColor,\n textWidth,\n tickTarget,\n truncate,\n valueOf,\n type ChartDatum,\n type ChartSeries,\n} from '../BarChart/chartUtils'\nimport './LineChart.css'\n\nexport type LineChartSeries = ChartSeries\nexport type LineChartDatum = ChartDatum\n\nexport interface LineChartProps extends ChartBaseProps {\n /** Um ponto do eixo X por entrada (mês, data em texto): `{ label: 'mar', values: { site: 180 } }`. `null` = sem dado (a linha se interrompe). */\n data: LineChartDatum[]\n /** Séries na ordem da legenda. Cada uma ganha cor, traço e marcador próprios. */\n series: LineChartSeries[]\n /** Preenche a área sob a linha (só com uma série). Inclui o zero no eixo. */\n area?: boolean\n /** Escreve o último valor de cada linha no fim dela (quando os rótulos não colidem). Padrão: `true`. */\n endLabels?: boolean\n /** Começa o eixo de valores em zero. Padrão: só com `area`. */\n includeZero?: boolean\n}\n\ninterface Point {\n index: number\n x: number\n y: number\n value: number\n}\n\nconst AXIS_BAND = 28\nconst DEFAULT_HEIGHT = 280\nconst INSET = 12\nconst MARKER_R = 4.5\n\n/**\n * Gráfico de linhas acessível, em SVG puro: evolução no tempo de uma ou mais\n * séries, cada uma com cor, traço e marcador próprios (nunca só a cor). Lacunas\n * (`null`) interrompem a linha. Tabela de dados alternativa e exploração por teclado.\n */\nexport const LineChart = forwardRef<HTMLElement, LineChartProps>(function LineChart(\n {\n title,\n description,\n summary,\n source,\n hideCaption = false,\n variant = 'outline',\n height: heightProp,\n valueFormat,\n categoryLabel,\n defaultShowData,\n data,\n series,\n area = false,\n endLabels = true,\n includeZero,\n ...rest\n },\n ref,\n) {\n const { t, locale } = useLocale()\n const hintId = useId('or-line-chart-hint')\n const maskId = useId('or-line-chart-mask')\n const n = data.length\n const k = series.length\n const format = createValueFormatter(locale, valueFormat)\n const filled = area && k === 1\n\n devWarning(\n area && k > 1,\n 'LineChart: `area` só vale para uma série — áreas sobrepostas escondem umas às outras.',\n )\n devWarning(\n k > VIZ_CATEGORICAL_COUNT && series.slice(VIZ_CATEGORICAL_COUNT).some((s) => !s.color),\n 'LineChart: a paleta categórica tem 5 cores. Agrupe a partir da sexta série em \"Outros\" ou use pequenos múltiplos.',\n )\n\n const colors = series.map((s, i) => seriesColor(s, i))\n const dashes = series.map((_, i) => LINE_DASHES[i % LINE_DASHES.length])\n const shapes = series.map((_, i) => MARKER_SHAPES[i % MARKER_SHAPES.length])\n const values = series.map((s) => data.map((d) => valueOf(d, s.key)))\n const all = values.flat().filter((v): v is number => v !== null)\n const zero = includeZero ?? filled\n\n // --- Geometria ---------------------------------------------------------\n const [plotRef, width] = useElementWidth<HTMLDivElement>()\n const height = Math.max(120, heightProp ?? DEFAULT_HEIGHT)\n const top = 12\n const plotH = Math.max(0, height - top - AXIS_BAND)\n const lo = all.length ? Math.min(...all, ...(zero ? [0] : [])) : 0\n const hi = all.length ? Math.max(...all, ...(zero ? [0] : [])) : 1\n const scale = niceScale(lo, hi, tickTarget(plotH))\n const axisFormat = createAxisFormatter(locale, valueFormat, scale.ticks, scale.step)\n const tickLabels = scale.ticks.map(axisFormat)\n const left = Math.max(...tickLabels.map((l) => textWidth(l))) + 10\n\n const lastIndexOf = (si: number) => {\n for (let i = n - 1; i >= 0; i--) if (values[si][i] !== null) return i\n return -1\n }\n const endLabelText = series.map((_, si) => {\n const li = lastIndexOf(si)\n return endLabels && li === n - 1 ? format(values[si][li] as number) : ''\n })\n const maxEndLabel = Math.max(0, ...endLabelText.map((l) => (l ? textWidth(l) : 0)))\n const lastCategoryHalf = n ? Math.ceil(textWidth(data[n - 1].label) / 2) - INSET : 0\n const right = Math.max(maxEndLabel ? maxEndLabel + 14 : 8, lastCategoryHalf, 8)\n const plotW = Math.max(0, width - left - right)\n const step = n > 1 ? (plotW - INSET * 2) / (n - 1) : 0\n const span = scale.max - scale.min || 1\n\n const x = (index: number) => (n > 1 ? left + INSET + index * step : left + plotW / 2)\n const y = (value: number) => top + ((scale.max - value) / span) * plotH\n const baseValue = scale.min <= 0 && scale.max >= 0 ? 0 : scale.min\n\n const points: (Point | null)[][] = values.map((row) =>\n row.map((value, index) =>\n value === null ? null : { index, value, x: px(x(index)), y: px(y(value)) },\n ),\n )\n /** Trechos contínuos de cada série (`null` interrompe). */\n const runs = points.map((row) => {\n const out: Point[][] = []\n let current: Point[] = []\n for (const p of row) {\n if (p) current.push(p)\n else if (current.length) {\n out.push(current)\n current = []\n }\n }\n if (current.length) out.push(current)\n return out\n })\n const pathOf = (run: Point[]) => run.map((p, j) => `${j ? 'L' : 'M'}${p.x} ${p.y}`).join('')\n const markersEverywhere = n <= 1 || step >= 18\n\n // --- Exploração (teclado e ponteiro) -----------------------------------\n const describe = (index: number, si: number) => {\n const value = values[si]?.[index]\n return t('chartPoint', {\n category: data[index].label,\n series: series[si].label,\n value: value === null || value === undefined ? t('chartNoData') : format(value),\n })\n }\n const explorer = useChartExplorer({\n count: n,\n seriesCount: k,\n keys: { next: 'ArrowRight', prev: 'ArrowLeft', seriesNext: 'ArrowDown', seriesPrev: 'ArrowUp' },\n describe,\n })\n const { active, last } = explorer\n\n const onPointer = (event: PointerEvent<SVGSVGElement>) => {\n if (!n) return\n const box = event.currentTarget.getBoundingClientRect()\n const cx0 = event.clientX - box.left\n const cy0 = event.clientY - box.top\n if (cx0 < left || cx0 > left + plotW || cy0 < 0 || cy0 > top + plotH + AXIS_BAND) {\n explorer.handlers.onPointerLeave()\n return\n }\n // A cruz encontra o X: o ponteiro só precisa estar perto da data, não da linha.\n const index =\n n > 1 ? Math.max(0, Math.min(n - 1, Math.round((cx0 - left - INSET) / (step || 1)))) : 0\n let si = 0\n let best = Infinity\n points.forEach((row, s) => {\n const p = row[index]\n if (p && Math.abs(p.y - cy0) < best) {\n best = Math.abs(p.y - cy0)\n si = s\n }\n })\n explorer.point(index, si)\n }\n\n // --- Movimento ----------------------------------------------------------\n const [motionRef, motion] = useChartMotion<HTMLElement>()\n const rootRef = useMemo(() => mergeRefs(ref, motionRef), [ref, motionRef])\n const animated = motion !== 'static'\n\n // --- Textos acessíveis -------------------------------------------------\n const autoSummary = () => {\n const parts = [t('chartRange', { first: data[0].label, last: data[n - 1].label })]\n if (k > 1)\n parts.push(\n t('chartSeries', {\n series: formatList(\n locale,\n series.map((s) => s.label),\n ),\n }),\n )\n const ext = extremes(data, series)\n if (ext) {\n parts.push(t('chartHighest', { value: describe(ext.max.index, ext.max.series) }))\n parts.push(t('chartLowest', { value: describe(ext.min.index, ext.min.series) }))\n }\n return parts.join(' ')\n }\n const label = [t('chartLineLabel', { title }), summary ?? (n ? autoSummary() : t('chartEmpty'))]\n .filter(Boolean)\n .join('. ')\n\n // --- Rótulos no fim das linhas: sem empilhar; quem colide fica para a legenda e a dica.\n const placed: number[] = []\n const endLabelY = series.map((_, si) => {\n const text = endLabelText[si]\n const p = text ? points[si][n - 1] : null\n if (!p || placed.some((yy) => Math.abs(yy - p.y) < 14)) return null\n placed.push(p.y)\n return p.y\n })\n\n // --- Dica ---------------------------------------------------------------\n let tooltip: ReactNode = null\n if (last && last.index < n && last.series < k) {\n const index = last.index\n const ys = points.map((row) => row[index]?.y).filter((v): v is number => v !== undefined)\n tooltip = (\n <ChartTooltip\n open={active !== null}\n x={x(index)}\n y={ys.length ? Math.min(...ys) - 6 : top + plotH / 2}\n width={width}\n title={data[index].label}\n rows={series.map((s, si) => ({\n key: s.key,\n label: s.label,\n value:\n values[si][index] === null ? t('chartNoData') : format(values[si][index] as number),\n color: colors[si],\n active: k > 1 && si === last.series,\n }))}\n />\n )\n }\n\n // --- Eixo X: rótulos espaçados para não se encostarem.\n const maxCategory = Math.max(0, ...data.map((d) => textWidth(d.label)))\n const every = n > 1 ? Math.max(1, Math.ceil((maxCategory + 10) / (step || 1))) : 1\n // O ritmo parte do último ponto (o período mais recente sempre tem rótulo).\n const showCategory = (index: number) => (n - 1 - index) % every === 0\n\n return (\n <ChartFigure\n ref={rootRef}\n title={title}\n description={description}\n source={source}\n hideCaption={hideCaption}\n variant={variant}\n motion={motion}\n legend={series.map((s, i) => ({\n label: s.label,\n color: colors[i],\n mark: 'line' as const,\n dash: dashes[i],\n shape: shapes[i],\n }))}\n table={{\n categoryLabel: categoryLabel ?? t('chartCategory'),\n columns: series.map((s) => s.label),\n rows: data.map((datum, index) => ({\n label: datum.label,\n cells: values.map((row) => row[index]),\n })),\n format,\n }}\n announcement={explorer.announcement}\n hintId={n ? hintId : undefined}\n defaultShowData={defaultShowData}\n {...rest}\n className={cx('or-line-chart', rest.className)}\n >\n <div ref={plotRef} className=\"or-chart__plot\" style={{ height }}>\n {n === 0 ? (\n <p className=\"or-chart__empty\">{t('chartEmpty')}</p>\n ) : (\n // O SVG é a imagem do gráfico (role=\"img\" + resumo, como na diretriz) e também a área\n // explorável pelo teclado: Tab foca, setas movem o destaque, Escape limpa.\n <svg\n className=\"or-chart__svg\"\n width={width}\n height={height}\n role=\"img\"\n aria-label={label}\n aria-describedby={hintId}\n tabIndex={0}\n onKeyDown={explorer.handlers.onKeyDown}\n onBlur={explorer.handlers.onBlur}\n onPointerMove={onPointer}\n onPointerDown={onPointer}\n onPointerLeave={explorer.handlers.onPointerLeave}\n >\n {animated && (\n <defs>\n {/* Desenho da linha: uma máscara com stroke-dashoffset revela cada série (contínua ou tracejada). */}\n {runs.map((seriesRuns, si) => (\n <mask\n key={si}\n id={`${maskId}-${si}`}\n maskUnits=\"userSpaceOnUse\"\n x={-INSET}\n y={-INSET}\n width={width + INSET * 2}\n height={height + INSET * 2}\n >\n <path\n className=\"or-line-chart__draw or-chart__anim\"\n d={pathOf(seriesRuns.flat())}\n pathLength={1}\n style={{ '--_s': si } as CSSProperties}\n />\n </mask>\n ))}\n </defs>\n )}\n\n {/* Grade e rótulos do eixo de valores */}\n <g className=\"or-line-chart__axis\">\n {scale.ticks.map((tick, i) => (\n <g key={tick}>\n <line\n className={tick === baseValue ? 'or-chart__baseline' : 'or-chart__grid'}\n x1={left}\n x2={left + plotW}\n y1={crisp(y(tick))}\n y2={crisp(y(tick))}\n />\n <text\n className=\"or-chart__tick\"\n x={left - 8}\n y={px(y(tick))}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n >\n {tickLabels[i]}\n </text>\n </g>\n ))}\n {data.map((datum, index) =>\n showCategory(index) ? (\n <text\n key={`${datum.label}-${index}`}\n className=\"or-chart__tick or-line-chart__category\"\n x={px(x(index))}\n y={px(top + plotH + 18)}\n textAnchor=\"middle\"\n >\n {truncate(datum.label, Math.max(step * every - 4, 24))}\n </text>\n ) : null,\n )}\n </g>\n\n {/* Cruz vertical no X em destaque: desliza com --or-duration-fast */}\n {last && last.index < n && (\n <line\n className=\"or-line-chart__crosshair\"\n data-state={active ? 'open' : 'closed'}\n x1={0.5}\n x2={0.5}\n y1={top}\n y2={top + plotH}\n style={{ transform: `translateX(${Math.round(x(last.index))}px)` }}\n />\n )}\n\n {/* Área (uma série) */}\n {filled &&\n runs[0].map((run, ri) => {\n const base = px(y(baseValue))\n const d = `${pathOf(run)}L${run[run.length - 1].x} ${base}L${run[0].x} ${base}Z`\n return (\n <path\n key={ri}\n className=\"or-line-chart__area or-chart__anim\"\n d={d}\n style={colorStyle(colors[0])}\n />\n )\n })}\n\n {/* Linhas e marcadores */}\n {series.map((s, si) => (\n <g\n key={s.key}\n className=\"or-line-chart__series\"\n data-series={s.key}\n data-emphasis={\n active && k > 1 ? (si === active.series ? 'active' : 'muted') : undefined\n }\n style={{ ...colorStyle(colors[si]), '--_s': si } as CSSProperties}\n >\n {runs[si].map((run, ri) =>\n run.length > 1 ? (\n <path\n key={ri}\n className=\"or-line-chart__line\"\n d={pathOf(run)}\n strokeDasharray={dashes[si] || undefined}\n mask={animated ? `url(#${maskId}-${si})` : undefined}\n />\n ) : null,\n )}\n {points[si].map((p, index) => {\n if (!p) return null\n const isolated = !points[si][index - 1] && !points[si][index + 1]\n const isActive = active?.index === index\n const isEnd = index === lastIndexOf(si)\n if (!markersEverywhere && !isolated && !isActive && !isEnd) return null\n return (\n <path\n key={index}\n className=\"or-line-chart__marker or-chart__anim\"\n data-active={isActive || undefined}\n d={markerPath(shapes[si], p.x, p.y, isActive ? MARKER_R + 1.5 : MARKER_R)}\n style={\n {\n '--_t': n > 1 ? Math.round((index / (n - 1)) * 100) / 100 : 0,\n } as CSSProperties\n }\n />\n )\n })}\n </g>\n ))}\n\n {/* Rótulo direto: o último valor, na cor do texto */}\n {series.map((s, si) => {\n const yy = endLabelY[si]\n if (yy === null) return null\n return (\n <text\n key={s.key}\n className=\"or-chart__value or-line-chart__end-label or-chart__anim\"\n x={px(x(n - 1) + MARKER_R + 6)}\n y={yy}\n dominantBaseline=\"middle\"\n >\n {endLabelText[si]}\n </text>\n )\n })}\n </svg>\n )}\n {tooltip}\n </div>\n </ChartFigure>\n )\n})\n","import {\n forwardRef,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type ElementType,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Link.css'\n\nexport type LinkVariant = 'default' | 'subtle' | 'standalone'\n\n/**\n * Props entregues a uma função `renderLink` (Breadcrumb, SideNav, AppHeader,\n * BottomNavigation…). Repasse-as ao link do seu roteador:\n * `renderLink={({ href, ...props }) => <RouterLink to={href} {...props} />}`.\n */\nexport type RenderLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string\n children?: ReactNode\n}\n\n/** Renderiza um link customizado (ex.: o `Link` do React Router ou do Next.js). */\nexport type RenderLink = (props: RenderLinkProps) => ReactNode\n\ninterface LinkOwnProps {\n /** Estilo visual. `standalone` é para links isolados, fora de um parágrafo. */\n variant?: LinkVariant\n /**\n * Link para outro site: abre em nova aba (`target=\"_blank\"`,\n * `rel=\"noopener noreferrer\"`), mostra o ícone ↗ e avisa leitores de tela.\n */\n external?: boolean\n /**\n * Componente renderizado no lugar do `<a>` — use para integrar com roteadores:\n * `<Link as={RouterLink} to=\"/conta\">`.\n */\n as?: ElementType\n children?: ReactNode\n className?: string\n}\n\nexport type LinkProps<C extends ElementType = 'a'> = LinkOwnProps &\n Omit<ComponentPropsWithoutRef<C>, keyof LinkOwnProps> & { as?: C }\n\n/** Gera as classes do link — útil para estilizar o link de um roteador. */\nexport function linkClassName({ variant = 'default' }: { variant?: LinkVariant } = {}) {\n return cx('or-link', `or-link--${variant}`)\n}\n\nfunction LinkImpl(\n { as: Component = 'a', variant = 'default', external = false, className, children, target, rel, ...rest }: LinkProps<ElementType>,\n ref: Ref<HTMLAnchorElement>,\n) {\n const { t } = useLocale()\n const showArrow = variant === 'standalone' && !external\n return (\n <Component\n ref={ref}\n className={cx(linkClassName({ variant }), external && 'or-link--external', className)}\n target={external ? (target ?? '_blank') : target}\n rel={external ? cx('noopener noreferrer', rel as string) : rel}\n {...rest}\n >\n <span className=\"or-link__label\">{children}</span>\n {external && (\n <>\n <Icon name=\"arrow-up-right\" className=\"or-link__icon or-link__icon--external\" />\n <VisuallyHidden> {t('opensInNewTab')}</VisuallyHidden>\n </>\n )}\n {showArrow && <Icon name=\"arrow-right\" className=\"or-link__icon or-link__icon--arrow\" />}\n </Component>\n )\n}\n\n/**\n * Links levam a outra página ou a outro ponto da página. Para disparar\n * ações (salvar, abrir um diálogo), use `Button`.\n *\n * Polimórfico: `as` aceita o link do seu roteador.\n */\nexport const Link = forwardRef(LinkImpl) as (<C extends ElementType = 'a'>(\n props: LinkProps<C> & { ref?: Ref<HTMLAnchorElement> },\n) => ReactElement | null) & { displayName?: string }\n\nLink.displayName = 'Link'\n","import { useEffect, useState } from 'react'\nimport { useInView, useIsomorphicLayoutEffect, useReducedMotion } from '../../hooks'\n\nexport type StaggerRevealState = 'idle' | 'hidden' | 'shown'\n\n/**\n * Uso interno (List, Timeline): com `enabled`, esconde os itens antes da\n * primeira pintura e os revela quando o contêiner entra na viewport. O CSS de\n * cada componente escalona os filhos com `--or-stagger`. Com movimento\n * reduzido, nada é escondido (`idle`). Opacidade não remove o conteúdo da\n * árvore de acessibilidade: leitores de tela leem tudo desde o início.\n */\nexport function useStaggerReveal<T extends HTMLElement>(enabled: boolean) {\n const reduced = useReducedMotion()\n const [viewRef, inView] = useInView<T>({ once: true })\n const [state, setState] = useState<StaggerRevealState>('idle')\n\n useIsomorphicLayoutEffect(() => {\n setState(enabled && !reduced ? 'hidden' : 'idle')\n }, [enabled, reduced])\n\n useEffect(() => {\n if (!inView || state !== 'hidden') return\n // Um quadro com o estado escondido já pintado garante que a transição rode.\n const raf = requestAnimationFrame(() => setState('shown'))\n return () => cancelAnimationFrame(raf)\n }, [inView, state])\n\n return { ref: viewRef, state: enabled ? state : ('idle' as StaggerRevealState) }\n}\n","import {\n createContext,\n forwardRef,\n useContext,\n useMemo,\n type CSSProperties,\n type HTMLAttributes,\n type LiHTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { cx, mergeRefs } from '../../utils'\nimport { useStaggerReveal } from './useStaggerReveal'\nimport './List.css'\n\nexport type ListVariant = 'bullet' | 'numbered' | 'icon' | 'divided' | 'inline' | 'plain'\nexport type ListSize = 'sm' | 'md' | 'lg'\n\nexport interface ListProps extends HTMLAttributes<HTMLElement> {\n /**\n * `bullet` (marcador quadrado laranja), `numbered` (\"01\", \"02\"…), `icon`\n * (ícone por item), `divided` (linhas entre itens), `inline` (itens na mesma\n * linha separados por \"·\") ou `plain` (sem marcador). Padrão: `bullet`.\n */\n variant?: ListVariant\n /** Elemento da lista. Padrão: `ol` para `numbered`, `ul` para as demais. */\n as?: 'ul' | 'ol'\n /** Tamanho do texto e do espaçamento entre itens. Padrão: `md`. */\n size?: ListSize\n /** Número inicial da variante `numbered`. Padrão: `1`. */\n start?: number\n /** Ícone padrão dos itens na variante `icon` (cada `ListItem` pode sobrescrever). */\n icon?: ReactNode\n /**\n * Os itens entram escalonados (subindo 24px, 80ms entre eles) quando a lista\n * aparece na tela. Para listas de destaque em páginas de apresentação.\n */\n animated?: boolean\n}\n\ninterface ListContextValue {\n variant: ListVariant\n icon?: ReactNode\n}\n\nconst ListContext = createContext<ListContextValue>({ variant: 'bullet' })\n\n/**\n * Lista de itens com marcadores do Orange. Use `ul` quando a ordem não importa\n * e `numbered` (`ol`) para passos e rankings.\n */\nexport const List = forwardRef<HTMLElement, ListProps>(function List(\n { variant = 'bullet', as, size = 'md', start, icon, animated = false, className, style, children, ...rest },\n ref,\n) {\n const reveal = useStaggerReveal<HTMLElement>(animated)\n const composedRef = useMemo(() => mergeRefs(ref, reveal.ref), [ref, reveal.ref])\n const Component = as ?? (variant === 'numbered' ? 'ol' : 'ul')\n const isOrdered = Component === 'ol'\n const counterStyle: CSSProperties | undefined =\n variant === 'numbered' ? { counterReset: `or-list ${(start ?? 1) - 1}`, ...style } : style\n\n return (\n <ListContext.Provider value={{ variant, icon }}>\n <Component\n ref={composedRef as Ref<HTMLUListElement & HTMLOListElement>}\n // `list-style: none` remove a semântica de lista no Safari/VoiceOver;\n // o papel explícito a restaura.\n role=\"list\"\n className={cx('or-list', `or-list--${variant}`, `or-list--${size}`, className)}\n start={isOrdered ? start : undefined}\n style={counterStyle}\n data-reveal={reveal.state === 'idle' ? undefined : reveal.state}\n {...rest}\n >\n {children}\n </Component>\n </ListContext.Provider>\n )\n})\n\nexport interface ListItemProps extends LiHTMLAttributes<HTMLLIElement> {\n /** Texto secundário exibido abaixo do conteúdo principal. */\n description?: ReactNode\n /** Ícone do item (variante `icon`). Sobrescreve o `icon` da `List`. */\n icon?: ReactNode\n}\n\n/** Item de `List`. Aceita uma descrição secundária opcional. */\nexport const ListItem = forwardRef<HTMLLIElement, ListItemProps>(function ListItem(\n { description, icon, className, children, ...rest },\n ref,\n) {\n const { variant, icon: listIcon } = useContext(ListContext)\n const itemIcon = icon ?? listIcon\n const showIcon = variant === 'icon' && itemIcon !== undefined && itemIcon !== null\n\n return (\n <li ref={ref} className={cx('or-list__item', className)} {...rest}>\n {showIcon && (\n <span className=\"or-list__icon\" aria-hidden=\"true\">\n {itemIcon}\n </span>\n )}\n <div className=\"or-list__content\">\n {description !== undefined && description !== null ? (\n <>\n <div className=\"or-list__label\">{children}</div>\n <div className=\"or-list__description\">{description}</div>\n </>\n ) : (\n children\n )}\n </div>\n </li>\n )\n})\n","import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport { Field, useField, useFieldControlProps } from '../Field'\nimport { useErrorShake } from '../TextField/useErrorShake'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport '../TextField/FormMotion.css'\nimport './Listbox.css'\n\nexport type ListboxSelectionMode = 'single' | 'multiple'\nexport type ListboxOrientation = 'vertical' | 'horizontal'\n\n/** Opção da prop `options` (alternativa a `<ListboxOption>`). */\nexport interface ListboxItem {\n /** Valor da opção (único na lista). É o que vai para `onChange` e para o formulário. */\n value: string\n /** Rótulo visível (nome acessível da opção). */\n label: ReactNode\n /** Texto secundário abaixo do rótulo, ligado por `aria-describedby`. */\n description?: ReactNode\n /** Focável, mas não pode ser selecionada. */\n disabled?: boolean\n /** Ícone decorativo antes do rótulo. */\n icon?: ReactNode\n}\n\n/** Grupo da prop `options` (alternativa a `<ListboxGroup>`). */\nexport interface ListboxItemGroup {\n /** Título do grupo. */\n label: ReactNode\n options: ListboxItem[]\n}\n\ninterface ListboxBaseProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue' | 'children'> {\n /** Rótulo visível do campo. Sem rótulo, informe `aria-label` ou `aria-labelledby`. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda abaixo do rótulo, ligado por `aria-describedby`. */\n description?: ReactNode\n /** Mensagem de erro. Quando presente, a lista fica inválida (borda vermelha + tremor). */\n error?: ReactNode\n /** Marca a lista como inválida sem exibir mensagem. */\n invalid?: boolean\n /** Mostra `*` no rótulo e expõe `aria-required`. A validação fica com o formulário. */\n required?: boolean\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n /** Desabilita a lista inteira: sai da ordem de Tab e não envia valores. */\n disabled?: boolean\n /** Envia um `<input type=\"hidden\">` por valor selecionado (para `Form` e formulários nativos). */\n name?: string\n /** Disposição das opções. `horizontal` troca ↑/↓ por ←/→. Padrão: `vertical`. */\n orientation?: ListboxOrientation\n /** Altura máxima (número em px ou valor CSS). A lista rola por dentro e mantém a opção ativa visível. */\n maxHeight?: number | string\n /**\n * Só no modo `single`: mover o foco com as setas, Home/End ou a digitação\n * também seleciona a opção. Padrão: `false`.\n */\n selectionFollowsFocus?: boolean\n /** Opções geradas a partir de dados. Alternativa a passar `<ListboxOption>` como filhos. */\n options?: Array<ListboxItem | ListboxItemGroup>\n /** `<ListboxOption>` e `<ListboxGroup>`. */\n children?: ReactNode\n}\n\nexport interface ListboxSingleProps extends ListboxBaseProps {\n /** `single` (padrão): uma opção por vez. `multiple`: várias, com `aria-multiselectable`. */\n selectionMode?: 'single'\n /** Valor selecionado (controlado). `null` = nada selecionado. */\n value?: string | null\n /** Valor inicial (não controlado). */\n defaultValue?: string | null\n /** Chamado com o novo valor selecionado. */\n onChange?: (value: string | null) => void\n}\n\nexport interface ListboxMultipleProps extends ListboxBaseProps {\n selectionMode: 'multiple'\n /** Valores selecionados (controlado), na ordem das opções. */\n value?: string[]\n /** Valores iniciais (não controlado). */\n defaultValue?: string[]\n /** Chamado com a nova lista de valores, na ordem das opções. */\n onChange?: (value: string[]) => void\n}\n\nexport type ListboxProps = ListboxSingleProps | ListboxMultipleProps\n\nexport interface ListboxOptionProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'id'> {\n /** Valor da opção (único na lista). */\n value: string\n /** Rótulo visível (nome acessível da opção). */\n children: ReactNode\n /** Texto secundário abaixo do rótulo, ligado por `aria-describedby`. */\n description?: ReactNode\n /** A opção continua focável (o leitor de tela a anuncia), mas não pode ser selecionada. */\n disabled?: boolean\n /** Ícone decorativo antes do rótulo. */\n icon?: ReactNode\n}\n\nexport interface ListboxGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Título do grupo, que nomeia o `role=\"group\"`. */\n label: ReactNode\n /** As `<ListboxOption>` do grupo. */\n children?: ReactNode\n}\n\n/* -------------------------------------------------------------------------- */\n/* Contexto e helpers internos */\n/* -------------------------------------------------------------------------- */\n\ninterface ListboxContextValue {\n baseId: string\n multiple: boolean\n selected: ReadonlySet<string>\n activeValue: string | null\n}\n\nconst ListboxContext = createContext<ListboxContextValue | null>(null)\n\nconst EMPTY: string[] = []\nconst TYPEAHEAD_TIMEOUT = 500\n\n/** Id de DOM estável de uma opção (usado por `aria-activedescendant`), a partir do valor. */\nfunction optionDomId(baseId: string, value: string) {\n // Mantém letras, dígitos e hífens; o resto vira _<código>_ (injetivo, sem espaços).\n const safe = Array.from(value, (char) => (/[A-Za-z0-9-]/.test(char) ? char : `_${char.codePointAt(0)!.toString(36)}_`))\n return `${baseId}-option-${safe.join('')}`\n}\n\n/** Remove acentos e caixa para a busca por digitação (\"são\" casa com \"Sao\"). */\nfunction normalizeText(text: string) {\n return text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n}\n\nfunction hasContent(node: ReactNode) {\n return node !== undefined && node !== null && node !== false && node !== ''\n}\n\nfunction isGroup(item: ListboxItem | ListboxItemGroup): item is ListboxItemGroup {\n return Array.isArray((item as ListboxItemGroup).options)\n}\n\nfunction sameValues(a: readonly string[], b: readonly string[]) {\n return a.length === b.length && a.every((v, i) => v === b[i])\n}\n\ninterface OptionNode {\n value: string\n disabled: boolean\n text: string\n el: HTMLElement\n}\n\n/* -------------------------------------------------------------------------- */\n/* Listbox */\n/* -------------------------------------------------------------------------- */\n\ntype ControlProps = Omit<ListboxBaseProps, 'label' | 'hideLabel' | 'description' | 'error' | 'optional' | 'className'> & {\n listboxRef: Ref<HTMLDivElement>\n hasLabel: boolean\n selectionMode?: ListboxSelectionMode\n value?: string | string[] | null\n defaultValue?: string | string[] | null\n onChange?: (value: string | string[] | null) => void\n}\n\nfunction ListboxControl({\n listboxRef,\n hasLabel,\n selectionMode = 'single',\n value: valueProp,\n defaultValue,\n onChange,\n selectionFollowsFocus = false,\n orientation = 'vertical',\n maxHeight,\n invalid,\n required,\n disabled,\n name,\n options,\n children,\n style,\n tabIndex,\n onKeyDown,\n onFocus,\n onBlur,\n onMouseDown,\n onMouseUp,\n onClick,\n onAnimationEnd,\n 'aria-describedby': ariaDescribedBy,\n 'aria-labelledby': ariaLabelledBy,\n ...rest\n}: ControlProps) {\n const { t } = useLocale()\n const field = useField()\n const controlProps = useFieldControlProps({\n required,\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': ariaDescribedBy,\n })\n const baseId = useId('or-listbox', controlProps.id)\n const multiple = selectionMode === 'multiple'\n const horizontal = orientation === 'horizontal'\n const isDisabled = Boolean(controlProps.disabled)\n const isInvalid = controlProps['aria-invalid'] === true\n const labelledBy = ariaLabelledBy ?? (hasLabel && field ? field.labelId : undefined)\n\n devWarning(\n !labelledBy && !rest['aria-label'],\n 'Listbox sem `label` precisa de `aria-label` ou `aria-labelledby`.',\n )\n\n const [raw, setRaw] = useControllableState<string | string[] | null>({\n value: valueProp,\n defaultValue: defaultValue !== undefined ? defaultValue : multiple ? EMPTY : null,\n onChange,\n })\n const selectedValues = useMemo<string[]>(\n () => (Array.isArray(raw) ? raw : raw === null || raw === undefined ? EMPTY : [raw]),\n [raw],\n )\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues])\n\n const listboxEl = useRef<HTMLDivElement>(null)\n const mergedRef = useMemo(() => mergeRefs(listboxRef, listboxEl), [listboxRef])\n\n // Opção ativa (\"foco virtual\" via aria-activedescendant). Só existe enquanto a lista tem foco.\n const [activeValue, setActiveState] = useState<string | null>(null)\n const activeRef = useRef<string | null>(null)\n // Última opção marcada sem Shift (âncora de Shift+Espaço / Shift+clique).\n const anchorRef = useRef<string | null>(null)\n // Extensão em andamento (Shift+setas, Shift+Espaço…): âncora + seleção de quando ela começou.\n const rangeRef = useRef<{ anchor: string; base: string[] } | null>(null)\n // Foco vindo de um clique: a opção clicada vira a ativa, sem rolar a lista sob o cursor.\n const pointerRef = useRef<{ value: string | null } | null>(null)\n const typeahead = useRef<{ buffer: string; timer?: ReturnType<typeof setTimeout> }>({ buffer: '' })\n\n const [announcement, setAnnouncement] = useState('')\n const { shakeClassName, onAnimationEnd: onShakeEnd } = useErrorShake(isInvalid)\n\n /** Opções na ordem do DOM (inclui as de grupos), lidas na hora do evento. */\n const getItems = (): OptionNode[] => {\n const root = listboxEl.current\n if (!root) return []\n return Array.from(root.querySelectorAll<HTMLElement>('[role=\"option\"]'))\n .filter((el) => el.closest('[role=\"listbox\"]') === root)\n .map((el) => ({\n value: el.dataset.value ?? '',\n disabled: el.getAttribute('aria-disabled') === 'true',\n text: (el.querySelector('.or-listbox-option__label')?.textContent ?? el.textContent ?? '').trim(),\n el,\n }))\n }\n\n const scrollToOption = (el: HTMLElement) => {\n // Primeira opção de um grupo: mostra também o título do grupo.\n const group = el.parentElement?.closest<HTMLElement>('[role=\"group\"]')\n if (group && group.querySelector('[role=\"option\"]') === el) {\n group.querySelector<HTMLElement>('.or-listbox-group__label')?.scrollIntoView?.({ block: 'nearest', inline: 'nearest' })\n }\n el.scrollIntoView?.({ block: 'nearest', inline: 'nearest' })\n }\n\n const setActive = (item: OptionNode | null, scroll: boolean) => {\n activeRef.current = item?.value ?? null\n setActiveState(item?.value ?? null)\n if (item && scroll) scrollToOption(item.el)\n }\n\n const announceCount = (count: number) => {\n const text =\n count === 0\n ? t('listboxSelectedNone')\n : count === 1\n ? t('listboxSelectedCountOne')\n : t('listboxSelectedCount', { count })\n // Mensagem repetida: um espaço invisível força o leitor de tela a reanunciar.\n setAnnouncement((prev) => (prev === text ? `${text}\\u00a0` : text))\n }\n\n /** Ordena pela posição das opções; valores sem opção (ex.: vindos de `value`) ficam no fim. */\n const inOptionOrder = (values: Iterable<string>, items: OptionNode[]) => {\n const set = new Set(values)\n const ordered = items.filter((item) => set.has(item.value)).map((item) => item.value)\n const known = new Set(ordered)\n return [...ordered, ...[...set].filter((v) => !known.has(v))]\n }\n\n const commit = (next: string[], announce = false) => {\n if (announce) announceCount(next.length)\n if (sameValues(next, selectedValues)) return\n setRaw(multiple ? next : (next[0] ?? null))\n }\n\n const toggle = (item: OptionNode, items: OptionNode[]) => {\n const next = selectedSet.has(item.value)\n ? selectedValues.filter((v) => v !== item.value)\n : inOptionOrder([...selectedValues, item.value], items)\n anchorRef.current = item.value\n rangeRef.current = null\n commit(next)\n }\n\n const selectOne = (item: OptionNode) => {\n anchorRef.current = item.value\n commit([item.value])\n }\n\n /**\n * Estende a seleção até `target` a partir da âncora: a seleção de quando a\n * extensão começou + as opções habilitadas entre a âncora e o alvo. Voltar\n * em direção à âncora encolhe a faixa. `from` define a âncora de uma\n * extensão nova: a opção focada (Shift+setas, Ctrl+Shift+Home/End) ou a\n * última marcada (Shift+Espaço, Shift+clique).\n */\n const extendTo = (items: OptionNode[], target: number, from: 'focus' | 'anchor', announce = false) => {\n let range = rangeRef.current\n if (!range || !items.some((item) => item.value === range!.anchor)) {\n const anchor =\n (from === 'anchor' ? anchorRef.current : null) ?? activeRef.current ?? items[target].value\n range = { anchor, base: selectedValues }\n rangeRef.current = range\n anchorRef.current = anchor\n }\n let start = items.findIndex((item) => item.value === range!.anchor)\n if (start < 0) start = target\n const [lo, hi] = start <= target ? [start, target] : [target, start]\n const between = items\n .slice(lo, hi + 1)\n .filter((item) => !item.disabled)\n .map((item) => item.value)\n commit(inOptionOrder([...range.base, ...between], items), announce)\n }\n\n const toggleAll = (items: OptionNode[]) => {\n const enabled = items.filter((item) => !item.disabled).map((item) => item.value)\n const allSelected = enabled.length > 0 && enabled.every((v) => selectedSet.has(v))\n const next = allSelected\n ? selectedValues.filter((v) => !enabled.includes(v))\n : inOptionOrder([...selectedValues, ...enabled], items)\n rangeRef.current = null\n commit(next, true)\n }\n\n const moveTo = (items: OptionNode[], index: number) => {\n const item = items[index]\n if (!item) return\n setActive(item, true)\n if (!multiple && selectionFollowsFocus && !item.disabled) selectOne(item)\n }\n\n const runTypeahead = (char: string, items: OptionNode[], index: number) => {\n const state = typeahead.current\n clearTimeout(state.timer)\n state.buffer += normalizeText(char)\n state.timer = setTimeout(() => {\n state.buffer = ''\n }, TYPEAHEAD_TIMEOUT)\n const query = state.buffer\n // A mesma letra repetida percorre as opções que começam com ela.\n const cycling = query.length > 1 && Array.from(query).every((c) => c === query[0])\n const search = cycling ? query[0] : query\n // Uma letra começa na próxima opção; várias letras refinam a partir da atual.\n const begin = search.length === 1 ? index + 1 : Math.max(index, 0)\n for (let i = 0; i < items.length; i++) {\n const candidate = (begin + i) % items.length\n if (normalizeText(items[candidate].text).startsWith(search)) {\n rangeRef.current = null\n moveTo(items, candidate)\n return\n }\n }\n }\n\n const resetTypeahead = () => {\n clearTimeout(typeahead.current.timer)\n typeahead.current.buffer = ''\n }\n\n useEffect(() => {\n const state = typeahead.current\n return () => clearTimeout(state.timer)\n }, [])\n\n // A opção ativa sumiu (lista mudou): limpa a referência para não apontar para um id inexistente.\n useIsomorphicLayoutEffect(() => {\n if (activeValue !== null && !getItems().some((item) => item.value === activeValue)) {\n activeRef.current = null\n setActiveState(null)\n }\n })\n\n // Clicar no rótulo do Field foca a lista, como num controle nativo.\n useEffect(() => {\n const listbox = listboxEl.current\n if (!hasLabel || !field || !listbox || isDisabled) return\n const labelEl = listbox.ownerDocument.getElementById(field.labelId)\n if (!labelEl) return\n const focusList = () => listbox.focus()\n labelEl.addEventListener('click', focusList)\n return () => labelEl.removeEventListener('click', focusList)\n }, [hasLabel, field, isDisabled])\n\n /* Foco --------------------------------------------------------------------- */\n\n const handleFocus = (event: FocusEvent<HTMLDivElement>) => {\n onFocus?.(event)\n if (event.target !== event.currentTarget || isDisabled) return\n const items = getItems()\n const pointer = pointerRef.current\n pointerRef.current = null\n const current = items.find((item) => item.value === activeRef.current)\n // APG: a ativa é a (primeira) selecionada ou, sem seleção, a primeira opção.\n const fallback = current ?? items.find((item) => selectedSet.has(item.value)) ?? items[0] ?? null\n if (pointer) {\n setActive(items.find((item) => item.value === pointer.value) ?? fallback, false)\n return\n }\n setActive(fallback, true)\n }\n\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n onBlur?.(event)\n if (event.target !== event.currentTarget) return\n setActive(null, false)\n rangeRef.current = null\n pointerRef.current = null\n resetTypeahead()\n }\n\n /* Teclado ------------------------------------------------------------------ */\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || isDisabled || event.target !== event.currentTarget) return\n const items = getItems()\n if (items.length === 0) return\n const index = items.findIndex((item) => item.value === activeRef.current)\n const last = items.length - 1\n const mod = event.ctrlKey || event.metaKey\n const { key, shiftKey: shift, altKey: alt } = event\n const prevKey = horizontal ? 'ArrowLeft' : 'ArrowUp'\n const nextKey = horizontal ? 'ArrowRight' : 'ArrowDown'\n\n if ((key === nextKey || key === prevKey) && !alt) {\n const step = key === nextKey ? 1 : -1\n const target = index < 0 ? (step === 1 ? 0 : last) : Math.min(last, Math.max(0, index + step))\n if (multiple && shift) extendTo(items, target, 'focus')\n else rangeRef.current = null\n moveTo(items, target)\n } else if ((key === 'Home' || key === 'End') && !alt) {\n const target = key === 'Home' ? 0 : last\n if (multiple && shift && mod) extendTo(items, target, 'focus', true)\n else rangeRef.current = null\n moveTo(items, target)\n } else if (key === ' ' && typeahead.current.buffer && !mod && !alt) {\n // Espaço no meio da digitação faz parte da busca (\"pão de queijo\").\n runTypeahead(' ', items, index)\n } else if ((key === ' ' || key === 'Enter') && !mod && !alt) {\n const item = items[index]\n if (item) {\n if (multiple && shift && key === ' ') extendTo(items, index, 'anchor', true)\n else if (item.disabled) {\n // APG: opções desabilitadas são focáveis, mas não selecionáveis.\n } else if (multiple) toggle(item, items)\n else selectOne(item)\n }\n } else if (multiple && mod && !shift && !alt && key.toLowerCase() === 'a') {\n toggleAll(items)\n } else if (key.length === 1 && key !== ' ' && !mod && !alt) {\n runTypeahead(key, items, index)\n } else {\n return\n }\n event.preventDefault()\n }\n\n /* Ponteiro ----------------------------------------------------------------- */\n\n const handleMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n onMouseDown?.(event)\n if (isDisabled) return\n const option = (event.target as Element).closest<HTMLElement>('[role=\"option\"]')\n pointerRef.current = { value: option?.dataset.value ?? null }\n }\n\n const handleMouseUp = (event: MouseEvent<HTMLDivElement>) => {\n onMouseUp?.(event)\n pointerRef.current = null\n }\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event)\n pointerRef.current = null\n const listbox = listboxEl.current\n if (event.defaultPrevented || isDisabled || !listbox) return\n const option = (event.target as Element).closest<HTMLElement>('[role=\"option\"]')\n const items = getItems()\n const index = items.findIndex((item) => item.el === option)\n if (index < 0) return\n const item = items[index]\n if (listbox.ownerDocument.activeElement !== listbox) {\n pointerRef.current = { value: item.value }\n listbox.focus({ preventScroll: true })\n pointerRef.current = null\n }\n if (!item.disabled) {\n if (multiple && event.shiftKey) extendTo(items, index, 'anchor', true)\n else if (multiple) toggle(item, items)\n else selectOne(item)\n }\n setActive(item, false)\n }\n\n /* Renderização --------------------------------------------------------------- */\n\n const context = useMemo<ListboxContextValue>(\n () => ({ baseId, multiple, selected: selectedSet, activeValue }),\n [baseId, multiple, selectedSet, activeValue],\n )\n const activeId = activeValue !== null && !isDisabled ? optionDomId(baseId, activeValue) : undefined\n\n return (\n <ListboxContext.Provider value={context}>\n {/* aria-activedescendant só existe com a lista habilitada, quando o tabIndex é 0. */}\n {/* eslint-disable-next-line jsx-a11y/aria-activedescendant-has-tabindex */}\n <div\n {...rest}\n ref={mergedRef}\n id={baseId}\n role=\"listbox\"\n tabIndex={tabIndex ?? (isDisabled ? undefined : 0)}\n aria-labelledby={labelledBy}\n aria-describedby={controlProps['aria-describedby']}\n aria-invalid={isInvalid || undefined}\n aria-required={controlProps.required || undefined}\n aria-disabled={isDisabled || undefined}\n aria-multiselectable={multiple}\n aria-orientation={orientation}\n aria-activedescendant={activeId}\n className={cx('or-listbox', `or-listbox--${orientation}`, multiple && 'or-listbox--multiple', shakeClassName)}\n style={maxHeight !== undefined ? { ...style, maxHeight } : style}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onClick={handleClick}\n onAnimationEnd={(event) => {\n onAnimationEnd?.(event)\n onShakeEnd(event)\n }}\n >\n {options?.map((item, index) =>\n isGroup(item) ? (\n <ListboxGroup key={`group-${index}`} label={item.label}>\n {item.options.map(renderItem)}\n </ListboxGroup>\n ) : (\n renderItem(item)\n ),\n )}\n {children}\n </div>\n {name &&\n (selectedValues.length > 0 ? (\n selectedValues.map((v) => <input key={v} type=\"hidden\" name={name} value={v} disabled={isDisabled} />)\n ) : (\n // Nada selecionado: nada é enviado (como caixas desmarcadas), mas o `Form` ainda\n // encontra o campo pelo `name` para focar a lista a partir do resumo de erros.\n <input type=\"hidden\" name={name} value=\"\" disabled />\n ))}\n {multiple && (\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </VisuallyHidden>\n )}\n </ListboxContext.Provider>\n )\n}\n\nfunction renderItem(item: ListboxItem) {\n return (\n <ListboxOption\n key={item.value}\n value={item.value}\n description={item.description}\n disabled={item.disabled}\n icon={item.icon}\n >\n {item.label}\n </ListboxOption>\n )\n}\n\n/**\n * Lista de opções sempre visível (padrão Listbox do WAI-ARIA APG): painéis de\n * filtro, escolha de plano, listas mestre. Seleção única ou múltipla, teclado\n * completo (setas, Home/End, digitação, faixas com Shift) e integração com\n * `Form` via `name`. Para escolher em uma lista suspensa, use `Select`,\n * `Combobox` ou `MultiSelect`.\n */\nexport const Listbox = forwardRef<HTMLDivElement, ListboxProps>(function Listbox(\n { label, hideLabel, description, error, required, optional, disabled, id, className, ...rest },\n ref,\n) {\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n className={cx('or-listbox-field', className)}\n >\n <ListboxControl\n {...(rest as Omit<ControlProps, 'listboxRef' | 'hasLabel'>)}\n listboxRef={ref}\n hasLabel={hasContent(label)}\n required={required}\n disabled={disabled}\n />\n </Field>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* ListboxOption */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Uma opção do `Listbox`. A seleção é exposta com `aria-selected` e indicada\n * por um check (seleção única) ou uma caixa marcada (seleção múltipla).\n */\nexport const ListboxOption = forwardRef<HTMLDivElement, ListboxOptionProps>(function ListboxOption(\n { value, children, description, disabled = false, icon, className, ...rest },\n ref,\n) {\n const context = useContext(ListboxContext)\n if (!context) throw new Error('[Orange] ListboxOption precisa estar dentro de <Listbox>.')\n const id = optionDomId(context.baseId, value)\n const selected = context.selected.has(value)\n const hasDescription = hasContent(description)\n\n return (\n <div\n {...rest}\n ref={ref}\n id={id}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n // Nome vem do conteúdo (só o rótulo: ícones e descrição são aria-hidden);\n // a descrição chega por aria-describedby.\n aria-describedby={hasDescription ? `${id}-description` : undefined}\n data-value={value}\n data-active={context.activeValue === value || undefined}\n className={cx('or-listbox-option', className)}\n >\n {context.multiple && (\n <span className=\"or-listbox-option__box\" aria-hidden=\"true\">\n <Icon name=\"check\" size={12} strokeWidth={2.5} />\n </span>\n )}\n {icon && (\n <span className=\"or-listbox-option__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"or-listbox-option__text\">\n <span id={`${id}-label`} className=\"or-listbox-option__label\">\n {children}\n </span>\n {hasDescription && (\n // aria-hidden tira a descrição do nome calculado pelo conteúdo; ela\n // continua sendo lida como descrição (aria-describedby lê conteúdo oculto).\n <span id={`${id}-description`} className=\"or-listbox-option__description\" aria-hidden=\"true\">\n {description}\n </span>\n )}\n </span>\n {!context.multiple && <Icon name=\"check\" size=\"sm\" strokeWidth={2.25} className=\"or-listbox-option__check\" />}\n </div>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* ListboxGroup */\n/* -------------------------------------------------------------------------- */\n\n/** Agrupa opções sob um título (`role=\"group\"` nomeado por `aria-labelledby`). */\nexport const ListboxGroup = forwardRef<HTMLDivElement, ListboxGroupProps>(function ListboxGroup(\n { label, className, children, ...rest },\n ref,\n) {\n const labelId = useId('or-listbox-group')\n return (\n <div ref={ref} role=\"group\" aria-labelledby={labelId} className={cx('or-listbox-group', className)} {...rest}>\n <div id={labelId} className=\"or-listbox-group__label\">\n {label}\n </div>\n {children}\n </div>\n )\n})\n","import { forwardRef, type HTMLAttributes } from 'react'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Spinner.css'\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg'\nexport type SpinnerTone = 'accent' | 'neutral' | 'current'\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n /** Diâmetro: `sm` 16px, `md` 24px, `lg` 40px. */\n size?: SpinnerSize\n /** Cor do arco: `accent` (laranja), `neutral` (texto) ou `current` (herda `color`). */\n tone?: SpinnerTone\n /** Texto anunciado a leitores de tela. Padrão: `t('loading')`. */\n label?: string\n /**\n * Esconde o indicador de tecnologias assistivas (`aria-hidden`). Use quando\n * outro elemento já anuncia o carregamento (ex.: um texto visível ao lado).\n */\n decorative?: boolean\n}\n\n/**\n * Indicador circular de carregamento para esperas curtas e de duração\n * desconhecida. Anuncia `role=\"status\"` com um rótulo visualmente oculto.\n */\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(function Spinner(\n { size = 'md', tone = 'accent', label, decorative = false, className, ...rest },\n ref,\n) {\n const { t } = useLocale()\n return (\n <span\n ref={ref}\n className={cx('or-spinner', `or-spinner--${size}`, `or-spinner--${tone}`, className)}\n {...(decorative ? { 'aria-hidden': true } : { role: 'status' })}\n {...rest}\n >\n <span className=\"or-spinner__ring\" aria-hidden=\"true\" />\n {!decorative && <VisuallyHidden>{label ?? t('loading')}</VisuallyHidden>}\n </span>\n )\n})\n","import { forwardRef, useRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { useIsomorphicLayoutEffect, usePresence } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { Spinner, type SpinnerSize } from '../Spinner'\nimport './LoadingOverlay.css'\n\nexport interface LoadingOverlayProps extends HTMLAttributes<HTMLDivElement> {\n /** Mostra a sobreposição e bloqueia o conteúdo coberto. */\n visible?: boolean\n /** Mensagem exibida e anunciada. Padrão: `t('loading')`. */\n message?: ReactNode\n /** Tamanho do spinner. */\n spinnerSize?: SpinnerSize\n /** Conteúdo que será coberto. */\n children?: ReactNode\n}\n\n/**\n * Cobre uma área (tabela, cartão, painel) enquanto ela é atualizada. O\n * conteúdo coberto fica `inert` e `aria-busy`; a mensagem é anunciada numa\n * região `role=\"status\"` que fica fora dele.\n */\nexport const LoadingOverlay = forwardRef<HTMLDivElement, LoadingOverlayProps>(\n function LoadingOverlay(\n { visible = false, message, spinnerSize = 'md', className, children, ...rest },\n ref,\n ) {\n const { t } = useLocale()\n const contentRef = useRef<HTMLDivElement>(null)\n const panelRef = useRef<HTMLDivElement>(null)\n const restoreFocus = useRef<HTMLElement | null>(null)\n // Saída animada: spinner e mensagem continuam no painel enquanto ele esmaece.\n const { present, nodeRef: backdropRef } = usePresence<HTMLDivElement>(visible)\n\n // `inert` via DOM (compatível com React 18 e 19). Se o foco estava no conteúdo,\n // ele é \"estacionado\" no painel e devolvido quando o carregamento termina.\n useIsomorphicLayoutEffect(() => {\n const content = contentRef.current\n const panel = panelRef.current\n if (!content) return\n if (visible) {\n const active = document.activeElement as HTMLElement | null\n content.setAttribute('inert', '')\n if (active && content.contains(active)) {\n restoreFocus.current = active\n panel?.focus({ preventScroll: true })\n }\n return\n }\n content.removeAttribute('inert')\n const target = restoreFocus.current\n restoreFocus.current = null\n const active = document.activeElement\n if (target?.isConnected && (!active || active === document.body || active === panel)) {\n target.focus({ preventScroll: true })\n }\n }, [visible])\n\n return (\n <div\n ref={ref}\n className={cx('or-loading-overlay', className)}\n data-state={visible ? 'visible' : 'hidden'}\n {...rest}\n >\n <div\n ref={contentRef}\n className=\"or-loading-overlay__content\"\n aria-busy={visible || undefined}\n >\n {children}\n </div>\n <div ref={backdropRef} className=\"or-loading-overlay__backdrop\">\n <div ref={panelRef} className=\"or-loading-overlay__panel\" tabIndex={-1}>\n {present && <Spinner size={spinnerSize} decorative />}\n {/* sempre montada para que a troca de texto seja anunciada */}\n <p className=\"or-loading-overlay__message\" role=\"status\">\n {present ? (message ?? t('loading')) : null}\n </p>\n </div>\n </div>\n </div>\n )\n },\n)\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { clamp, cx, devWarning } from '../../utils'\nimport './Meter.css'\n\nexport type MeterTone = 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'danger'\nexport type MeterSize = 'sm' | 'md'\n/** Faixa do valor em relação ao ótimo (mesmo algoritmo do `<meter>` nativo). */\nexport type MeterLevel = 'optimum' | 'suboptimum' | 'critical'\n\nexport interface MeterValueInfo {\n min: number\n max: number\n /** Posição do valor na escala, de 0 a 100. */\n percent: number\n}\n\nexport interface MeterProps extends HTMLAttributes<HTMLDivElement> {\n /** Valor medido. */\n value: number\n /** Início da escala. */\n min?: number\n /** Fim da escala. */\n max?: number\n /** Limite superior da faixa \"baixa\". */\n low?: number\n /** Limite inferior da faixa \"alta\". */\n high?: number\n /**\n * Valor ideal. Define qual faixa é boa: se estiver abaixo de `low`, valores\n * baixos são ótimos (ex.: uso de disco); acima de `high`, valores altos são\n * ótimos (ex.: bateria). Padrão: o meio da escala.\n */\n optimum?: number\n /** Rótulo visível, associado via `aria-labelledby`. */\n label?: ReactNode\n /** Texto de apoio abaixo do medidor, associado via `aria-describedby`. */\n description?: ReactNode\n /** Mostra o valor formatado ao lado do rótulo. */\n showValue?: boolean\n /** Formata o valor exibido e anunciado (`aria-valuetext`). Padrão: percentual. */\n formatValue?: (value: number, info: MeterValueInfo) => string\n /**\n * Força uma cor. Sem esta prop, a cor vem das faixas: ótimo → `success`,\n * subótimo → `warning`, crítico → `danger` (ou `accent` sem `low`/`high`).\n */\n tone?: MeterTone\n /** Espessura: `sm` 4px, `md` 8px. */\n size?: MeterSize\n /** Mostra marcas nos limites `low` e `high`. */\n showThresholds?: boolean\n}\n\n/** Calcula a faixa do valor seguindo o algoritmo do elemento `<meter>` do HTML. */\nfunction getMeterLevel(value: number, low: number, high: number, optimum: number): MeterLevel {\n const region = (v: number) => (v < low ? 'low' : v > high ? 'high' : 'medium')\n const valueRegion = region(value)\n const optimumRegion = region(optimum)\n if (valueRegion === optimumRegion) return 'optimum'\n if (optimumRegion === 'medium') return 'suboptimum'\n if (valueRegion === 'medium') return 'suboptimum'\n return 'critical'\n}\n\nconst levelTone: Record<MeterLevel, MeterTone> = {\n optimum: 'success',\n suboptimum: 'warning',\n critical: 'danger',\n}\n\n/**\n * Medidor de um valor escalar dentro de uma faixa conhecida — uso de\n * armazenamento, cota de API, força de senha. Para o andamento de uma tarefa,\n * use `ProgressBar`.\n */\nexport const Meter = forwardRef<HTMLDivElement, MeterProps>(function Meter(\n {\n value,\n min = 0,\n max = 100,\n low: lowProp,\n high: highProp,\n optimum: optimumProp,\n label,\n description,\n showValue = true,\n formatValue,\n tone: toneProp,\n size = 'md',\n showThresholds = true,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n ...rest\n },\n ref,\n) {\n const { locale } = useLocale()\n const baseId = useId('or-meter', id)\n const labelId = `${baseId}-label`\n const descriptionId = `${baseId}-description`\n\n devWarning(\n !label && !ariaLabel && !ariaLabelledby,\n 'Meter precisa de `label`, `aria-label` ou `aria-labelledby`.',\n )\n\n const safeMax = Math.max(min, max)\n const current = clamp(value, min, safeMax)\n const low = clamp(lowProp ?? min, min, safeMax)\n const high = clamp(highProp ?? safeMax, low, safeMax)\n const optimum = clamp(optimumProp ?? (min + safeMax) / 2, min, safeMax)\n const hasRegions = lowProp !== undefined || highProp !== undefined\n const level = getMeterLevel(current, low, high, optimum)\n const tone = toneProp ?? (hasRegions ? levelTone[level] : 'accent')\n\n const toPercent = (v: number) => (safeMax > min ? ((v - min) / (safeMax - min)) * 100 : 0)\n const percent = toPercent(current)\n const valueText = formatValue\n ? formatValue(current, { min, max: safeMax, percent })\n : new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(\n percent / 100,\n )\n\n const thresholds = showThresholds\n ? [lowProp !== undefined ? low : null, highProp !== undefined ? high : null].filter(\n (v, i, list): v is number => v !== null && v > min && v < safeMax && list.indexOf(v) === i,\n )\n : []\n\n const labelledBy =\n [ariaLabelledby, label ? labelId : undefined].filter(Boolean).join(' ') || undefined\n const describedBy =\n [ariaDescribedby, description ? descriptionId : undefined].filter(Boolean).join(' ') ||\n undefined\n\n return (\n <div\n ref={ref}\n id={id}\n className={cx('or-meter', `or-meter--${tone}`, `or-meter--${size}`, className)}\n data-level={hasRegions ? level : undefined}\n {...rest}\n >\n {(label || showValue) && (\n <div className=\"or-meter__header\">\n {label && (\n <span id={labelId} className=\"or-meter__label\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"or-meter__value\" aria-hidden=\"true\">\n {valueText}\n </span>\n )}\n </div>\n )}\n <div\n className=\"or-meter__track\"\n role=\"meter\"\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n aria-valuemin={min}\n aria-valuemax={safeMax}\n aria-valuenow={current}\n aria-valuetext={valueText}\n >\n {/* transform (scaleX) em vez de width: anima sem recalcular layout */}\n <div className=\"or-meter__fill\" style={{ transform: `scaleX(${percent / 100})` }} />\n {thresholds.map((threshold) => (\n <span\n key={threshold}\n className=\"or-meter__threshold\"\n style={{ left: `${toPercent(threshold)}%` }}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n {description && (\n <div id={descriptionId} className=\"or-meter__description\">\n {description}\n </div>\n )}\n </div>\n )\n})\n","import {\n cloneElement,\n forwardRef,\n type HTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { useDisclosure, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx } from '../../utils'\nimport { Button } from '../Button'\nimport { DialogShell } from './DialogShell'\nimport './Modal.css'\n\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'full'\n\n/** Funções entregues ao conteúdo quando `children` é uma função. */\nexport interface ModalRenderProps {\n /** Fecha o diálogo (útil no modo não controlado, com `trigger`). */\n close: () => void\n}\n\nexport interface ModalProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'children'> {\n /** Aberto (controlado). Use com `onOpenChange`. */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o diálogo pede para abrir ou fechar. */\n onOpenChange?: (open: boolean) => void\n /** Título visível; nomeia o diálogo via `aria-labelledby`. */\n title: ReactNode\n /** Texto de apoio sob o título; descreve o diálogo via `aria-describedby`. */\n description?: ReactNode\n /** Largura: `sm` 400px, `md` 560px, `lg` 800px, `full` tela inteira. */\n size?: ModalSize\n /**\n * Elemento que recebe o foco ao abrir. Padrão: primeiro elemento focável do\n * conteúdo (ou o que tiver `data-autofocus`).\n */\n initialFocus?: RefObject<HTMLElement | null>\n /** Elemento que recebe o foco ao fechar. Padrão: o que estava focado antes de abrir. */\n finalFocus?: RefObject<HTMLElement | null>\n /** Fecha ao clicar no fundo escurecido. */\n closeOnOverlayClick?: boolean\n /** Fecha com a tecla Escape. */\n closeOnEscape?: boolean\n /** Esconde o botão de fechar do cabeçalho. Garanta outra forma de fechar. */\n hideCloseButton?: boolean\n /**\n * Elemento que abre o diálogo (modo não controlado). Recebe `onClick` e\n * `aria-haspopup=\"dialog\"`.\n */\n trigger?: ReactElement\n /** Conteúdo: use `ModalBody` e `ModalFooter`. Aceita uma função `({ close }) => …`. */\n children?: ReactNode | ((props: ModalRenderProps) => ReactNode)\n}\n\n/**\n * Diálogo modal: interrompe a tarefa atual para pedir uma decisão ou\n * informação. Prende o foco, bloqueia o scroll da página e fecha com Escape.\n */\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>(function Modal(\n {\n open,\n defaultOpen,\n onOpenChange,\n title,\n description,\n size = 'md',\n initialFocus,\n finalFocus,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n hideCloseButton = false,\n trigger,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const disclosure = useDisclosure({ open, defaultOpen, onOpenChange })\n const titleId = useId('or-modal-title')\n const descriptionId = useId('or-modal-description')\n\n const triggerElement = trigger\n ? cloneElement(trigger as ReactElement<HTMLAttributes<HTMLElement>>, {\n 'aria-haspopup': 'dialog',\n onClick: composeEventHandlers(\n (trigger.props as HTMLAttributes<HTMLElement>).onClick,\n (_event: ReactMouseEvent<HTMLElement>) => disclosure.open(),\n ),\n })\n : null\n\n return (\n <>\n {triggerElement}\n <DialogShell\n open={disclosure.isOpen}\n onDismiss={disclosure.close}\n initialFocus={initialFocus}\n finalFocus={finalFocus}\n closeOnEscape={closeOnEscape}\n closeOnOverlayClick={closeOnOverlayClick}\n rootClassName={cx('or-modal-root', size === 'full' && 'or-modal-root--full')}\n panelRef={ref}\n className={cx('or-modal', `or-modal--${size}`, className)}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n {...rest}\n >\n <div className=\"or-modal__header\">\n <div className=\"or-modal__heading\">\n <h2 id={titleId} className=\"or-modal__title\">\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className=\"or-modal__description\">\n {description}\n </p>\n )}\n </div>\n {!hideCloseButton && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={t('close')}\n startIcon={<Icon name=\"close\" />}\n className=\"or-modal__close\"\n data-or-dialog-close=\"\"\n onClick={disclosure.close}\n />\n )}\n </div>\n {typeof children === 'function' ? children({ close: disclosure.close }) : children}\n </DialogShell>\n </>\n )\n})\n\nexport type ModalBodyProps = HTMLAttributes<HTMLDivElement>\n\n/** Corpo do Modal. Rola internamente quando o conteúdo passa da altura disponível. */\nexport const ModalBody = forwardRef<HTMLDivElement, ModalBodyProps>(function ModalBody(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('or-modal__body', className)} {...rest} />\n})\n\nexport type ModalFooterProps = HTMLAttributes<HTMLDivElement>\n\n/** Rodapé do Modal com as ações, alinhadas à direita (a principal por último). */\nexport const ModalFooter = forwardRef<HTMLDivElement, ModalFooterProps>(function ModalFooter(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('or-modal__footer', className)} {...rest} />\n})\n","import { forwardRef, useMemo, useState, type HTMLAttributes } from 'react'\nimport { useControllableState } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport './MonthPaginator.css'\n\n/** Um mês do calendário. `month` vai de 0 (janeiro) a 11 (dezembro), como em `Date#getMonth()`. */\nexport interface YearMonth {\n year: number\n month: number\n}\n\nexport type MonthPaginatorSize = 'sm' | 'md' | 'lg'\n\nexport interface MonthPaginatorProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** Mês exibido (controlado). */\n value?: YearMonth\n /** Mês inicial (não controlado). Padrão: mês atual. */\n defaultValue?: YearMonth\n /** Chamado com o novo mês ao clicar em anterior/próximo. */\n onChange?: (value: YearMonth) => void\n /** Primeiro mês permitido — o botão \"Mês anterior\" fica indisponível nele. */\n min?: YearMonth\n /** Último mês permitido — o botão \"Próximo mês\" fica indisponível nele. */\n max?: YearMonth\n /** Altura dos botões: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: MonthPaginatorSize\n /** Formato do nome do mês. Padrão: `long` (\"Março de 2026\"). */\n monthFormat?: 'long' | 'short'\n disabled?: boolean\n}\n\nconst toIndex = ({ year, month }: YearMonth) => year * 12 + month\nconst fromIndex = (index: number): YearMonth => ({\n year: Math.floor(index / 12),\n month: ((index % 12) + 12) % 12,\n})\n\nfunction currentMonth(): YearMonth {\n const now = new Date()\n return { year: now.getFullYear(), month: now.getMonth() }\n}\n\n/**\n * Navegação entre meses (\"‹ Março de 2026 ›\") para filtrar extratos,\n * agendas e relatórios mensais. O rótulo central é anunciado a leitores\n * de tela a cada mudança.\n */\nexport const MonthPaginator = forwardRef<HTMLDivElement, MonthPaginatorProps>(\n function MonthPaginator(\n {\n value: valueProp,\n defaultValue,\n onChange,\n min,\n max,\n size = 'md',\n monthFormat = 'long',\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) {\n const { t, locale } = useLocale()\n const [value, setValue] = useControllableState<YearMonth>({\n value: valueProp,\n defaultValue: defaultValue ?? currentMonth(),\n onChange,\n })\n\n const formatter = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, { month: monthFormat, year: 'numeric' })\n } catch {\n return new Intl.DateTimeFormat('pt-BR', { month: monthFormat, year: 'numeric' })\n }\n }, [locale, monthFormat])\n\n const index = toIndex(value)\n const atMin = !!min && index <= toIndex(min)\n const atMax = !!max && index >= toIndex(max)\n const format = (month: YearMonth) => {\n const raw = formatter.format(new Date(month.year, month.month, 1))\n return raw.charAt(0).toLocaleUpperCase(locale) + raw.slice(1)\n }\n const label = format(value)\n\n // Direção da última mudança (controlada ou não): o rótulo desliza para o\n // lado da navegação enquanto o mês anterior sai em crossfade.\n const [transition, setTransition] = useState<{\n index: number\n direction: 'next' | 'prev' | null\n from: number | null\n }>({ index, direction: null, from: null })\n if (transition.index !== index) {\n setTransition({\n index,\n direction: index > transition.index ? 'next' : 'prev',\n from: transition.index,\n })\n }\n const { direction } = transition\n\n const go = (delta: number) => {\n if (disabled || (delta < 0 && atMin) || (delta > 0 && atMax)) return\n setValue(fromIndex(index + delta))\n }\n\n const renderButton = (direction: 'previous' | 'next') => {\n const unavailable = disabled || (direction === 'previous' ? atMin : atMax)\n return (\n <button\n type=\"button\"\n className={cx('or-month-paginator__button', `or-month-paginator__button--${direction}`)}\n aria-label={t(direction === 'previous' ? 'previousMonth' : 'nextMonth')}\n // aria-disabled mantém o foco no botão ao chegar no limite.\n aria-disabled={unavailable || undefined}\n onClick={() => go(direction === 'previous' ? -1 : 1)}\n >\n <Icon name={direction === 'previous' ? 'chevron-left' : 'chevron-right'} size=\"sm\" />\n </button>\n )\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel ?? t('monthNavigation')}\n className={cx('or-month-paginator', `or-month-paginator--${size}`, className)}\n aria-disabled={disabled || undefined}\n data-disabled={disabled || undefined}\n {...rest}\n >\n {renderButton('previous')}\n <span className=\"or-month-paginator__label\" aria-live=\"polite\" aria-atomic=\"true\">\n {transition.from !== null && direction && (\n <span\n key={`out-${transition.from}-${index}`}\n className={cx(\n 'or-month-paginator__text',\n `or-month-paginator__text--out-${direction}`,\n )}\n aria-hidden=\"true\"\n >\n {format(fromIndex(transition.from))}\n </span>\n )}\n <time\n key={`in-${index}`}\n className={cx(\n 'or-month-paginator__text',\n direction && `or-month-paginator__text--in-${direction}`,\n )}\n dateTime={`${String(value.year).padStart(4, '0')}-${String(value.month + 1).padStart(2, '0')}`}\n >\n {label}\n </time>\n </span>\n {renderButton('next')}\n </div>\n )\n },\n)\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { useClickOutside, useControllableState, useDisclosure, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { useExitingItems, useInlinePresence } from '../Combobox/motion'\nimport {\n defaultOptionFilter,\n Freeze,\n firstEnabledIndex,\n lastEnabledIndex,\n ListboxOptionItem,\n nextEnabledIndex,\n useAnnouncer,\n useListboxPopup,\n useScrollActiveIntoView,\n} from '../Combobox/shared'\nimport { Field, useField, useFieldControlProps } from '../Field'\nimport { Portal } from '../Portal'\nimport './MultiSelect.css'\n\nexport type MultiSelectSize = 'sm' | 'md' | 'lg'\n\nexport interface MultiSelectOption {\n /** Valor da opção (único). */\n value: string\n /** Texto exibido na lista e no chip. */\n label: string\n /** Texto secundário exibido abaixo do rótulo. */\n description?: string\n disabled?: boolean\n}\n\nexport interface MultiSelectProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'children'\n> {\n options: MultiSelectOption[]\n /** Valores selecionados (controlado). */\n value?: string[]\n /** Valores iniciais (não controlado). */\n defaultValue?: string[]\n /** Chamado a cada seleção ou remoção. */\n onChange?: (value: string[], options: MultiSelectOption[]) => void\n /** Chamado a cada alteração do texto de busca — use para busca assíncrona. */\n onInputChange?: (inputValue: string) => void\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Limite de itens selecionados. Ao atingir, as demais opções ficam indisponíveis. */\n maxSelected?: number\n /**\n * Função de filtro. Padrão: o rótulo contém o texto, ignorando acentos e caixa.\n * Passe `false` quando as opções já vierem filtradas.\n */\n filter?: ((option: MultiSelectOption, query: string) => boolean) | false\n /** Mostra \"Carregando…\" na lista. */\n loading?: boolean\n /** Mensagem quando nenhuma opção corresponde à busca. */\n emptyMessage?: ReactNode\n /** Mostra o botão \"Limpar tudo\" quando há seleção. Padrão: `true`. */\n clearable?: boolean\n label?: ReactNode\n hideLabel?: boolean\n description?: ReactNode\n error?: ReactNode\n /** Marca o campo como inválido sem exibir mensagem. */\n invalid?: boolean\n /** Altura mínima do controle: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: MultiSelectSize\n /** Classe aplicada ao contêiner externo. */\n className?: string\n}\n\ntype ControlProps = Omit<\n MultiSelectProps,\n 'label' | 'hideLabel' | 'description' | 'error' | 'className'\n> & {\n inputRef: React.Ref<HTMLInputElement>\n hasLabel: boolean\n}\n\nconst EMPTY: string[] = []\n\nfunction MultiSelectControl({\n inputRef,\n hasLabel,\n options,\n value: valueProp,\n defaultValue = EMPTY,\n onChange,\n onInputChange,\n open: openProp,\n defaultOpen,\n onOpenChange,\n maxSelected,\n filter,\n loading = false,\n emptyMessage,\n clearable = true,\n invalid,\n size = 'md',\n required,\n disabled,\n readOnly,\n name,\n placeholder,\n onKeyDown,\n onBlur,\n ...rest\n}: ControlProps) {\n const { t } = useLocale()\n const field = useField()\n const controlProps = useFieldControlProps({\n required,\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': rest['aria-describedby'],\n })\n const isDisabled = Boolean(controlProps.disabled)\n const interactive = !isDisabled && !readOnly\n const listboxId = useId('or-multi-select-listbox')\n const inputEl = useRef<HTMLInputElement>(null)\n const frameEl = useRef<HTMLDivElement>(null)\n const popupEl = useRef<HTMLDivElement>(null)\n const chipButtons = useRef(new Map<string, HTMLButtonElement>())\n const pendingFocus = useRef<string | null>(null)\n const { announce, region } = useAnnouncer()\n\n const [values, setValues] = useControllableState<string[]>({ value: valueProp, defaultValue })\n const { isOpen, setOpen } = useDisclosure({ open: openProp, defaultOpen, onOpenChange })\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(-1)\n\n // Cache de opções já vistas: chips continuam com rótulo mesmo se a busca assíncrona trocar `options`.\n const known = useRef(new Map<string, MultiSelectOption>())\n for (const option of options) known.current.set(option.value, option)\n const optionFor = (v: string): MultiSelectOption => known.current.get(v) ?? { value: v, label: v }\n const selectedOptions = values.map(optionFor)\n // Chips presentes na montagem não animam; os adicionados depois entram com \"pop\".\n const initialValues = useRef(new Set(values))\n const { entries: chipEntries, leavingProps } = useExitingItems(selectedOptions, (o) => o.value)\n\n const limitReached = maxSelected !== undefined && values.length >= maxSelected\n\n const filtered = useMemo(() => {\n if (filter === false || !query.trim()) return options\n const fn = filter ?? defaultOptionFilter\n return options.filter((o) => fn(o, query))\n }, [options, query, filter])\n const visible = loading ? [] : filtered\n const isUnavailable = (o: MultiSelectOption) =>\n Boolean(o.disabled) || (limitReached && !values.includes(o.value))\n const navigable = visible.map((o) => ({ disabled: isUnavailable(o) }))\n\n const optionId = (option: MultiSelectOption) => `${listboxId}-${options.indexOf(option)}`\n const activeOption = isOpen && activeIndex >= 0 ? visible[activeIndex] : undefined\n const activeId = activeOption ? optionId(activeOption) : undefined\n useScrollActiveIntoView(activeId)\n\n const { refs, floatingStyles, theme, present, state, nodeRef, side } = useListboxPopup(isOpen)\n useClickOutside([frameEl, popupEl], () => setOpen(false), isOpen)\n\n useEffect(() => {\n if (!isOpen || loading) return\n const count = visible.length\n announce(\n count === 0\n ? t('noResults')\n : count === 1\n ? t('resultsCountOne')\n : t('resultsCount', { count }),\n 400,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, loading, visible.length, query])\n\n // Foco após remover um chip: próximo chip, anterior ou o campo de texto.\n useEffect(() => {\n const target = pendingFocus.current\n if (target === null) return\n pendingFocus.current = null\n const next = target === 'input' ? null : chipButtons.current.get(target)\n ;(next ?? inputEl.current)?.focus()\n }, [values])\n\n const emit = (next: string[]) => {\n setValues(next)\n onChange?.(next, next.map(optionFor))\n }\n\n const setText = (text: string) => {\n setQuery(text)\n onInputChange?.(text)\n }\n\n const toggle = (option: MultiSelectOption) => {\n if (!interactive || option.disabled) return\n const selected = values.includes(option.value)\n if (!selected && limitReached) {\n announce(t('maxItemsReached', { max: maxSelected! }))\n return\n }\n const next = selected ? values.filter((v) => v !== option.value) : [...values, option.value]\n emit(next)\n announce(t(selected ? 'itemRemoved' : 'itemAdded', { label: option.label }))\n if (query) {\n // Depois de escolher, a busca é limpa e a opção continua ativa na lista completa.\n setText('')\n setActiveIndex(options.indexOf(option))\n }\n }\n\n /** Remove `v`; o foco vai para o chip vizinho (`neighbor`) ou para o campo. */\n const remove = (v: string, focusAfter: 'neighbor' | 'input') => {\n if (!interactive) return\n const index = values.indexOf(v)\n const neighbor =\n focusAfter === 'neighbor' ? (values[index + 1] ?? values[index - 1]) : undefined\n pendingFocus.current = neighbor ?? 'input'\n initialValues.current.delete(v)\n emit(values.filter((x) => x !== v))\n announce(t('itemRemoved', { label: optionFor(v).label }))\n }\n\n const clearAll = () => {\n if (!interactive) return\n pendingFocus.current = 'input'\n initialValues.current.clear()\n emit([])\n setText('')\n announce(t('itemRemoved', { label: selectedOptions.map((o) => o.label).join(', ') }))\n }\n\n const openList = (focus: 'first' | 'last' | 'none') => {\n if (!interactive) return\n const all = options.map((o) => ({ disabled: isUnavailable(o) }))\n setActiveIndex(\n loading || query\n ? -1\n : focus === 'first'\n ? firstEnabledIndex(all)\n : focus === 'last'\n ? lastEnabledIndex(all)\n : -1,\n )\n setOpen(true)\n }\n\n const closeList = () => {\n setOpen(false)\n setActiveIndex(-1)\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || !interactive) return\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n if (!isOpen) openList(event.altKey ? 'none' : 'first')\n else if (!event.altKey) setActiveIndex((i) => nextEnabledIndex(navigable, i, 1))\n break\n case 'ArrowUp':\n event.preventDefault()\n if (!isOpen) openList(event.altKey ? 'none' : 'last')\n else if (event.altKey) closeList()\n else setActiveIndex((i) => nextEnabledIndex(navigable, i < 0 ? navigable.length : i, -1))\n break\n case 'Home':\n case 'End':\n if (!isOpen || activeIndex < 0) break\n event.preventDefault()\n setActiveIndex(\n event.key === 'Home' ? firstEnabledIndex(navigable) : lastEnabledIndex(navigable),\n )\n break\n case 'ArrowLeft':\n case 'ArrowRight':\n if (activeIndex >= 0) setActiveIndex(-1)\n break\n case 'Enter':\n if (!isOpen) break\n event.preventDefault()\n if (activeOption) toggle(activeOption)\n break\n case 'Escape':\n if (isOpen) {\n event.preventDefault()\n event.stopPropagation()\n closeList()\n } else if (query) {\n event.preventDefault()\n event.stopPropagation()\n setText('')\n }\n break\n case 'Backspace':\n if (!query && values.length > 0 && event.currentTarget.selectionStart === 0) {\n event.preventDefault()\n remove(values[values.length - 1], 'input')\n }\n break\n case 'Tab':\n if (isOpen) closeList()\n break\n }\n }\n\n const labelledBy = hasLabel && field ? field.labelId : undefined\n const hasValues = values.length > 0\n const clearPresence = useInlinePresence<HTMLButtonElement>(clearable && interactive && hasValues)\n\n return (\n // O mousedown só amplia a área de clique do input (que já é focável por teclado).\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={mergeRefs(frameEl, refs.setReference)}\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-multi-select')}\n data-invalid={controlProps['aria-invalid'] || undefined}\n // Expõe o estado inativo do conjunto (chips + campo) — o contraste reduzido\n // dos itens desabilitados é isento pela WCAG 1.4.3.\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled || undefined}\n data-open={isOpen || undefined}\n onMouseDown={(event) => {\n // Clique na área vazia do campo foca o texto.\n if (\n event.target === event.currentTarget ||\n (event.target as HTMLElement).classList.contains('or-multi-select__values')\n ) {\n event.preventDefault()\n inputEl.current?.focus()\n if (!isOpen) openList('none')\n }\n }}\n >\n <div className=\"or-multi-select__values\">\n {chipEntries.length > 0 && (\n // role=\"list\" explícito: o Safari remove a semântica de listas com list-style: none.\n <ul role=\"list\" className=\"or-multi-select__chips\" aria-label={t('selectedItems')}>\n {chipEntries.map(({ item: option, key, leaving }) =>\n leaving ? (\n <li key={key} className=\"or-multi-select__chip\" {...leavingProps(key)}>\n <span className=\"or-multi-select__chip-label\">{option.label}</span>\n {interactive && (\n <span className=\"or-multi-select__chip-remove\" aria-hidden=\"true\">\n <Icon name=\"close\" size={12} strokeWidth={2} />\n </span>\n )}\n </li>\n ) : (\n <li\n key={key}\n className=\"or-multi-select__chip\"\n data-enter={!initialValues.current.has(option.value) || undefined}\n >\n <span className=\"or-multi-select__chip-label\">{option.label}</span>\n {interactive && (\n <button\n ref={(el) => {\n if (el) chipButtons.current.set(option.value, el)\n else chipButtons.current.delete(option.value)\n }}\n type=\"button\"\n className=\"or-multi-select__chip-remove\"\n aria-label={t('removeItem', { label: option.label })}\n onClick={() => remove(option.value, 'neighbor')}\n >\n <Icon name=\"close\" size={12} strokeWidth={2} />\n </button>\n )}\n </li>\n ),\n )}\n </ul>\n )}\n <input\n ref={mergeRefs(inputEl, inputRef)}\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={activeId}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n className=\"or-control-frame__input or-multi-select__input\"\n value={query}\n placeholder={hasValues ? undefined : placeholder}\n readOnly={readOnly}\n onChange={(event) => {\n const text = event.target.value\n setText(text)\n if (!isOpen) setOpen(true)\n if (text.trim()) {\n const fn = filter === false ? () => true : (filter ?? defaultOptionFilter)\n const matches = options\n .filter((o) => fn(o, text))\n .map((o) => ({ disabled: isUnavailable(o) }))\n setActiveIndex(loading ? -1 : firstEnabledIndex(matches))\n } else setActiveIndex(-1)\n }}\n onKeyDown={handleKeyDown}\n onClick={() => {\n if (!isOpen) openList('none')\n }}\n onBlur={(event) => {\n onBlur?.(event)\n if (popupEl.current?.contains(event.relatedTarget as Node)) return\n closeList()\n }}\n {...rest}\n {...controlProps}\n required={controlProps.required && !hasValues}\n />\n </div>\n {name &&\n values.map((v) => (\n <input key={v} type=\"hidden\" name={name} value={v} disabled={isDisabled} />\n ))}\n {loading && <span className=\"or-multi-select__spinner\" aria-hidden=\"true\" />}\n {clearPresence.present && (\n <button\n ref={clearPresence.nodeRef}\n type=\"button\"\n className=\"or-multi-select__clear\"\n aria-label={t('clearAll')}\n aria-hidden={clearPresence.closing || undefined}\n tabIndex={clearPresence.closing ? -1 : undefined}\n data-state={clearPresence.dataState}\n onClick={clearAll}\n >\n <Icon name=\"close\" size=\"sm\" />\n </button>\n )}\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"or-control-frame__button or-multi-select__toggle\"\n aria-label={t('showOptions')}\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n disabled={!interactive}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (isOpen) closeList()\n else openList('first')\n inputEl.current?.focus()\n }}\n >\n <Icon name=\"chevron-down\" size=\"sm\" className=\"or-multi-select__chevron\" />\n </button>\n {region}\n {present && (\n <Portal>\n {/* O mousedown só impede que o clique na lista tire o foco do campo (o teclado age no campo). */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={mergeRefs(popupEl, refs.setFloating, nodeRef)}\n className=\"or-combobox-popup\"\n style={floatingStyles}\n data-theme={theme}\n data-state={state}\n data-side={side}\n onMouseDown={(event) => event.preventDefault()}\n >\n <Freeze frozen={!isOpen}>\n {limitReached && (\n <div className=\"or-combobox-popup__message or-combobox-popup__message--warning\">\n <Icon name=\"info\" size=\"sm\" />\n {t('maxItemsReached', { max: maxSelected! })}\n </div>\n )}\n {loading ? (\n <div className=\"or-combobox-popup__message\">\n <span className=\"or-combobox-popup__spinner\" aria-hidden=\"true\" />\n {t('loading')}\n </div>\n ) : visible.length === 0 ? (\n <div className=\"or-combobox-popup__message\">{emptyMessage ?? t('noResults')}</div>\n ) : null}\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n className=\"or-combobox-listbox\"\n aria-labelledby={labelledBy}\n aria-label={labelledBy ? undefined : rest['aria-label']}\n aria-busy={loading || undefined}\n >\n {visible.map((option, index) => (\n <ListboxOptionItem\n key={option.value}\n id={optionId(option)}\n option={option}\n query={query}\n multiple\n active={index === activeIndex}\n selected={values.includes(option.value)}\n disabled={isUnavailable(option)}\n onHover={() => setActiveIndex(index)}\n onSelect={() => toggle(option)}\n />\n ))}\n </ul>\n </Freeze>\n </div>\n </Portal>\n )}\n </div>\n )\n}\n\n/**\n * Seleção de várias opções com busca: a lista fica aberta enquanto se escolhe\n * e os itens escolhidos aparecem como chips removíveis.\n */\nexport const MultiSelect = forwardRef<HTMLInputElement, MultiSelectProps>(function MultiSelect(\n { label, hideLabel, description, error, required, disabled, id, className, ...rest },\n ref,\n) {\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n controlId={id}\n className={cx('or-multi-select-field', className)}\n >\n <MultiSelectControl\n inputRef={ref}\n hasLabel={Boolean(label)}\n required={required}\n disabled={disabled}\n {...rest}\n />\n </Field>\n )\n})\n","import { forwardRef, useMemo, useRef, type InputHTMLAttributes, type MouseEvent, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { cx, mergeRefs } from '../../utils'\nimport { useFieldControlProps } from '../Field'\nimport { useErrorShake } from './useErrorShake'\nimport './FormMotion.css'\nimport './TextField.css'\n\n/** Tamanho dos controles de texto: `sm` 32px, `md` 40px, `lg` 48px. */\nexport type ControlSize = 'sm' | 'md' | 'lg'\n\n/**\n * Props internas do controle com moldura (`.or-control-frame`) compartilhado\n * por TextField, PasswordField e NumberField. Não é exportado pela biblioteca.\n */\nexport interface InputControlProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n size?: ControlSize\n /** Força o estado inválido mesmo sem mensagem de erro. */\n invalid?: boolean\n startIcon?: ReactNode\n endIcon?: ReactNode\n /** Texto fixo antes do valor (ex.: `https://`, `R$`). */\n prefix?: ReactNode\n /** Texto fixo depois do valor (ex.: `kg`, `.com.br`). */\n suffix?: ReactNode\n /** Elementos interativos no início da moldura (botões internos). */\n leading?: ReactNode\n /** Elementos interativos no fim da moldura (botões internos). */\n trailing?: ReactNode\n /** Ids extras para `aria-describedby` (contador, requisitos…). */\n describedBy?: string\n /** Conteúdo renderizado logo abaixo da moldura. */\n after?: ReactNode\n frameClassName?: string\n}\n\nexport const InputControl = forwardRef<HTMLInputElement, InputControlProps>(function InputControl(\n {\n size = 'md',\n invalid,\n startIcon,\n endIcon,\n prefix,\n suffix,\n leading,\n trailing,\n describedBy,\n after,\n frameClassName,\n className,\n id,\n required,\n disabled,\n readOnly,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n ...rest\n },\n ref,\n) {\n const innerRef = useRef<HTMLInputElement>(null)\n const ref2 = useMemo(() => mergeRefs(ref, innerRef), [ref])\n const affixId = useId('or-affix')\n const hasPrefix = prefix !== undefined && prefix !== null && prefix !== false\n const hasSuffix = suffix !== undefined && suffix !== null && suffix !== false\n const prefixId = hasPrefix ? `${affixId}-prefix` : undefined\n const suffixId = hasSuffix ? `${affixId}-suffix` : undefined\n\n const controlProps = useFieldControlProps({\n id,\n 'aria-describedby': [ariaDescribedBy, prefixId, suffixId, describedBy].filter(Boolean).join(' ') || undefined,\n 'aria-invalid': invalid || ariaInvalid === true || ariaInvalid === 'true' ? true : undefined,\n required,\n disabled,\n })\n const isInvalid = controlProps['aria-invalid'] === true\n const isDisabled = Boolean(controlProps.disabled)\n const { shakeClassName, onAnimationEnd } = useErrorShake(isInvalid)\n\n // Clicar em qualquer parte da moldura (ícone, prefixo) foca o campo.\n const handleFrameMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement\n const input = innerRef.current\n if (!input || isDisabled || target === input || target.closest('button, a, input, select, textarea')) return\n event.preventDefault()\n input.focus()\n }\n\n return (\n <>\n {/* O mousedown só amplia a área de clique do input (que já é focável por teclado). */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-input-frame', frameClassName, shakeClassName)}\n data-invalid={isInvalid || undefined}\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled || undefined}\n data-readonly={readOnly || undefined}\n onMouseDown={handleFrameMouseDown}\n onAnimationEnd={onAnimationEnd}\n >\n {leading}\n {hasPrefix && (\n <span id={prefixId} className=\"or-input-frame__affix or-input-frame__affix--prefix\">\n {prefix}\n </span>\n )}\n {startIcon && (\n <span className=\"or-control-frame__addon or-control-frame__addon--start\" aria-hidden=\"true\">\n {startIcon}\n </span>\n )}\n <input\n ref={ref2}\n className={cx('or-control-frame__input', className)}\n readOnly={readOnly}\n {...controlProps}\n {...rest}\n />\n {endIcon && (\n <span className=\"or-control-frame__addon or-control-frame__addon--end\" aria-hidden=\"true\">\n {endIcon}\n </span>\n )}\n {hasSuffix && (\n <span id={suffixId} className=\"or-input-frame__affix or-input-frame__affix--suffix\">\n {suffix}\n </span>\n )}\n {trailing}\n </div>\n {after}\n </>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type PointerEvent,\n type ReactNode,\n} from 'react'\nimport { flushSync } from 'react-dom'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { clamp, cx, mergeRefs } from '../../utils'\nimport { Field } from '../Field'\nimport { InputControl } from '../TextField/InputControl'\nimport type { TextFieldBaseProps } from '../TextField/TextField'\nimport './NumberField.css'\n\nexport interface NumberFieldProps\n extends Omit<TextFieldBaseProps, 'onValueChange'>,\n Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'prefix' | 'type' | 'value' | 'defaultValue' | 'onChange' | 'min' | 'max' | 'step'\n > {\n /** Valor (controlado). `null` representa o campo vazio. */\n value?: number | null\n /** Valor inicial (não controlado). */\n defaultValue?: number | null\n /** Chamado com o novo valor numérico (ou `null` quando vazio). */\n onChange?: (value: number | null) => void\n /** Valor mínimo. `Home` leva até ele. */\n min?: number\n /** Valor máximo. `End` leva até ele. */\n max?: number\n /** Incremento das setas e dos botões. Padrão: 1. */\n step?: number\n /** Incremento de `PageUp`/`PageDown`. Padrão: `step × 10`. */\n largeStep?: number\n /**\n * Opções de `Intl.NumberFormat` (moeda, porcentagem, unidade, casas\n * decimais). O idioma vem do `OrangeProvider`.\n */\n formatOptions?: Intl.NumberFormatOptions\n /** Ícone decorativo no início do campo. */\n startIcon?: ReactNode\n /** Texto fixo antes do valor (ex.: `R$`). */\n prefix?: ReactNode\n /** Texto fixo depois do valor (ex.: `kg`, `un.`). */\n suffix?: ReactNode\n /** Oculta os botões − / +. O teclado continua funcionando. */\n hideStepper?: boolean\n}\n\nfunction decimalsOf(value: number): number {\n if (!Number.isFinite(value)) return 0\n const text = String(value)\n const exp = text.match(/e-(\\d+)$/)\n if (exp) return Number(exp[1])\n const dot = text.indexOf('.')\n return dot === -1 ? 0 : text.length - dot - 1\n}\n\nfunction roundTo(value: number, digits: number): number {\n return Number(value.toFixed(Math.min(Math.max(digits, 0), 20)))\n}\n\n/** Cria um leitor de números que entende separadores do idioma, moeda e %. */\nfunction createParser(locale: string, percent: boolean) {\n let group = ','\n let decimal = '.'\n try {\n const parts = new Intl.NumberFormat(locale, { useGrouping: true }).formatToParts(-12345.6)\n group = parts.find((p) => p.type === 'group')?.value ?? group\n decimal = parts.find((p) => p.type === 'decimal')?.value ?? decimal\n } catch {\n /* locale inválido: usa o padrão en */\n }\n return (text: string): number | null => {\n let s = text.replace(/[\\s\\u00a0\\u202f]/g, '').replace(/[\\u2212\\u2012\\u2013]/g, '-')\n if (s === '') return null\n const isSpaceGroup = /\\s/.test(group) || group === '\\u00a0' || group === '\\u202f'\n if (!isSpaceGroup && !s.includes(decimal)) {\n // \"1.5\" em pt-BR: um único separador de milhar sem 3 dígitos depois → decimal.\n const pieces = s.split(group)\n if (pieces.length === 2 && pieces[1].replace(/\\D/g, '').length !== 3) s = pieces.join(decimal)\n }\n if (!isSpaceGroup) s = s.split(group).join('')\n s = s.split(decimal).join('.')\n s = s.replace(/[^\\d.-]/g, '')\n if (!/^-?\\d*\\.?\\d*$/.test(s) || !/\\d/.test(s)) return Number.NaN\n const n = Number.parseFloat(s)\n return percent ? n / 100 : n\n }\n}\n\n/**\n * Campo numérico no padrão spinbutton do WAI-ARIA: setas, PageUp/PageDown,\n * Home/End e botões − / +. Aceita formatação por `Intl.NumberFormat`\n * (moeda, porcentagem, unidades) e trabalha com `number | null`.\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(\n {\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n optional,\n labelAside,\n disabled,\n readOnly,\n id,\n className,\n style,\n size = 'md',\n value: valueProp,\n defaultValue = null,\n onChange,\n min,\n max,\n step = 1,\n largeStep,\n formatOptions,\n startIcon,\n prefix,\n suffix,\n hideStepper = false,\n name,\n form,\n inputMode,\n onKeyDown,\n onBlur,\n ...rest\n },\n ref,\n) {\n const { locale, t } = useLocale()\n const inputId = useId('or-number-field', id)\n const innerRef = useRef<HTMLInputElement>(null)\n const mergedRef = useMemo(() => mergeRefs(ref, innerRef), [ref])\n const [value, setValue] = useControllableState<number | null>({ value: valueProp, defaultValue, onChange })\n const [editingText, setEditingText] = useState<string | null>(null)\n const editingRef = useRef<string | null>(null)\n editingRef.current = editingText\n\n const optionsKey = JSON.stringify(formatOptions ?? null)\n const { formatter, parse, maxFractionDigits } = useMemo(() => {\n const options: Intl.NumberFormatOptions = formatOptions ?? { maximumFractionDigits: Math.max(3, decimalsOf(step)) }\n let nf: Intl.NumberFormat\n try {\n nf = new Intl.NumberFormat(locale, options)\n } catch {\n nf = new Intl.NumberFormat(undefined, options)\n }\n const percent = options.style === 'percent'\n const resolved = nf.resolvedOptions()\n return {\n formatter: nf,\n parse: createParser(locale, percent),\n maxFractionDigits: (resolved.maximumFractionDigits ?? 3) + (percent ? 2 : 0),\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [locale, optionsKey, step])\n\n const format = (n: number | null) => (n === null || Number.isNaN(n) ? '' : formatter.format(n))\n const lower = min ?? Number.NEGATIVE_INFINITY\n const upper = max ?? Number.POSITIVE_INFINITY\n const big = largeStep ?? step * 10\n const interactive = !disabled && !readOnly\n\n /** Lê o texto digitado (se houver) ou o valor atual. */\n const resolveCurrent = (prev: number | null): number | null => {\n const typed = editingRef.current\n if (typed === null) return prev\n const parsed = parse(typed)\n return parsed === null || Number.isNaN(parsed) ? prev : parsed\n }\n\n // \"Tick\" visual do valor a cada passo discreto (alterna a paridade para reiniciar a animação).\n const [bump, setBump] = useState<{ direction: 'up' | 'down'; count: number } | null>(null)\n const announceBump = (direction: 'up' | 'down') =>\n setBump((previous) => ({ direction, count: (previous?.count ?? 0) + 1 }))\n\n const stepBy = (delta: number, animate = true) => {\n let from: number | null = null\n let to: number | null = null\n // O updater do useControllableState roda de forma síncrona.\n setValue((prev) => {\n const current = resolveCurrent(prev)\n from = prev\n to =\n current === null\n ? clamp(0, lower, upper)\n : clamp(roundTo(current + delta, Math.max(decimalsOf(step), decimalsOf(current), decimalsOf(delta))), lower, upper)\n return to\n })\n editingRef.current = null\n setEditingText(null)\n if (animate && to !== from) announceBump(delta > 0 ? 'up' : 'down')\n }\n\n const setTo = (next: number) => {\n if (value !== null && next !== value) announceBump(next > value ? 'up' : 'down')\n setValue(next)\n editingRef.current = null\n setEditingText(null)\n }\n\n const commit = () => {\n const typed = editingRef.current\n if (typed === null) return\n const parsed = parse(typed)\n editingRef.current = null\n setEditingText(null)\n if (parsed === null) {\n setValue(null)\n return\n }\n if (Number.isNaN(parsed)) return // texto inválido: volta ao último valor\n setValue(clamp(roundTo(parsed, maxFractionDigits), lower, upper))\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || !interactive || event.altKey || event.metaKey || event.ctrlKey) return\n switch (event.key) {\n case 'ArrowUp':\n stepBy(step)\n break\n case 'ArrowDown':\n stepBy(-step)\n break\n case 'PageUp':\n stepBy(big)\n break\n case 'PageDown':\n stepBy(-big)\n break\n case 'Home':\n if (min === undefined) return\n setTo(min)\n break\n case 'End':\n if (max === undefined) return\n setTo(max)\n break\n case 'Enter':\n // Confirma antes do envio implícito do formulário.\n flushSync(commit)\n return\n default:\n return\n }\n event.preventDefault()\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n commit()\n onBlur?.(event)\n }\n\n // Botões −/+: clique simples ou pressionar e segurar para repetir.\n const repeatTimer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const pointerStepped = useRef(false)\n const stopRepeat = () => clearTimeout(repeatTimer.current)\n useEffect(() => stopRepeat, [])\n\n const stepperProps = (delta: number, enabled: boolean) => ({\n type: 'button' as const,\n tabIndex: -1,\n disabled: !enabled,\n 'aria-controls': inputId,\n className: 'or-control-frame__button or-number-field__step',\n onMouseDown: (event: { preventDefault: () => void }) => event.preventDefault(),\n onPointerDown: (event: PointerEvent<HTMLButtonElement>) => {\n if (event.button !== 0) return\n // Sem preventDefault aqui: ele suprimiria o :active (press). O foco é\n // preservado pelo preventDefault do mousedown.\n pointerStepped.current = true\n if (event.pointerType === 'mouse') innerRef.current?.focus({ preventScroll: true })\n stepBy(delta)\n stopRepeat()\n const tick = (delay: number) => {\n repeatTimer.current = setTimeout(() => {\n stepBy(delta, false)\n tick(60)\n }, delay)\n }\n tick(400)\n window.addEventListener('pointerup', stopRepeat, { once: true })\n window.addEventListener('pointercancel', stopRepeat, { once: true })\n },\n onPointerUp: stopRepeat,\n onPointerLeave: stopRepeat,\n onClick: () => {\n // Cliques sem pointerdown (leitores de tela, testes) também contam.\n if (pointerStepped.current) {\n pointerStepped.current = false\n return\n }\n stepBy(delta)\n },\n })\n\n const canDecrement = interactive && (value === null || value > lower)\n const canIncrement = interactive && (value === null || value < upper)\n const allowsNegative = min === undefined || min < 0\n const allowsFraction = decimalsOf(step) > 0 || maxFractionDigits > 0\n const display = editingText ?? format(value)\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={inputId}\n labelAside={labelAside}\n className={cx('or-number-field', className)}\n style={style}\n >\n <InputControl\n ref={mergedRef}\n type=\"text\"\n role=\"spinbutton\"\n size={size}\n invalid={invalid}\n readOnly={readOnly}\n startIcon={startIcon}\n prefix={prefix}\n suffix={suffix}\n frameClassName=\"or-number-field__frame\"\n inputMode={inputMode ?? (allowsNegative ? 'text' : allowsFraction ? 'decimal' : 'numeric')}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={display}\n aria-valuenow={value ?? undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={value === null ? undefined : format(value)}\n data-tick={bump ? `${bump.direction}-${bump.count % 2}` : undefined}\n form={form}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n editingRef.current = event.target.value\n setEditingText(event.target.value)\n }}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n trailing={\n hideStepper ? null : (\n <>\n <button {...stepperProps(-step, canDecrement)} aria-label={t('decrement')}>\n <Icon name=\"minus\" />\n </button>\n <button {...stepperProps(step, canIncrement)} aria-label={t('increment')}>\n <Icon name=\"plus\" />\n </button>\n </>\n )\n }\n after={name ? <input type=\"hidden\" name={name} form={form} value={value ?? ''} /> : null}\n {...rest}\n />\n </Field>\n )\n})\n","import { forwardRef, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { useReducedMotion } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { cx } from '../../utils'\nimport type { RenderLink } from '../Link'\nimport './PageHeader.css'\n\nexport type PageHeaderHeadingLevel = 1 | 2 | 3\n\n/** Link de volta para a página anterior na hierarquia. */\nexport interface PageHeaderBack {\n /** Destino do link. */\n href: string\n /** Texto do link — diga para onde ele leva (\"Pedidos\", \"Voltar para pedidos\"). */\n label: string\n}\n\nexport interface PageHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Título da página. */\n title: ReactNode\n /** Nível do heading do título. Padrão: `1` (um `h1` por página). */\n headingLevel?: PageHeaderHeadingLevel\n /** Texto de apoio abaixo do título. */\n description?: ReactNode\n /** Rótulo curto em caixa alta acima do título (área, seção, contexto). */\n eyebrow?: ReactNode\n /** Trilha de navegação acima do título — normalmente um `<Breadcrumb>`. */\n breadcrumbs?: ReactNode\n /** Link de volta, com seta, acima do título. */\n back?: PageHeaderBack\n /** Renderiza o link de volta com o componente do seu roteador. */\n renderLink?: RenderLink\n /** Ações da página (botões), alinhadas à direita; quebram para baixo do título em telas estreitas. */\n actions?: ReactNode\n /** Selos ou status ao lado do título (Tag, Badge…). */\n meta?: ReactNode\n /** Navegação local sob o cabeçalho — normalmente uma `TabList`. */\n navigation?: ReactNode\n /** Linha de 1px na base do cabeçalho. */\n divider?: boolean\n /**\n * Entrada em sequência ao montar: eyebrow → título → descrição → ações\n * (sobem 24px com fade, 80ms entre eles). Desligada com movimento reduzido.\n */\n reveal?: boolean\n}\n\n/**\n * Topo de uma página da aplicação: trilha ou link de volta, eyebrow, título,\n * descrição, selos, ações e navegação local (abas).\n */\nexport const PageHeader = forwardRef<HTMLDivElement, PageHeaderProps>(function PageHeader(\n {\n title,\n headingLevel = 1,\n description,\n eyebrow,\n breadcrumbs,\n back,\n renderLink,\n actions,\n meta,\n navigation,\n divider = false,\n reveal = false,\n className,\n ...rest\n },\n ref,\n) {\n const reducedMotion = useReducedMotion()\n const animate = reveal && !reducedMotion\n const Heading = `h${headingLevel}` as 'h1' | 'h2' | 'h3'\n // Índice de cada parte na sequência da revelação (eyebrow → título → descrição → ações).\n let step = 0\n const revealStyle = () => (animate ? ({ '--_i': step++ } as CSSProperties) : undefined)\n\n const backLink = back\n ? (() => {\n const linkProps = {\n href: back.href,\n className: 'or-page-header__back',\n children: (\n <>\n <Icon name=\"arrow-left\" size=\"sm\" className=\"or-page-header__back-icon\" />\n <span>{back.label}</span>\n </>\n ),\n }\n return renderLink ? renderLink(linkProps) : <a {...linkProps} />\n })()\n : null\n\n return (\n <div\n ref={ref}\n className={cx(\n 'or-page-header',\n `or-page-header--h${headingLevel}`,\n divider && 'or-page-header--divider',\n Boolean(navigation) && 'or-page-header--with-navigation',\n animate && 'or-page-header--reveal',\n className,\n )}\n {...rest}\n >\n {(breadcrumbs || backLink) && (\n <div className=\"or-page-header__context\">\n {breadcrumbs && <div className=\"or-page-header__breadcrumbs\">{breadcrumbs}</div>}\n {backLink}\n </div>\n )}\n <div className=\"or-page-header__main\">\n <div className=\"or-page-header__heading\">\n {eyebrow && (\n <p className=\"or-page-header__eyebrow or-eyebrow\" style={revealStyle()}>\n {eyebrow}\n </p>\n )}\n <div className=\"or-page-header__title-row\" style={revealStyle()}>\n <Heading className=\"or-page-header__title\">{title}</Heading>\n {meta && <div className=\"or-page-header__meta\">{meta}</div>}\n </div>\n {description && (\n <div className=\"or-page-header__description\" style={revealStyle()}>\n {description}\n </div>\n )}\n </div>\n {actions && (\n <div className=\"or-page-header__actions\" style={revealStyle()}>\n {actions}\n </div>\n )}\n </div>\n {navigation ? <div className=\"or-page-header__navigation\">{navigation}</div> : null}\n </div>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon, type IconName } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { clamp, cx, range } from '../../utils'\nimport type { RenderLink } from '../Link'\nimport { VisuallyHidden } from '../VisuallyHidden'\n// Estilos compartilhados de controle (.or-control) usados no seletor de itens por página.\nimport '../Field/Field.css'\nimport './Paginator.css'\n\nexport type PaginatorVariant = 'default' | 'compact'\nexport type PaginatorSize = 'sm' | 'md'\n\nexport interface PaginatorProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Página atual, começando em 1 (controlado). */\n page?: number\n /** Página inicial (não controlado). Padrão: 1. */\n defaultPage?: number\n /** Chamado quando a página muda. */\n onPageChange?: (page: number) => void\n /** Total de páginas. Opcional quando `totalItems` é informado. */\n totalPages?: number\n /** Total de itens. Habilita o texto \"1–20 de 240\" e o cálculo de páginas. */\n totalItems?: number\n /** Itens por página (controlado). */\n pageSize?: number\n /** Itens por página inicial (não controlado). Padrão: 20. */\n defaultPageSize?: number\n /** Chamado quando o usuário escolhe outra quantidade de itens por página. */\n onPageSizeChange?: (pageSize: number) => void\n /** Opções do seletor de itens por página. Sem opções, o seletor não aparece. */\n pageSizeOptions?: number[]\n /** Páginas mostradas de cada lado da atual. Padrão: 1. */\n siblingCount?: number\n /** Páginas sempre mostradas no início e no fim. Padrão: 1. */\n boundaryCount?: number\n /** Mostra os botões de primeira e última página. */\n showFirstLast?: boolean\n /** `default`: lista de páginas. `compact`: \"Página 3 de 12\" entre anterior/próximo. */\n variant?: PaginatorVariant\n /** Tamanho dos botões: `sm` 32px, `md` 40px. */\n size?: PaginatorSize\n /**\n * Gera o endereço de cada página — as páginas viram links (bom para SEO e\n * para abrir em nova aba). Sem ela, são botões.\n */\n getPageHref?: (page: number) => string\n /** Renderiza os links com o componente do seu roteador (requer `getPageHref`). */\n renderLink?: RenderLink\n}\n\ntype PageItem = number | 'start-ellipsis' | 'end-ellipsis'\n\n/** Calcula a sequência de páginas com reticências (mesma lógica do MUI). */\nfunction getPageItems(page: number, count: number, siblingCount: number, boundaryCount: number): PageItem[] {\n const startPages = range(1, Math.min(boundaryCount, count))\n const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count)\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, count - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n )\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : count - 1,\n )\n const items: (PageItem | null)[] = [\n ...startPages,\n siblingsStart > boundaryCount + 2\n ? 'start-ellipsis'\n : boundaryCount + 1 < count - boundaryCount\n ? boundaryCount + 1\n : null,\n ...range(siblingsStart, siblingsEnd),\n siblingsEnd < count - boundaryCount - 1\n ? 'end-ellipsis'\n : count - boundaryCount > boundaryCount\n ? count - boundaryCount\n : null,\n ...endPages,\n ]\n return items.filter((item): item is PageItem => item !== null)\n}\n\n/**\n * Paginação: divide resultados longos em páginas e permite navegar entre\n * elas. Variante `compact` para espaços estreitos e seletor opcional de\n * itens por página.\n */\nexport const Paginator = forwardRef<HTMLElement, PaginatorProps>(function Paginator(\n {\n page: pageProp,\n defaultPage = 1,\n onPageChange,\n totalPages,\n totalItems,\n pageSize: pageSizeProp,\n defaultPageSize = 20,\n onPageSizeChange,\n pageSizeOptions,\n siblingCount = 1,\n boundaryCount = 1,\n showFirstLast = false,\n variant = 'default',\n size = 'md',\n getPageHref,\n renderLink,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const selectId = useId('or-paginator-size')\n const listRef = useRef<HTMLUListElement>(null)\n const focusCurrent = useRef(false)\n\n const [pageSize, setPageSize] = useControllableState({\n value: pageSizeProp,\n defaultValue: defaultPageSize,\n onChange: onPageSizeChange,\n })\n const count = Math.max(\n 1,\n totalPages ?? (totalItems !== undefined ? Math.ceil(totalItems / Math.max(1, pageSize)) : 1),\n )\n const [rawPage, setPage] = useControllableState({ value: pageProp, defaultValue: defaultPage, onChange: onPageChange })\n const page = clamp(rawPage, 1, count)\n\n // Se o botão focado sumir (anterior/próximo desabilitado), o foco vai para a página atual.\n useEffect(() => {\n if (!focusCurrent.current) return\n focusCurrent.current = false\n const active = document.activeElement\n if (active && active !== document.body && !(active as HTMLButtonElement).disabled) return\n const list = listRef.current\n const fallback =\n list?.querySelector<HTMLElement>('[aria-current=\"page\"]') ??\n list?.querySelector<HTMLElement>('button.or-paginator__button:not(:disabled), a.or-paginator__button[href]')\n fallback?.focus()\n }, [page])\n\n // Depois da primeira troca de página, o texto da variante compacta anima.\n const [prevPage, setPrevPage] = useState(page)\n const [changed, setChanged] = useState(false)\n if (prevPage !== page) {\n setPrevPage(page)\n setChanged(true)\n }\n\n const goTo = (next: number) => {\n const target = clamp(next, 1, count)\n if (target === page) return\n if (target === 1 || target === count) focusCurrent.current = true\n setPage(target)\n }\n\n const renderControl = (opts: {\n key: string\n target: number\n label: string\n icon?: IconName\n text?: ReactNode\n disabled?: boolean\n current?: boolean\n className: string\n edge?: boolean\n }) => {\n const { key, target, label, icon, text, disabled, current, className: itemClass, edge } = opts\n // Páginas: o número é visível e o nome completo (\"Página 3\") vem de texto\n // oculto. Botões só com ícone usam aria-label.\n const content =\n text !== undefined ? (\n <>\n <span aria-hidden=\"true\">{text}</span>\n <VisuallyHidden>{label}</VisuallyHidden>\n </>\n ) : (\n icon && <Icon name={icon} size=\"sm\" />\n )\n const common = {\n className: cx('or-paginator__button', itemClass),\n 'aria-label': text !== undefined ? undefined : label,\n 'aria-current': current ? ('page' as const) : undefined,\n }\n let control: ReactNode\n if (getPageHref && !disabled) {\n const linkProps = {\n ...common,\n href: getPageHref(target),\n children: content,\n onClick: () => goTo(target),\n }\n control = renderLink ? renderLink(linkProps) : <a {...linkProps} />\n } else if (getPageHref && disabled) {\n control = (\n <a {...common} role=\"link\" aria-disabled=\"true\">\n {content}\n </a>\n )\n } else {\n control = (\n <button type=\"button\" {...common} disabled={disabled} onClick={() => goTo(target)}>\n {content}\n </button>\n )\n }\n return (\n <li key={key} className={cx('or-paginator__item', edge && 'or-paginator__item--edge')}>\n {control}\n </li>\n )\n }\n\n const isFirst = page <= 1\n const isLast = page >= count\n\n const edges = {\n first: showFirstLast\n ? renderControl({\n key: 'first',\n target: 1,\n label: t('firstPage'),\n icon: 'chevrons-left',\n disabled: isFirst,\n className: 'or-paginator__button--nav or-paginator__button--first',\n edge: true,\n })\n : null,\n prev: renderControl({\n key: 'prev',\n target: page - 1,\n label: t('previousPage'),\n icon: 'chevron-left',\n disabled: isFirst,\n className: 'or-paginator__button--nav or-paginator__button--prev',\n }),\n next: renderControl({\n key: 'next',\n target: page + 1,\n label: t('nextPage'),\n icon: 'chevron-right',\n disabled: isLast,\n className: 'or-paginator__button--nav or-paginator__button--next',\n }),\n last: showFirstLast\n ? renderControl({\n key: 'last',\n target: count,\n label: t('lastPage'),\n icon: 'chevrons-right',\n disabled: isLast,\n className: 'or-paginator__button--nav or-paginator__button--last',\n edge: true,\n })\n : null,\n }\n\n const pages =\n variant === 'compact' ? (\n <li className=\"or-paginator__item or-paginator__status\" aria-live=\"polite\">\n {/* Remonta a cada troca para o texto entrar com um deslize curto. */}\n <span key={page} className={cx('or-paginator__status-text', changed && 'or-paginator__status-text--enter')}>\n {t('pageOf', { page, total: count })}\n </span>\n </li>\n ) : (\n getPageItems(page, count, siblingCount, boundaryCount).map((item) =>\n typeof item === 'number' ? (\n renderControl({\n key: `page-${item}`,\n target: item,\n label: t('page', { page: item }),\n text: item,\n current: item === page,\n className: 'or-paginator__button--page',\n })\n ) : (\n <li key={item} className=\"or-paginator__item or-paginator__ellipsis\" aria-hidden=\"true\">\n …\n </li>\n ),\n )\n )\n\n const start = totalItems !== undefined ? Math.min((page - 1) * pageSize + 1, totalItems) : 0\n const end = totalItems !== undefined ? Math.min(page * pageSize, totalItems) : 0\n const showInfo = totalItems !== undefined || (pageSizeOptions && pageSizeOptions.length > 0)\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel ?? t('pagination')}\n className={cx('or-paginator', `or-paginator--${variant}`, `or-paginator--${size}`, className)}\n {...rest}\n >\n {showInfo && (\n <div className=\"or-paginator__info\">\n {totalItems !== undefined && (\n <span className=\"or-paginator__range\" aria-live=\"polite\">\n {t('itemRange', { start, end, total: totalItems })}\n </span>\n )}\n {pageSizeOptions && pageSizeOptions.length > 0 && (\n <span className=\"or-paginator__size\">\n <label htmlFor={selectId}>{t('itemsPerPage')}</label>\n <select\n id={selectId}\n className={cx('or-control', 'or-control--sm', 'or-paginator__select')}\n value={pageSize}\n onChange={(event) => {\n const nextSize = Number(event.target.value)\n const firstItem = (page - 1) * pageSize\n setPageSize(nextSize)\n // Mantém visível o primeiro item da página atual.\n setPage(Math.floor(firstItem / nextSize) + 1)\n }}\n >\n {pageSizeOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </span>\n )}\n </div>\n )}\n <ul ref={listRef} className=\"or-paginator__list\">\n {edges.first}\n {edges.prev}\n {pages}\n {edges.next}\n {edges.last}\n </ul>\n </nav>\n )\n})\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n type ElementType,\n type HTMLAttributes,\n type RefObject,\n} from 'react'\nimport { useIsomorphicLayoutEffect } from '../../hooks'\nimport {\n getColorScheme,\n isHighContrastTheme,\n isThemeName,\n useTheme,\n type ResolvedTheme,\n} from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport './Paper.css'\n\nexport type PaperPadding = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12\nexport type PaperBorder = 'none' | 'default' | 'strong' | 'accent-top' | 'accent-left'\nexport type PaperElevation = 'flat' | 'raised' | 'overlay'\nexport type PaperTone = 'default' | 'subtle' | 'inverse'\n\nexport interface PaperProps\n extends HTMLAttributes<HTMLElement>,\n Pick<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'target' | 'rel' | 'download'>,\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'disabled'> {\n /** Elemento renderizado (`section`, `article`, `aside`, `li`…). Padrão: `div`. */\n as?: ElementType\n /** Espaçamento interno na escala de espaço (`6` = 1.5rem). Padrão: `6`. */\n padding?: PaperPadding\n /** Borda: 1px neutra, mais forte, ou com faixa laranja no topo/à esquerda. Padrão: `default`. */\n border?: PaperBorder\n /** `flat` (padrão), `raised` (sombra leve) ou `overlay` (sombra de sobreposição). */\n elevation?: PaperElevation\n /**\n * Cor de fundo: `default` (superfície), `subtle` (fundo sutil) ou `inverse`\n * (inverte o tema dentro da superfície — componentes internos acompanham).\n */\n tone?: PaperTone\n /**\n * Superfície clicável (cartão-link, opção selecionável): sobe 4px com sombra\n * laranja no hover/foco e afunda ao pressionar. Use com `as=\"a\"`/`as=\"button\"`\n * ou com um link/botão dentro.\n */\n interactive?: boolean\n}\n\n/**\n * Lê o esquema de cores efetivo do pai (que pode estar num escopo\n * `data-theme` diferente do documento) e devolve o tema oposto.\n */\nfunction useInverseTheme(ref: RefObject<HTMLElement | null>, enabled: boolean): ResolvedTheme | undefined {\n const { resolvedTheme } = useTheme()\n const [theme, setTheme] = useState<ResolvedTheme | undefined>(undefined)\n\n useIsomorphicLayoutEffect(() => {\n if (!enabled) {\n setTheme(undefined)\n return\n }\n const el = ref.current\n if (!el) return\n const update = () => {\n const parent = el.parentElement\n const scheme = parent ? (getComputedStyle(parent).colorScheme ?? '') : ''\n // O tema do escopo diz se é alto contraste: o inverso de dark-hc é light-hc.\n const scope = parent?.closest('[data-theme]')?.getAttribute('data-theme')\n const context: ResolvedTheme = isThemeName(scope) ? scope : resolvedTheme\n const current = scheme.includes('light')\n ? 'light'\n : scheme.includes('dark')\n ? 'dark'\n : getColorScheme(context)\n const inverse = current === 'light' ? 'dark' : 'light'\n setTheme(isHighContrastTheme(context) ? `${inverse}-hc` : inverse)\n }\n update()\n if (typeof MutationObserver === 'undefined') return\n // reage a trocas de tema em qualquer ancestral (provider, prévia da doc…)\n const observer = new MutationObserver(update)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'], subtree: true })\n return () => observer.disconnect()\n }, [enabled, resolvedTheme])\n\n return theme\n}\n\n/**\n * Superfície base do Orange: um contêiner com fundo, borda de 1px e\n * espaçamento interno. É a peça sobre a qual cartões, painéis e seções são\n * montados.\n */\nexport const Paper = forwardRef<HTMLElement, PaperProps>(function Paper(\n {\n as: Component = 'div',\n padding = 6,\n border = 'default',\n elevation = 'flat',\n tone = 'default',\n interactive = false,\n className,\n ...rest\n },\n ref,\n) {\n const innerRef = useRef<HTMLElement>(null)\n const composedRef = useMemo(() => mergeRefs(ref, innerRef), [ref])\n const inverseTheme = useInverseTheme(innerRef, tone === 'inverse')\n\n return (\n <Component\n ref={composedRef}\n className={cx(\n 'or-paper',\n `or-paper--padding-${padding}`,\n `or-paper--border-${border}`,\n `or-paper--${elevation}`,\n `or-paper--tone-${tone}`,\n interactive && 'or-paper--interactive',\n className,\n )}\n data-theme={inverseTheme}\n {...rest}\n />\n )\n})\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type InputHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useDebouncedValue, useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { Field } from '../Field'\nimport { InputControl } from '../TextField/InputControl'\nimport type { TextFieldBaseProps } from '../TextField/TextField'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './PasswordField.css'\n\nexport interface PasswordRequirement {\n /** Texto do requisito, ex.: \"Pelo menos 8 caracteres\". */\n label: ReactNode\n /** Se o valor atual atende ao requisito. */\n met: boolean\n}\n\nexport interface PasswordFieldProps\n extends TextFieldBaseProps,\n Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'type'> {\n /** Ícone decorativo no início do campo (ex.: cadeado). */\n startIcon?: ReactNode\n /** Lista de requisitos exibida abaixo do campo, com estado atendido/não atendido. */\n requirements?: PasswordRequirement[]\n /** Título da lista de requisitos. Padrão: \"Requisitos da senha\". */\n requirementsLabel?: ReactNode\n /** Senha visível (controlado). */\n visible?: boolean\n /** Senha visível inicialmente (não controlado). Padrão: `false`. */\n defaultVisible?: boolean\n /** Chamado quando a visibilidade muda. */\n onVisibleChange?: (visible: boolean) => void\n}\n\nfunction PasswordRequirements({\n id,\n title,\n requirements,\n}: {\n id: string\n title: ReactNode\n requirements: PasswordRequirement[]\n}) {\n const { t } = useLocale()\n const met = requirements.filter((r) => r.met).length\n const total = requirements.length\n const [initial] = useState(met)\n const dirty = useRef(false)\n if (met !== initial) dirty.current = true\n const settled = useDebouncedValue(met, 700)\n const [announcement, setAnnouncement] = useState('')\n\n useEffect(() => {\n if (!dirty.current) return\n setAnnouncement(t('requirementsProgress', { count: settled, total }))\n }, [settled, total, t])\n\n return (\n <div className=\"or-password-field__requirements\">\n <div id={id}>\n <p className=\"or-password-field__requirements-title\">{title}</p>\n <ul className=\"or-password-field__requirements-list\">\n {requirements.map((requirement, index) => (\n <li\n key={index}\n className=\"or-password-field__requirement\"\n data-met={requirement.met || undefined}\n >\n {/* Os dois ícones ficam empilhados: o check entra desenhando com um \"pop\". */}\n <span className=\"or-password-field__requirement-icon\" aria-hidden=\"true\">\n <Icon name=\"square\" size=\"sm\" className=\"or-password-field__requirement-unmet\" />\n <Icon name=\"check\" size=\"sm\" strokeWidth={2.5} className=\"or-password-field__requirement-met\" />\n </span>\n <span>\n {requirement.label}\n <VisuallyHidden> ({requirement.met ? t('requirementMet') : t('requirementNotMet')})</VisuallyHidden>\n </span>\n </li>\n ))}\n </ul>\n </div>\n <VisuallyHidden aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </VisuallyHidden>\n </div>\n )\n}\n\n/**\n * Campo de senha com botão para mostrar/ocultar o valor e lista opcional de\n * requisitos. O botão usa `aria-pressed` e, quando clicado com o mouse ou\n * toque, mantém o foco e o cursor no campo.\n */\nexport const PasswordField = forwardRef<HTMLInputElement, PasswordFieldProps>(function PasswordField(\n {\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n optional,\n labelAside,\n disabled,\n id,\n className,\n style,\n size = 'md',\n startIcon,\n requirements,\n requirementsLabel,\n visible: visibleProp,\n defaultVisible = false,\n onVisibleChange,\n onChange,\n onValueChange,\n autoComplete,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const inputId = useId('or-password', id)\n const requirementsId = useId('or-password-requirements')\n const innerRef = useRef<HTMLInputElement>(null)\n const mergedRef = useMemo(() => mergeRefs(ref, innerRef), [ref])\n const [visible, setVisible] = useControllableState({\n value: visibleProp,\n defaultValue: defaultVisible,\n onChange: onVisibleChange,\n })\n const pendingSelection = useRef<{ start: number | null; end: number | null } | null>(null)\n const hasRequirements = Boolean(requirements && requirements.length > 0)\n\n // Trocar o `type` pode reposicionar o cursor: restaura a seleção anterior.\n useIsomorphicLayoutEffect(() => {\n const selection = pendingSelection.current\n const input = innerRef.current\n if (!selection || !input) return\n pendingSelection.current = null\n if (selection.start === null || selection.end === null) return\n try {\n input.setSelectionRange(selection.start, selection.end)\n } catch {\n /* alguns tipos não suportam seleção */\n }\n }, [visible])\n\n const handleToggle = (event: MouseEvent<HTMLButtonElement>) => {\n const input = innerRef.current\n // `detail > 0` → clique de ponteiro: o foco continua (ou vai) para o campo.\n // Pelo teclado, o foco permanece no botão para permitir alternar de novo.\n if (input && event.detail > 0) {\n const hadFocus = document.activeElement === input\n const end = input.value.length\n pendingSelection.current = {\n start: hadFocus ? input.selectionStart : end,\n end: hadFocus ? input.selectionEnd : end,\n }\n if (!hadFocus) input.focus({ preventScroll: true })\n }\n setVisible(!visible)\n }\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event)\n onValueChange?.(event.target.value)\n }\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={inputId}\n labelAside={labelAside}\n className={cx('or-password-field', className)}\n style={style}\n >\n <InputControl\n ref={mergedRef}\n type={visible ? 'text' : 'password'}\n size={size}\n invalid={invalid}\n startIcon={startIcon}\n autoComplete={autoComplete ?? (hasRequirements ? 'new-password' : 'current-password')}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n onChange={handleChange}\n describedBy={hasRequirements ? requirementsId : undefined}\n trailing={\n <button\n type=\"button\"\n className=\"or-control-frame__button or-password-field__toggle\"\n aria-label={t('showPassword')}\n aria-pressed={visible}\n aria-controls={inputId}\n disabled={disabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleToggle}\n >\n {/* Olho e olho cortado empilhados: troca com crossfade + escala. */}\n <span className=\"or-password-field__eye\" aria-hidden=\"true\">\n <Icon name=\"eye\" className=\"or-password-field__eye-icon or-password-field__eye-icon--show\" />\n <Icon name=\"eye-off\" className=\"or-password-field__eye-icon or-password-field__eye-icon--hide\" />\n </span>\n </button>\n }\n after={\n hasRequirements ? (\n <PasswordRequirements\n id={requirementsId}\n title={requirementsLabel ?? t('passwordRequirements')}\n requirements={requirements!}\n />\n ) : null\n }\n {...rest}\n />\n </Field>\n )\n})\n","import {\n forwardRef,\n Fragment,\n useEffect,\n useRef,\n useState,\n type ClipboardEvent,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { useControllableState } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { useShake } from '../Combobox/motion'\nimport { Field, useField } from '../Field'\nimport './PinInput.css'\n\nexport type PinInputSize = 'sm' | 'md' | 'lg'\nexport type PinInputType = 'numeric' | 'alphanumeric'\n\nexport interface PinInputProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** Quantidade de caracteres. Padrão: 6. */\n length?: number\n /** Caracteres aceitos. `numeric` abre o teclado numérico no celular. */\n type?: PinInputType\n /** Código digitado (controlado). */\n value?: string\n /** Código inicial (não controlado). */\n defaultValue?: string\n /** Chamado a cada alteração. */\n onChange?: (value: string) => void\n /** Chamado quando todos os campos estão preenchidos. */\n onComplete?: (value: string) => void\n /** Oculta os caracteres (como em senhas). */\n mask?: boolean\n /** Agrupa visualmente os campos (ex.: 3 → \"123 456\"). */\n groupSize?: number\n /** Texto de exemplo em cada campo vazio (ex.: \"○\"). */\n placeholder?: string\n /** Rótulo do grupo. */\n label?: ReactNode\n hideLabel?: boolean\n description?: ReactNode\n error?: ReactNode\n /** Marca os campos como inválidos sem exibir mensagem. */\n invalid?: boolean\n required?: boolean\n disabled?: boolean\n /** Foca o primeiro campo ao montar. */\n autoFocus?: boolean\n /** Nome do campo oculto que envia o código completo no formulário. */\n name?: string\n /** Lado de cada campo: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: PinInputSize\n /** Id do primeiro campo. */\n id?: string\n}\n\nconst PATTERNS: Record<PinInputType, RegExp> = {\n numeric: /^[0-9]$/,\n alphanumeric: /^[a-zA-Z0-9]$/,\n}\n\nconst toChars = (value: string, length: number) => Array.from({ length }, (_, i) => value[i] ?? '')\n\ntype ControlProps = Required<Pick<PinInputProps, 'length' | 'type' | 'size'>> &\n Pick<\n PinInputProps,\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'onComplete'\n | 'mask'\n | 'groupSize'\n | 'placeholder'\n | 'invalid'\n | 'autoFocus'\n | 'name'\n > & {\n hasLabel: boolean\n groupRef: React.Ref<HTMLDivElement>\n /** Muda quando o erro surge/muda — dispara o tremor do grupo. */\n errorSignal: string | boolean\n rest: HTMLAttributes<HTMLDivElement>\n }\n\nfunction PinInputControl({\n length,\n type,\n size,\n value: valueProp,\n defaultValue = '',\n onChange,\n onComplete,\n mask = false,\n groupSize,\n placeholder = '',\n invalid,\n autoFocus,\n name,\n hasLabel,\n groupRef,\n errorSignal,\n rest,\n}: ControlProps) {\n const { t } = useLocale()\n const field = useField()\n const pattern = PATTERNS[type]\n const inputs = useRef<(HTMLInputElement | null)[]>([])\n const [value, setValue] = useControllableState({ value: valueProp, defaultValue })\n // Guarda os caracteres por posição (permite lacunas enquanto o usuário edita).\n const [chars, setChars] = useState(() => toChars(value, length))\n useEffect(() => {\n if (value !== chars.join('')) setChars(toChars(value, length))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, length])\n\n useEffect(() => {\n if (autoFocus) inputs.current[0]?.focus()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const isInvalid = invalid || Boolean(field?.invalid)\n const complete = chars.every(Boolean)\n const shake = useShake(errorSignal)\n const pops = useRef<number[]>([])\n const popOrder = useRef<number[]>([])\n const disabled = Boolean(field?.disabled)\n const required = Boolean(field?.required)\n const describedBy = [field?.descriptionId, field?.errorId].filter(Boolean).join(' ') || undefined\n const baseId = field?.controlId\n\n const focusAt = (index: number) => {\n const el = inputs.current[clampIndex(index)]\n el?.focus()\n el?.select()\n }\n const clampIndex = (index: number) => Math.max(0, Math.min(length - 1, index))\n\n const commit = (next: string[]) => {\n // Cada caractere novo faz um pequeno \"pop\"; vários de uma vez (colar) entram em onda.\n let order = 0\n next.forEach((c, i) => {\n if (c && c !== chars[i]) {\n pops.current[i] = (pops.current[i] ?? 0) + 1\n popOrder.current[i] = order++\n }\n })\n if (order === 1) popOrder.current = popOrder.current.map(() => 0)\n setChars(next)\n const joined = next.join('')\n setValue(joined)\n onChange?.(joined)\n if (next.every(Boolean)) onComplete?.(joined)\n }\n\n /** Distribui vários caracteres a partir de `start` (colar ou preenchimento automático do SMS). */\n const fill = (text: string, start: number) => {\n const valid = Array.from(text).filter((c) => pattern.test(c))\n if (valid.length === 0) return\n const from = valid.length >= length ? 0 : start\n const next = [...chars]\n valid.slice(0, length - from).forEach((c, i) => {\n next[from + i] = c\n })\n commit(next)\n focusAt(Math.min(from + valid.length, length - 1))\n }\n\n const handleInput = (index: number, raw: string) => {\n const previous = chars[index]\n if (raw.length > 1) {\n // Campo já preenchido + nova tecla: usa o caractere novo.\n if (raw.length === 2 && previous && raw.includes(previous)) {\n const typed = raw[0] === previous ? raw[1] : raw[0]\n if (!pattern.test(typed)) return\n const next = [...chars]\n next[index] = typed\n commit(next)\n if (index < length - 1) focusAt(index + 1)\n return\n }\n fill(raw, index)\n return\n }\n if (raw === '') {\n const next = [...chars]\n next[index] = ''\n commit(next)\n return\n }\n if (!pattern.test(raw)) return\n const next = [...chars]\n next[index] = raw\n commit(next)\n if (index < length - 1) focusAt(index + 1)\n }\n\n const handleKeyDown = (index: number, event: KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n case 'Backspace': {\n event.preventDefault()\n const next = [...chars]\n if (next[index]) {\n next[index] = ''\n commit(next)\n } else if (index > 0) {\n next[index - 1] = ''\n commit(next)\n focusAt(index - 1)\n }\n break\n }\n case 'Delete': {\n event.preventDefault()\n if (chars[index]) {\n const next = [...chars]\n next[index] = ''\n commit(next)\n }\n break\n }\n case 'ArrowLeft':\n event.preventDefault()\n focusAt(index - 1)\n break\n case 'ArrowRight':\n event.preventDefault()\n focusAt(index + 1)\n break\n case 'Home':\n event.preventDefault()\n focusAt(0)\n break\n case 'End':\n event.preventDefault()\n focusAt(length - 1)\n break\n default:\n // Mesma tecla do caractere atual: apenas avança (o onChange não dispara).\n if (\n event.key.length === 1 &&\n event.key === chars[index] &&\n !event.ctrlKey &&\n !event.metaKey\n ) {\n event.preventDefault()\n if (index < length - 1) focusAt(index + 1)\n }\n }\n }\n\n const handlePaste = (index: number, event: ClipboardEvent<HTMLInputElement>) => {\n event.preventDefault()\n fill(event.clipboardData.getData('text').trim(), index)\n }\n\n const labelledBy = hasLabel && field ? field.labelId : undefined\n const { 'aria-label': ariaLabel, ...groupRest } = rest\n\n return (\n <div\n ref={groupRef}\n role=\"group\"\n aria-labelledby={labelledBy}\n aria-label={labelledBy ? undefined : ariaLabel}\n aria-describedby={describedBy}\n className={cx('or-pin-input', `or-pin-input--${size}`)}\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n data-complete={(complete && !isInvalid) || undefined}\n {...shake}\n {...groupRest}\n >\n {chars.map((char, index) => (\n <Fragment key={index}>\n {groupSize && index > 0 && index % groupSize === 0 && (\n <span className=\"or-pin-input__separator\" aria-hidden=\"true\" />\n )}\n <input\n ref={(el) => {\n inputs.current[index] = el\n }}\n id={index === 0 ? baseId : baseId ? `${baseId}-${index}` : undefined}\n type={mask ? 'password' : 'text'}\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n pattern={type === 'numeric' ? '[0-9]*' : undefined}\n autoComplete={index === 0 ? 'one-time-code' : 'off'}\n autoCapitalize={type === 'alphanumeric' ? 'characters' : 'off'}\n autoCorrect=\"off\"\n spellCheck={false}\n className=\"or-pin-input__field\"\n value={char}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n aria-invalid={isInvalid || undefined}\n aria-label={t(type === 'numeric' ? 'pinDigit' : 'pinCharacter', {\n index: index + 1,\n total: length,\n })}\n data-filled={char ? '' : undefined}\n data-pop={\n char && pops.current[index] ? (pops.current[index] % 2 ? 'a' : 'b') : undefined\n }\n style={{ '--_i': index, '--_pop-order': popOrder.current[index] ?? 0 } as CSSProperties}\n onChange={(event) => handleInput(index, event.target.value)}\n onKeyDown={(event) => handleKeyDown(index, event)}\n onPaste={(event) => handlePaste(index, event)}\n onFocus={(event) => event.target.select()}\n />\n </Fragment>\n ))}\n {name && <input type=\"hidden\" name={name} value={value} disabled={disabled} />}\n </div>\n )\n}\n\n/**\n * Campos de um caractere para códigos de verificação (OTP/PIN): avança\n * sozinho, aceita colar o código inteiro e o preenchimento automático do SMS.\n */\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(function PinInput(\n {\n length = 6,\n type = 'numeric',\n size = 'md',\n value,\n defaultValue,\n onChange,\n onComplete,\n mask,\n groupSize,\n placeholder,\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n disabled,\n autoFocus,\n name,\n id,\n className,\n ...rest\n },\n ref,\n) {\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n controlId={id}\n className={cx('or-pin-input-field', className)}\n >\n <PinInputControl\n length={length}\n type={type}\n size={size}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n onComplete={onComplete}\n mask={mask}\n groupSize={groupSize}\n placeholder={placeholder}\n invalid={invalid}\n autoFocus={autoFocus}\n name={name}\n hasLabel={Boolean(label)}\n groupRef={ref}\n errorSignal={typeof error === 'string' ? error : Boolean(error) || Boolean(invalid)}\n rest={rest}\n />\n </Field>\n )\n})\n","import {\n cloneElement,\n forwardRef,\n useEffect,\n useMemo,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport {\n useDisclosure,\n useId,\n useIsomorphicLayoutEffect,\n useMounted,\n usePresence,\n} from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx, getFocusableElements, mergeRefs } from '../../utils'\nimport { Button } from '../Button'\nimport { focusElement, getTabbableAfter, getThemeScope, useLayer } from '../Modal/overlay'\nimport { Portal } from '../Portal'\nimport {\n returnFocusIfLost,\n useFloatingPanel,\n useTriggerElement,\n type FloatingPlacement,\n} from './floating'\nimport './Popover.css'\n\nexport type PopoverPlacement = FloatingPlacement\n\n/** Funções entregues ao conteúdo quando `children` é uma função. */\nexport interface PopoverRenderProps {\n /** Fecha o popover e devolve o foco ao gatilho. */\n close: () => void\n}\n\nexport interface PopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'children'> {\n /**\n * Elemento que abre o popover (normalmente um `Button`). Recebe\n * `aria-haspopup=\"dialog\"`, `aria-expanded` e `aria-controls`.\n */\n trigger: ReactElement\n /** Conteúdo. Aceita uma função `({ close }) => …`. */\n children?: ReactNode | ((props: PopoverRenderProps) => ReactNode)\n /** Título visível; nomeia o popover. Sem título, o nome vem do gatilho (ou de `aria-label`). */\n title?: ReactNode\n /** Aberto (controlado). Use com `onOpenChange`. */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o popover pede para abrir ou fechar. */\n onOpenChange?: (open: boolean) => void\n /** Posição preferida em relação ao gatilho; inverte sozinho se faltar espaço. */\n placement?: PopoverPlacement\n /** Distância do gatilho, em px. */\n offset?: number\n /** Mostra uma seta apontando para o gatilho. */\n arrow?: boolean\n /** Elemento que recebe o foco ao abrir. Padrão: primeiro focável (ou o próprio painel). */\n initialFocus?: RefObject<HTMLElement | null>\n /** Fecha ao clicar fora. */\n closeOnOutsideClick?: boolean\n /** Mostra um botão de fechar no cabeçalho. */\n showCloseButton?: boolean\n}\n\n/**\n * Painel não modal ancorado a um gatilho, para conteúdo e controles\n * complementares (filtros, detalhes, formulários curtos).\n */\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(function Popover(\n {\n trigger,\n children,\n title,\n open,\n defaultOpen,\n onOpenChange,\n placement = 'bottom',\n offset = 8,\n arrow = false,\n initialFocus,\n closeOnOutsideClick = true,\n showCloseButton = false,\n className,\n style,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const disclosure = useDisclosure({ open, defaultOpen, onOpenChange })\n const mounted = useMounted()\n const active = disclosure.isOpen && mounted\n // Mantém o painel montado durante a animação de saída.\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(active)\n const [triggerEl, triggerRef] = useTriggerElement(trigger)\n const [panelEl, setPanelEl] = useState<HTMLDivElement | null>(null)\n const triggerProps = trigger.props as HTMLAttributes<HTMLElement>\n const triggerId = useId('or-popover-trigger', triggerProps.id)\n const panelId = useId('or-popover')\n const titleId = useId('or-popover-title')\n\n const floating = useFloatingPanel({\n open: present,\n reference: triggerEl,\n floating: panelEl,\n placement,\n offset,\n arrow,\n })\n\n const closeAndFocusTrigger = () => {\n disclosure.close()\n focusElement(triggerEl)\n }\n\n const { setNode, layerProps } = useLayer(active, {\n onEscape: closeAndFocusTrigger,\n onPointerDownOutside: closeOnOutsideClick\n ? () => {\n disclosure.close()\n returnFocusIfLost(triggerEl)\n }\n : undefined,\n onFocusOutside: () => disclosure.close(),\n insideElements: () => [triggerEl],\n })\n\n // Ao abrir, o foco vai para o conteúdo.\n useIsomorphicLayoutEffect(() => {\n if (!active || !panelEl) return\n if (panelEl.contains(document.activeElement)) return\n focusElement(initialFocus?.current ?? getFocusableElements(panelEl)[0] ?? panelEl)\n }, [active, panelEl])\n\n // Fechado com o foco dentro (ex.: estado controlado): devolve ao gatilho.\n useEffect(() => {\n if (!active || !panelEl) return\n return () => {\n const current = document.activeElement\n if (!current || current === document.body || panelEl.contains(current))\n focusElement(triggerEl)\n }\n }, [active, panelEl, triggerEl])\n\n const handleTriggerKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n // Tab no gatilho com o popover aberto entra no conteúdo, como se ele\n // estivesse logo depois do gatilho na página.\n if (event.key === 'Tab' && !event.shiftKey && active && panelEl) {\n event.preventDefault()\n focusElement(getFocusableElements(panelEl)[0] ?? panelEl)\n }\n }\n\n const handlePanelKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || event.key !== 'Tab' || !panelEl) return\n const current = document.activeElement as HTMLElement | null\n if (current && !panelEl.contains(current)) return\n const items = getFocusableElements(panelEl).filter((el) => el.tabIndex >= 0)\n const first = items[0]\n const last = items[items.length - 1]\n if (event.shiftKey && (current === first || current === panelEl || items.length === 0)) {\n event.preventDefault()\n focusElement(triggerEl)\n } else if (!event.shiftKey && (current === last || items.length === 0)) {\n event.preventDefault()\n disclosure.close()\n if (triggerEl) focusElement(getTabbableAfter(triggerEl, panelEl) ?? triggerEl)\n }\n }\n\n const panelRef = useMemo(\n () => mergeRefs<HTMLDivElement>(setPanelEl, setNode, nodeRef, ref),\n [setNode, nodeRef, ref],\n )\n\n const triggerElement = cloneElement(\n trigger as ReactElement<HTMLAttributes<HTMLElement> & { ref?: unknown }>,\n {\n ref: triggerRef,\n id: triggerId,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': active,\n 'aria-controls': active ? panelId : undefined,\n onClick: composeEventHandlers(triggerProps.onClick, (_event: ReactMouseEvent<HTMLElement>) =>\n disclosure.toggle(),\n ),\n onKeyDown: composeEventHandlers(triggerProps.onKeyDown, handleTriggerKeyDown),\n },\n )\n\n const labelled = rest['aria-label'] || rest['aria-labelledby']\n const content =\n typeof children === 'function' ? children({ close: closeAndFocusTrigger }) : children\n\n return (\n <>\n {triggerElement}\n <Portal>\n {present && (\n // onKeyDown só gerencia o Tab (ordem de foco); o diálogo em si não é um controle.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <div\n ref={panelRef}\n id={panelId}\n role=\"dialog\"\n aria-labelledby={labelled ? undefined : title ? titleId : triggerId}\n tabIndex={-1}\n data-state={state}\n inert={state === 'closed' || undefined}\n data-side={floating.side}\n data-theme={getThemeScope(triggerEl)}\n className={cx('or-floating', 'or-popover', className)}\n style={{ ...floating.floatingStyles, ...style }}\n onKeyDown={handlePanelKeyDown}\n {...rest}\n {...layerProps}\n >\n {arrow && (\n <span\n ref={floating.arrowRef}\n className=\"or-floating-arrow\"\n data-side={floating.side}\n style={floating.arrowStyle}\n aria-hidden=\"true\"\n />\n )}\n {(title || showCloseButton) && (\n <div className=\"or-popover__header\">\n {title && (\n <h2 id={titleId} className=\"or-popover__title\">\n {title}\n </h2>\n )}\n {showCloseButton && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={t('close')}\n startIcon={<Icon name=\"close\" />}\n className=\"or-popover__close\"\n onClick={closeAndFocusTrigger}\n />\n )}\n </div>\n )}\n <div className=\"or-popover__body\">{content}</div>\n </div>\n )}\n </Portal>\n </>\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { clamp, cx, devWarning } from '../../utils'\nimport './ProgressBar.css'\n\nexport type ProgressBarTone = 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'danger'\nexport type ProgressBarSize = 'sm' | 'md'\n\nexport interface ProgressValueInfo {\n min: number\n max: number\n /** Percentual concluído, de 0 a 100. */\n percent: number\n}\n\nexport interface ProgressBarProps extends HTMLAttributes<HTMLDivElement> {\n /** Valor atual. Sem valor (`undefined`/`null`), a barra fica indeterminada. */\n value?: number | null\n /** Valor mínimo. */\n min?: number\n /** Valor máximo. */\n max?: number\n /** Rótulo visível, associado à barra via `aria-labelledby`. */\n label?: ReactNode\n /** Texto de apoio abaixo da barra, associado via `aria-describedby`. */\n description?: ReactNode\n /** Mostra o valor formatado ao lado do rótulo (barras determinadas). */\n showValue?: boolean\n /**\n * Formata o valor exibido e anunciado (`aria-valuetext`).\n * Padrão: percentual no idioma do provider (ex.: \"45%\").\n */\n formatValue?: (value: number, info: ProgressValueInfo) => string\n /** Cor da barra. */\n tone?: ProgressBarTone\n /** Espessura: `sm` 4px, `md` 8px. */\n size?: ProgressBarSize\n}\n\n/**\n * Barra de progresso linear para tarefas com duração mensurável (upload,\n * importação, etapas). Sem `value`, indica atividade de duração desconhecida.\n */\nexport const ProgressBar = forwardRef<HTMLDivElement, ProgressBarProps>(function ProgressBar(\n {\n value,\n min = 0,\n max = 100,\n label,\n description,\n showValue = true,\n formatValue,\n tone = 'accent',\n size = 'md',\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n ...rest\n },\n ref,\n) {\n const { locale } = useLocale()\n const baseId = useId('or-progress', id)\n const labelId = `${baseId}-label`\n const descriptionId = `${baseId}-description`\n\n devWarning(\n !label && !ariaLabel && !ariaLabelledby,\n 'ProgressBar precisa de `label`, `aria-label` ou `aria-labelledby`.',\n )\n\n const indeterminate = value === undefined || value === null || Number.isNaN(value)\n const current = indeterminate ? min : clamp(value, min, max)\n const percent = max > min ? ((current - min) / (max - min)) * 100 : 0\n const valueText = indeterminate\n ? undefined\n : formatValue\n ? formatValue(current, { min, max, percent })\n : new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(\n percent / 100,\n )\n\n const labelledBy =\n [ariaLabelledby, label ? labelId : undefined].filter(Boolean).join(' ') || undefined\n const describedBy =\n [ariaDescribedby, description ? descriptionId : undefined].filter(Boolean).join(' ') ||\n undefined\n\n return (\n <div\n ref={ref}\n id={id}\n className={cx(\n 'or-progress-bar',\n `or-progress-bar--${tone}`,\n `or-progress-bar--${size}`,\n indeterminate && 'or-progress-bar--indeterminate',\n className,\n )}\n {...rest}\n >\n {(label || (showValue && valueText)) && (\n <div className=\"or-progress-bar__header\">\n {label && (\n <span id={labelId} className=\"or-progress-bar__label\">\n {label}\n </span>\n )}\n {showValue && valueText && (\n // o valor já é anunciado por aria-valuetext; evita leitura duplicada\n <span className=\"or-progress-bar__value\" aria-hidden=\"true\">\n {valueText}\n </span>\n )}\n </div>\n )}\n <div\n className=\"or-progress-bar__track\"\n role=\"progressbar\"\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : current}\n aria-valuetext={valueText}\n >\n <div\n className=\"or-progress-bar__fill\"\n // transform (scaleX) em vez de width: anima sem recalcular layout\n style={indeterminate ? undefined : { transform: `scaleX(${percent / 100})` }}\n />\n </div>\n {description && (\n <div id={descriptionId} className=\"or-progress-bar__description\">\n {description}\n </div>\n )}\n </div>\n )\n})\n","import { forwardRef, type CSSProperties, type HTMLAttributes } from 'react'\nimport { useLocale } from '../../providers'\nimport { clamp, cx } from '../../utils'\nimport './ProgressCircle.css'\n\nexport type ProgressCircleSize = 'sm' | 'md' | 'lg'\nexport type ProgressCircleTone = 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'danger'\n\nexport interface ProgressCircleValueInfo {\n min: number\n max: number\n /** Percentual concluído, de 0 a 100. */\n percent: number\n}\n\nexport interface ProgressCircleProps extends HTMLAttributes<HTMLDivElement> {\n /** Valor atual. Sem valor (`undefined`/`null`), o círculo fica indeterminado. */\n value?: number | null\n min?: number\n max?: number\n /** Diâmetro: `sm` 24px, `md` 48px, `lg` 80px. */\n size?: ProgressCircleSize\n /** Cor do arco. */\n tone?: ProgressCircleTone\n /** Mostra o valor no centro (tamanhos `md` e `lg`, modo determinado). */\n showValue?: boolean\n /** Formata o valor exibido e anunciado (`aria-valuetext`). Padrão: percentual. */\n formatValue?: (value: number, info: ProgressCircleValueInfo) => string\n /**\n * Nome acessível (`aria-label`). Padrão: `t('loading')`. Prefira algo\n * específico: \"Enviando foto\", \"Sincronizando agenda\".\n */\n label?: string\n}\n\nconst dimensions: Record<ProgressCircleSize, { size: number; stroke: number }> = {\n sm: { size: 24, stroke: 3 },\n md: { size: 48, stroke: 4 },\n lg: { size: 80, stroke: 6 },\n}\n\n/**\n * Indicador circular de progresso (`role=\"progressbar\"`). Use em espaços\n * compactos — cartões, miniaturas de upload, botões — ou quando o valor\n * central for o destaque.\n */\nexport const ProgressCircle = forwardRef<HTMLDivElement, ProgressCircleProps>(\n function ProgressCircle(\n {\n value,\n min = 0,\n max = 100,\n size = 'md',\n tone = 'accent',\n showValue = false,\n formatValue,\n label,\n className,\n style,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n ...rest\n },\n ref,\n ) {\n const { t, locale } = useLocale()\n const indeterminate = value === undefined || value === null || Number.isNaN(value)\n const current = indeterminate ? min : clamp(value, min, max)\n const percent = max > min ? ((current - min) / (max - min)) * 100 : 0\n const valueText = indeterminate\n ? undefined\n : formatValue\n ? formatValue(current, { min, max, percent })\n : new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(\n percent / 100,\n )\n\n const { size: px, stroke } = dimensions[size]\n const radius = (px - stroke) / 2\n const circumference = 2 * Math.PI * radius\n const center = px / 2\n // a terminação quadrada avança meio traço em cada ponta: só desenha o arco quando há progresso\n const showArc = indeterminate || percent > 0\n const dashOffset = indeterminate ? circumference * 0.72 : circumference * (1 - percent / 100)\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-label={ariaLabelledby ? ariaLabel : (ariaLabel ?? label ?? t('loading'))}\n aria-labelledby={ariaLabelledby}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : current}\n aria-valuetext={valueText}\n className={cx(\n 'or-progress-circle',\n `or-progress-circle--${size}`,\n `or-progress-circle--${tone}`,\n indeterminate && 'or-progress-circle--indeterminate',\n className,\n )}\n style={{ width: px, height: px, ...style }}\n {...rest}\n >\n <svg\n className=\"or-progress-circle__svg\"\n width={px}\n height={px}\n viewBox={`0 0 ${px} ${px}`}\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n className=\"or-progress-circle__track\"\n cx={center}\n cy={center}\n r={radius}\n strokeWidth={stroke}\n />\n {showArc && (\n <circle\n className=\"or-progress-circle__arc\"\n cx={center}\n cy={center}\n r={radius}\n strokeWidth={stroke}\n strokeLinecap=\"square\"\n strokeDasharray={circumference}\n // via style (não atributo) para a transição de stroke-dashoffset ser garantida;\n // --_circumference alimenta o \"desenho\" de entrada\n style={\n {\n strokeDashoffset: dashOffset,\n '--_circumference': circumference,\n } as CSSProperties\n }\n />\n )}\n </svg>\n {showValue && valueText && size !== 'sm' && (\n <span className=\"or-progress-circle__value\" aria-hidden=\"true\">\n {valueText}\n </span>\n )}\n </div>\n )\n },\n)\n","import { createContext, useContext } from 'react'\n\nexport interface RadioGroupContextValue {\n name: string\n value: string | null\n disabled: boolean\n required: boolean\n variant: 'default' | 'card'\n select: (value: string) => void\n}\n\nexport const RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\n\nexport function useRadioGroup() {\n return useContext(RadioGroupContext)\n}\n","import { forwardRef, type ChangeEvent, type InputHTMLAttributes, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { cx, devWarning } from '../../utils'\nimport { hasContent } from '../Fieldset/FieldsetBase'\nimport { useRadioGroup } from './RadioGroupContext'\nimport './RadioGroup.css'\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'value'> {\n /** Valor enviado quando esta opção está selecionada. */\n value: string\n /** Rótulo da opção (clicável). */\n label: ReactNode\n /** Texto de apoio da opção, ligado por `aria-describedby`. */\n description?: ReactNode\n}\n\n/**\n * Opção de um `RadioGroup`: `<input type=\"radio\">` nativo estilizado. As setas\n * do teclado movem a seleção entre as opções (comportamento nativo).\n * A `ref` e as props nativas vão para o `<input>`; `className` e `style`, para o contêiner.\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n {\n value,\n label,\n description,\n disabled,\n id,\n className,\n style,\n name,\n checked,\n required,\n onChange,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n },\n ref,\n) {\n const group = useRadioGroup()\n devWarning(group === null, 'Radio deve ser usado dentro de um RadioGroup.')\n const inputId = useId('or-radio', id)\n const labelId = `${inputId}-label`\n const hasDescription = hasContent(description)\n const descriptionId = hasDescription ? `${inputId}-description` : undefined\n const isDisabled = Boolean(disabled || group?.disabled)\n const isChecked = group ? group.value === value : checked\n const variant = group?.variant ?? 'default'\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event)\n if (group && event.target.checked) group.select(value)\n }\n\n return (\n <label\n htmlFor={inputId}\n className={cx('or-radio', `or-radio--${variant}`, className)}\n style={style}\n data-checked={isChecked || undefined}\n data-disabled={isDisabled || undefined}\n >\n <span className=\"or-radio__control\">\n <input\n ref={ref}\n type=\"radio\"\n id={inputId}\n className=\"or-radio__input\"\n name={name ?? group?.name}\n value={value}\n checked={isChecked}\n required={required ?? group?.required}\n disabled={isDisabled}\n aria-labelledby={labelId}\n aria-describedby={[ariaDescribedBy, descriptionId].filter(Boolean).join(' ') || undefined}\n onChange={handleChange}\n {...rest}\n />\n <span className=\"or-radio__indicator\" aria-hidden=\"true\" />\n </span>\n <span className=\"or-radio__body\">\n <span id={labelId} className=\"or-radio__label\">\n {label}\n </span>\n {hasDescription && (\n <span id={descriptionId} className=\"or-radio__description\">\n {description}\n </span>\n )}\n </span>\n </label>\n )\n})\n","import { forwardRef, useMemo, type FieldsetHTMLAttributes, type ReactNode } from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { cx } from '../../utils'\nimport { FieldsetBase } from '../Fieldset/FieldsetBase'\nimport { Radio } from './Radio'\nimport { RadioGroupContext, type RadioGroupContextValue } from './RadioGroupContext'\nimport './RadioGroup.css'\n\nexport interface RadioGroupOption {\n value: string\n label: ReactNode\n description?: ReactNode\n disabled?: boolean\n}\n\nexport type RadioGroupVariant = 'default' | 'card'\n\nexport interface RadioGroupProps\n extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'defaultValue' | 'onChange' | 'title'> {\n /** Pergunta ou título do grupo, renderizado como `<legend>`. */\n label: ReactNode\n /** Oculta a legenda visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda do grupo, ligado por `aria-describedby`. */\n description?: ReactNode\n /** Mensagem de erro do grupo. */\n error?: ReactNode\n /** Exige uma escolha: aplica `required` nativo a todas as opções. */\n required?: boolean\n /** Mostra \"(opcional)\" ao lado da legenda. */\n optional?: boolean\n /** Desabilita nativamente todas as opções. */\n disabled?: boolean\n /** `name` compartilhado pelas opções. Gerado automaticamente se omitido. */\n name?: string\n /** Valor selecionado (controlado). `null` = nenhum. */\n value?: string | null\n /** Valor selecionado inicialmente (não controlado). */\n defaultValue?: string | null\n /** Chamado com o valor da opção escolhida. */\n onChange?: (value: string) => void\n /** Opções geradas automaticamente. Alternativa a passar `<Radio>` como filhos. */\n options?: RadioGroupOption[]\n /** Disposição das opções. Padrão: `vertical`. */\n orientation?: 'vertical' | 'horizontal'\n /** `card` mostra cada opção em um cartão com borda (laranja quando selecionado). */\n variant?: RadioGroupVariant\n children?: ReactNode\n}\n\n/**\n * Grupo de botões de opção para uma escolha única entre poucas alternativas,\n * com `<fieldset>`/`<legend>` e radios nativos — Tab entra no grupo e as setas\n * mudam a seleção.\n */\nexport const RadioGroup = forwardRef<HTMLFieldSetElement, RadioGroupProps>(function RadioGroup(\n {\n label,\n hideLabel,\n description,\n error,\n required = false,\n optional,\n disabled = false,\n name: nameProp,\n value: valueProp,\n defaultValue = null,\n onChange,\n options,\n orientation = 'vertical',\n variant = 'default',\n className,\n children,\n ...rest\n },\n ref,\n) {\n const name = useId('or-radio-group', nameProp)\n const [value, setValue] = useControllableState<string | null>({\n value: valueProp,\n defaultValue,\n onChange: onChange as ((value: string | null) => void) | undefined,\n })\n\n const context = useMemo<RadioGroupContextValue>(\n () => ({ name, value, disabled, required, variant, select: (next) => setValue(next) }),\n [name, value, disabled, required, variant, setValue],\n )\n\n return (\n <RadioGroupContext.Provider value={context}>\n <FieldsetBase\n ref={ref}\n appearance=\"group\"\n legend={label}\n hideLegend={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n disabled={disabled}\n className={cx('or-radio-group', `or-radio-group--${variant}`, className)}\n contentProps={{ 'data-orientation': orientation, className: 'or-radio-group__options' }}\n {...rest}\n >\n {options?.map((option) => (\n <Radio\n key={option.value}\n value={option.value}\n label={option.label}\n description={option.description}\n disabled={option.disabled}\n />\n ))}\n {children}\n </FieldsetBase>\n </RadioGroupContext.Provider>\n )\n})\n","import {\n forwardRef,\n useMemo,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, range } from '../../utils'\nimport '../Field/Field.css'\nimport './Rating.css'\n\nexport type RatingSize = 'sm' | 'md' | 'lg'\n\nexport interface RatingProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** Nota selecionada (controlado). `null` ou `0` = sem nota. */\n value?: number | null\n /** Nota inicial (não controlado). */\n defaultValue?: number | null\n /** Chamado com a nova nota (1 a `max`). */\n onChange?: (value: number) => void\n /** Quantidade de estrelas. Padrão: 5. */\n max?: number\n /**\n * Somente leitura: exibe as estrelas como imagem (`role=\"img\"`) com a nota\n * por extenso. Aceita frações (ex.: 4.5).\n */\n readOnly?: boolean\n /** Rótulo do grupo (\"Avalie o atendimento\"). */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. */\n error?: ReactNode\n required?: boolean\n disabled?: boolean\n /**\n * Nome de cada nota (\"Péssimo\"… \"Excelente\"). Usado como nome acessível de\n * cada estrela e exibido ao lado durante o hover/seleção.\n */\n labels?: string[]\n /** Nome do grupo de rádios (envio em formulários). Gerado se omitido. */\n name?: string\n /** Tamanho das estrelas: `sm` 16px, `md` 24px, `lg` 32px. */\n size?: RatingSize\n}\n\n/**\n * Avaliação por estrelas. Interativo, é um grupo de rádios nativos (setas\n * do teclado funcionam como em qualquer radiogroup); em `readOnly`, uma\n * imagem com a nota por extenso.\n */\nexport const Rating = forwardRef<HTMLDivElement, RatingProps>(function Rating(\n {\n value: valueProp,\n defaultValue = null,\n onChange,\n max = 5,\n readOnly = false,\n label,\n hideLabel = false,\n description,\n error,\n required = false,\n disabled = false,\n labels,\n name,\n size = 'md',\n id,\n className,\n ...rest\n },\n ref,\n) {\n const { t, locale } = useLocale()\n const baseId = useId('or-rating', id)\n const groupName = name ?? baseId\n const labelId = `${baseId}-label`\n const descriptionId = `${baseId}-description`\n const errorId = `${baseId}-error`\n const [value, setValue] = useControllableState<number | null>({\n value: valueProp,\n defaultValue,\n onChange: onChange as ((value: number | null) => void) | undefined,\n })\n const [hover, setHover] = useState<number | null>(null)\n // Cada escolha dispara um \"pop\" em onda nas estrelas preenchidas.\n const [pop, setPop] = useState({ count: 0, value: 0 })\n const hasError = error !== undefined && error !== null && error !== false && error !== ''\n const stars = range(1, Math.max(1, Math.round(max)))\n const numberFormat = useMemo(() => {\n try {\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 1 })\n } catch {\n return new Intl.NumberFormat('pt-BR', { maximumFractionDigits: 1 })\n }\n }, [locale])\n const current = value ?? 0\n const optionLabel = (n: number) =>\n labels?.[n - 1] ?? t('rating', { value: numberFormat.format(n), max })\n\n if (readOnly) {\n const clamped = Math.min(Math.max(current, 0), stars.length)\n return (\n <div\n ref={ref}\n id={id}\n className={cx('or-rating-field', 'or-rating-field--readonly', className)}\n {...rest}\n >\n {label && !hideLabel && <span className=\"or-field__label\">{label}</span>}\n <div\n role=\"img\"\n aria-label={t('rating', { value: numberFormat.format(clamped), max: stars.length })}\n className={cx('or-rating', `or-rating--${size}`)}\n >\n {stars.map((n) => {\n const fill = Math.min(Math.max(clamped - (n - 1), 0), 1)\n return (\n <span key={n} className=\"or-rating__star\" data-filled={fill === 1 || undefined}>\n <Icon name=\"star\" className=\"or-rating__icon\" />\n {fill > 0 && fill < 1 && (\n <span className=\"or-rating__partial\" style={{ width: `${fill * 100}%` }}>\n <Icon name=\"star\" className=\"or-rating__icon\" />\n </span>\n )}\n </span>\n )\n })}\n </div>\n </div>\n )\n }\n\n const display = hover ?? current\n const popped = (n: number) => pop.count > 0 && n <= pop.value && pop.value === current\n const caption = display > 0 && labels?.[display - 1]\n const describedBy =\n [description && descriptionId, hasError && errorId].filter(Boolean).join(' ') || undefined\n\n return (\n <div\n ref={ref}\n className={cx('or-field', 'or-rating-field', className)}\n data-invalid={hasError || undefined}\n data-disabled={disabled || undefined}\n {...rest}\n >\n {label && (\n <div className={cx('or-field__label-row', hideLabel && 'or-visually-hidden')}>\n <span id={labelId} className=\"or-field__label\">\n {label}\n {required && (\n <span className=\"or-field__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n </div>\n )}\n {description && (\n <p id={descriptionId} className=\"or-field__description\">\n {description}\n </p>\n )}\n <div className=\"or-rating-field__row\">\n {/* A prévia do hover termina quando o ponteiro sai da área das estrelas. */}\n <div className=\"or-rating__hover-zone\" onMouseLeave={() => setHover(null)}>\n <div\n id={id}\n role=\"radiogroup\"\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={describedBy}\n aria-required={required || undefined}\n aria-invalid={hasError || undefined}\n aria-disabled={disabled || undefined}\n className={cx(\n 'or-rating',\n `or-rating--${size}`,\n hover !== null && 'or-rating--preview',\n )}\n >\n {stars.map((n) => {\n const inputId = `${baseId}-${n}`\n return (\n <span key={n} className=\"or-rating__option\">\n <input\n id={inputId}\n type=\"radio\"\n className=\"or-visually-hidden or-rating__input\"\n name={groupName}\n value={n}\n checked={current === n}\n disabled={disabled}\n required={required}\n onChange={() => {\n setPop((prev) => ({ count: prev.count + 1, value: n }))\n setValue(n)\n }}\n />\n <label\n htmlFor={inputId}\n className=\"or-rating__star\"\n data-filled={n <= display || undefined}\n onMouseEnter={() => {\n if (!disabled) setHover(n)\n }}\n >\n {/* Só o ícone remonta (key) para repetir o pop; o rádio mantém o foco. */}\n <span\n key={popped(n) ? `pop-${pop.count}` : 'static'}\n className={cx('or-rating__glyph', popped(n) && 'or-rating__glyph--pop')}\n style={popped(n) ? ({ '--_i': n - 1 } as CSSProperties) : undefined}\n >\n <Icon name=\"star\" className=\"or-rating__icon\" />\n </span>\n <span className=\"or-visually-hidden\">{optionLabel(n)}</span>\n </label>\n </span>\n )\n })}\n </div>\n </div>\n {labels && (\n <span className=\"or-rating-field__caption\" aria-hidden=\"true\">\n {caption || ''}\n </span>\n )}\n </div>\n {hasError && (\n <p id={errorId} className=\"or-field__error\">\n <Icon name=\"alert-circle\" size=\"sm\" />\n <span>{error}</span>\n </p>\n )}\n </div>\n )\n})\n","import { forwardRef, useEffect, useState, type TimeHTMLAttributes } from 'react'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning } from '../../utils'\nimport './RelativeTime.css'\n\nexport type RelativeTimeFormat = 'relative' | 'absolute' | 'auto'\nexport type RelativeTimeDate = Date | string | number\n\nexport interface RelativeTimeProps extends Omit<TimeHTMLAttributes<HTMLTimeElement>, 'dateTime' | 'children'> {\n /** Data de referência (Date, string ISO ou timestamp em ms). */\n date: RelativeTimeDate\n /**\n * `relative` (\"há 5 minutos\"), `absolute` (\"3 de nov. de 2026, 14:05\") ou\n * `auto` (relativo até `threshold` dias, depois absoluto). Padrão: `auto`.\n */\n format?: RelativeTimeFormat\n /** No formato `auto`, quantos dias o texto continua relativo. Padrão: `7`. */\n threshold?: number\n /**\n * Intervalo de atualização do texto em ms. Padrão: automático (mais\n * frequente para datas recentes). Use `false` para não atualizar.\n */\n updateInterval?: number | false\n /** `auto` usa expressões como \"ontem\" e \"agora\"; `always` sempre usa números. Padrão: `auto`. */\n numeric?: 'auto' | 'always'\n /** Extensão do texto relativo: `long` (\"há 5 minutos\"), `short` (\"há 5 min.\") ou `narrow`. */\n relativeStyle?: 'long' | 'short' | 'narrow'\n /** Formato do texto absoluto. Padrão: `{ dateStyle: 'medium', timeStyle: 'short' }`. */\n absoluteFormat?: Intl.DateTimeFormatOptions\n /** Mostra a data completa no `title` (dica ao passar o mouse). Padrão: `true`. */\n showTitle?: boolean\n}\n\nconst SECOND = 1000\nconst MINUTE = 60 * SECOND\nconst HOUR = 60 * MINUTE\nconst DAY = 24 * HOUR\nconst WEEK = 7 * DAY\nconst MONTH = 30.4375 * DAY\nconst YEAR = 365.25 * DAY\n\nfunction parseDate(value: RelativeTimeDate): Date | null {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value\n if (typeof value === 'string') {\n // AAAA-MM-DD é tratado como data local (new Date() assumiria UTC).\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value.trim())\n if (match) return new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]))\n }\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? null : date\n}\n\nfunction selectUnit(diff: number, numeric: 'auto' | 'always'): [number, Intl.RelativeTimeFormatUnit] {\n const abs = Math.abs(diff)\n if (abs < 45 * SECOND) return [numeric === 'auto' ? 0 : Math.round(diff / SECOND), 'second']\n if (abs < 45 * MINUTE) return [Math.round(diff / MINUTE), 'minute']\n if (abs < 22 * HOUR) return [Math.round(diff / HOUR), 'hour']\n if (abs < 6.5 * DAY) return [Math.round(diff / DAY), 'day']\n if (abs < 26 * DAY) return [Math.round(diff / WEEK), 'week']\n if (abs < 320 * DAY) return [Math.round(diff / MONTH), 'month']\n return [Math.round(diff / YEAR), 'year']\n}\n\n/** Intervalo automático: atualiza mais vezes enquanto a data é recente. */\nfunction autoInterval(diff: number): number {\n const abs = Math.abs(diff)\n if (abs < MINUTE) return 5 * SECOND\n if (abs < HOUR) return 30 * SECOND\n if (abs < DAY) return 5 * MINUTE\n return HOUR\n}\n\n/**\n * Data em formato relativo (\"há 5 minutos\", \"em 3 dias\") com `Intl` no idioma\n * do provider. Renderiza `<time dateTime>` e se atualiza sozinha.\n */\nexport const RelativeTime = forwardRef<HTMLTimeElement, RelativeTimeProps>(function RelativeTime(\n {\n date,\n format = 'auto',\n threshold = 7,\n updateInterval,\n numeric = 'auto',\n relativeStyle = 'long',\n absoluteFormat,\n showTitle = true,\n className,\n title,\n ...rest\n },\n ref,\n) {\n const { locale } = useLocale()\n const [now, setNow] = useState(() => Date.now())\n const parsed = parseDate(date)\n const timestamp = parsed?.getTime() ?? NaN\n devWarning(parsed === null, `RelativeTime: data inválida (${String(date)}).`)\n\n const diff = timestamp - now\n const useRelative =\n format === 'relative' || (format === 'auto' && Math.abs(diff) < Math.max(0, threshold) * DAY)\n const interval = updateInterval === false ? null : (updateInterval ?? autoInterval(diff))\n const shouldUpdate = parsed !== null && interval !== null && interval > 0 && (useRelative || format === 'auto')\n\n useEffect(() => {\n if (!shouldUpdate) return\n const timer = setTimeout(() => setNow(Date.now()), interval!)\n return () => clearTimeout(timer)\n }, [shouldUpdate, interval, now])\n\n // Se a data mudar, recalcula a partir do instante atual.\n useEffect(() => {\n setNow(Date.now())\n }, [timestamp])\n\n let text: string | null = null\n if (parsed && useRelative) {\n const [value, unit] = selectUnit(diff, numeric)\n text = new Intl.RelativeTimeFormat(locale, { numeric, style: relativeStyle }).format(value, unit)\n } else if (parsed) {\n text = new Intl.DateTimeFormat(locale, absoluteFormat ?? { dateStyle: 'medium', timeStyle: 'short' }).format(parsed)\n }\n // Só as atualizações (não a primeira renderização) fazem o fade do texto.\n const [initialText] = useState(text)\n const updated = text !== null && text !== initialText\n\n if (!parsed || text === null) {\n return (\n <time ref={ref} className={cx('or-relative-time', className)} title={title} {...rest}>\n {String(date)}\n </time>\n )\n }\n\n const fullDate = showTitle\n ? new Intl.DateTimeFormat(locale, { dateStyle: 'full', timeStyle: 'short' }).format(parsed)\n : undefined\n\n return (\n <time\n ref={ref}\n className={cx('or-relative-time', className)}\n dateTime={parsed.toISOString()}\n title={title ?? fullDate}\n // o texto depende do relógio: servidor e cliente podem divergir por segundos\n suppressHydrationWarning\n {...rest}\n >\n {/* Texto novo remonta (key) com um fade sutil; sem aria-live, nada é anunciado. */}\n <span\n key={text}\n className={cx('or-relative-time__text', updated && 'or-relative-time__text--updated')}\n suppressHydrationWarning\n >\n {text}\n </span>\n </time>\n )\n})\n","import { forwardRef, useEffect, useState, type CSSProperties, type ElementType, type HTMLAttributes } from 'react'\nimport { useInView, useIsomorphicLayoutEffect, useReducedMotion } from '../../hooks'\nimport { cx, mergeRefs } from '../../utils'\n\nexport type RevealVariant = 'up' | 'fade' | 'scale'\n\nexport interface RevealProps extends HTMLAttributes<HTMLElement> {\n /** Elemento renderizado. Padrão: `div`. */\n as?: ElementType\n /** Tipo de entrada: subir 24px (padrão), só opacidade ou leve escala. */\n variant?: RevealVariant\n /** Atraso antes de começar, em ms. */\n delay?: number\n /** Posição numa sequência: cada índice soma `--or-stagger` (80ms) ao atraso. */\n index?: number\n /** Escalona os filhos diretos (cada um entra 80ms depois do anterior). */\n stagger?: boolean\n /** Revela só uma vez (padrão) ou sempre que entrar na viewport. */\n once?: boolean\n /** Margem do IntersectionObserver. */\n rootMargin?: string\n /**\n * Anima também quando o conteúdo já está visível ao montar (entrada de\n * página/hero). Sem `appear`, conteúdo acima da dobra aparece direto.\n */\n appear?: boolean\n}\n\ntype RevealState = 'idle' | 'hidden' | 'shown'\n\n/** Converte uma lista CSS de tempos (\"0.6s, 80ms\") em milissegundos. */\nfunction toMsList(value: string): number[] {\n return value.split(',').map((part) => {\n const v = part.trim()\n const n = parseFloat(v)\n if (Number.isNaN(n)) return 0\n return v.endsWith('ms') ? n : n * 1000\n })\n}\n\n/** Maior \"atraso + duração\" entre as transições dos elementos. */\nfunction longestTransition(elements: Element[]): number {\n let longest = 0\n for (const el of elements) {\n const cs = getComputedStyle(el)\n const durations = toMsList(cs.transitionDuration)\n const delays = toMsList(cs.transitionDelay)\n durations.forEach((d, i) => {\n longest = Math.max(longest, d + (delays[i % delays.length] ?? 0))\n })\n }\n return longest\n}\n\n/**\n * Revela o conteúdo quando ele entra na viewport: sobe 24px e aparece em\n * 600ms, com escalonamento opcional entre os filhos. Conteúdo já visível na\n * carga não pisca; sem JavaScript ou com movimento reduzido, tudo aparece\n * imediatamente. Puramente visual: nada é escondido de leitores de tela.\n */\nexport const Reveal = forwardRef<HTMLElement, RevealProps>(function Reveal(\n {\n as: Component = 'div',\n variant = 'up',\n delay,\n index,\n stagger = false,\n once = true,\n rootMargin = '0px 0px -60px 0px',\n appear = false,\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const reduced = useReducedMotion()\n // threshold 0: revela assim que o topo passa da margem. Com uma fração\n // (ex.: 8%), contêineres mais altos que ~12 telas — como uma grade de 86\n // cartões em uma coluna no celular — nunca atingiam a fração e ficavam\n // invisíveis para sempre.\n const [viewRef, inView] = useInView<HTMLElement>({ rootMargin, once, threshold: 0 })\n const [node, setNode] = useState<HTMLElement | null>(null)\n // 'idle' no servidor e na primeira pintura: nada fica escondido sem JS.\n const [state, setState] = useState<RevealState>('idle')\n // Depois que a entrada termina, as transições da revelação saem de cena e\n // os filhos voltam a usar as próprias (hover de cartões, por exemplo) —\n // sem herdar o atraso escalonado nem perder propriedades como box-shadow.\n const [settled, setSettled] = useState(false)\n\n useIsomorphicLayoutEffect(() => {\n if (!node || reduced) return\n const rect = node.getBoundingClientRect()\n const alreadyVisible = rect.top < window.innerHeight && rect.bottom >= 0\n if (!alreadyVisible) {\n // Abaixo da dobra: aguarda o scroll.\n setSettled(false)\n setState('hidden')\n return\n }\n if (!appear) return\n // Já visível e `appear`: esconde, e revela dois frames depois (a transição precisa de um frame).\n setSettled(false)\n setState('hidden')\n let raf2 = 0\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setState('shown'))\n })\n return () => {\n cancelAnimationFrame(raf1)\n cancelAnimationFrame(raf2)\n }\n }, [node, reduced, appear])\n\n useEffect(() => {\n if (inView) setState((s) => (s === 'hidden' ? 'shown' : s))\n else if (!once) {\n setSettled(false)\n setState((s) => (s === 'shown' ? 'hidden' : s))\n }\n }, [inView, once])\n\n // Marca a revelação como concluída quando a transição mais longa termina.\n useEffect(() => {\n if (state !== 'shown' || !node) return\n const targets = stagger ? Array.from(node.children) : [node]\n const id = window.setTimeout(() => setSettled(true), longestTransition(targets) + 50)\n return () => window.clearTimeout(id)\n }, [state, node, stagger])\n\n return (\n <Component\n ref={mergeRefs(ref, viewRef, setNode)}\n className={cx(\n stagger ? 'or-reveal-group' : ['or-reveal', `or-reveal--${variant}`].join(' '),\n className,\n )}\n data-reveal={state === 'hidden' ? 'hidden' : 'shown'}\n data-reveal-settled={state === 'idle' || (state === 'shown' && settled) ? '' : undefined}\n style={\n {\n ...(delay ? { '--or-reveal-delay': `${delay}ms` } : null),\n ...(index !== undefined ? { '--or-reveal-index': index } : null),\n ...style,\n } as CSSProperties\n }\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type FormEvent,\n type FormHTMLAttributes,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { useInlinePresence } from '../Combobox/motion'\nimport { Field, useFieldControlProps } from '../Field'\nimport './Search.css'\n\nexport type SearchSize = 'sm' | 'md' | 'lg'\n\nexport interface SearchProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'type'\n> {\n /** Rótulo do campo (obrigatório — fica oculto por padrão, mas é lido por leitores de tela). */\n label: ReactNode\n /** Oculta o rótulo visualmente. Padrão: `true`. */\n hideLabel?: boolean\n /** Texto de ajuda exibido abaixo do rótulo. */\n description?: ReactNode\n /** Texto buscado (controlado). */\n value?: string\n /** Texto inicial (não controlado). */\n defaultValue?: string\n /**\n * Chamado quando o texto muda. Com `debounce`, só é chamado após a pausa na\n * digitação (limpar e enviar disparam na hora).\n */\n onChange?: (value: string) => void\n /** Chamado ao pressionar Enter ou enviar o formulário. */\n onSearch?: (value: string) => void\n /** Chamado quando o campo é limpo (botão ou Escape). */\n onClear?: () => void\n /** Atraso em ms para chamar `onChange` (busca enquanto digita). */\n debounce?: number\n /** Mostra um indicador de carregamento no lugar da lupa. */\n loading?: boolean\n /** Altura do controle: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: SearchSize\n /** Atributos extras do `<form role=\"search\">`. */\n formProps?: Omit<FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'role'>\n /** Classe aplicada ao `<form>`. */\n className?: string\n}\n\ntype ControlProps = Omit<\n SearchProps,\n | 'label'\n | 'hideLabel'\n | 'description'\n | 'formProps'\n | 'className'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'onSearch'\n | 'onClear'\n | 'debounce'\n> & {\n inputRef: React.Ref<HTMLInputElement>\n text: string\n onTextChange: (text: string) => void\n onClearClick: () => void\n}\n\nfunction SearchControl({\n inputRef,\n text,\n onTextChange,\n onClearClick,\n loading,\n size = 'md',\n disabled,\n readOnly,\n placeholder,\n onKeyDown,\n ...rest\n}: ControlProps) {\n const { t } = useLocale()\n const controlProps = useFieldControlProps({\n disabled,\n 'aria-describedby': rest['aria-describedby'],\n })\n const isDisabled = Boolean(controlProps.disabled)\n const clearPresence = useInlinePresence<HTMLButtonElement>(\n Boolean(text) && !isDisabled && !readOnly,\n )\n return (\n <div\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-search__frame')}\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled || undefined}\n >\n {/* Lupa e indicador de carregamento ficam empilhados e trocam com fade + escala. */}\n <span\n className=\"or-control-frame__addon or-control-frame__addon--start or-search__icon\"\n data-loading={loading || undefined}\n aria-hidden=\"true\"\n >\n <Icon name=\"search\" size={size === 'lg' ? 'md' : 'sm'} className=\"or-search__glyph\" />\n <span className=\"or-search__spinner\" />\n </span>\n <input\n ref={inputRef}\n type=\"search\"\n className=\"or-control-frame__input or-search__input\"\n value={text}\n placeholder={placeholder ?? t('searchPlaceholder')}\n autoComplete=\"off\"\n enterKeyHint=\"search\"\n readOnly={readOnly}\n onChange={(event) => onTextChange(event.target.value)}\n onKeyDown={(event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented) return\n // Escape limpa o campo; com o campo vazio, deixa o evento seguir (ex.: fechar um modal).\n if (event.key === 'Escape' && text && !readOnly) {\n event.preventDefault()\n event.stopPropagation()\n onClearClick()\n }\n }}\n {...rest}\n {...controlProps}\n />\n {clearPresence.present && (\n <button\n ref={clearPresence.nodeRef}\n type=\"button\"\n className=\"or-control-frame__button or-search__clear\"\n aria-label={t('clear')}\n aria-hidden={clearPresence.closing || undefined}\n tabIndex={clearPresence.closing ? -1 : undefined}\n data-state={clearPresence.dataState}\n onClick={onClearClick}\n >\n <Icon name=\"close\" size=\"sm\" />\n </button>\n )}\n </div>\n )\n}\n\n/**\n * Campo de busca: `<form role=\"search\">` com input `type=\"search\"`, lupa,\n * botão de limpar e envio por Enter. Opcionalmente chama `onChange` com\n * atraso (`debounce`) para buscar enquanto o usuário digita.\n */\nexport const Search = forwardRef<HTMLInputElement, SearchProps>(function Search(\n {\n label,\n hideLabel = true,\n description,\n value,\n defaultValue = '',\n onChange,\n onSearch,\n onClear,\n debounce,\n disabled,\n id,\n formProps,\n className,\n ...rest\n },\n ref,\n) {\n const inputEl = useRef<HTMLInputElement>(null)\n const [text, setText] = useState(value ?? defaultValue)\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined)\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n // Valor controlado vindo de fora sobrescreve o texto local.\n const lastEmitted = useRef(value)\n useEffect(() => {\n if (value !== undefined && value !== lastEmitted.current) {\n lastEmitted.current = value\n setText(value)\n }\n }, [value])\n useEffect(() => () => clearTimeout(timer.current), [])\n\n const emit = (next: string, immediate = false) => {\n clearTimeout(timer.current)\n const run = () => {\n lastEmitted.current = next\n onChangeRef.current?.(next)\n }\n if (debounce && debounce > 0 && !immediate) timer.current = setTimeout(run, debounce)\n else run()\n }\n\n const handleTextChange = (next: string) => {\n setText(next)\n emit(next)\n }\n\n const handleClear = () => {\n setText('')\n emit('', true)\n onClear?.()\n inputEl.current?.focus()\n }\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n if (disabled) return\n // Envia na hora o que estiver pendente no debounce.\n if (debounce) emit(text, true)\n onSearch?.(text)\n }\n\n return (\n <form\n {...formProps}\n role=\"search\"\n noValidate\n className={cx('or-search', className)}\n aria-label={formProps?.['aria-label'] ?? (typeof label === 'string' ? label : undefined)}\n onSubmit={handleSubmit}\n >\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n disabled={disabled}\n controlId={id}\n >\n <SearchControl\n inputRef={mergeRefs(inputEl, ref)}\n text={text}\n onTextChange={handleTextChange}\n onClearClick={handleClear}\n disabled={disabled}\n {...rest}\n />\n </Field>\n </form>\n )\n})\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon, type IconName } from '../../icons'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './SegmentedControl.css'\n\nexport type SegmentedControlSize = 'sm' | 'md' | 'lg'\n\nexport interface SegmentedControlOption {\n /** Valor enviado em `onChange` e no formulário. */\n value: string\n /** Rótulo da opção. Também é o nome acessível quando `iconOnly`. */\n label: string\n /** Ícone antes do rótulo. */\n icon?: IconName\n /** Desabilita somente esta opção. */\n disabled?: boolean\n}\n\nexport interface SegmentedControlProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue' | 'children'\n> {\n /** Rótulo do grupo (obrigatório). Use `hideLabel` para escondê-lo visualmente. */\n label: ReactNode\n /** Esconde o rótulo visualmente, mantendo-o para leitores de tela. */\n hideLabel?: boolean\n /** Texto de ajuda abaixo do rótulo. */\n description?: ReactNode\n /** De 2 a 5 opções mutuamente exclusivas. */\n options: SegmentedControlOption[]\n /** Valor selecionado (controlado). */\n value?: string\n /** Valor inicial (não controlado). Padrão: a primeira opção habilitada. */\n defaultValue?: string\n onChange?: (value: string) => void\n /** Altura: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: SegmentedControlSize\n /** Ocupa toda a largura disponível; as opções dividem o espaço igualmente. */\n fullWidth?: boolean\n /** Mostra apenas os ícones; os rótulos continuam disponíveis para leitores de tela. */\n iconOnly?: boolean\n /** Desabilita o grupo inteiro. */\n disabled?: boolean\n /** Atributo `name` dos radios (gerado automaticamente se omitido). */\n name?: string\n}\n\ninterface IndicatorRect {\n x: number\n width: number\n}\n\n/**\n * Escolha exclusiva entre 2 a 5 opções, sempre visíveis. É um grupo de radios\n * nativos (`role=\"radiogroup\"`): Tab entra no grupo pela opção selecionada e\n * as setas mudam a seleção.\n */\nexport const SegmentedControl = forwardRef<HTMLDivElement, SegmentedControlProps>(\n function SegmentedControl(\n {\n label,\n hideLabel = false,\n description,\n options,\n value: valueProp,\n defaultValue,\n onChange,\n size = 'md',\n fullWidth = false,\n iconOnly = false,\n disabled = false,\n name: nameProp,\n id: idProp,\n className,\n style,\n ...rest\n },\n ref,\n ) {\n const id = useId('or-segmented', idProp)\n const name = nameProp ?? id\n const labelId = `${id}-label`\n const descriptionId = description ? `${id}-description` : undefined\n\n devWarning(\n options.length < 2 || options.length > 5,\n 'SegmentedControl funciona melhor com 2 a 5 opções. Para mais opções, use Select ou RadioGroup.',\n )\n devWarning(\n iconOnly && options.some((option) => !option.icon),\n 'SegmentedControl com `iconOnly` precisa de `icon` em todas as opções.',\n )\n\n const [value, setValue] = useControllableState<string | undefined>({\n value: valueProp,\n defaultValue: defaultValue ?? options.find((option) => !option.disabled)?.value,\n onChange: onChange as ((value: string | undefined) => void) | undefined,\n })\n\n const trackRef = useRef<HTMLDivElement>(null)\n const [indicator, setIndicator] = useState<IndicatorRect | null>(null)\n // A transição só é ligada depois da primeira medição, para o indicador não\n // \"deslizar\" a partir da borda esquerda ao montar.\n const [animate, setAnimate] = useState(false)\n\n const measure = useCallback(() => {\n const track = trackRef.current\n if (!track) return\n const selected = track.querySelector<HTMLElement>('[data-checked]')\n setIndicator((prev) => {\n if (!selected) return null\n const next = { x: selected.offsetLeft, width: selected.offsetWidth }\n return prev && prev.x === next.x && prev.width === next.width ? prev : next\n })\n }, [])\n\n useIsomorphicLayoutEffect(measure, [measure, value, options, size, iconOnly, fullWidth])\n\n useEffect(() => {\n const track = trackRef.current\n if (!track || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(() => measure())\n observer.observe(track)\n return () => observer.disconnect()\n }, [measure])\n\n useEffect(() => {\n if (!indicator || animate) return\n const frame = requestAnimationFrame(() => setAnimate(true))\n return () => cancelAnimationFrame(frame)\n }, [indicator, animate])\n\n return (\n <div\n className={cx(\n 'or-segmented-control',\n `or-segmented-control--${size}`,\n fullWidth && 'or-segmented-control--full-width',\n iconOnly && 'or-segmented-control--icon-only',\n disabled && 'or-segmented-control--disabled',\n className,\n )}\n style={style}\n >\n <span\n id={labelId}\n className={cx('or-segmented-control__label', hideLabel && 'or-visually-hidden')}\n >\n {label}\n </span>\n {description && (\n <p id={descriptionId} className=\"or-segmented-control__description\">\n {description}\n </p>\n )}\n <div\n ref={mergeRefs(ref, trackRef)}\n id={idProp}\n role=\"radiogroup\"\n aria-labelledby={labelId}\n aria-describedby={descriptionId}\n aria-disabled={disabled || undefined}\n className=\"or-segmented-control__track\"\n data-ready={indicator ? '' : undefined}\n data-animate={animate ? '' : undefined}\n {...rest}\n >\n <span\n className=\"or-segmented-control__indicator\"\n aria-hidden=\"true\"\n style={\n indicator\n ? { width: indicator.width, transform: `translateX(${indicator.x}px)` }\n : { opacity: 0 }\n }\n />\n {options.map((option) => {\n const checked = option.value === value\n const optionDisabled = disabled || option.disabled\n return (\n <label\n key={option.value}\n className=\"or-segmented-control__option\"\n data-checked={checked ? '' : undefined}\n data-disabled={optionDisabled ? '' : undefined}\n title={iconOnly ? option.label : undefined}\n >\n <input\n type=\"radio\"\n className=\"or-segmented-control__input or-visually-hidden\"\n name={name}\n value={option.value}\n checked={checked}\n disabled={optionDisabled}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.checked) setValue(option.value)\n }}\n />\n <span className=\"or-segmented-control__content\">\n {option.icon && (\n <Icon name={option.icon} className=\"or-segmented-control__icon\" />\n )}\n {iconOnly ? (\n <VisuallyHidden>{option.label}</VisuallyHidden>\n ) : (\n <span className=\"or-segmented-control__text\">{option.label}</span>\n )}\n </span>\n </label>\n )\n })}\n </div>\n </div>\n )\n },\n)\n","import {\n forwardRef,\n useCallback,\n useRef,\n type ChangeEvent,\n type ReactNode,\n type SelectHTMLAttributes,\n} from 'react'\nimport { useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { cx, mergeRefs } from '../../utils'\nimport { Field, useFieldControlProps } from '../Field'\nimport './Select.css'\n\nexport type SelectSize = 'sm' | 'md' | 'lg'\n\nexport interface SelectOption {\n /** Valor enviado no formulário. */\n value: string\n /** Texto exibido. */\n label: string\n disabled?: boolean\n}\n\nexport interface SelectOptionGroup {\n /** Título do grupo (`<optgroup label>`). */\n label: string\n options: SelectOption[]\n disabled?: boolean\n}\n\nexport interface SelectProps extends Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n 'size' | 'multiple'\n> {\n /** Rótulo visível do campo. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda exibido abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. Quando presente, o campo fica inválido. */\n error?: ReactNode\n /** Marca o campo como inválido sem exibir mensagem. */\n invalid?: boolean\n /** Opções (ou grupos de opções). Alternativa a passar `<option>`/`<optgroup>` como children. */\n options?: Array<SelectOption | SelectOptionGroup>\n /**\n * Texto exibido enquanto nada foi escolhido (opção de valor vazio). Se o campo for\n * `required`, a opção fica desabilitada e não pode ser escolhida de volta.\n */\n placeholder?: string\n /** Altura do controle: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: SelectSize\n /** Classe aplicada ao contêiner externo. */\n className?: string\n}\n\nfunction isGroup(item: SelectOption | SelectOptionGroup): item is SelectOptionGroup {\n return Array.isArray((item as SelectOptionGroup).options)\n}\n\ninterface SelectControlProps extends Omit<\n SelectProps,\n 'label' | 'hideLabel' | 'description' | 'error' | 'className'\n> {\n selectRef: React.Ref<HTMLSelectElement>\n}\n\nfunction SelectControl({\n selectRef,\n options,\n placeholder,\n size = 'md',\n invalid,\n required,\n disabled,\n id,\n children,\n value,\n defaultValue,\n onChange,\n ...rest\n}: SelectControlProps) {\n const innerRef = useRef<HTMLSelectElement>(null)\n const controlProps = useFieldControlProps({\n id,\n required,\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': rest['aria-describedby'],\n })\n\n // Marca o estado \"placeholder visível\" direto no DOM para estilizar o texto\n // em tom secundário, inclusive no modo não controlado.\n const syncPlaceholder = useCallback(() => {\n const el = innerRef.current\n if (!el) return\n el.toggleAttribute('data-placeholder-shown', placeholder !== undefined && el.value === '')\n }, [placeholder])\n useIsomorphicLayoutEffect(syncPlaceholder)\n\n const resolvedDefault =\n value === undefined && defaultValue === undefined && placeholder !== undefined\n ? ''\n : defaultValue\n\n return (\n <div\n className={cx('or-select', `or-select--${size}`)}\n data-disabled={controlProps.disabled || undefined}\n >\n <select\n ref={mergeRefs(innerRef, selectRef)}\n className={cx('or-control', `or-control--${size}`, 'or-select__control')}\n value={value}\n defaultValue={resolvedDefault}\n onChange={(event: ChangeEvent<HTMLSelectElement>) => {\n onChange?.(event)\n syncPlaceholder()\n }}\n {...rest}\n {...controlProps}\n >\n {placeholder !== undefined && (\n <option\n value=\"\"\n disabled={Boolean(controlProps.required)}\n className=\"or-select__placeholder\"\n >\n {placeholder}\n </option>\n )}\n {options?.map((item) =>\n isGroup(item) ? (\n <optgroup key={`group-${item.label}`} label={item.label} disabled={item.disabled}>\n {item.options.map((option) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </optgroup>\n ) : (\n <option key={item.value} value={item.value} disabled={item.disabled}>\n {item.label}\n </option>\n ),\n )}\n {children}\n </select>\n <span className=\"or-select__chevron\" aria-hidden=\"true\">\n <Icon name=\"chevron-down\" size={size === 'lg' ? 'md' : 'sm'} />\n </span>\n </div>\n )\n}\n\n/**\n * Lista suspensa baseada no `<select>` nativo: teclado, leitores de tela e\n * foco vêm prontos. Onde o navegador suporta o select customizável\n * (`appearance: base-select`), a lista aberta também ganha o visual do Orange;\n * nos demais, abre o seletor do sistema. Use para escolher uma opção entre\n * poucas (até ~15). Para listas longas com busca, use `Combobox`.\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { label, hideLabel, description, error, required, disabled, id, className, ...rest },\n ref,\n) {\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n controlId={id}\n className={cx('or-select-field', className)}\n >\n <SelectControl selectRef={ref} required={required} disabled={disabled} {...rest} />\n </Field>\n )\n})\n","import {\n forwardRef,\n Fragment,\n useRef,\n useState,\n type CSSProperties,\n type InputHTMLAttributes,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { clamp, cx, mergeRefs } from '../../utils'\nimport { Field, useField, useFieldControlProps } from '../Field'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Slider.css'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n\nexport interface SliderMark {\n value: number\n /** Rótulo exibido abaixo do trilho. Sem rótulo, mostra apenas a marca. */\n label?: ReactNode\n}\n\ninterface SliderBaseProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'type' | 'min' | 'max' | 'step'\n> {\n /** Rótulo visível do campo. */\n label?: ReactNode\n hideLabel?: boolean\n /** Texto de ajuda exibido abaixo do rótulo. */\n description?: ReactNode\n error?: ReactNode\n /** Valor mínimo. Padrão: 0. */\n min?: number\n /** Valor máximo. Padrão: 100. */\n max?: number\n /** Incremento. Padrão: 1. */\n step?: number\n /**\n * Marcas no trilho. `true` = uma por passo; números = marcas sem rótulo;\n * objetos `{ value, label }` = marcas com rótulo (clicáveis com o mouse).\n */\n marks?: boolean | Array<number | SliderMark>\n /** Formata o valor para a saída visível e para `aria-valuetext` (ex.: moeda, %). */\n formatValue?: (value: number) => string\n /** Mostra o valor atual ao lado do rótulo (`<output>`). Padrão: `true`. */\n showValue?: boolean\n /** Tamanho do polegar e do trilho. */\n size?: SliderSize\n /** Marca o campo como inválido sem exibir mensagem. */\n invalid?: boolean\n /** Classe aplicada ao contêiner externo. */\n className?: string\n}\n\nexport interface SliderSingleProps extends SliderBaseProps {\n range?: false\n value?: number\n defaultValue?: number\n onChange?: (value: number) => void\n /** Chamado quando o usuário solta o polegar ou a tecla (valor \"confirmado\"). */\n onChangeEnd?: (value: number) => void\n}\n\nexport interface SliderRangeProps extends SliderBaseProps {\n /** Dois polegares: mínimo e máximo. */\n range: true\n value?: [number, number]\n defaultValue?: [number, number]\n onChange?: (value: [number, number]) => void\n onChangeEnd?: (value: [number, number]) => void\n /** Distância mínima entre os polegares. Padrão: 0. */\n minDistance?: number\n /** Nomes acessíveis dos polegares. Padrão: \"mínimo\" e \"máximo\". */\n thumbLabels?: [string, string]\n}\n\nexport type SliderProps = SliderSingleProps | SliderRangeProps\n\nfunction decimals(step: number) {\n const s = String(step)\n return s.includes('.') ? s.split('.')[1].length : 0\n}\n\nfunction snap(value: number, min: number, max: number, step: number) {\n const snapped = Math.round((value - min) / step) * step + min\n return clamp(Number(snapped.toFixed(decimals(step))), min, max)\n}\n\nconst toArray = (v: number | [number, number] | undefined) =>\n v === undefined ? undefined : Array.isArray(v) ? [v[0], v[1]] : [v]\n\ninterface ControlProps {\n inputRef: React.Ref<HTMLInputElement>\n hasLabel: boolean\n values: number[]\n isRange: boolean\n min: number\n max: number\n step: number\n marks?: SliderBaseProps['marks']\n formatValue?: (value: number) => string\n size: SliderSize\n thumbLabels: [string, string]\n onValueChange: (index: number, value: number) => void\n onCommit: () => void\n invalid?: boolean\n disabled?: boolean\n required?: boolean\n rest: Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'type' | 'min' | 'max' | 'step'\n >\n}\n\nfunction SliderControl({\n inputRef,\n hasLabel,\n values,\n isRange,\n min,\n max,\n step,\n marks,\n formatValue,\n size,\n thumbLabels,\n onValueChange,\n onCommit,\n invalid,\n disabled,\n required,\n rest,\n}: ControlProps) {\n const field = useField()\n const controlProps = useFieldControlProps({\n required,\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': rest['aria-describedby'],\n })\n const isDisabled = Boolean(controlProps.disabled)\n const baseId = controlProps.id ?? rest.id\n const thumbLabelId = useId('or-slider-thumb')\n const railRef = useRef<HTMLDivElement>(null)\n const inputs = useRef<(HTMLInputElement | null)[]>([])\n const [lastActive, setLastActive] = useState(0)\n // Saltos (clique no trilho/marca, teclado) animam o preenchimento e o polegar; o arraste não.\n const [animate, setAnimate] = useState(false)\n\n const pct = (v: number) => (max === min ? 0 : ((v - min) / (max - min)) * 100)\n const start = isRange ? pct(values[0]) : 0\n const end = isRange ? pct(values[1]) : pct(values[0])\n\n // Com os polegares sobrepostos, o de cima é o que consegue se mover para dentro do trilho.\n const topIndex =\n isRange && values[0] === values[1] ? (values[0] > (min + max) / 2 ? 0 : 1) : lastActive\n\n const markList: SliderMark[] =\n marks === true\n ? (max - min) / step <= 100\n ? Array.from({ length: Math.floor((max - min) / step) + 1 }, (_, i) => ({\n value: min + i * step,\n }))\n : []\n : Array.isArray(marks)\n ? marks\n .map((m) => (typeof m === 'number' ? { value: m } : m))\n .filter((m) => m.value >= min && m.value <= max)\n : []\n const labeledMarks = markList.filter((m) => m.label !== undefined && m.label !== null)\n\n const nearestIndex = (v: number) => {\n if (!isRange) return 0\n if (v <= values[0]) return 0\n if (v >= values[1]) return 1\n return Math.abs(v - values[0]) <= Math.abs(values[1] - v) ? 0 : 1\n }\n\n const valueAt = (clientX: number) => {\n const rect = railRef.current!.getBoundingClientRect()\n const ratio = rect.width ? clamp((clientX - rect.left) / rect.width, 0, 1) : 0\n return snap(min + ratio * (max - min), min, max, step)\n }\n\n // No modo intervalo, os inputs ignoram o ponteiro fora dos polegares: o trilho trata o clique e o arraste.\n const handleRailPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (isDisabled || event.button !== 0 || !isRange) return\n event.preventDefault()\n const v = valueAt(event.clientX)\n const index = nearestIndex(v)\n setAnimate(true)\n setLastActive(index)\n onValueChange(index, v)\n inputs.current[index]?.focus()\n const target = event.currentTarget\n target.setPointerCapture?.(event.pointerId)\n const move = (e: PointerEvent) => {\n setAnimate(false)\n onValueChange(index, valueAt(e.clientX))\n }\n const up = () => {\n target.removeEventListener('pointermove', move)\n target.removeEventListener('pointerup', up)\n target.removeEventListener('pointercancel', up)\n onCommit()\n }\n target.addEventListener('pointermove', move)\n target.addEventListener('pointerup', up)\n target.addEventListener('pointercancel', up)\n }\n\n const style = {\n '--_start': `${start}%`,\n '--_end': `${end}%`,\n // Preenchimento por transform (anima sem mexer em left/width): posição e tamanho em fração.\n '--_fill-start': start / 100,\n '--_fill-size': (end - start) / 100,\n } as CSSProperties\n const labelId = hasLabel && field ? field.labelId : undefined\n const { 'aria-label': ariaLabel, ...inputRest } = rest\n\n return (\n <div\n className={cx(\n 'or-slider',\n `or-slider--${size}`,\n isRange && 'or-slider--range',\n labeledMarks.length > 0 && 'or-slider--labeled',\n )}\n data-disabled={isDisabled || undefined}\n data-invalid={controlProps['aria-invalid'] || undefined}\n data-animate={animate || undefined}\n style={style}\n role={isRange ? 'group' : undefined}\n aria-labelledby={isRange ? labelId : undefined}\n aria-label={isRange && !labelId ? ariaLabel : undefined}\n >\n <div className=\"or-slider__control\">\n <div ref={railRef} className=\"or-slider__rail\" onPointerDown={handleRailPointerDown}>\n <div className=\"or-slider__track\" />\n {!isRange && <div className=\"or-slider__cap\" />}\n <div className=\"or-slider__fill\" />\n {markList.map((mark) => {\n const p = pct(mark.value)\n // Com valor único o preenchimento começa antes do 0% (cap): uma marca\n // \"ativa\" no início cortaria o preenchimento e deixaria um toco laranja solto.\n const active = (isRange ? p >= start : p > start) && p <= end\n return (\n <span\n key={mark.value}\n className=\"or-slider__tick\"\n data-active={active || undefined}\n style={{ left: `${p}%` }}\n aria-hidden=\"true\"\n />\n )\n })}\n </div>\n {values.map((v, index) => {\n const thumbId = index === 0 ? baseId : `${baseId}-max`\n return (\n <Fragment key={index}>\n <input\n ref={mergeRefs(\n index === 0 ? inputRef : undefined,\n (el: HTMLInputElement | null) => {\n inputs.current[index] = el\n },\n )}\n type=\"range\"\n className=\"or-slider__input\"\n min={min}\n max={max}\n step={step}\n value={v}\n data-top={(isRange && topIndex === index) || undefined}\n aria-valuetext={formatValue ? formatValue(v) : undefined}\n aria-labelledby={\n isRange && labelId ? `${labelId} ${thumbLabelId}-${index}` : undefined\n }\n aria-label={\n isRange && !labelId\n ? `${ariaLabel ?? ''} ${thumbLabels[index]}`.trim()\n : !isRange\n ? ariaLabel\n : undefined\n }\n onChange={(event) => {\n setLastActive(index)\n onValueChange(index, Number(event.target.value))\n }}\n onPointerDown={() => setAnimate(true)}\n onPointerMove={(event) => {\n if (event.buttons & 1) setAnimate(false)\n }}\n onKeyDown={() => setAnimate(true)}\n onPointerUp={onCommit}\n onKeyUp={(event) => {\n if (\n [\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n 'Home',\n 'End',\n 'PageUp',\n 'PageDown',\n ].includes(event.key)\n )\n onCommit()\n }}\n {...inputRest}\n {...controlProps}\n id={thumbId}\n />\n {/* Polegar visual: o nativo fica transparente (continua sendo o alvo do ponteiro). */}\n <span\n className=\"or-slider__thumb-pos\"\n data-top={(isRange && topIndex === index) || undefined}\n style={{ '--_p': `${pct(v)}%` } as CSSProperties}\n aria-hidden=\"true\"\n >\n <span className=\"or-slider__thumb\" />\n </span>\n </Fragment>\n )\n })}\n {isRange &&\n thumbLabels.map((text, index) => (\n <VisuallyHidden key={index} id={`${thumbLabelId}-${index}`}>\n {text}\n </VisuallyHidden>\n ))}\n </div>\n {labeledMarks.length > 0 && (\n <div className=\"or-slider__marks\" aria-hidden=\"true\">\n {labeledMarks.map((mark) => {\n const p = pct(mark.value)\n return (\n // Atalho só para mouse (aria-hidden): pelo teclado, as setas fazem o mesmo.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <span\n key={mark.value}\n className=\"or-slider__mark-label\"\n data-edge={p <= 0 ? 'start' : p >= 100 ? 'end' : undefined}\n style={{ left: `${p}%` }}\n onClick={() => {\n if (isDisabled) return\n const index = nearestIndex(mark.value)\n setAnimate(true)\n onValueChange(index, mark.value)\n onCommit()\n inputs.current[index]?.focus()\n }}\n >\n {mark.label}\n </span>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Controle deslizante baseado no `<input type=\"range\">` nativo — teclado,\n * leitores de tela e toque funcionam como o navegador manda. No modo `range`,\n * dois polegares definem um intervalo.\n */\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(props, ref) {\n const {\n label,\n hideLabel,\n description,\n error,\n min = 0,\n max = 100,\n step = 1,\n marks,\n formatValue,\n showValue = true,\n size = 'md',\n className,\n range,\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n disabled,\n required,\n invalid,\n id,\n ...restAll\n } = props as SliderBaseProps & {\n range?: boolean\n value?: number | [number, number]\n defaultValue?: number | [number, number]\n onChange?: (value: never) => void\n onChangeEnd?: (value: never) => void\n minDistance?: number\n thumbLabels?: [string, string]\n }\n const { minDistance = 0, thumbLabels: thumbLabelsProp, ...rest } = restAll\n const { t } = useLocale()\n const isRange = range === true\n const thumbLabels: [string, string] = thumbLabelsProp ?? [t('minimum'), t('maximum')]\n\n const [values, setValues] = useControllableState<number[]>({\n value: toArray(value),\n defaultValue: toArray(defaultValue) ?? (isRange ? [min, max] : [min]),\n })\n const valuesRef = useRef(values)\n valuesRef.current = values\n\n const emit = (next: number[]) => (isRange ? ([next[0], next[1]] as [number, number]) : next[0])\n\n const handleValueChange = (index: number, raw: number) => {\n const current = valuesRef.current\n let v = snap(raw, min, max, step)\n if (isRange) {\n v =\n index === 0 ? Math.min(v, current[1] - minDistance) : Math.max(v, current[0] + minDistance)\n }\n if (v === current[index]) return\n const next = [...current]\n next[index] = v\n valuesRef.current = next\n setValues(next)\n ;(onChange as ((value: number | [number, number]) => void) | undefined)?.(emit(next))\n }\n\n const handleCommit = () => {\n ;(onChangeEnd as ((value: number | [number, number]) => void) | undefined)?.(\n emit(valuesRef.current),\n )\n }\n\n const format = (v: number) => (formatValue ? formatValue(v) : String(v))\n const outputText = isRange ? `${format(values[0])} – ${format(values[1])}` : format(values[0])\n const fieldId = useId('or-slider', id)\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n controlId={fieldId}\n className={cx('or-slider-field', className)}\n labelAside={\n showValue && label ? (\n <output\n className=\"or-slider__output\"\n htmlFor={isRange ? `${fieldId} ${fieldId}-max` : fieldId}\n aria-live=\"off\"\n >\n {outputText}\n </output>\n ) : undefined\n }\n >\n <SliderControl\n inputRef={ref}\n hasLabel={Boolean(label)}\n values={values}\n isRange={isRange}\n min={min}\n max={max}\n step={step}\n marks={marks}\n formatValue={formatValue}\n size={size}\n thumbLabels={thumbLabels}\n onValueChange={handleValueChange}\n onCommit={handleCommit}\n invalid={invalid}\n disabled={disabled}\n required={required}\n rest={rest}\n />\n </Field>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefCallback,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect, useReducedMotion } from '../../hooks'\nimport { Icon, type IconName } from '../../icons'\nimport { useLocale, type MessageKey } from '../../providers'\nimport { clamp, cx, devWarning, mergeRefs } from '../../utils'\nimport { Dropdown, DropdownItem } from '../Dropdown'\nimport { IconButton } from '../IconButton'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './SortableList.css'\n\nexport type SortableListOrientation = 'vertical' | 'horizontal'\nexport type SortableMoveControls = 'buttons' | 'menu' | 'none'\nexport type SortableKey = string | number\n\nexport interface SortableReorderDetails<T> {\n /** Posição original do item (base 0). */\n from: number\n /** Nova posição do item (base 0). */\n to: number\n /** O item movido. */\n item: T\n}\n\nexport interface SortableItemState {\n /** Posição atual (base 0). Durante o arraste, é a posição prevista. */\n index: number\n /** Total de itens. */\n total: number\n /** O item está sendo movido (por ponteiro ou teclado). */\n isDragging: boolean\n /** O item não pode ser movido (`disabled` da lista ou do item). */\n disabled: boolean\n}\n\nexport interface SortableAnnouncementContext {\n /** Nome do item (de `getItemLabel`). */\n label: string\n /** Posição atual (base 1). */\n position: number\n /** Total de itens. */\n total: number\n /** Posição (base 1) antes do movimento começar. */\n initialPosition: number\n}\n\n/** Textos anunciados no leitor de tela. Cada função substitui o texto padrão. */\nexport interface SortableAnnouncements {\n lifted?: (context: SortableAnnouncementContext) => string\n moved?: (context: SortableAnnouncementContext) => string\n dropped?: (context: SortableAnnouncementContext) => string\n cancelled?: (context: SortableAnnouncementContext) => string\n}\n\nexport interface SortableListProps<T>\n extends Omit<HTMLAttributes<HTMLUListElement>, 'children' | 'defaultValue' | 'onChange'> {\n /** Itens na ordem atual (controlado). Use com `onReorder`. */\n items?: readonly T[]\n /** Itens iniciais (não controlado). */\n defaultItems?: readonly T[]\n /**\n * Chamado quando o usuário conclui uma reordenação (soltar, botão ou menu)\n * com a nova lista e `{ from, to, item }`. Não é chamado ao cancelar.\n */\n onReorder?: (items: T[], details: SortableReorderDetails<T>) => void\n /** Renderiza o conteúdo do item. A alça e os controles de mover são do componente. */\n renderItem: (item: T, state: SortableItemState) => ReactNode\n /** Chave estável de cada item. Padrão: `item.id` (ou o próprio item, se for texto/número). */\n getKey?: (item: T, index: number) => SortableKey\n /**\n * Nome do item usado na alça (\"Reordenar …\") e nos anúncios. Padrão:\n * `item.label`, `item.title` ou `item.name` (ou o próprio item, se for texto).\n */\n getItemLabel?: (item: T) => string\n /** Itens que não podem ser movidos. Padrão: `item.disabled === true`. */\n isItemDisabled?: (item: T) => boolean\n /** Nome acessível da lista (`aria-label`). */\n label?: string\n /** Desabilita a reordenação de todos os itens. */\n disabled?: boolean\n /** Direção da lista. Define também as setas do teclado. Padrão: `vertical`. */\n orientation?: SortableListOrientation\n /**\n * Alternativa ao arraste com um único clique (WCAG 2.5.7): botões \"Mover\n * para cima/baixo\" (`buttons`, padrão), um menu com topo/cima/baixo/fim\n * (`menu`) ou nenhuma (`none` — só quando a página oferece outra alternativa).\n */\n moveControls?: SortableMoveControls\n /** Substitui os textos anunciados ao levantar, mover, soltar e cancelar. */\n announcements?: SortableAnnouncements\n}\n\n/** Distância (px) que o ponteiro percorre antes de virar arraste: cliques simples não arrastam. */\nconst DRAG_THRESHOLD = 5\n/** Faixa (px) junto às bordas do contêiner rolável que dispara a rolagem automática. */\nconst SCROLL_EDGE = 48\n/** Velocidade máxima da rolagem automática (px por quadro). */\nconst SCROLL_SPEED = 16\n/** Congela o transform durante as medições do FLIP sem cortar o esmaecer da sombra. */\nconst FREEZE_TRANSFORM = 'box-shadow var(--or-duration-fast) var(--or-ease-out)'\n\ntype AnnouncementKind = keyof SortableAnnouncements\ntype Direction = 'prev' | 'next' | 'first' | 'last'\ntype FocusPart = 'handle' | 'prev' | 'next' | 'menu'\n\nconst announcementKeys: Record<AnnouncementKind, MessageKey> = {\n lifted: 'sortableLifted',\n moved: 'sortableMoved',\n dropped: 'sortableDropped',\n cancelled: 'sortableCancelled',\n}\n\n/** Posições medidas no início do movimento (relativas à lista, sem transformações). */\ninterface Layout {\n starts: number[]\n sizes: number[]\n cross: number[]\n crossSizes: number[]\n gap: number\n}\n\ninterface DragState {\n key: SortableKey\n /** Índice original do item movido. */\n from: number\n /** `order[posição] = índice original` — a ordem prevista. */\n order: number[]\n mode: 'keyboard' | 'pointer'\n layout: Layout\n}\n\ninterface PointerSession {\n key: SortableKey\n index: number\n id: number\n startX: number\n startY: number\n x: number\n y: number\n started: boolean\n listRect: DOMRect | null\n scrollX: number\n scrollY: number\n scroller: HTMLElement | null\n frame: number\n cleanup: () => void\n}\n\ninterface FlipSnapshot {\n rects: Map<SortableKey, DOMRect>\n settle?: SortableKey\n}\n\nfunction defaultGetKey(item: unknown, index: number): SortableKey {\n if (typeof item === 'string' || typeof item === 'number') return item\n if (item && typeof item === 'object' && 'id' in item) {\n const id = (item as { id: unknown }).id\n if (typeof id === 'string' || typeof id === 'number') return id\n }\n return index\n}\n\nfunction defaultGetLabel(item: unknown, key: SortableKey): string {\n if (typeof item === 'string' || typeof item === 'number') return String(item)\n if (item && typeof item === 'object') {\n for (const field of ['label', 'title', 'name']) {\n const value = (item as Record<string, unknown>)[field]\n if (typeof value === 'string' && value) return value\n }\n }\n return String(key)\n}\n\nfunction defaultIsDisabled(item: unknown): boolean {\n return !!item && typeof item === 'object' && (item as { disabled?: unknown }).disabled === true\n}\n\nfunction identity(length: number): number[] {\n return Array.from({ length }, (_, i) => i)\n}\n\n/**\n * Move o elemento de `from` para `to` passando apenas pelas posições livres:\n * itens travados (desabilitados) nunca saem do lugar.\n */\nfunction moveInSlots<V>(list: readonly V[], from: number, to: number, isLocked: (position: number) => boolean): V[] {\n const next = list.slice()\n if (from === to) return next\n const slots: number[] = []\n for (let p = 0; p < list.length; p++) if (p === from || !isLocked(p)) slots.push(p)\n const a = slots.indexOf(from)\n const b = slots.indexOf(to)\n if (a === -1 || b === -1) return next\n const sequence = slots.map((p) => list[p])\n const [moved] = sequence.splice(a, 1)\n sequence.splice(b, 0, moved)\n slots.forEach((p, k) => {\n next[p] = sequence[k]\n })\n return next\n}\n\n/** Próxima posição livre na direção pedida, ou `null` se não houver. */\nfunction findSlot(from: number, direction: Direction, total: number, isLocked: (position: number) => boolean) {\n if (direction === 'prev') {\n for (let p = from - 1; p >= 0; p--) if (!isLocked(p)) return p\n } else if (direction === 'next') {\n for (let p = from + 1; p < total; p++) if (!isLocked(p)) return p\n } else if (direction === 'first') {\n for (let p = 0; p < from; p++) if (!isLocked(p)) return p\n } else {\n for (let p = total - 1; p > from; p--) if (!isLocked(p)) return p\n }\n return null\n}\n\n/** Posição livre mais próxima de `target` (empate: a mais próxima da origem). */\nfunction nearestSlot(target: number, from: number, total: number, isLocked: (position: number) => boolean) {\n let best = from\n for (let p = 0; p < total; p++) {\n if (p !== from && isLocked(p)) continue\n const distance = Math.abs(p - target)\n const bestDistance = Math.abs(best - target)\n if (distance < bestDistance || (distance === bestDistance && Math.abs(p - from) < Math.abs(best - from))) best = p\n }\n return best\n}\n\n/** Início (px, relativo à lista) de cada posição para a ordem `order`. */\nfunction slotStarts(layout: Layout, order: number[]): number[] {\n const starts: number[] = []\n let cursor = layout.starts[0] ?? 0\n for (const index of order) {\n starts.push(cursor)\n cursor += layout.sizes[index] + layout.gap\n }\n return starts\n}\n\n/** Primeiro ancestral (incluindo o próprio elemento) que rola no eixo da lista. */\nfunction getScrollParent(node: HTMLElement, vertical: boolean): HTMLElement | null {\n let current: HTMLElement | null = node\n while (current && current !== document.body && current !== document.documentElement) {\n const style = getComputedStyle(current)\n const overflow = vertical ? style.overflowY : style.overflowX\n const scrollable = vertical\n ? current.scrollHeight > current.clientHeight\n : current.scrollWidth > current.clientWidth\n if (/(auto|scroll|overlay)/.test(overflow) && scrollable) return current\n current = current.parentElement\n }\n return null\n}\n\nfunction SortableListInner<T>(\n {\n items: itemsProp,\n defaultItems,\n onReorder,\n renderItem,\n getKey = defaultGetKey,\n getItemLabel,\n isItemDisabled = defaultIsDisabled,\n label,\n disabled = false,\n orientation = 'vertical',\n moveControls = 'buttons',\n announcements,\n className,\n ...rest\n }: SortableListProps<T>,\n ref: Ref<HTMLUListElement>,\n) {\n const { t } = useLocale()\n const reducedMotion = useReducedMotion()\n const instructionsId = useId('or-sortable-instructions')\n const [list, setList] = useControllableState<readonly T[]>({\n value: itemsProp,\n defaultValue: defaultItems ?? [],\n })\n const [drag, setDragState] = useState<DragState | null>(null)\n const [message, setMessage] = useState('')\n const [, setRenderTick] = useState(0)\n\n const listRef = useRef<HTMLUListElement>(null)\n const composedRef = useMemo(() => mergeRefs(ref, listRef), [ref])\n const nodes = useRef(new Map<SortableKey, HTMLLIElement>())\n const nodeRefs = useRef(new Map<SortableKey, RefCallback<HTMLLIElement>>())\n const dragRef = useRef<DragState | null>(null)\n const pointerRef = useRef<PointerSession | null>(null)\n const flipRef = useRef<FlipSnapshot | null>(null)\n const focusRef = useRef<\n { key: SortableKey; part: FocusPart; reveal: boolean } | { element: HTMLElement } | null\n >(null)\n\n devWarning(\n !label && !rest['aria-label'] && !rest['aria-labelledby'],\n 'SortableList precisa de `label` (ou `aria-labelledby`) para dar nome à lista.',\n )\n\n const vertical = orientation !== 'horizontal'\n const total = list.length\n const keys = list.map((item, index) => getKey(item, index))\n const labels = list.map((item, index) => getItemLabel?.(item) ?? defaultGetLabel(item, keys[index]))\n const locked = list.map((item) => disabled || isItemDisabled(item))\n const isLockedAt = (position: number) => locked[position]\n\n // Itens que mudam durante o arraste (dados chegando do servidor, por exemplo) encerram o arraste.\n const activeDrag = drag && drag.order.length === total && keys[drag.from] === drag.key ? drag : null\n\n // Valores atuais para os ouvintes registrados em `window` durante o arraste.\n const latest = useRef({ list, keys, labels, locked, total, vertical, reducedMotion, announcements, onReorder, setList, t })\n latest.current = { list, keys, labels, locked, total, vertical, reducedMotion, announcements, onReorder, setList, t }\n\n const setDrag = (next: DragState | null) => {\n dragRef.current = next\n setDragState(next)\n }\n\n const nodeRef = (key: SortableKey) => {\n let callback = nodeRefs.current.get(key)\n if (!callback) {\n callback = (el) => {\n if (el) nodes.current.set(key, el)\n else nodes.current.delete(key)\n }\n nodeRefs.current.set(key, callback)\n }\n return callback\n }\n\n const announce = (kind: AnnouncementKind, index: number, position: number) => {\n const L = latest.current\n const context: SortableAnnouncementContext = {\n label: L.labels[index] ?? '',\n position: position + 1,\n total: L.total,\n initialPosition: index + 1,\n }\n const custom = L.announcements?.[kind]\n setMessage(\n custom\n ? custom(context)\n : L.t(announcementKeys[kind], { label: context.label, position: context.position, total: context.total }),\n )\n }\n\n /** Mede os itens pelo layout (offset*), que ignora transformações em andamento. */\n const measure = (): Layout => {\n const L = latest.current\n const layout: Layout = { starts: [], sizes: [], cross: [], crossSizes: [], gap: 0 }\n for (const key of L.keys) {\n const el = nodes.current.get(key)\n layout.starts.push(el ? (L.vertical ? el.offsetTop : el.offsetLeft) : 0)\n layout.sizes.push(el ? (L.vertical ? el.offsetHeight : el.offsetWidth) : 0)\n layout.cross.push(el ? (L.vertical ? el.offsetLeft : el.offsetTop) : 0)\n layout.crossSizes.push(el ? (L.vertical ? el.offsetWidth : el.offsetHeight) : 0)\n }\n if (layout.starts.length > 1) layout.gap = layout.starts[1] - (layout.starts[0] + layout.sizes[0])\n return layout\n }\n\n /** Rola o contêiner (ou a página) até a posição `start` (relativa à lista) ficar visível. */\n const ensureVisible = (start: number, size: number) => {\n const listEl = listRef.current\n if (!listEl || !size) return\n const V = latest.current.vertical\n const rect = listEl.getBoundingClientRect()\n const begin = (V ? rect.top + listEl.clientTop - listEl.scrollTop : rect.left + listEl.clientLeft - listEl.scrollLeft) + start\n const end = begin + size\n const scroller = getScrollParent(listEl, V)\n const view = scroller?.getBoundingClientRect()\n const viewStart = view ? (V ? view.top : view.left) : 0\n const viewEnd = view ? (V ? view.bottom : view.right) : V ? window.innerHeight : window.innerWidth\n const margin = 8\n let delta = 0\n if (begin < viewStart + margin) delta = begin - viewStart - margin\n else if (end > viewEnd - margin) delta = Math.min(end - viewEnd + margin, begin - viewStart - margin)\n if (!delta) return\n if (scroller) {\n if (V) scroller.scrollTop += delta\n else scroller.scrollLeft += delta\n } else {\n window.scrollTo(window.scrollX + (V ? 0 : delta), window.scrollY + (V ? delta : 0))\n }\n }\n\n /** Guarda a posição visual de cada item antes de uma reordenação (FLIP: \"First\"). */\n const prepareFlip = (settle?: SortableKey) => {\n // Garante um novo commit mesmo que o pai ignore `onReorder`.\n setRenderTick((n) => n + 1)\n if (latest.current.reducedMotion) {\n flipRef.current = null\n return\n }\n const rects = new Map<SortableKey, DOMRect>()\n nodes.current.forEach((el, key) => {\n rects.set(key, el.getBoundingClientRect())\n // Sem transição de transform até o layout final ser medido no efeito abaixo.\n el.style.transition = FREEZE_TRANSFORM\n })\n flipRef.current = { rects, settle }\n }\n\n // FLIP (\"Last, Invert, Play\") e devolução do foco depois de cada reordenação.\n useIsomorphicLayoutEffect(() => {\n const flip = flipRef.current\n if (flip) {\n flipRef.current = null\n const elements = Array.from(nodes.current.entries())\n const deltas = elements.map(([key, el]) => {\n el.style.transition = FREEZE_TRANSFORM\n const before = flip.rects.get(key)\n if (!before) return null\n const after = el.getBoundingClientRect()\n const dx = before.left - after.left\n const dy = before.top - after.top\n return Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5 ? null : { dx, dy }\n })\n elements.forEach(([key, el], i) => {\n const delta = deltas[i]\n if (!delta) return\n el.style.transform = `translate(${delta.dx}px, ${delta.dy}px)`\n if (key === flip.settle) {\n el.setAttribute('data-settling', '')\n const done = (event?: TransitionEvent) => {\n if (event && (event.target !== el || event.propertyName !== 'transform')) return\n el.removeAttribute('data-settling')\n el.removeEventListener('transitionend', done)\n }\n el.addEventListener('transitionend', done)\n window.setTimeout(done, 1000)\n }\n })\n // Força o reflow para fixar o ponto de partida antes de liberar a transição.\n if (deltas.some(Boolean)) void listRef.current?.offsetWidth\n for (const [, el] of elements) {\n el.style.transition = ''\n el.style.transform = ''\n }\n }\n\n const focus = focusRef.current\n focusRef.current = null\n if (focus && 'element' in focus) {\n // O usuário saiu da alça: mantém o foco onde ele foi, mesmo que o DOM tenha sido reordenado.\n if (focus.element.isConnected && document.activeElement !== focus.element) {\n focus.element.focus({ preventScroll: true })\n }\n } else if (focus) {\n const li = nodes.current.get(focus.key)\n if (li) {\n const order: FocusPart[] =\n focus.part === 'prev'\n ? ['prev', 'next', 'handle']\n : focus.part === 'next'\n ? ['next', 'prev', 'handle']\n : [focus.part, 'handle']\n for (const part of order) {\n const target = li.querySelector<HTMLButtonElement>(`[data-sortable-part=\"${part}\"]`)\n if (target && !target.disabled) {\n target.focus({ preventScroll: true })\n break\n }\n }\n if (focus.reveal) {\n const V = latest.current.vertical\n ensureVisible(V ? li.offsetTop : li.offsetLeft, V ? li.offsetHeight : li.offsetWidth)\n }\n }\n }\n })\n\n const clearDragOffset = (key: SortableKey) => {\n const el = nodes.current.get(key)\n el?.style.removeProperty('--_drag-x')\n el?.style.removeProperty('--_drag-y')\n }\n\n /**\n * Solta (`commit`) ou cancela o item levantado. O foco volta para a alça, a\n * menos que `focusTarget` indique para onde o usuário levou o foco.\n */\n const finish = (commit: boolean, focusTarget?: HTMLElement | null) => {\n const d = dragRef.current\n if (!d) return\n const L = latest.current\n const position = d.order.indexOf(d.from)\n prepareFlip(d.key)\n clearDragOffset(d.key)\n setDrag(null)\n focusRef.current =\n focusTarget === undefined\n ? { key: d.key, part: 'handle', reveal: false }\n : focusTarget\n ? { element: focusTarget }\n : null\n if (commit && position !== d.from) {\n const next = d.order.map((i) => L.list[i])\n L.setList(next)\n L.onReorder?.(next, { from: d.from, to: position, item: L.list[d.from] })\n }\n announce(commit ? 'dropped' : 'cancelled', d.from, commit ? position : d.from)\n }\n\n // Teclado --------------------------------------------------------------------\n\n const lift = (index: number) => {\n const L = latest.current\n if (L.locked[index]) return\n setDrag({ key: L.keys[index], from: index, order: identity(L.total), mode: 'keyboard', layout: measure() })\n announce('lifted', index, index)\n }\n\n const moveLifted = (direction: Direction) => {\n const d = dragRef.current\n if (!d) return\n const L = latest.current\n const isLocked = (p: number) => L.locked[p]\n const position = d.order.indexOf(d.from)\n const target = findSlot(position, direction, L.total, isLocked)\n if (target === null) return\n const order = moveInSlots(d.order, position, target, isLocked)\n setDrag({ ...d, order })\n announce('moved', d.from, target)\n ensureVisible(slotStarts(d.layout, order)[target], d.layout.sizes[d.from])\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>, index: number) => {\n const d = dragRef.current\n const key = event.key\n if (!d) {\n if ((key === ' ' || key === 'Enter') && !event.repeat) {\n event.preventDefault()\n lift(index)\n }\n return\n }\n if (d.mode !== 'keyboard' || d.key !== latest.current.keys[index]) return\n const V = latest.current.vertical\n if (key === (V ? 'ArrowUp' : 'ArrowLeft')) moveLifted('prev')\n else if (key === (V ? 'ArrowDown' : 'ArrowRight')) moveLifted('next')\n else if (key === 'Home') moveLifted('first')\n else if (key === 'End') moveLifted('last')\n else if (key === ' ' || key === 'Enter') {\n if (!event.repeat) finish(true)\n } else if (key === 'Escape') {\n // Não deixa o Escape fechar um Modal/Drawer em volta.\n event.stopPropagation()\n finish(false)\n } else return\n event.preventDefault()\n }\n\n const handleBlur = (event: FocusEvent<HTMLButtonElement>, key: SortableKey) => {\n const d = dragRef.current\n // Sair da alça (Tab, clique fora) solta o item onde ele está.\n if (d?.mode === 'keyboard' && d.key === key) finish(true, event.relatedTarget as HTMLElement | null)\n }\n\n // Ponteiro (mouse, caneta, toque) ---------------------------------------------\n\n const updatePointerDrag = () => {\n const session = pointerRef.current\n const d = dragRef.current\n const listEl = listRef.current\n if (!session?.started || !session.listRect || d?.mode !== 'pointer' || !listEl) return\n const L = latest.current\n const V = L.vertical\n const now = listEl.getBoundingClientRect()\n // Quanto o conteúdo da lista se deslocou na tela desde o início (rolagem da página ou da lista).\n const scrolled = V\n ? session.listRect.top - now.top + listEl.scrollTop - session.scrollY\n : session.listRect.left - now.left + listEl.scrollLeft - session.scrollX\n const { starts, sizes } = d.layout\n const from = d.from\n const lastEnd = Math.max(...starts.map((start, i) => start + sizes[i]))\n const raw = (V ? session.y - session.startY : session.x - session.startX) + scrolled\n // O item arrastado não sai visualmente da lista…\n const offset = clamp(raw, starts[0] - starts[from], lastEnd - starts[from] - sizes[from])\n nodes.current.get(d.key)?.style.setProperty(V ? '--_drag-y' : '--_drag-x', `${offset}px`)\n\n // …mas o destino segue o ponteiro, sem esse limite. Com o centro limitado, itens\n // da mesma altura nunca passavam do meio do último e a última posição ficava\n // inalcançável (arrastar o 4º para o 5º não mudava nada).\n const center = starts[from] + raw + sizes[from] / 2\n let target = 0\n for (let i = 0; i < L.total; i++) if (i !== from && starts[i] + sizes[i] / 2 < center) target++\n const isLocked = (p: number) => L.locked[p]\n target = nearestSlot(target, from, L.total, isLocked)\n if (target === d.order.indexOf(from)) return\n setDrag({ ...d, order: moveInSlots(identity(L.total), from, target, isLocked) })\n announce('moved', from, target)\n }\n\n const autoScroll = () => {\n const session = pointerRef.current\n if (!session?.started) return\n session.frame = 0\n const V = latest.current.vertical\n const scroller = session.scroller\n const rect = scroller?.getBoundingClientRect()\n const start = rect ? (V ? rect.top : rect.left) : 0\n const end = rect ? (V ? rect.bottom : rect.right) : V ? window.innerHeight : window.innerWidth\n const edge = Math.min(SCROLL_EDGE, (end - start) / 4)\n if (edge <= 0) return\n const pos = V ? session.y : session.x\n let speed = 0\n if (pos < start + edge) speed = -SCROLL_SPEED * Math.min(1, (start + edge - pos) / edge)\n else if (pos > end - edge) speed = SCROLL_SPEED * Math.min(1, (pos - (end - edge)) / edge)\n if (!speed) return\n speed = Math.round(speed) || Math.sign(speed)\n if (scroller) {\n if (V) scroller.scrollTop += speed\n else scroller.scrollLeft += speed\n } else {\n window.scrollTo(window.scrollX + (V ? 0 : speed), window.scrollY + (V ? speed : 0))\n }\n updatePointerDrag()\n session.frame = requestAnimationFrame(autoScroll)\n }\n\n const startPointerDrag = (session: PointerSession) => {\n const listEl = listRef.current\n if (!listEl) return\n const L = latest.current\n // A lista pode ter mudado desde o pointerdown (ex.: um item levantado pelo teclado foi solto).\n const index = L.keys.indexOf(session.key)\n if (index === -1 || L.locked[index]) {\n endPointer(false)\n return\n }\n session.started = true\n session.index = index\n session.listRect = listEl.getBoundingClientRect()\n session.scrollX = listEl.scrollLeft\n session.scrollY = listEl.scrollTop\n session.scroller = getScrollParent(listEl, L.vertical)\n setDrag({ key: session.key, from: index, order: identity(L.total), mode: 'pointer', layout: measure() })\n }\n\n const pointerMove = (x: number, y: number) => {\n const session = pointerRef.current\n if (!session) return\n session.x = x\n session.y = y\n if (!session.started) {\n if (Math.hypot(x - session.startX, y - session.startY) < DRAG_THRESHOLD) return\n startPointerDrag(session)\n if (!session.started) return\n }\n updatePointerDrag()\n if (!session.frame) autoScroll()\n }\n\n const endPointer = (commit: boolean) => {\n const session = pointerRef.current\n if (!session) return\n pointerRef.current = null\n session.cleanup()\n if (session.started && dragRef.current?.mode === 'pointer') finish(commit)\n }\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLButtonElement>, index: number) => {\n const L = latest.current\n if (event.button !== 0 || event.isPrimary === false || L.locked[index] || pointerRef.current) return\n if (dragRef.current) {\n if (dragRef.current.mode !== 'keyboard') return\n finish(true, null)\n }\n const handle = event.currentTarget\n // O Safari não foca botões no clique; o foco acompanha o item depois de soltar.\n handle.focus({ preventScroll: true })\n const id = event.pointerId\n try {\n handle.setPointerCapture?.(id)\n } catch {\n // ponteiro já liberado (eventos sintéticos)\n }\n const session: PointerSession = {\n key: L.keys[index],\n index,\n id,\n startX: event.clientX,\n startY: event.clientY,\n x: event.clientX,\n y: event.clientY,\n started: false,\n listRect: null,\n scrollX: 0,\n scrollY: 0,\n scroller: null,\n frame: 0,\n cleanup: () => {},\n }\n const onMove = (e: PointerEvent) => {\n if (e.pointerId === id) pointerMove(e.clientX, e.clientY)\n }\n const onUp = (e: PointerEvent) => {\n if (e.pointerId === id) endPointer(true)\n }\n const onCancel = (e: PointerEvent) => {\n if (e.pointerId === id) endPointer(false)\n }\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !session.started) return\n e.preventDefault()\n e.stopPropagation()\n endPointer(false)\n }\n const onScroll = () => updatePointerDrag()\n const onWindowBlur = () => endPointer(false)\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onCancel)\n window.addEventListener('keydown', onKeyDown, true)\n window.addEventListener('scroll', onScroll, true)\n window.addEventListener('blur', onWindowBlur)\n session.cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onCancel)\n window.removeEventListener('keydown', onKeyDown, true)\n window.removeEventListener('scroll', onScroll, true)\n window.removeEventListener('blur', onWindowBlur)\n if (session.frame) cancelAnimationFrame(session.frame)\n try {\n if (handle.hasPointerCapture?.(id)) handle.releasePointerCapture(id)\n } catch {\n // nada a liberar\n }\n }\n pointerRef.current = session\n }\n\n // Alternativa de clique único (botões ou menu) -------------------------------\n\n const moveByControl = (index: number, direction: Direction, part: FocusPart) => {\n const L = latest.current\n if (dragRef.current || L.locked[index]) return\n const isLocked = (p: number) => L.locked[p]\n const target = findSlot(index, direction, L.total, isLocked)\n if (target === null) return\n const next = moveInSlots(L.list, index, target, isLocked)\n prepareFlip()\n focusRef.current = { key: L.keys[index], part, reveal: true }\n L.setList(next)\n L.onReorder?.(next, { from: index, to: target, item: L.list[index] })\n announce('moved', index, target)\n }\n\n // Ciclo de vida ----------------------------------------------------------------\n\n useEffect(() => {\n if (!drag || activeDrag) return\n pointerRef.current?.cleanup()\n pointerRef.current = null\n clearDragOffset(drag.key)\n dragRef.current = null\n setDragState(null)\n }, [drag, activeDrag])\n\n useEffect(() => {\n const sessions = pointerRef\n return () => sessions.current?.cleanup()\n }, [])\n\n // Renderização -----------------------------------------------------------------\n\n const positions = new Array<number>(total)\n activeDrag?.order.forEach((original, position) => {\n positions[original] = position\n })\n const starts = activeDrag ? slotStarts(activeDrag.layout, activeDrag.order) : null\n const isPointerDrag = activeDrag?.mode === 'pointer'\n\n let placeholder: ReactNode = null\n if (activeDrag && starts && isPointerDrag) {\n const { layout, from } = activeDrag\n const slot = starts[positions[from]]\n const style: CSSProperties = vertical\n ? { width: layout.crossSizes[from], height: layout.sizes[from], transform: `translate(${layout.cross[from]}px, ${slot}px)` }\n : { width: layout.sizes[from], height: layout.crossSizes[from], transform: `translate(${slot}px, ${layout.cross[from]}px)` }\n placeholder = <li aria-hidden=\"true\" className=\"or-sortable__placeholder\" style={style} />\n }\n\n const prevIcon: IconName = vertical ? 'arrow-up' : 'arrow-left'\n const nextIcon: IconName = vertical ? 'arrow-down' : 'arrow-right'\n const firstIcon: IconName = vertical ? 'arrow-up-to-line' : 'chevrons-left'\n const lastIcon: IconName = vertical ? 'arrow-down-to-line' : 'chevrons-right'\n const prevText = t(vertical ? 'sortableMoveUp' : 'sortableMoveLeft')\n const nextText = t(vertical ? 'sortableMoveDown' : 'sortableMoveRight')\n const firstText = t(vertical ? 'sortableMoveTop' : 'sortableMoveStart')\n const lastText = t('sortableMoveEnd')\n\n return (\n <>\n <ul\n ref={composedRef}\n // `list-style: none` remove a semântica de lista no Safari/VoiceOver; o papel explícito a restaura.\n role=\"list\"\n aria-label={label}\n className={cx('or-sortable', `or-sortable--${orientation}`, className)}\n data-active={activeDrag?.mode}\n data-disabled={disabled || undefined}\n {...rest}\n >\n {list.map((item, index) => {\n const key = keys[index]\n const itemLabel = labels[index]\n const itemLocked = locked[index]\n const position = activeDrag ? positions[index] : index\n const isDragging = activeDrag?.key === key\n const canPrev = !itemLocked && findSlot(index, 'prev', total, isLockedAt) !== null\n const canNext = !itemLocked && findSlot(index, 'next', total, isLockedAt) !== null\n let style: CSSProperties | undefined\n if (starts && activeDrag && !(isDragging && isPointerDrag)) {\n const shift = starts[position] - activeDrag.layout.starts[index]\n style = { [vertical ? '--_shift-y' : '--_shift-x']: `${shift}px` } as CSSProperties\n }\n\n return (\n <li\n key={key}\n ref={nodeRef(key)}\n className=\"or-sortable__item\"\n data-dragging={isDragging || undefined}\n data-disabled={itemLocked || undefined}\n style={style}\n >\n <button\n type=\"button\"\n className=\"or-sortable__handle\"\n data-sortable-part=\"handle\"\n aria-label={t('sortableHandle', { label: itemLabel, position: position + 1, total })}\n aria-describedby={instructionsId}\n disabled={itemLocked}\n onKeyDown={(event) => handleKeyDown(event, index)}\n onPointerDown={(event) => handlePointerDown(event, index)}\n onBlur={(event) => handleBlur(event, key)}\n >\n <Icon name={itemLocked && !disabled ? 'lock' : 'grip'} size=\"sm\" />\n </button>\n <div className=\"or-sortable__content\">\n {renderItem(item, { index: position, total, isDragging, disabled: itemLocked })}\n </div>\n {moveControls === 'buttons' && (\n <div className=\"or-sortable__controls\">\n <IconButton\n size=\"sm\"\n icon={prevIcon}\n label={t('sortableMoveItem', { action: prevText, label: itemLabel })}\n disabled={!canPrev}\n data-sortable-part=\"prev\"\n onClick={() => moveByControl(index, 'prev', 'prev')}\n />\n <IconButton\n size=\"sm\"\n icon={nextIcon}\n label={t('sortableMoveItem', { action: nextText, label: itemLabel })}\n disabled={!canNext}\n data-sortable-part=\"next\"\n onClick={() => moveByControl(index, 'next', 'next')}\n />\n </div>\n )}\n {moveControls === 'menu' && (\n <div className=\"or-sortable__controls\">\n <Dropdown\n placement=\"bottom-end\"\n trigger={\n <IconButton\n size=\"sm\"\n icon={vertical ? 'arrows-up-down' : 'more-horizontal'}\n label={t('sortableMoveMenu', { label: itemLabel })}\n disabled={!canPrev && !canNext}\n data-sortable-part=\"menu\"\n />\n }\n >\n <DropdownItem icon={firstIcon} disabled={!canPrev} onSelect={() => moveByControl(index, 'first', 'menu')}>\n {firstText}\n </DropdownItem>\n <DropdownItem icon={prevIcon} disabled={!canPrev} onSelect={() => moveByControl(index, 'prev', 'menu')}>\n {prevText}\n </DropdownItem>\n <DropdownItem icon={nextIcon} disabled={!canNext} onSelect={() => moveByControl(index, 'next', 'menu')}>\n {nextText}\n </DropdownItem>\n <DropdownItem icon={lastIcon} disabled={!canNext} onSelect={() => moveByControl(index, 'last', 'menu')}>\n {lastText}\n </DropdownItem>\n </Dropdown>\n </div>\n )}\n </li>\n )\n })}\n {placeholder}\n </ul>\n <VisuallyHidden id={instructionsId}>{t('sortableInstructions')}</VisuallyHidden>\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {message}\n </VisuallyHidden>\n </>\n )\n}\n\n/**\n * Lista que o usuário reordena: prioridades, ordem de categorias, etapas.\n * Arraste pela alça (mouse, caneta ou toque), use o teclado na alça\n * (Espaço levanta, setas movem, Espaço solta, Esc cancela) ou os botões/menu\n * de mover — a alternativa de clique único exigida pela WCAG 2.5.7.\n */\nconst ForwardedSortableList = forwardRef(SortableListInner)\nForwardedSortableList.displayName = 'SortableList'\n\nexport const SortableList = ForwardedSortableList as <T>(\n props: SortableListProps<T> & { ref?: Ref<HTMLUListElement> },\n) => ReactElement | null\n","import { forwardRef, useMemo, type CSSProperties, type HTMLAttributes } from 'react'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport { useChartMotion } from '../BarChart/ChartFrame'\nimport { px } from '../BarChart/chartUtils'\nimport './Sparkline.css'\n\nexport interface SparklineProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {\n /** Valores em ordem (o último é o período atual). */\n data: number[]\n /**\n * Resumo da tendência em palavras — é o texto alternativo do gráfico\n * (ex.: \"Vendas subiram 18% em 7 dias\"). Obrigatório.\n */\n label: string\n /** Largura em px. Padrão: 96. */\n width?: number\n /** Altura em px. Padrão: 28. */\n height?: number\n /** Cor da linha. Padrão: o neutro `--or-color-viz-other` (o ponto final usa o acento). */\n color?: string\n /** Preenche a área sob a linha. */\n area?: boolean\n /** Ponto no último valor, no acento. Padrão: `true`. */\n showEndPoint?: boolean\n /** Marca o menor e o maior valor. */\n showMinMax?: boolean\n}\n\nconst PAD = 4\n\n/**\n * Tendência em miniatura, para usar junto de um número (Stat, tabelas, listas).\n * Não interativa: sem eixos nem legenda — o `label` diz em palavras o que a\n * linha mostra. Desenha-se uma vez ao entrar na tela.\n */\nexport const Sparkline = forwardRef<HTMLSpanElement, SparklineProps>(function Sparkline(\n {\n data,\n label,\n width = 96,\n height = 28,\n color = 'var(--or-color-viz-other)',\n area = false,\n showEndPoint = true,\n showMinMax = false,\n className,\n style,\n ...rest\n },\n ref,\n) {\n devWarning(!label, 'Sparkline precisa de `label` resumindo a tendência em palavras.')\n const values = data.filter((v) => Number.isFinite(v))\n const n = values.length\n const min = n ? Math.min(...values) : 0\n const max = n ? Math.max(...values) : 0\n const span = max - min\n const x = (i: number) => px(n > 1 ? PAD + (i * (width - PAD * 2)) / (n - 1) : width / 2)\n const y = (v: number) => px(span ? PAD + ((max - v) / span) * (height - PAD * 2) : height / 2)\n const d = values.map((v, i) => `${i ? 'L' : 'M'}${x(i)} ${y(v)}`).join('')\n const minIndex = values.indexOf(min)\n const maxIndex = values.indexOf(max)\n const lastIndex = n - 1\n\n const [motionRef, motion] = useChartMotion<HTMLSpanElement>()\n const rootRef = useMemo(() => mergeRefs(ref, motionRef), [ref, motionRef])\n\n return (\n <span\n ref={rootRef}\n role=\"img\"\n aria-label={label}\n className={cx('or-sparkline', className)}\n data-motion={motion}\n style={{ width, height, '--_color': color, ...style } as CSSProperties}\n {...rest}\n >\n <svg\n className=\"or-sparkline__svg\"\n width={width}\n height={height}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {area && n > 1 && (\n <path\n className=\"or-sparkline__area or-chart__anim\"\n d={`${d}L${x(lastIndex)} ${height}L${x(0)} ${height}Z`}\n />\n )}\n {n > 1 && <path className=\"or-sparkline__line or-chart__anim\" d={d} pathLength={1} />}\n {showMinMax && n > 1 && span > 0 && (\n <g className=\"or-sparkline__extremes\">\n <circle\n className=\"or-sparkline__dot or-sparkline__dot--min or-chart__anim\"\n cx={x(minIndex)}\n cy={y(min)}\n r={2.5}\n />\n <circle\n className=\"or-sparkline__dot or-sparkline__dot--max or-chart__anim\"\n cx={x(maxIndex)}\n cy={y(max)}\n r={2.5}\n />\n </g>\n )}\n {showEndPoint && n > 0 && (\n <circle\n className=\"or-sparkline__dot or-sparkline__dot--end or-chart__anim\"\n cx={x(lastIndex)}\n cy={y(values[lastIndex])}\n r={3}\n />\n )}\n </svg>\n </span>\n )\n})\n","import {\n autoUpdate,\n flip,\n offset,\n shift,\n size as sizeMiddleware,\n useFloating,\n} from '@floating-ui/react-dom'\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react'\nimport { useClickOutside, useControllableState, useId, usePresence } from '../../hooks'\nimport { Icon, type IconName } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport { Button, type ButtonProps } from '../Button'\nimport { rovingItemProps, useActionGroup } from '../ButtonGroup/context'\nimport { Portal } from '../Portal'\nimport './SplitButton.css'\n\nexport type SplitButtonVariant = 'primary' | 'secondary' | 'outline'\n\nexport interface SplitButtonAction {\n /** Rótulo do item do menu (também usado na busca por letra inicial). */\n label: string\n /** Chamado quando o item é escolhido. O menu fecha e o foco volta para a seta. */\n onSelect: () => void\n /** Ícone antes do rótulo. */\n icon?: IconName\n /** Item visível e focável, mas que não pode ser acionado. */\n disabled?: boolean\n}\n\nexport interface SplitButtonProps extends Omit<\n ButtonProps,\n 'variant' | 'iconOnly' | 'endIcon' | 'block'\n> {\n /** Estilo visual das duas partes. */\n variant?: SplitButtonVariant\n /** Ações alternativas exibidas no menu da seta. */\n actions: SplitButtonAction[]\n /** Nome acessível do botão de seta. Padrão: `t('moreActions')` (\"Mais ações\"). */\n menuLabel?: string\n /** Menu aberto (controlado). */\n open?: boolean\n /** Menu aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Alinhamento do menu em relação ao botão. */\n placement?: 'bottom-start' | 'bottom-end'\n}\n\nconst isPrintableKey = (key: string) => key.length === 1 && key !== ' '\n\n/**\n * Ação principal com um botão de seta que abre um menu de ações relacionadas\n * (padrão \"menu button\" do WAI-ARIA). `ref` e os atributos extras vão para o\n * botão principal; `className` e `style`, para o contêiner.\n */\nexport const SplitButton = forwardRef<HTMLButtonElement, SplitButtonProps>(function SplitButton(\n {\n variant,\n size,\n disabled,\n actions,\n menuLabel,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottom-end',\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const group = useActionGroup()\n const id = useId('or-split-button')\n const triggerId = `${id}-trigger`\n const menuId = `${id}-menu`\n\n devWarning(actions.length === 0, 'SplitButton precisa de ao menos uma ação em `actions`.')\n\n const groupVariant =\n group?.variant === 'primary' || group?.variant === 'secondary' || group?.variant === 'outline'\n ? group.variant\n : undefined\n const resolvedVariant = variant ?? groupVariant ?? 'primary'\n const resolvedSize = size ?? group?.size ?? 'md'\n const isDisabled = disabled ?? group?.disabled ?? false\n\n const [isOpen, setOpen] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const [activeIndex, setActiveIndex] = useState(0)\n\n const rootRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([])\n // O menu continua montado durante a animação de saída (data-state=\"closed\").\n const { present, state, nodeRef: menuRef } = usePresence<HTMLDivElement>(isOpen)\n\n const {\n refs,\n floatingStyles,\n isPositioned,\n placement: resolvedPlacement,\n } = useFloating({\n open: present,\n placement,\n transform: false,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n sizeMiddleware({\n apply({ rects, elements }) {\n elements.floating.style.minWidth = `${Math.max(rects.reference.width, 192)}px`\n },\n }),\n ],\n })\n\n const openMenu = (index: number) => {\n setActiveIndex(index)\n setOpen(true)\n }\n\n const closeMenu = (restoreFocus: boolean) => {\n setOpen(false)\n if (restoreFocus) triggerRef.current?.focus()\n }\n\n // Move o foco para o item ativo sempre que o menu abre ou o item muda.\n useEffect(() => {\n if (!isOpen) return\n itemRefs.current[activeIndex]?.focus({ preventScroll: true })\n }, [isOpen, activeIndex])\n\n useClickOutside([rootRef, menuRef], () => setOpen(false), isOpen)\n\n const last = actions.length - 1\n\n const onTriggerClick = () => {\n if (isOpen) closeMenu(false)\n else openMenu(0)\n }\n\n const onTriggerKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n openMenu(0)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n openMenu(last)\n }\n }\n\n const selectItem = (action: SplitButtonAction) => {\n if (action.disabled) return\n closeMenu(true)\n action.onSelect()\n }\n\n const onMenuKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowDown':\n setActiveIndex((i) => (i >= last ? 0 : i + 1))\n break\n case 'ArrowUp':\n setActiveIndex((i) => (i <= 0 ? last : i - 1))\n break\n case 'Home':\n case 'PageUp':\n setActiveIndex(0)\n break\n case 'End':\n case 'PageDown':\n setActiveIndex(last)\n break\n case 'Escape':\n event.stopPropagation()\n closeMenu(true)\n break\n case 'Tab':\n // Fecha e devolve o foco à seta; o Tab nativo segue a partir dela.\n closeMenu(true)\n return\n default:\n if (isPrintableKey(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n const char = event.key.toLocaleLowerCase()\n const order = actions.map((_, i) => (activeIndex + 1 + i) % actions.length)\n const match = order.find((i) =>\n actions[i].label.trim().toLocaleLowerCase().startsWith(char),\n )\n if (match !== undefined) setActiveIndex(match)\n break\n }\n return\n }\n event.preventDefault()\n }\n\n const onMenuBlur = (event: FocusEvent<HTMLDivElement>) => {\n const next = event.relatedTarget as Node | null\n if (!next) return\n if (menuRef.current?.contains(next) || rootRef.current?.contains(next)) return\n setOpen(false)\n }\n\n return (\n <div\n ref={mergeRefs(rootRef, refs.setReference)}\n className={cx(\n 'or-split-button',\n `or-split-button--${resolvedVariant}`,\n `or-split-button--${resolvedSize}`,\n className,\n )}\n style={style}\n data-state={isOpen ? 'open' : 'closed'}\n >\n <Button\n ref={ref}\n variant={resolvedVariant}\n size={resolvedSize}\n disabled={isDisabled}\n className=\"or-split-button__main\"\n {...rovingItemProps(group)}\n {...rest}\n >\n {children}\n </Button>\n <Button\n ref={triggerRef}\n id={triggerId}\n variant={resolvedVariant}\n size={resolvedSize}\n disabled={isDisabled || actions.length === 0}\n iconOnly\n aria-label={menuLabel ?? t('moreActions')}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n startIcon={<Icon name=\"chevron-down\" />}\n className=\"or-split-button__trigger\"\n onClick={onTriggerClick}\n onKeyDown={onTriggerKeyDown}\n {...rovingItemProps(group)}\n />\n <Portal>\n {present && (\n <div\n ref={mergeRefs(menuRef, refs.setFloating)}\n id={menuId}\n role=\"menu\"\n tabIndex={-1}\n aria-labelledby={triggerId}\n className=\"or-split-button__menu\"\n // A entrada só começa depois do posicionamento (sem \"piscar\" no canto).\n data-state={isPositioned ? state : undefined}\n data-side={resolvedPlacement.split('-')[0]}\n inert={state === 'closed' || undefined}\n style={{ ...floatingStyles, opacity: isPositioned ? undefined : 0 }}\n onKeyDown={onMenuKeyDown}\n onBlur={onMenuBlur}\n >\n {actions.map((action, index) => (\n <button\n key={`${index}-${action.label}`}\n ref={(el) => {\n itemRefs.current[index] = el\n }}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n aria-disabled={action.disabled || undefined}\n className=\"or-split-button__item\"\n onClick={() => selectItem(action)}\n onMouseMove={(event: MouseEvent<HTMLButtonElement>) => {\n // O item sob o ponteiro recebe o foco, como em menus nativos.\n if (activeIndex !== index) setActiveIndex(index)\n else if (document.activeElement !== event.currentTarget) {\n event.currentTarget.focus({ preventScroll: true })\n }\n }}\n >\n {action.icon && (\n <Icon name={action.icon} size=\"sm\" className=\"or-split-button__item-icon\" />\n )}\n <span className=\"or-split-button__item-label\">{action.label}</span>\n </button>\n ))}\n </div>\n )}\n </Portal>\n </div>\n )\n})\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent as ReactFocusEvent,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { canUseDOM, clamp, composeEventHandlers, cx, devWarning, getFocusableElements, mergeRefs } from '../../utils'\nimport './Splitter.css'\n\nexport type SplitterOrientation = 'horizontal' | 'vertical'\nexport type SplitterStackBreakpoint = 'sm' | 'md'\n\nexport interface SplitterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /**\n * `horizontal` (padrão): painéis lado a lado, separadores verticais.\n * `vertical`: painéis empilhados, separadores horizontais.\n */\n orientation?: SplitterOrientation\n /** Tamanhos dos painéis em % (somam 100), na ordem do DOM (controlado). */\n sizes?: number[]\n /**\n * Tamanhos iniciais em % (não controlado). Também é o destino do clique\n * duplo no separador. Padrão: divisão igual.\n */\n defaultSizes?: number[]\n /** Chamado a cada mudança de tamanho (inclusive durante o arraste). */\n onSizesChange?: (sizes: number[]) => void\n /** Chamado quando um redimensionamento termina (soltar o ponteiro, soltar a tecla, clique duplo). */\n onResizeEnd?: (sizes: number[]) => void\n /**\n * Guarda os tamanhos no `localStorage` (chave `or-splitter:<storageKey>`) ao fim\n * de cada redimensionamento e os restaura ao montar. Falhas de armazenamento\n * (modo privado, cota cheia) são ignoradas.\n */\n storageKey?: string\n /** Nome acessível do grupo de painéis (`role=\"group\"`). */\n label?: string\n /** Passo das setas, em %. Padrão: 2. */\n step?: number\n /** Passo de Shift + seta, em %. Padrão: 10. */\n shiftStep?: number\n /**\n * Abaixo deste ponto de quebra (`sm` 640px, `md` 768px) os painéis empilham\n * na vertical, sem separadores. O conteúdo precisa fazer sentido empilhado.\n */\n stackBelow?: SplitterStackBreakpoint\n /** `SplitterPanel` e `SplitterHandle` como filhos diretos, intercalados. */\n children?: ReactNode\n}\n\nexport interface SplitterPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Tamanho mínimo em %. Padrão: 0. */\n minSize?: number\n /** Tamanho máximo em %. Padrão: 100. */\n maxSize?: number\n /** Pode ser recolhido (Enter no separador ou arraste abaixo do mínimo). */\n collapsible?: boolean\n /** Tamanho em % quando recolhido. Padrão: 0 (o conteúdo sai da tela e do foco). */\n collapsedSize?: number\n /** Começa recolhido (requer `collapsible`). */\n defaultCollapsed?: boolean\n /** `id` do painel (alvo do `aria-controls` do separador). Padrão: gerado. */\n id?: string\n /** Nome do painel, usado no nome acessível do separador (\"Redimensionar {label}\"). */\n label?: string\n}\n\nexport type SplitterHandleProps = HTMLAttributes<HTMLDivElement>\n\n/* -------------------------------------------------------------------------- */\n/* Modelo */\n/* -------------------------------------------------------------------------- */\n\ninterface PanelConfig {\n id: string\n label?: string\n minSize: number\n maxSize: number\n collapsible: boolean\n collapsedSize: number\n defaultCollapsed: boolean\n}\n\ninterface HandleState {\n /** Índice do painel primário (anterior) e do secundário (seguinte); -1 se faltar. */\n before: number\n after: number\n valueNow?: number\n valueMin?: number\n valueMax?: number\n valueText?: string\n controls?: string\n name: string\n collapsed: boolean\n edge?: 'start' | 'end'\n}\n\ntype ItemKind = 'panel' | 'handle' | 'other'\n\ninterface SplitterContextValue {\n orientation: SplitterOrientation\n panels: PanelConfig[]\n sizes: number[]\n handles: HandleState[]\n dragging: number | null\n onKeyDown: (index: number, event: ReactKeyboardEvent<HTMLDivElement>) => void\n onKeyUp: (event: ReactKeyboardEvent<HTMLDivElement>) => void\n onBlur: (event: ReactFocusEvent<HTMLDivElement>) => void\n onPointerDown: (index: number, event: ReactPointerEvent<HTMLDivElement>) => void\n onPointerMove: (event: ReactPointerEvent<HTMLDivElement>) => void\n onPointerEnd: (event: ReactPointerEvent<HTMLDivElement>) => void\n onDoubleClick: (event: ReactMouseEvent<HTMLDivElement>) => void\n}\n\nconst SplitterContext = createContext<SplitterContextValue | null>(null)\n/** Índice do painel ou separador na ordem do Splitter (null fora de um filho direto). */\nconst ItemContext = createContext<number | null>(null)\n\nfunction useSplitterItem(component: string) {\n const ctx = useContext(SplitterContext)\n const index = useContext(ItemContext)\n if (!ctx || index === null) {\n throw new Error(`<${component}> precisa ser filho direto de <Splitter>.`)\n }\n return { ctx, index }\n}\n\nconst EPSILON = 0.01\nconst STORAGE_PREFIX = 'or-splitter:'\n\nconst round = (value: number) => Math.round(value * 100) / 100\nconst finiteOr = (value: number | undefined, fallback: number) =>\n typeof value === 'number' && Number.isFinite(value) ? value : fallback\nconst sameSizes = (a: readonly number[], b: readonly number[]) =>\n a.length === b.length && a.every((v, i) => Math.abs(v - b[i]) < 0.005)\nconst isCollapsedAt = (panel: PanelConfig | undefined, size: number | undefined) =>\n !!panel && panel.collapsible && size !== undefined && size <= panel.collapsedSize + EPSILON\n\n/** Valida e reescala uma lista de tamanhos para somar 100. `null` se inválida. */\nfunction normalizeSizes(value: unknown, count: number): number[] | null {\n if (!Array.isArray(value) || value.length !== count || count === 0) return null\n if (!value.every((v) => typeof v === 'number' && Number.isFinite(v) && v >= 0)) return null\n const total = (value as number[]).reduce((sum, v) => sum + v, 0)\n if (total <= 0) return null\n return (value as number[]).map((v) => round((v * 100) / total))\n}\n\nfunction readPanel(props: SplitterPanelProps, id: string): PanelConfig {\n const minSize = clamp(finiteOr(props.minSize, 0), 0, 100)\n const maxSize = clamp(finiteOr(props.maxSize, 100), minSize, 100)\n const collapsible = Boolean(props.collapsible)\n return {\n id,\n label: props.label,\n minSize,\n maxSize,\n collapsible,\n collapsedSize: clamp(finiteOr(props.collapsedSize, 0), 0, minSize),\n defaultCollapsed: collapsible && Boolean(props.defaultCollapsed),\n }\n}\n\n/** Tamanhos padrão (com `defaultCollapsed` aplicado) e os tamanhos \"abertos\" de cada painel. */\nfunction resolveDefaults(panels: PanelConfig[], defaultSizes?: number[]) {\n const count = panels.length\n const base =\n normalizeSizes(defaultSizes, count) ?? panels.map(() => round(100 / Math.max(count, 1)))\n const sizes = [...base]\n if (count > 1) {\n panels.forEach((panel, i) => {\n if (!panel.defaultCollapsed) return\n const partner = i + 1 < count ? i + 1 : i - 1\n sizes[partner] = round(sizes[partner] + sizes[i] - panel.collapsedSize)\n sizes[i] = panel.collapsedSize\n })\n }\n return { sizes, expanded: base }\n}\n\ninterface StoredLayout {\n sizes: number[]\n expanded?: number[]\n}\n\nfunction readStorage(key: string, count: number): StoredLayout | null {\n if (!canUseDOM) return null\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + key)\n if (!raw) return null\n const data = JSON.parse(raw) as Partial<StoredLayout> | null\n const sizes = normalizeSizes(data?.sizes, count)\n if (!sizes) return null\n const expanded =\n Array.isArray(data?.expanded) &&\n data.expanded.length === count &&\n data.expanded.every((v) => typeof v === 'number' && Number.isFinite(v) && v >= 0)\n ? data.expanded\n : undefined\n return { sizes, expanded }\n } catch {\n return null\n }\n}\n\nfunction writeStorage(key: string, layout: StoredLayout) {\n if (!canUseDOM) return\n try {\n window.localStorage.setItem(STORAGE_PREFIX + key, JSON.stringify(layout))\n } catch {\n // Armazenamento indisponível (modo privado, cota cheia, bloqueado): segue sem persistir.\n }\n}\n\n/** Trava cursor e seleção de texto no documento inteiro durante o arraste. */\nfunction lockDocument(cursor: string) {\n const { style } = document.body\n const previous = {\n cursor: style.cursor,\n userSelect: style.userSelect,\n webkitUserSelect: style.getPropertyValue('-webkit-user-select'),\n }\n style.cursor = cursor\n style.userSelect = 'none'\n style.setProperty('-webkit-user-select', 'none')\n return () => {\n style.cursor = previous.cursor\n style.userSelect = previous.userSelect\n if (previous.webkitUserSelect) style.setProperty('-webkit-user-select', previous.webkitUserSelect)\n else style.removeProperty('-webkit-user-select')\n }\n}\n\nfunction formatPercent(value: number, locale: string) {\n try {\n return new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(\n value / 100,\n )\n } catch {\n return `${Math.round(value)}%`\n }\n}\n\ninterface DragState {\n handle: number\n a: number\n b: number\n pointerId: number\n origin: number\n /** px → %: tamanho útil do contêiner (sem os separadores). */\n available: number\n /** -1 em layouts horizontais da direita para a esquerda. */\n sign: number\n startSizes: number[]\n changed: boolean\n}\n\n/* -------------------------------------------------------------------------- */\n/* Splitter */\n/* -------------------------------------------------------------------------- */\n\nfunction isElementOfType<P>(node: ReactNode, type: unknown): node is ReactElement<P> {\n return isValidElement(node) && node.type === type\n}\n\n/**\n * Painéis redimensionáveis (lista/detalhe, editor/prévia, inspetores, consoles).\n * Implementa o padrão Window Splitter do WAI-ARIA: cada `SplitterHandle` é um\n * `separator` focável que se move com as setas, Home/End e recolhe com Enter.\n */\nexport const Splitter = forwardRef<HTMLDivElement, SplitterProps>(function Splitter(\n {\n orientation = 'horizontal',\n sizes: sizesProp,\n defaultSizes,\n onSizesChange,\n onResizeEnd,\n storageKey,\n label,\n step = 2,\n shiftStep = 10,\n stackBelow,\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const { t, locale } = useLocale()\n const baseId = useId('or-splitter')\n const rootRef = useRef<HTMLDivElement>(null)\n const horizontal = orientation === 'horizontal'\n\n // Descobre painéis e separadores entre os filhos diretos (na ordem do DOM).\n const items = Children.toArray(children)\n const panels: PanelConfig[] = []\n const layout: { kind: ItemKind; index: number }[] = []\n const handleBefore: number[] = []\n items.forEach((child) => {\n if (isElementOfType<SplitterPanelProps>(child, SplitterPanel)) {\n const index = panels.length\n panels.push(readPanel(child.props, child.props.id ?? `${baseId}-panel-${index}`))\n layout.push({ kind: 'panel', index })\n } else if (isElementOfType<SplitterHandleProps>(child, SplitterHandle)) {\n layout.push({ kind: 'handle', index: handleBefore.length })\n handleBefore.push(panels.length - 1)\n } else {\n layout.push({ kind: 'other', index: -1 })\n }\n })\n const count = panels.length\n const handlePairs = handleBefore.map((before) => ({\n before,\n after: before + 1 < count ? before + 1 : -1,\n }))\n devWarning(\n handlePairs.some((pair) => pair.before < 0 || pair.after < 0),\n 'Cada SplitterHandle precisa ficar entre dois SplitterPanel.',\n )\n devWarning(\n defaultSizes !== undefined && normalizeSizes(defaultSizes, count) === null,\n 'Splitter: `defaultSizes` precisa ter um número (>= 0) por painel. Usando divisão igual.',\n )\n\n const defaults = resolveDefaults(panels, defaultSizes)\n const [rawSizes, setRawSizes] = useControllableState<number[]>({\n value: sizesProp,\n defaultValue: defaults.sizes,\n onChange: onSizesChange,\n })\n const sizes = normalizeSizes(rawSizes, count) ?? defaults.sizes\n\n const [animate, setAnimate] = useState(false)\n const [dragging, setDragging] = useState<number | null>(null)\n\n // Últimas versões para os handlers (eventos de ponteiro chegam entre renderizações).\n const sizesRef = useRef(sizes)\n sizesRef.current = sizes\n const panelsRef = useRef(panels)\n panelsRef.current = panels\n const defaultsRef = useRef(defaults)\n defaultsRef.current = defaults\n const onResizeEndRef = useRef(onResizeEnd)\n onResizeEndRef.current = onResizeEnd\n /** Último tamanho aberto de cada painel: destino de Enter ao restaurar. */\n const expandedRef = useRef<number[]>(defaults.expanded)\n const dragRef = useRef<DragState | null>(null)\n const unlockRef = useRef<(() => void) | null>(null)\n const pendingEndRef = useRef(false)\n\n useEffect(\n () => () => {\n unlockRef.current?.()\n unlockRef.current = null\n },\n [],\n )\n\n // Restaura o layout salvo antes da primeira pintura (no servidor, fica o padrão).\n useIsomorphicLayoutEffect(() => {\n if (!storageKey) return\n const stored = readStorage(storageKey, panelsRef.current.length)\n if (!stored) return\n if (stored.expanded) expandedRef.current = [...stored.expanded]\n if (sameSizes(stored.sizes, sizesRef.current)) return\n sizesRef.current = stored.sizes\n setRawSizes(stored.sizes)\n }, [storageKey])\n\n /** Atualiza a memória dos tamanhos abertos: quem acabou de recolher guarda o tamanho anterior. */\n const rememberExpanded = (next: number[], previous: number[]) => {\n const list = panelsRef.current\n expandedRef.current = list.map((panel, i) => {\n if (!isCollapsedAt(panel, next[i])) return next[i]\n if (!isCollapsedAt(panel, previous[i]) && previous[i] !== undefined) return previous[i]\n return expandedRef.current[i] ?? defaultsRef.current.expanded[i]\n })\n }\n\n const commit = (next: number[], options: { animated: boolean; remember: boolean }) => {\n if (sameSizes(next, sizesRef.current)) return false\n if (options.remember) rememberExpanded(next, sizesRef.current)\n setAnimate(options.animated)\n sizesRef.current = next\n setRawSizes(next)\n return true\n }\n\n const finish = () => {\n pendingEndRef.current = false\n const final = sizesRef.current\n onResizeEndRef.current?.(final)\n if (storageKey) writeStorage(storageKey, { sizes: final, expanded: expandedRef.current })\n }\n\n /** Faixa do painel primário sem recolher ninguém, respeitando os dois vizinhos. */\n const expandedRange = (a: number, b: number, total: number): [number, number] => {\n const pa = panelsRef.current[a]\n const pb = panelsRef.current[b]\n return [Math.max(pa.minSize, total - pb.maxSize), Math.min(pa.maxSize, total - pb.minSize)]\n }\n\n const resizePair = (current: number[], a: number, b: number, targetA: number) => {\n const total = current[a] + current[b]\n const [lo, hi] = expandedRange(a, b, total)\n if (lo > hi + EPSILON) return null\n const nextA = round(clamp(targetA, lo, hi))\n const next = [...current]\n next[a] = nextA\n next[b] = round(total - nextA)\n return next\n }\n\n const collapsePair = (current: number[], target: number, partner: number) => {\n const list = panelsRef.current\n const total = current[target] + current[partner]\n const partnerSize = total - list[target].collapsedSize\n if (partnerSize > list[partner].maxSize + EPSILON) return null\n const next = [...current]\n next[target] = list[target].collapsedSize\n next[partner] = round(partnerSize)\n return next\n }\n\n /** Arraste: abaixo da metade do caminho até o mínimo, um painel recolhível recolhe. */\n const resolveDrag = (start: number[], a: number, b: number, targetA: number) => {\n const pa = panelsRef.current[a]\n const pb = panelsRef.current[b]\n const total = start[a] + start[b]\n if (pa.collapsible && targetA < (pa.collapsedSize + pa.minSize) / 2) {\n const next = collapsePair(start, a, b)\n if (next) return next\n }\n if (pb.collapsible && total - targetA < (pb.collapsedSize + pb.minSize) / 2) {\n const next = collapsePair(start, b, a)\n if (next) return next\n }\n return resizePair(start, a, b, targetA)\n }\n\n const isRtl = () =>\n horizontal && !!rootRef.current && canUseDOM && getComputedStyle(rootRef.current).direction === 'rtl'\n\n const handleKeyDown = (index: number, event: ReactKeyboardEvent<HTMLDivElement>) => {\n const pair = handlePairs[index]\n if (!pair || pair.before < 0 || pair.after < 0) return\n const { before: a, after: b } = pair\n const list = panelsRef.current\n const current = sizesRef.current\n const collapsedA = isCollapsedAt(list[a], current[a])\n const collapsedB = isCollapsedAt(list[b], current[b])\n\n let direction = 0\n if (horizontal && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\n direction = event.key === 'ArrowRight' ? 1 : -1\n if (isRtl()) direction = -direction\n } else if (!horizontal && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {\n direction = event.key === 'ArrowDown' ? 1 : -1\n }\n\n let next: number[] | null = null\n let animated = false\n if (direction !== 0) {\n event.preventDefault()\n // Setas não recolhem nem \"empurram\" um painel já recolhido: só Enter (ou arraste).\n if ((direction < 0 && collapsedA) || (direction > 0 && collapsedB)) return\n const amount = event.shiftKey ? shiftStep : step\n next = resizePair(current, a, b, current[a] + direction * amount)\n } else if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault()\n const isHome = event.key === 'Home'\n if ((isHome && collapsedA) || (!isHome && collapsedB)) return\n const [lo, hi] = expandedRange(a, b, current[a] + current[b])\n next = resizePair(current, a, b, isHome ? lo : hi)\n animated = true\n } else if (event.key === 'Enter') {\n // Recolhe o painel primário; se ele não for recolhível, o secundário (ex.: console embaixo).\n const target = list[a].collapsible ? a : list[b].collapsible ? b : -1\n if (target < 0) return\n event.preventDefault()\n const partner = target === a ? b : a\n if (isCollapsedAt(list[target], current[target])) {\n const remembered = expandedRef.current[target]\n const restore =\n remembered !== undefined && remembered > list[target].collapsedSize + EPSILON\n ? remembered\n : Math.max(defaultsRef.current.expanded[target] ?? 0, list[target].minSize)\n const total = current[a] + current[b]\n next = resizePair(current, a, b, target === a ? restore : total - restore)\n } else {\n next = collapsePair(current, target, partner)\n }\n animated = true\n } else {\n return\n }\n if (next && commit(next, { animated, remember: true })) pendingEndRef.current = true\n }\n\n const handleKeyUp = () => {\n if (pendingEndRef.current) finish()\n }\n\n const handlePointerDown = (index: number, event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0 || dragRef.current) return\n const pair = handlePairs[index]\n const root = rootRef.current\n if (!root || !pair || pair.before < 0 || pair.after < 0) return\n const rect = root.getBoundingClientRect()\n const handlesSize = Array.from(root.children)\n .filter((el) => el.classList.contains('or-splitter__handle'))\n .reduce((sum, el) => {\n const r = el.getBoundingClientRect()\n return sum + (horizontal ? r.width : r.height)\n }, 0)\n const available = (horizontal ? rect.width : rect.height) - handlesSize\n if (available <= 0) return\n event.currentTarget.setPointerCapture?.(event.pointerId)\n dragRef.current = {\n handle: index,\n a: pair.before,\n b: pair.after,\n pointerId: event.pointerId,\n origin: horizontal ? event.clientX : event.clientY,\n available,\n sign: isRtl() ? -1 : 1,\n startSizes: sizesRef.current,\n changed: false,\n }\n unlockRef.current?.()\n unlockRef.current = canUseDOM ? lockDocument(horizontal ? 'col-resize' : 'row-resize') : null\n setAnimate(false)\n setDragging(index)\n }\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current\n if (!drag || event.pointerId !== drag.pointerId) return\n const position = horizontal ? event.clientX : event.clientY\n const delta = (((position - drag.origin) * drag.sign) / drag.available) * 100\n const next = resolveDrag(drag.startSizes, drag.a, drag.b, drag.startSizes[drag.a] + delta)\n if (next && commit(next, { animated: false, remember: false })) drag.changed = true\n }\n\n const handlePointerEnd = (event: ReactPointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current\n if (!drag || event.pointerId !== drag.pointerId) return\n dragRef.current = null\n const target = event.currentTarget\n if (target.hasPointerCapture?.(event.pointerId)) target.releasePointerCapture?.(event.pointerId)\n unlockRef.current?.()\n unlockRef.current = null\n setDragging(null)\n if (drag.changed) {\n rememberExpanded(sizesRef.current, drag.startSizes)\n finish()\n }\n }\n\n /** Clique duplo: volta aos tamanhos padrão (`defaultSizes`, com `defaultCollapsed`). */\n const handleDoubleClick = () => {\n const { sizes: initial, expanded } = defaultsRef.current\n const changed = commit(initial, { animated: true, remember: false })\n expandedRef.current = panelsRef.current.map((panel, i) =>\n isCollapsedAt(panel, initial[i]) ? expanded[i] : initial[i],\n )\n if (changed) finish()\n }\n\n // Estado de cada separador (valores ARIA em % do painel primário).\n const handles: HandleState[] = handlePairs.map(({ before: a, after: b }) => {\n const pa = panels[a]\n const pb = panels[b]\n const fallbackLabel = pa?.label ?? pb?.label\n const name = fallbackLabel ? t('splitterResize', { label: fallbackLabel }) : t('splitterResizePanels')\n if (!pa || !pb) return { before: a, after: b, name, collapsed: false }\n const total = sizes[a] + sizes[b]\n const lowA = pa.collapsible ? pa.collapsedSize : pa.minSize\n const lowB = pb.collapsible ? pb.collapsedSize : pb.minSize\n const collapsedA = isCollapsedAt(pa, sizes[a])\n const collapsedB = isCollapsedAt(pb, sizes[b])\n const collapsedPanel = collapsedA ? pa : collapsedB ? pb : undefined\n const offset = sizes.slice(0, a + 1).reduce((sum, v) => sum + v, 0)\n return {\n before: a,\n after: b,\n valueNow: Math.round(sizes[a]),\n valueMin: Math.round(Math.max(lowA, total - pb.maxSize)),\n valueMax: Math.round(Math.min(pa.maxSize, total - lowB)),\n valueText: collapsedPanel\n ? collapsedPanel.label\n ? t('splitterCollapsed', { label: collapsedPanel.label })\n : t('splitterPanelCollapsed')\n : formatPercent(sizes[a], locale),\n controls: pa.id,\n name,\n collapsed: Boolean(collapsedPanel),\n edge: offset <= EPSILON ? 'start' : offset >= 100 - EPSILON ? 'end' : undefined,\n }\n })\n\n // Trilhas da grade: painéis em fr (dividem o espaço sem os separadores), separadores com 1px.\n const tracks = layout\n .map((item) =>\n item.kind === 'panel'\n ? `minmax(0, ${sizes[item.index]}fr)`\n : item.kind === 'handle'\n ? 'var(--or-border-thin)'\n : 'auto',\n )\n .join(' ')\n\n const ctx: SplitterContextValue = {\n orientation,\n panels,\n sizes,\n handles,\n dragging,\n onKeyDown: handleKeyDown,\n onKeyUp: handleKeyUp,\n onBlur: handleKeyUp,\n onPointerDown: handlePointerDown,\n onPointerMove: handlePointerMove,\n onPointerEnd: handlePointerEnd,\n onDoubleClick: handleDoubleClick,\n }\n\n const named = Boolean(label || rest['aria-label'] || rest['aria-labelledby'])\n\n return (\n <SplitterContext.Provider value={ctx}>\n <div\n ref={mergeRefs(ref, rootRef)}\n role={named ? 'group' : undefined}\n aria-label={label}\n className={cx('or-splitter', `or-splitter--${orientation}`, className)}\n data-orientation={orientation}\n data-stack-below={stackBelow}\n data-animate={animate || undefined}\n data-dragging={dragging !== null || undefined}\n style={{ ...style, '--_tracks': tracks } as CSSProperties}\n {...rest}\n >\n {items.map((child, i) => {\n const item = layout[i]\n if (item.kind === 'other') return child\n return (\n <ItemContext.Provider\n key={isValidElement(child) && child.key !== null ? child.key : i}\n value={item.index}\n >\n {child}\n </ItemContext.Provider>\n )\n })}\n </div>\n </SplitterContext.Provider>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* SplitterPanel */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Observa se o elemento rola e se tem algo focável dentro. Quando rola sem\n * nenhum alvo de foco, o teclado não alcança o conteúdo escondido; nesse caso o\n * próprio painel precisa entrar na ordem de foco.\n */\nfunction useScrollableRegion() {\n const ref = useRef<HTMLDivElement>(null)\n const [needed, setNeeded] = useState(false)\n useEffect(() => {\n const el = ref.current\n if (!el) return\n const check = () => {\n const scrolls = el.scrollHeight > el.clientHeight + 1 || el.scrollWidth > el.clientWidth + 1\n // O próprio painel pode estar focável por causa deste hook: ignore-o.\n const focusable = getFocusableElements(el).some((node) => node !== el)\n setNeeded(scrolls && !focusable)\n }\n check()\n const resize = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(check)\n resize?.observe(el)\n Array.from(el.children).forEach((child) => resize?.observe(child))\n const mutation = typeof MutationObserver === 'undefined' ? null : new MutationObserver(check)\n mutation?.observe(el, { childList: true, subtree: true })\n return () => {\n resize?.disconnect()\n mutation?.disconnect()\n }\n }, [])\n return { ref, needed }\n}\n\n/**\n * Painel do `Splitter`. Os limites (`minSize`, `maxSize`) e o recolhimento são\n * lidos pelo Splitter — o painel precisa ser filho direto dele.\n */\nexport const SplitterPanel = forwardRef<HTMLDivElement, SplitterPanelProps>(function SplitterPanel(\n {\n minSize: _minSize,\n maxSize: _maxSize,\n collapsible: _collapsible,\n collapsedSize: _collapsedSize,\n defaultCollapsed: _defaultCollapsed,\n label: _label,\n id: _id,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { ctx, index } = useSplitterItem('SplitterPanel')\n const panel = ctx.panels[index]\n const collapsed = isCollapsedAt(panel, ctx.sizes[index])\n const scrollFocus = useScrollableRegion()\n return (\n <div\n ref={mergeRefs(ref, scrollFocus.ref)}\n id={panel?.id}\n // Painel que rola sem nada focável dentro vira uma região focável, para que\n // o teclado também consiga rolar o conteúdo (WCAG 2.1.1).\n {...(scrollFocus.needed && {\n tabIndex: 0,\n role: 'region',\n 'aria-label': typeof panel?.label === 'string' ? panel.label : undefined,\n })}\n className={cx('or-splitter__panel', className)}\n data-collapsed={collapsed || undefined}\n // Recolhido em 0%: o conteúdo sai da tela, do foco e da árvore de acessibilidade (CSS).\n data-hidden={(collapsed && panel?.collapsedSize === 0) || undefined}\n {...rest}\n >\n {/* Um Splitter aninhado começa uma contagem nova. */}\n <ItemContext.Provider value={null}>{children}</ItemContext.Provider>\n </div>\n )\n})\n\n/* -------------------------------------------------------------------------- */\n/* SplitterHandle */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Separador entre dois `SplitterPanel` (`role=\"separator\"`, focável). Arraste\n * com mouse, caneta ou toque; setas, Shift + setas, Home/End e Enter pelo teclado;\n * clique duplo volta aos tamanhos padrão.\n */\nexport const SplitterHandle = forwardRef<HTMLDivElement, SplitterHandleProps>(function SplitterHandle(\n {\n className,\n onKeyDown,\n onKeyUp,\n onBlur,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onLostPointerCapture,\n onDoubleClick,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n) {\n const { ctx, index } = useSplitterItem('SplitterHandle')\n const state = ctx.handles[index]\n const usable = !!state && state.before >= 0 && state.after >= 0\n const labelledBy = rest['aria-labelledby']\n return (\n // Um separador focável é um widget (WAI-ARIA 1.2, padrão Window Splitter): o plugin o trata como estático.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <div\n ref={ref}\n role=\"separator\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- separador focável (ver acima)\n tabIndex={usable ? 0 : undefined}\n aria-orientation={ctx.orientation === 'horizontal' ? 'vertical' : 'horizontal'}\n aria-valuenow={state?.valueNow}\n aria-valuemin={state?.valueMin}\n aria-valuemax={state?.valueMax}\n aria-valuetext={state?.valueText}\n aria-controls={state?.controls}\n aria-label={labelledBy ? undefined : (ariaLabel ?? state?.name)}\n className={cx('or-splitter__handle', className)}\n data-dragging={ctx.dragging === index || undefined}\n data-collapsed={state?.collapsed || undefined}\n data-edge={state?.edge}\n onKeyDown={composeEventHandlers(onKeyDown, (event) => ctx.onKeyDown(index, event))}\n onKeyUp={composeEventHandlers(onKeyUp, ctx.onKeyUp)}\n onBlur={composeEventHandlers(onBlur, ctx.onBlur)}\n onPointerDown={composeEventHandlers(onPointerDown, (event) => ctx.onPointerDown(index, event))}\n onPointerMove={composeEventHandlers(onPointerMove, ctx.onPointerMove)}\n onPointerUp={composeEventHandlers(onPointerUp, ctx.onPointerEnd)}\n onPointerCancel={composeEventHandlers(onPointerCancel, ctx.onPointerEnd)}\n onLostPointerCapture={composeEventHandlers(onLostPointerCapture, ctx.onPointerEnd)}\n onDoubleClick={composeEventHandlers(onDoubleClick, ctx.onDoubleClick)}\n {...rest}\n >\n <span className=\"or-splitter__grip\" aria-hidden=\"true\">\n <Icon name=\"grip\" size={16} />\n </span>\n </div>\n )\n})\n","import {\n Children,\n forwardRef,\n type CSSProperties,\n type ElementType,\n type HTMLAttributes,\n} from 'react'\nimport { cx } from '../../utils'\nimport {\n addResponsive,\n createResponsiveStyles,\n gapToCss,\n isListElement,\n type LayoutGap,\n type ResponsiveValue,\n} from './responsive'\nimport './Stack.css'\n\nexport type StackDirection = 'vertical' | 'horizontal'\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\n\nexport interface StackProps extends HTMLAttributes<HTMLElement> {\n /**\n * Elemento renderizado. Padrão: `div`. `ul`/`ol` mantêm a semântica de lista\n * (com `role=\"list\"`); `nav` e `section` precisam de um nome acessível.\n */\n as?: ElementType\n /**\n * Eixo principal: `vertical` (coluna, padrão) ou `horizontal` (linha).\n * Responsivo: `{ base: 'vertical', md: 'horizontal' }` empilha no celular e\n * vira linha a partir de 768px. Não existe `reverse`: a ordem visual é sempre\n * a ordem do DOM (WCAG 1.3.2).\n */\n direction?: ResponsiveValue<StackDirection>\n /** Espaço entre os filhos na escala de espaço (`4` = 1rem). Responsivo. Padrão: `4`. */\n gap?: ResponsiveValue<LayoutGap>\n /** Alinhamento no eixo cruzado (`align-items`). Padrão: `stretch`. */\n align?: StackAlign\n /** Distribuição no eixo principal (`justify-content`). Padrão: `start`. */\n justify?: StackJustify\n /** Quebra os filhos em novas linhas quando não cabem. */\n wrap?: boolean\n /**\n * Linha de 1px (`--or-color-border`) entre os filhos, com `gap` de cada lado.\n * Acompanha a direção (horizontal ou vertical) sozinha. Decorativa: fica\n * oculta para leitores de tela. Pensada para pilhas sem `wrap`.\n */\n separator?: boolean\n}\n\n/**\n * Layout em uma dimensão: empilha os filhos na vertical ou na horizontal com\n * espaçamento da escala do sistema. Direção e espaço podem mudar por\n * breakpoint, só com CSS.\n */\nexport const Stack = forwardRef<HTMLElement, StackProps>(function Stack(\n {\n as: Component = 'div',\n direction,\n gap,\n align = 'stretch',\n justify = 'start',\n wrap = false,\n separator = false,\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const responsive = createResponsiveStyles()\n addResponsive(responsive, direction, '--_stack-dir', 'or-stack--dir', (d) =>\n d === 'horizontal' ? 'row' : 'column',\n )\n addResponsive(responsive, gap, '--_stack-gap', 'or-stack--gap', gapToCss)\n const isList = isListElement(Component)\n\n let content = children\n if (separator) {\n // Em listas o separador é um <li> oculto (ul/ol só aceitam li); em <dl>, um <div>.\n const Separator: ElementType = isList ? 'li' : Component === 'dl' ? 'div' : 'span'\n content = Children.toArray(children).flatMap((child, index) =>\n index === 0\n ? [child]\n : [\n <Separator\n key={`or-stack-separator-${index}`}\n className=\"or-stack__separator\"\n aria-hidden=\"true\"\n />,\n child,\n ],\n )\n }\n\n const hasVars = Object.keys(responsive.style).length > 0\n return (\n <Component\n ref={ref}\n className={cx(\n 'or-stack',\n `or-stack--align-${align}`,\n `or-stack--justify-${justify}`,\n wrap && 'or-stack--wrap',\n separator && 'or-stack--separated',\n ...responsive.classes,\n className,\n )}\n style={hasVars || style ? ({ ...responsive.style, ...style } as CSSProperties) : undefined}\n role={isList ? 'list' : undefined}\n {...rest}\n >\n {content}\n </Component>\n )\n})\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useMemo,\n type CSSProperties,\n type ElementType,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useCountUp, useInView, useReducedMotion } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Stat.css'\n\nexport type StatTrend = 'increase' | 'decrease' | 'neutral'\nexport type StatDeltaTone = 'positive' | 'negative' | 'neutral'\nexport type StatSize = 'sm' | 'md' | 'lg'\n\nconst StatGroupContext = createContext<{ size?: StatSize } | null>(null)\n\nexport interface StatProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n /** O que está sendo medido (vira o `<dt>`). */\n label: ReactNode\n /** A métrica, já formatada (ex.: \"R$ 48,2 mil\"). */\n value: ReactNode\n /** Variação exibida ao lado da seta (ex.: \"12%\"). */\n delta?: ReactNode\n /** Direção da variação: define a seta e o texto acessível. Padrão: `neutral`. */\n trend?: StatTrend\n /**\n * Se a variação é boa ou ruim. Padrão: aumento → `positive`, queda →\n * `negative`. Inverta para métricas como churn ou tempo de resposta.\n */\n deltaTone?: StatDeltaTone\n /** Contexto da métrica (ex.: \"vs. mês anterior\"). */\n help?: ReactNode\n /** Tamanho do número. Padrão: `md` (ou o do `StatGroup`). */\n size?: StatSize\n /**\n * Conta de zero até o valor quando o Stat entra na tela. Funciona com\n * números e com textos já formatados (\"R$ 48,2 mil\", \"1h 12min\"). Leitores\n * de tela ouvem só o valor final. Sem efeito em movimento reduzido.\n */\n animate?: boolean\n /** Formata `value` quando ele é um número. Padrão: `Intl.NumberFormat` do idioma. */\n format?: (value: number) => string\n}\n\nfunction nodeText(node: ReactNode): string {\n if (node === null || node === undefined || typeof node === 'boolean') return ''\n if (typeof node === 'string' || typeof node === 'number') return String(node)\n if (Array.isArray(node)) return node.map(nodeText).join('')\n if (isValidElement<{ children?: ReactNode }>(node)) return nodeText(node.props.children)\n return ''\n}\n\nconst COUNT_DURATION = 1200\n\ninterface NumberToken {\n start: number\n end: number\n value: number\n decimals: number\n grouped: boolean\n}\n\nfunction separators(locale: string) {\n try {\n const parts = new Intl.NumberFormat(locale).formatToParts(12345.6)\n return {\n group: parts.find((p) => p.type === 'group')?.value ?? ',',\n decimal: parts.find((p) => p.type === 'decimal')?.value ?? '.',\n }\n } catch {\n return { group: ',', decimal: '.' }\n }\n}\n\nconst escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/** Encontra os números de um texto formatado, respeitando os separadores do idioma. */\nfunction tokenize(text: string, locale: string): NumberToken[] {\n const { group, decimal } = separators(locale)\n const pattern = new RegExp(`\\\\d+(?:[${escapeRegExp(group)}${escapeRegExp(decimal)}]\\\\d+)*`, 'g')\n const tokens: NumberToken[] = []\n for (const match of text.matchAll(pattern)) {\n const raw = match[0]\n const decimalAt = raw.lastIndexOf(decimal)\n const integer = decimalAt >= 0 ? raw.slice(0, decimalAt) : raw\n const fraction = decimalAt >= 0 ? raw.slice(decimalAt + 1) : ''\n const value = Number(`${integer.split(group).join('')}${fraction ? `.${fraction}` : ''}`)\n if (Number.isNaN(value)) continue\n tokens.push({\n start: match.index ?? 0,\n end: (match.index ?? 0) + raw.length,\n value,\n decimals: fraction.length,\n grouped: integer.includes(group),\n })\n }\n return tokens\n}\n\n/** Reescreve o texto com cada número multiplicado por `progress` (0 → 1). */\nfunction interpolateText(text: string, tokens: NumberToken[], progress: number, locale: string) {\n let out = ''\n let cursor = 0\n for (const token of tokens) {\n const formatter = new Intl.NumberFormat(locale, {\n minimumFractionDigits: token.decimals,\n maximumFractionDigits: token.decimals,\n useGrouping: token.grouped,\n })\n out += text.slice(cursor, token.start) + formatter.format(token.value * progress)\n cursor = token.end\n }\n return out + text.slice(cursor)\n}\n\nconst TREND_ICON = { increase: 'arrow-up', decrease: 'arrow-down', neutral: 'minus' } as const\nconst TREND_MESSAGE = { increase: 'statIncrease', decrease: 'statDecrease', neutral: 'statChange' } as const\nconst DEFAULT_TONE: Record<StatTrend, StatDeltaTone> = { increase: 'positive', decrease: 'negative', neutral: 'neutral' }\n\n/**\n * Métrica em destaque: rótulo, número grande e variação opcional, com\n * semântica de lista de definição (`dt`/`dd`).\n */\nexport const Stat = forwardRef<HTMLElement, StatProps>(function Stat(\n {\n label,\n value,\n delta,\n trend = 'neutral',\n deltaTone,\n help,\n size: sizeProp,\n animate = false,\n format,\n className,\n ...rest\n },\n ref,\n) {\n const { t, locale } = useLocale()\n const group = useContext(StatGroupContext)\n const size = sizeProp ?? group?.size ?? 'md'\n const tone = deltaTone ?? DEFAULT_TONE[trend]\n const Root = (group ? 'div' : 'dl') as ElementType\n const hasDelta = delta !== undefined && delta !== null && delta !== ''\n\n // Texto final da métrica (números são formatados no idioma atual).\n const finalText = useMemo(() => {\n if (typeof value === 'number') return format ? format(value) : new Intl.NumberFormat(locale).format(value)\n return typeof value === 'string' ? value : null\n }, [value, format, locale])\n const tokens = useMemo(\n () => (animate && finalText ? tokenize(finalText, locale) : []),\n [animate, finalText, locale],\n )\n\n // Contagem: começa quando o Stat entra na tela.\n const reducedMotion = useReducedMotion()\n const [inViewRef, inView] = useInView<HTMLElement>()\n const canCount = animate && !reducedMotion && tokens.length > 0\n const rawProgress = useCountUp(inView ? 1 : 0, { from: 0, duration: COUNT_DURATION, enabled: canCount })\n // O timestamp do rAF pode vir antes do início da contagem: limita a [0, 1].\n const progress = Math.min(1, Math.max(0, rawProgress))\n const counting = canCount && progress < 1\n const composedRef = useMemo(() => mergeRefs(ref, inViewRef), [ref, inViewRef])\n\n return (\n <Root\n ref={animate ? composedRef : ref}\n className={cx('or-stat', `or-stat--${size}`, className)}\n data-animate={animate || undefined}\n data-inview={animate && (inView || reducedMotion) ? '' : undefined}\n {...rest}\n >\n <dt className=\"or-stat__label\">{label}</dt>\n <dd className=\"or-stat__value\" data-counting={counting || undefined}>\n {counting && finalText ? (\n <>\n {/* O valor final fica no lugar (transparente) para o leitor de tela e para reservar a largura. */}\n <span className=\"or-stat__value-final\">{finalText}</span>\n <span className=\"or-stat__value-count\" aria-hidden=\"true\">\n {interpolateText(finalText, tokens, progress, locale)}\n </span>\n </>\n ) : (\n (finalText ?? value)\n )}\n </dd>\n {(hasDelta || help) && (\n <dd className=\"or-stat__meta\">\n {hasDelta && (\n <span className={cx('or-stat__delta', `or-stat__delta--${tone}`, `or-stat__delta--${trend}`)}>\n <Icon name={TREND_ICON[trend]} size={14} strokeWidth={2.25} />\n <span aria-hidden=\"true\">{delta}</span>\n <VisuallyHidden>{t(TREND_MESSAGE[trend], { value: nodeText(delta) })}</VisuallyHidden>\n </span>\n )}\n {help && <span className=\"or-stat__help\">{help}</span>}\n </dd>\n )}\n </Root>\n )\n})\n\nexport interface StatGroupProps extends HTMLAttributes<HTMLDListElement> {\n /** Número de colunas em telas largas. Padrão: quantidade de Stats (até 4). */\n columns?: number\n /** Tamanho aplicado a todos os Stats. */\n size?: StatSize\n}\n\n/**\n * Grade de métricas com divisórias de 1px entre as células. Renderiza um\n * único `<dl>`; cada `Stat` vira um grupo `dt`/`dd`. Reflui para 2 e 1\n * coluna conforme a largura disponível.\n */\nexport const StatGroup = forwardRef<HTMLDListElement, StatGroupProps>(function StatGroup(\n { columns, size, className, style, children, ...rest },\n ref,\n) {\n const count = Children.toArray(children).filter(isValidElement).length\n const cols = Math.max(1, columns ?? Math.min(count || 1, 4))\n const gridStyle = {\n '--_cols': cols,\n '--_cols-md': Math.min(cols, 2),\n ...style,\n } as CSSProperties\n return (\n <StatGroupContext.Provider value={{ size }}>\n <div className=\"or-stat-group\">\n <dl ref={ref} className={cx('or-stat-group__list', className)} style={gridStyle} {...rest}>\n {children}\n </dl>\n </div>\n </StatGroupContext.Provider>\n )\n})\n","import { forwardRef, type OlHTMLAttributes, type ReactNode } from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Stepper.css'\n\nexport type StepperStatus = 'complete' | 'current' | 'upcoming' | 'error'\nexport type StepperOrientation = 'horizontal' | 'vertical'\n\nexport interface StepperStep {\n /** Nome da etapa. */\n label: ReactNode\n /** Texto de apoio abaixo do nome. */\n description?: ReactNode\n /** Força um estado. Padrão: calculado a partir de `activeStep`. Use `error` para etapas com problema. */\n status?: StepperStatus\n /** Conteúdo exibido sob a etapa atual (somente na orientação vertical). */\n content?: ReactNode\n}\n\nexport interface StepperProps extends Omit<OlHTMLAttributes<HTMLOListElement>, 'children'> {\n /** Etapas do fluxo, em ordem. */\n steps: StepperStep[]\n /** Índice (a partir de 0) da etapa atual. Etapas anteriores ficam concluídas. */\n activeStep: number\n /** Orientação. A horizontal vira compacta em contêineres estreitos. */\n orientation?: StepperOrientation\n /**\n * Torna as etapas concluídas clicáveis (para voltar e revisar). Etapas\n * atuais e futuras nunca são clicáveis.\n */\n onStepClick?: (index: number) => void\n}\n\nfunction getStatus(step: StepperStep, index: number, activeStep: number): StepperStatus {\n if (step.status) return step.status\n if (index < activeStep) return 'complete'\n if (index === activeStep) return 'current'\n return 'upcoming'\n}\n\n/**\n * Mostra o progresso em um fluxo de várias etapas (checkout, cadastro,\n * configuração). Indica etapas concluídas, a atual e as próximas.\n */\nexport const Stepper = forwardRef<HTMLOListElement, StepperProps>(function Stepper(\n { steps, activeStep, orientation = 'horizontal', onStepClick, className, ...rest },\n ref,\n) {\n const { t } = useLocale()\n const statusText: Record<StepperStatus, string | null> = {\n complete: t('completed'),\n current: t('current'),\n error: t('stepWithError'),\n upcoming: null,\n }\n\n return (\n <ol\n ref={ref}\n className={cx('or-stepper', `or-stepper--${orientation}`, className)}\n data-orientation={orientation}\n {...rest}\n >\n {steps.map((step, index) => {\n const status = getStatus(step, index, activeStep)\n const isCurrent = index === activeStep\n const clickable = Boolean(onStepClick) && status === 'complete'\n const hidden = statusText[status]\n const marker = (\n <span className=\"or-stepper__marker\" aria-hidden=\"true\">\n {status === 'complete' ? (\n <Icon name=\"check\" size=\"sm\" strokeWidth={2.25} />\n ) : status === 'error' ? (\n <Icon name=\"alert-triangle\" size=\"sm\" strokeWidth={2} />\n ) : (\n index + 1\n )}\n </span>\n )\n const text = (\n <span className=\"or-stepper__text\">\n <span className=\"or-stepper__label\">\n {step.label}\n {hidden && <VisuallyHidden> ({hidden})</VisuallyHidden>}\n </span>\n {step.description && <span className=\"or-stepper__description\">{step.description}</span>}\n </span>\n )\n return (\n <li\n key={index}\n className=\"or-stepper__step\"\n data-status={status}\n aria-current={isCurrent ? 'step' : undefined}\n >\n {clickable ? (\n <button type=\"button\" className=\"or-stepper__trigger\" onClick={() => onStepClick?.(index)}>\n {marker}\n {text}\n </button>\n ) : (\n <div className=\"or-stepper__trigger\">\n {marker}\n {text}\n </div>\n )}\n {orientation === 'vertical' && isCurrent && step.content && (\n <div className=\"or-stepper__content\">{step.content}</div>\n )}\n </li>\n )\n })}\n </ol>\n )\n})\n","import { forwardRef, type ButtonHTMLAttributes, type MouseEvent, type ReactNode } from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { cx, devWarning } from '../../utils'\nimport { hasContent } from '../Fieldset/FieldsetBase'\nimport './Switch.css'\n\nexport type SwitchSize = 'sm' | 'md'\n\nexport interface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange' | 'value' | 'defaultValue' | 'type'> {\n /** Rótulo associado (clicável). Descreva a configuração, não o estado: \"Notificações por e-mail\". */\n label?: ReactNode\n /** Texto de apoio, ligado por `aria-describedby`. */\n description?: ReactNode\n /** Tamanho do trilho: `sm` ou `md` (padrão). */\n size?: SwitchSize\n /** Ligado (controlado). */\n checked?: boolean\n /** Ligado inicialmente (não controlado). */\n defaultChecked?: boolean\n /** Chamado com o novo estado. */\n onCheckedChange?: (checked: boolean) => void\n /** Posição do rótulo: `end` (depois do switch, padrão) ou `start` (antes, alinhado à esquerda — listas de configurações). */\n labelPosition?: 'start' | 'end'\n /** Envia `name=value` no formulário quando ligado. */\n name?: string\n /** Valor enviado quando ligado. Padrão: `on`. */\n value?: string\n}\n\n/**\n * Liga/desliga uma configuração com efeito imediato. `<button role=\"switch\">`\n * com `aria-checked`; Espaço e Enter alternam. Para escolhas que só valem ao\n * enviar um formulário, prefira `Checkbox`.\n */\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n {\n label,\n description,\n size = 'md',\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n labelPosition = 'end',\n name,\n value = 'on',\n disabled,\n id,\n className,\n style,\n onClick,\n form,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n },\n ref,\n) {\n const switchId = useId('or-switch', id)\n const labelId = `${switchId}-label`\n const hasLabel = hasContent(label)\n const hasDescription = hasContent(description)\n const descriptionId = hasDescription ? `${switchId}-description` : undefined\n const [checked, setChecked] = useControllableState({\n value: checkedProp,\n defaultValue: defaultChecked,\n onChange: onCheckedChange,\n })\n\n devWarning(\n !hasLabel && !rest['aria-label'] && !rest['aria-labelledby'],\n 'Switch sem `label` precisa de `aria-label` ou `aria-labelledby`.',\n )\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n setChecked(!checked)\n }\n\n return (\n <div\n className={cx('or-switch', `or-switch--${size}`, `or-switch--label-${labelPosition}`, className)}\n style={style}\n data-disabled={disabled || undefined}\n >\n <div className=\"or-switch__row\">\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n id={switchId}\n className=\"or-switch__control\"\n aria-checked={checked}\n aria-labelledby={hasLabel ? labelId : undefined}\n aria-describedby={[ariaDescribedBy, descriptionId].filter(Boolean).join(' ') || undefined}\n data-state={checked ? 'on' : 'off'}\n disabled={disabled}\n form={form}\n onClick={handleClick}\n {...rest}\n >\n <span className=\"or-switch__thumb\" aria-hidden=\"true\" />\n </button>\n {hasLabel && (\n <label id={labelId} htmlFor={switchId} className=\"or-switch__label\">\n {label}\n </label>\n )}\n </div>\n {hasDescription && (\n <p id={descriptionId} className=\"or-switch__description\">\n {description}\n </p>\n )}\n {name && checked && <input type=\"hidden\" name={name} value={value} form={form} disabled={disabled} />}\n </div>\n )\n})\n","import {\n forwardRef,\n isValidElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ForwardedRef,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n type TableHTMLAttributes,\n} from 'react'\nimport { useControllableState, useId } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Table.css'\n\nexport type TableAlign = 'start' | 'center' | 'end'\nexport type TableSortDirection = 'ascending' | 'descending'\nexport type TableDensity = 'compact' | 'normal'\nexport type TableSortValue = string | number | boolean | Date | null | undefined\n\nexport interface TableSort {\n /** `key` da coluna ordenada. */\n key: string\n direction: TableSortDirection\n}\n\nexport interface TableColumn<T> {\n /** Identificador único da coluna. Sem `render`, a célula mostra `row[key]`. */\n key: string\n /** Conteúdo do cabeçalho (`<th scope=\"col\">`). */\n header: ReactNode\n /** Renderiza o conteúdo da célula. */\n render?: (row: T, index: number) => ReactNode\n /** Permite ordenar pela coluna (botão no cabeçalho). */\n sortable?: boolean\n /** Valor usado na ordenação. Padrão: `row[key]`. */\n sortValue?: (row: T) => TableSortValue\n /** Alinhamento horizontal. Use `end` para números. */\n align?: TableAlign\n /** Largura da coluna (px ou qualquer unidade CSS). */\n width?: number | string\n /** Células desta coluna viram cabeçalhos de linha (`<th scope=\"row\">`). */\n rowHeader?: boolean\n /** Esconde o texto do cabeçalho visualmente (continua acessível). */\n hideHeader?: boolean\n}\n\nexport interface TableProps<T> extends Omit<TableHTMLAttributes<HTMLTableElement>, 'children'> {\n /** Definição das colunas. */\n columns: TableColumn<T>[]\n /** Linhas da tabela. */\n data: T[]\n /** Id estável de cada linha. Padrão: `row.id` ou o índice. */\n getRowId?: (row: T, index: number) => string\n /** Título da tabela (`<caption>`). Obrigatório para dar nome à tabela. */\n caption: ReactNode\n /** Esconde a legenda visualmente, mantendo-a para leitores de tela. */\n hideCaption?: boolean\n /** Ordenação controlada. */\n sort?: TableSort | null\n /** Ordenação inicial (não controlada). */\n defaultSort?: TableSort | null\n /** Chamado quando o usuário muda a ordenação. */\n onSortChange?: (sort: TableSort | null) => void\n /** Não ordena `data` internamente (ordenação feita no servidor). */\n manualSort?: boolean\n /** Mostra checkboxes para selecionar linhas. */\n selectable?: boolean\n /** Ids das linhas selecionadas (controlado). */\n selectedRows?: string[]\n /** Ids selecionados inicialmente (não controlado). */\n defaultSelectedRows?: string[]\n /** Chamado com os ids selecionados sempre que a seleção muda. */\n onSelectionChange?: (ids: string[]) => void\n /** Texto que identifica a linha no rótulo do checkbox (\"Selecionar linha: …\"). */\n getRowLabel?: (row: T) => string\n /** Espaçamento das células. */\n density?: TableDensity\n /** Alterna a cor de fundo das linhas. */\n striped?: boolean\n /** Altura máxima: o corpo rola e o cabeçalho fica fixo. */\n maxHeight?: number | string\n /** Conteúdo exibido quando `data` está vazio. */\n emptyState?: ReactNode\n /**\n * Torna a linha clicável. A célula principal (cabeçalho de linha ou primeira\n * coluna) vira um botão, garantindo o acesso por teclado.\n */\n onRowClick?: (row: T, event: MouseEvent<HTMLElement>) => void\n /** Atributos do contêiner com borda/rolagem que envolve a tabela. */\n containerProps?: HTMLAttributes<HTMLDivElement>\n}\n\nconst INTERACTIVE = 'a, button, input, select, textarea, label, summary, [role=\"button\"], [role=\"link\"], [tabindex]'\n\n/** Extrai o texto de um ReactNode (para anúncios e rótulos). */\nfunction nodeText(node: ReactNode): string {\n if (node === null || node === undefined || typeof node === 'boolean') return ''\n if (typeof node === 'string' || typeof node === 'number') return String(node)\n if (Array.isArray(node)) return node.map(nodeText).join('')\n if (isValidElement<{ children?: ReactNode }>(node)) return nodeText(node.props.children)\n return ''\n}\n\nfunction defaultRowId(row: unknown, index: number): string {\n if (row && typeof row === 'object' && 'id' in row) {\n const id = (row as { id: unknown }).id\n if (typeof id === 'string' || typeof id === 'number') return String(id)\n }\n return String(index)\n}\n\nfunction readValue<T>(row: T, key: string): unknown {\n return row && typeof row === 'object' ? (row as Record<string, unknown>)[key] : undefined\n}\n\nfunction isEmpty(value: TableSortValue) {\n return value === null || value === undefined || value === ''\n}\n\nfunction TableInner<T>(\n {\n columns,\n data,\n getRowId,\n caption,\n hideCaption = false,\n sort: sortProp,\n defaultSort = null,\n onSortChange,\n manualSort = false,\n selectable = false,\n selectedRows,\n defaultSelectedRows,\n onSelectionChange,\n getRowLabel,\n density = 'normal',\n striped = false,\n maxHeight,\n emptyState,\n onRowClick,\n containerProps,\n className,\n ...rest\n }: TableProps<T>,\n ref: ForwardedRef<HTMLTableElement>,\n) {\n const { t, locale } = useLocale()\n const tableId = useId('or-table')\n const captionId = `${tableId}-caption`\n const selectAllRef = useRef<HTMLInputElement>(null)\n const [announcement, setAnnouncement] = useState('')\n const sortedByUser = useRef(false)\n\n const [sort, setSort] = useControllableState<TableSort | null>({\n value: sortProp,\n defaultValue: defaultSort,\n onChange: onSortChange,\n })\n const [selected, setSelected] = useControllableState<string[]>({\n value: selectedRows,\n defaultValue: defaultSelectedRows ?? [],\n onChange: onSelectionChange,\n })\n\n const collator = useMemo(() => {\n try {\n return new Intl.Collator(locale, { numeric: true, sensitivity: 'base' })\n } catch {\n return new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' })\n }\n }, [locale])\n\n const entries = useMemo(\n () => data.map((row, index) => ({ row, index, id: getRowId ? getRowId(row, index) : defaultRowId(row, index) })),\n [data, getRowId],\n )\n\n const rows = useMemo(() => {\n if (!sort || manualSort) return entries\n const column = columns.find((c) => c.key === sort.key)\n if (!column) return entries\n const getValue = column.sortValue ?? ((row: T) => readValue(row, column.key) as TableSortValue)\n const factor = sort.direction === 'ascending' ? 1 : -1\n return [...entries].sort((a, b) => {\n const va = getValue(a.row)\n const vb = getValue(b.row)\n // valores vazios sempre ao final, independentemente da direção\n if (isEmpty(va) || isEmpty(vb)) {\n if (isEmpty(va) && isEmpty(vb)) return a.index - b.index\n return isEmpty(va) ? 1 : -1\n }\n let result: number\n if (typeof va === 'number' && typeof vb === 'number') result = va - vb\n else if (va instanceof Date && vb instanceof Date) result = va.getTime() - vb.getTime()\n else if (typeof va === 'boolean' && typeof vb === 'boolean') result = Number(va) - Number(vb)\n else result = collator.compare(String(va), String(vb))\n return result * factor || a.index - b.index\n })\n }, [entries, sort, manualSort, columns, collator])\n\n // Seleção ----------------------------------------------------------------\n const selectedSet = useMemo(() => new Set(selected), [selected])\n const visibleIds = entries.map((e) => e.id)\n const selectedCount = visibleIds.filter((id) => selectedSet.has(id)).length\n const allSelected = visibleIds.length > 0 && selectedCount === visibleIds.length\n const someSelected = selectedCount > 0 && !allSelected\n\n useEffect(() => {\n if (selectAllRef.current) selectAllRef.current.indeterminate = someSelected\n }, [someSelected])\n\n const toggleAll = () => {\n if (allSelected) setSelected(selected.filter((id) => !visibleIds.includes(id)))\n else setSelected([...selected, ...visibleIds.filter((id) => !selectedSet.has(id))])\n }\n\n const toggleRow = (id: string) => {\n setSelected(selectedSet.has(id) ? selected.filter((s) => s !== id) : [...selected, id])\n }\n\n // Ordenação --------------------------------------------------------------\n const handleSort = (column: TableColumn<T>) => {\n const direction: TableSortDirection =\n sort?.key === column.key && sort.direction === 'ascending' ? 'descending' : 'ascending'\n sortedByUser.current = true\n setSort({ key: column.key, direction })\n }\n\n useEffect(() => {\n if (!sortedByUser.current || !sort) return\n sortedByUser.current = false\n const column = columns.find((c) => c.key === sort.key)\n if (!column) return\n const label = nodeText(column.header) || column.key\n setAnnouncement(`${label}, ${t(sort.direction === 'ascending' ? 'sortAscending' : 'sortDescending')}`)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sort?.key, sort?.direction])\n\n // Linha clicável ---------------------------------------------------------\n const primaryKey = (columns.find((c) => c.rowHeader) ?? columns[0])?.key\n const rowHeaderKey = columns.find((c) => c.rowHeader)?.key\n\n const handleRowClick = (row: T) => (event: MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return\n const target = event.target as Element\n const interactive = target.closest(INTERACTIVE)\n if (interactive && event.currentTarget.contains(interactive)) return\n if (typeof window !== 'undefined' && window.getSelection?.()?.toString()) return\n onRowClick(row, event)\n }\n\n const colCount = columns.length + (selectable ? 1 : 0)\n const scrollable = maxHeight !== undefined\n const containerStyle: CSSProperties = { ...containerProps?.style, ...(scrollable ? { maxHeight } : null) }\n\n return (\n <div\n {...containerProps}\n className={cx('or-table-container', scrollable && 'or-table-container--scroll', containerProps?.className)}\n style={containerStyle}\n {...(scrollable ? { role: 'region', 'aria-labelledby': captionId, tabIndex: 0 } : null)}\n >\n <table\n ref={ref}\n id={tableId}\n className={cx(\n 'or-table',\n `or-table--${density}`,\n striped && 'or-table--striped',\n scrollable && 'or-table--sticky',\n onRowClick && 'or-table--clickable',\n className,\n )}\n {...rest}\n >\n <caption id={captionId} className={cx('or-table__caption', hideCaption && 'or-visually-hidden')}>\n {caption}\n </caption>\n <thead>\n <tr>\n {selectable && (\n <th scope=\"col\" className=\"or-table__select\">\n <span className=\"or-table__check\">\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n className=\"or-table__check-input\"\n aria-label={t('selectAll')}\n checked={allSelected}\n disabled={visibleIds.length === 0}\n onChange={toggleAll}\n />\n <span className=\"or-table__check-box\" aria-hidden=\"true\">\n <Icon name=\"check\" className=\"or-table__check-icon\" strokeWidth={2.5} />\n <Icon name=\"minus\" className=\"or-table__check-icon or-table__check-icon--minus\" strokeWidth={2.5} />\n </span>\n </span>\n </th>\n )}\n {columns.map((column) => {\n const active = sort?.key === column.key\n const ariaSort = column.sortable ? (active ? sort!.direction : 'none') : undefined\n const label = column.hideHeader ? <VisuallyHidden>{column.header}</VisuallyHidden> : column.header\n return (\n <th\n key={column.key}\n scope=\"col\"\n aria-sort={ariaSort}\n className={cx(\n 'or-table__th',\n column.align && `or-table__cell--${column.align}`,\n active && 'or-table__th--sorted',\n )}\n style={column.width !== undefined ? { width: column.width } : undefined}\n >\n {column.sortable ? (\n <button type=\"button\" className=\"or-table__sort\" onClick={() => handleSort(column)}>\n <span className=\"or-table__sort-label\">{label}</span>\n {/* Os dois ícones ficam sobrepostos: a troca é um crossfade e a seta gira 180° entre crescente e decrescente. */}\n <span\n className=\"or-table__sort-icon\"\n aria-hidden=\"true\"\n data-direction={active ? sort!.direction : undefined}\n >\n <Icon name=\"chevrons-up-down\" size={14} className=\"or-table__sort-idle\" />\n <Icon name=\"arrow-up\" size={14} className=\"or-table__sort-arrow\" />\n </span>\n </button>\n ) : (\n label\n )}\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr className=\"or-table__empty-row\">\n <td colSpan={colCount} className=\"or-table__empty\">\n {emptyState ?? t('noResults')}\n </td>\n </tr>\n ) : (\n rows.map(({ row, id }, rowIndex) => {\n const isSelected = selectedSet.has(id)\n const headerCellId = `${tableId}-r${rowIndex}-h`\n const checkboxId = `${tableId}-r${rowIndex}-cb`\n const rowLabel = getRowLabel?.(row)\n return (\n <tr\n key={id}\n data-selected={isSelected || undefined}\n className=\"or-table__row\"\n onClick={onRowClick ? handleRowClick(row) : undefined}\n >\n {selectable && (\n <td className=\"or-table__select\">\n <span className=\"or-table__check\">\n <input\n id={checkboxId}\n type=\"checkbox\"\n className=\"or-table__check-input\"\n checked={isSelected}\n onChange={() => toggleRow(id)}\n {...(rowLabel\n ? { 'aria-label': `${t('selectRow')}: ${rowLabel}` }\n : rowHeaderKey\n ? { 'aria-label': t('selectRow'), 'aria-labelledby': `${checkboxId} ${headerCellId}` }\n : { 'aria-label': `${t('selectRow')} ${rowIndex + 1}` })}\n />\n <span className=\"or-table__check-box\" aria-hidden=\"true\">\n <Icon name=\"check\" className=\"or-table__check-icon\" strokeWidth={2.5} />\n </span>\n </span>\n </td>\n )}\n {columns.map((column) => {\n const raw = column.render ? column.render(row, rowIndex) : (readValue(row, column.key) as ReactNode)\n const content =\n onRowClick && column.key === primaryKey ? (\n <button\n type=\"button\"\n className=\"or-table__row-action\"\n onClick={(event) => onRowClick(row, event)}\n >\n {raw}\n </button>\n ) : (\n raw\n )\n const cellClass = cx('or-table__cell', column.align && `or-table__cell--${column.align}`)\n return column.rowHeader ? (\n <th key={column.key} scope=\"row\" id={headerCellId} className={cx(cellClass, 'or-table__row-header')}>\n {content}\n </th>\n ) : (\n <td key={column.key} className={cellClass}>\n {content}\n </td>\n )\n })}\n </tr>\n )\n })\n )}\n </tbody>\n </table>\n <VisuallyHidden role=\"status\">{announcement}</VisuallyHidden>\n </div>\n )\n}\n\n/**\n * Tabela de dados semântica: legenda, cabeçalhos com `scope`, ordenação por\n * coluna (`aria-sort`), seleção de linhas, cabeçalho fixo e estado vazio.\n */\nconst ForwardedTable = forwardRef(TableInner)\nForwardedTable.displayName = 'Table'\n\nexport const Table = ForwardedTable as <T>(\n props: TableProps<T> & { ref?: Ref<HTMLTableElement> },\n) => ReactElement | null\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { useId } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { canUseDOM, cx } from '../../utils'\nimport { useSlidingIndicator } from '../Tabs/useSlidingIndicator'\nimport './TableOfContents.css'\n\nexport interface TableOfContentsItem {\n /** Id do título de destino (sem `#`). */\n id: string\n /** Texto exibido no índice. */\n label: ReactNode\n /** Nível do título (2 para `h2`, 3 para `h3`…). Define a indentação. */\n level?: number\n}\n\ntype ContainerTarget = HTMLElement | null | RefObject<HTMLElement | null>\n\nexport interface TableOfContentsProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Itens do índice. Alternativa a `container`. */\n items?: TableOfContentsItem[]\n /**\n * Contêiner de onde os títulos são coletados automaticamente (quando\n * `items` não é informado). Títulos sem `id` recebem um gerado do texto.\n */\n container?: ContainerTarget\n /** Seletor dos títulos coletados. Padrão: `h2, h3`. */\n headingSelector?: string\n /** Título visível acima da lista. Padrão: `t('tableOfContents')`. `null` esconde (o nome continua no `aria-label`). */\n title?: ReactNode\n /**\n * Margem do IntersectionObserver: a faixa da tela em que uma seção conta\n * como \"visível\". Padrão: `'-80px 0px -65% 0px'` (terço superior).\n */\n rootMargin?: string\n /**\n * Contêiner rolável usado como raiz do IntersectionObserver. Padrão: a\n * janela. Informe quando o conteúdo rola dentro de um painel.\n */\n root?: ContainerTarget\n /** Chamado ao clicar em um item. */\n onItemClick?: (id: string, event: MouseEvent<HTMLAnchorElement>) => void\n}\n\nfunction resolveContainer(target: ContainerTarget | undefined): HTMLElement | null {\n if (!target) return null\n return 'current' in target ? target.current : target\n}\n\nfunction slugify(text: string) {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n}\n\nfunction collectHeadings(root: HTMLElement, selector: string): TableOfContentsItem[] {\n const used = new Set<string>()\n return Array.from(root.querySelectorAll<HTMLElement>(selector)).map((heading) => {\n if (!heading.id) {\n const base = slugify(heading.textContent ?? '') || 'secao'\n let id = base\n let n = 2\n while (used.has(id) || document.getElementById(id)) id = `${base}-${n++}`\n heading.id = id\n }\n used.add(heading.id)\n const level = /^H([1-6])$/.exec(heading.tagName)?.[1]\n return { id: heading.id, label: heading.textContent ?? '', level: level ? Number(level) : 2 }\n })\n}\n\n/**\n * Índice \"Nesta página\": lista as seções da página e destaca a que está\n * visível enquanto a pessoa rola.\n */\nexport const TableOfContents = forwardRef<HTMLElement, TableOfContentsProps>(\n function TableOfContents(\n {\n items: itemsProp,\n container,\n headingSelector = 'h2, h3',\n title,\n rootMargin = '-80px 0px -65% 0px',\n root,\n onItemClick,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) {\n const { t } = useLocale()\n const titleId = useId('or-toc-title')\n const [collected, setCollected] = useState<TableOfContentsItem[]>([])\n const [activeId, setActiveId] = useState<string>()\n const items = itemsProp ?? collected\n\n // Coleta automática dos títulos do contêiner (e atualiza se o conteúdo mudar).\n useEffect(() => {\n if (itemsProp) return\n const root = resolveContainer(container)\n if (!root) return\n const signature = (list: TableOfContentsItem[]) =>\n list.map((i) => `${i.id}:${i.level}:${i.label}`).join('|')\n const update = () => {\n const next = collectHeadings(root, headingSelector)\n // Evita re-render (e laços com o MutationObserver) quando nada mudou.\n setCollected((prev) => (signature(prev) === signature(next) ? prev : next))\n }\n update()\n if (typeof MutationObserver === 'undefined') return\n const mo = new MutationObserver(update)\n mo.observe(root, { childList: true, subtree: true })\n return () => mo.disconnect()\n }, [itemsProp, container, headingSelector])\n\n const idsKey = items.map((item) => item.id).join('|')\n\n // Destaca a seção visível.\n useEffect(() => {\n if (!canUseDOM || typeof IntersectionObserver === 'undefined') return\n const ids = idsKey ? idsKey.split('|') : []\n const elements = ids\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => !!el)\n if (elements.length === 0) return\n const visible = new Set<string>()\n const io = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) visible.add(entry.target.id)\n else visible.delete(entry.target.id)\n }\n // A primeira seção (na ordem do documento) dentro da faixa vence.\n const first = ids.find((id) => visible.has(id))\n if (first) setActiveId(first)\n },\n { rootMargin, root: resolveContainer(root) },\n )\n elements.forEach((el) => io.observe(el))\n return () => io.disconnect()\n }, [idsKey, rootMargin, root])\n\n const handleClick = (id: string) => (event: MouseEvent<HTMLAnchorElement>) => {\n onItemClick?.(id, event)\n if (!event.defaultPrevented) setActiveId(id)\n }\n\n const minLevel = items.reduce((min, item) => Math.min(min, item.level ?? 2), Infinity)\n const showTitle = title !== null\n const labelled = showTitle && !ariaLabel\n\n // Marcador único que desliza até a seção visível.\n const trackRef = useRef<HTMLDivElement>(null)\n const marker = useSlidingIndicator(\n trackRef,\n '[aria-current=\"location\"]',\n 'y',\n `${activeId}|${idsKey}`,\n )\n\n if (items.length === 0) return null\n\n return (\n <nav\n ref={ref}\n className={cx('or-toc', className)}\n aria-label={labelled ? undefined : (ariaLabel ?? t('tableOfContents'))}\n aria-labelledby={labelled ? titleId : undefined}\n {...rest}\n >\n {showTitle && (\n <p id={titleId} className=\"or-toc__title\">\n {title ?? t('tableOfContents')}\n </p>\n )}\n <div\n ref={trackRef}\n className=\"or-toc__track\"\n data-marker={marker.ready ? 'ready' : undefined}\n >\n <span\n className=\"or-toc__marker\"\n aria-hidden=\"true\"\n data-visible={marker.visible || undefined}\n data-ready={marker.ready || undefined}\n style={marker.style}\n />\n <ul className=\"or-toc__list\">\n {items.map((item) => {\n const depth = Math.max(\n 0,\n (item.level ?? 2) - (Number.isFinite(minLevel) ? minLevel : 2),\n )\n return (\n <li key={item.id} className=\"or-toc__item\" data-depth={depth}>\n <a\n href={`#${item.id}`}\n className=\"or-toc__link\"\n aria-current={activeId === item.id ? 'location' : undefined}\n onClick={handleClick(item.id)}\n >\n {item.label}\n </a>\n </li>\n )\n })}\n </ul>\n </div>\n </nav>\n )\n },\n)\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { composeEventHandlers, cx, devWarning, mergeRefs } from '../../utils'\nimport { useSlidingIndicator } from './useSlidingIndicator'\nimport './Tabs.css'\n\nexport type TabsVariant = 'line' | 'enclosed'\nexport type TabsOrientation = 'horizontal' | 'vertical'\nexport type TabsActivation = 'automatic' | 'manual'\nexport type TabsSize = 'sm' | 'md' | 'lg'\n\ninterface TabsContextValue {\n value: string | undefined\n select: (value: string) => void\n initialize: (value: string) => void\n baseId: string\n /** Valores com `TabPanel` montado: só eles recebem `aria-controls`. */\n panels: ReadonlySet<string>\n registerPanel: (value: string) => () => void\n orientation: TabsOrientation\n activation: TabsActivation\n variant: TabsVariant\n /** Liga a entrada animada dos painéis depois da primeira troca de aba (não anima ao montar). */\n animatePanels: boolean\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext(component: string): TabsContextValue {\n const ctx = useContext(TabsContext)\n if (!ctx) throw new Error(`<${component}> precisa estar dentro de <Tabs>.`)\n return ctx\n}\n\nconst toIdPart = (value: string) => value.replace(/[^\\w-]/g, '_')\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n /** Aba selecionada (controlado). */\n value?: string\n /** Aba selecionada inicialmente (não controlado). Padrão: a primeira aba habilitada. */\n defaultValue?: string\n /** Chamado quando outra aba é selecionada. */\n onChange?: (value: string) => void\n /**\n * `automatic` (padrão) seleciona a aba ao receber foco pelas setas;\n * `manual` só seleciona com Enter/Espaço — use quando trocar de painel é lento.\n */\n activation?: TabsActivation\n /** Orientação da lista de abas. `vertical` usa ↑/↓; `horizontal` usa ←/→. */\n orientation?: TabsOrientation\n /** `line`: sublinhado laranja de 2px. `enclosed`: abas com borda, unidas ao painel. */\n variant?: TabsVariant\n /** Altura das abas: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: TabsSize\n /** As abas dividem igualmente a largura disponível. */\n fitted?: boolean\n children?: ReactNode\n}\n\n/**\n * Abas organizam conteúdo relacionado em painéis, mostrando um por vez.\n * Implementa o padrão Tabs do WAI-ARIA com `TabList`, `Tab` e `TabPanel`.\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n value: valueProp,\n defaultValue,\n onChange,\n activation = 'automatic',\n orientation = 'horizontal',\n variant = 'line',\n size = 'md',\n fitted = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const baseId = useId('or-tabs', rest.id)\n const [internal, setInternal] = useState<string | undefined>(defaultValue)\n const isControlled = valueProp !== undefined\n const value = isControlled ? valueProp : internal\n const valueRef = useRef(value)\n valueRef.current = value\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const select = useCallback(\n (next: string) => {\n if (next === valueRef.current) return\n if (!isControlled) setInternal(next)\n valueRef.current = next\n onChangeRef.current?.(next)\n },\n [isControlled],\n )\n\n // Sem valor inicial: seleciona a primeira aba habilitada sem disparar onChange.\n const initialize = useCallback(\n (next: string) => {\n if (!isControlled && valueRef.current === undefined) setInternal(next)\n },\n [isControlled],\n )\n\n const [panels, setPanels] = useState<ReadonlySet<string>>(() => new Set())\n const registerPanel = useCallback((panelValue: string) => {\n setPanels((prev) => (prev.has(panelValue) ? prev : new Set(prev).add(panelValue)))\n return () =>\n setPanels((prev) => {\n if (!prev.has(panelValue)) return prev\n const next = new Set(prev)\n next.delete(panelValue)\n return next\n })\n }, [])\n\n // Painéis só entram animados depois que a aba muda pela primeira vez.\n const [prevValue, setPrevValue] = useState(value)\n const [animatePanels, setAnimatePanels] = useState(false)\n if (value !== prevValue) {\n setPrevValue(value)\n if (prevValue !== undefined) setAnimatePanels(true)\n }\n\n const ctx = useMemo<TabsContextValue>(\n () => ({ value, select, initialize, baseId, panels, registerPanel, orientation, activation, variant, animatePanels }),\n [value, select, initialize, baseId, panels, registerPanel, orientation, activation, variant, animatePanels],\n )\n\n return (\n <TabsContext.Provider value={ctx}>\n <div\n ref={ref}\n className={cx(\n 'or-tabs',\n `or-tabs--${variant}`,\n `or-tabs--${orientation}`,\n `or-tabs--${size}`,\n fitted && 'or-tabs--fitted',\n className,\n )}\n data-orientation={orientation}\n {...rest}\n >\n {children}\n </div>\n </TabsContext.Provider>\n )\n})\n\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode\n}\n\n/** Contêiner das abas (`role=\"tablist\"`). Dê um nome com `aria-label` ou `aria-labelledby`. */\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(function TabList(\n { className, children, onKeyDown, ...rest },\n ref,\n) {\n const { orientation, activation, select, initialize, value, variant } = useTabsContext('TabList')\n const listRef = useRef<HTMLDivElement>(null)\n const indicator = useSlidingIndicator(\n listRef,\n '[role=\"tab\"][aria-selected=\"true\"]',\n orientation === 'vertical' ? 'y' : 'x',\n `${value}|${orientation}|${variant}`,\n )\n\n devWarning(\n !rest['aria-label'] && !rest['aria-labelledby'],\n 'TabList precisa de `aria-label` ou `aria-labelledby` descrevendo o conjunto de abas.',\n )\n\n const getTabs = useCallback(() => {\n const list = listRef.current\n if (!list) return []\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')).filter(\n (tab) => tab.closest('[role=\"tablist\"]') === list,\n )\n }, [])\n\n useIsomorphicLayoutEffect(() => {\n if (value !== undefined) return\n const first = getTabs().find((tab) => !tab.disabled)\n if (first?.dataset.value) initialize(first.dataset.value)\n })\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const tabs = getTabs().filter((tab) => !tab.disabled)\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement)\n if (index === -1 || tabs.length === 0) return\n const prevKey = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft'\n const nextKey = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight'\n let next = -1\n if (event.key === nextKey) next = (index + 1) % tabs.length\n else if (event.key === prevKey) next = (index - 1 + tabs.length) % tabs.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = tabs.length - 1\n else return\n event.preventDefault()\n const tab = tabs[next]\n tab.focus()\n if (activation === 'automatic' && tab.dataset.value) select(tab.dataset.value)\n }\n\n return (\n // eslint-disable-next-line jsx-a11y/interactive-supports-focus -- o foco fica nas abas (roving tabindex); o tablist só delega as setas\n <div\n ref={mergeRefs(ref, listRef)}\n role=\"tablist\"\n aria-orientation={orientation === 'vertical' ? 'vertical' : undefined}\n className={cx('or-tabs__list', className)}\n data-indicator={variant === 'line' && indicator.ready ? 'ready' : undefined}\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}\n {...rest}\n >\n {children}\n {variant === 'line' && (\n // Indicador único que desliza entre as abas (só transform).\n <span\n className=\"or-tabs__indicator\"\n aria-hidden=\"true\"\n data-visible={indicator.visible || undefined}\n data-ready={indicator.ready || undefined}\n style={indicator.style}\n />\n )}\n </div>\n )\n})\n\nexport interface TabProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Identificador da aba; liga a aba ao `TabPanel` de mesmo `value`. */\n value: string\n /** Ícone antes do rótulo (decorativo). */\n icon?: ReactNode\n /** Contador ou selo após o rótulo (ex.: número de itens). */\n badge?: ReactNode\n}\n\n/** Uma aba. Fica fora da ordem de Tab quando não está selecionada (roving tabindex). */\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value, icon, badge, disabled, className, children, onClick, ...rest },\n ref,\n) {\n const ctx = useTabsContext('Tab')\n const selected = ctx.value === value\n const id = `${ctx.baseId}-tab-${toIdPart(value)}`\n const panelId = `${ctx.baseId}-panel-${toIdPart(value)}`\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={id}\n aria-selected={selected}\n aria-controls={ctx.panels.has(value) ? panelId : undefined}\n tabIndex={selected ? 0 : -1}\n disabled={disabled}\n data-value={value}\n data-state={selected ? 'active' : 'inactive'}\n className={cx('or-tabs__tab', className)}\n onClick={composeEventHandlers(onClick, () => ctx.select(value))}\n {...rest}\n >\n {icon && (\n <span className=\"or-tabs__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"or-tabs__label\">{children}</span>\n {badge !== undefined && badge !== null && <span className=\"or-tabs__badge\">{badge}</span>}\n </button>\n )\n})\n\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** O `value` da aba que controla este painel. */\n value: string\n /** Mantém o conteúdo montado (apenas escondido) quando o painel está inativo. */\n keepMounted?: boolean\n children?: ReactNode\n}\n\n/** Painel de conteúdo de uma aba (`role=\"tabpanel\"`). */\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(function TabPanel(\n { value, keepMounted = false, className, children, ...rest },\n ref,\n) {\n const ctx = useTabsContext('TabPanel')\n const selected = ctx.value === value\n const { registerPanel } = ctx\n useEffect(() => registerPanel(value), [registerPanel, value])\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`${ctx.baseId}-panel-${toIdPart(value)}`}\n aria-labelledby={`${ctx.baseId}-tab-${toIdPart(value)}`}\n tabIndex={0}\n hidden={!selected}\n data-state={selected ? 'active' : 'inactive'}\n data-motion={ctx.animatePanels || undefined}\n className={cx('or-tabs__panel', className)}\n {...rest}\n >\n {selected || keepMounted ? children : null}\n </div>\n )\n})\n","import {\n forwardRef,\n isValidElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { canUseDOM, cx, mergeRefs } from '../../utils'\nimport './Tag.css'\n\nexport type TagTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info'\nexport type TagVariant = 'outline' | 'solid'\nexport type TagSize = 'sm' | 'md' | 'lg'\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n /** Cor semântica do marcador (e do fundo, na variante `solid`). */\n tone?: TagTone\n /** `outline` (borda, padrão) ou `solid` (fundo suave do tom). */\n variant?: TagVariant\n /** Altura: `sm` 22px, `md` 28px, `lg` 32px. */\n size?: TagSize\n /** Mostra o marcador quadrado colorido. Padrão: `true`. */\n marker?: boolean\n /** Ícone no lugar do marcador. */\n icon?: ReactNode\n /**\n * Mostra o botão de remover. É chamado quando a animação de saída termina\n * (imediatamente em movimento reduzido) — remova a tag da lista nesse momento.\n */\n onRemove?: (event: MouseEvent<HTMLButtonElement>) => void\n /** Rótulo acessível do botão de remover. Padrão: \"Remover {texto da tag}\". */\n removeLabel?: string\n /** Desabilita o botão de remover. */\n disabled?: boolean\n}\n\nfunction animationSeconds(value: string) {\n return Math.max(0, ...value.split(',').map((v) => (v.trim().endsWith('ms') ? parseFloat(v) / 1000 : parseFloat(v) || 0)))\n}\n\nfunction nodeText(node: ReactNode): string {\n if (node === null || node === undefined || typeof node === 'boolean') return ''\n if (typeof node === 'string' || typeof node === 'number') return String(node)\n if (Array.isArray(node)) return node.map(nodeText).join('')\n if (isValidElement<{ children?: ReactNode }>(node)) return nodeText(node.props.children)\n return ''\n}\n\n/**\n * Rótulo estático para categorizar ou indicar status, com marcador quadrado\n * colorido e botão de remover opcional.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n {\n tone = 'neutral',\n variant = 'outline',\n size = 'md',\n marker = true,\n icon,\n onRemove,\n removeLabel,\n disabled = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const nodeRef = useRef<HTMLSpanElement>(null)\n const composedRef = useMemo(() => mergeRefs(ref, nodeRef), [ref])\n const [leaving, setLeaving] = useState(false)\n const pendingEvent = useRef<MouseEvent<HTMLButtonElement> | null>(null)\n const onRemoveRef = useRef(onRemove)\n onRemoveRef.current = onRemove\n\n // Saída animada: a tag encolhe e some; só então avisa o pai.\n useEffect(() => {\n if (!leaving) return\n const node = nodeRef.current\n const finish = () => {\n const event = pendingEvent.current\n pendingEvent.current = null\n setLeaving(false)\n if (event) onRemoveRef.current?.(event)\n }\n const style = node && canUseDOM ? getComputedStyle(node) : null\n const animated = !!style && style.animationName !== 'none' && !!style.animationName && animationSeconds(style.animationDuration) > 0\n if (!node || !animated) {\n finish()\n return\n }\n const onEnd = (event: AnimationEvent) => {\n if (event.target === node) finish()\n }\n node.addEventListener('animationend', onEnd)\n const fallback = window.setTimeout(finish, 600)\n return () => {\n node.removeEventListener('animationend', onEnd)\n window.clearTimeout(fallback)\n }\n }, [leaving])\n\n const handleRemove = (event: MouseEvent<HTMLButtonElement>) => {\n if (leaving) return\n pendingEvent.current = event\n setLeaving(true)\n }\n\n return (\n <span\n ref={composedRef}\n className={cx(\n 'or-tag',\n `or-tag--${tone}`,\n `or-tag--${variant}`,\n `or-tag--${size}`,\n onRemove && 'or-tag--removable',\n className,\n )}\n data-disabled={disabled || undefined}\n data-leaving={leaving || undefined}\n {...rest}\n >\n {icon ? (\n <span className=\"or-tag__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : (\n marker && <span className=\"or-tag__marker\" aria-hidden=\"true\" />\n )}\n <span className=\"or-tag__label\">{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className=\"or-tag__remove\"\n aria-label={removeLabel ?? t('removeItem', { label: nodeText(children) })}\n disabled={disabled}\n onClick={handleRemove}\n >\n <Icon name=\"close\" size={size === 'sm' ? 12 : 14} strokeWidth={2} />\n </button>\n )}\n </span>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type ClipboardEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { useControllableState } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { Field, useFieldControlProps } from '../Field'\nimport { useExitingItems, useShake } from '../Combobox/motion'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './TagInput.css'\n\nexport type TagInputSize = 'sm' | 'md' | 'lg'\nexport type TagInputSeparator = 'Enter' | ',' | 'Tab' | ';' | ' '\n\nexport interface TagInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size'\n> {\n /** Tags (controlado). */\n value?: string[]\n /** Tags iniciais (não controlado). */\n defaultValue?: string[]\n /** Chamado quando uma tag é adicionada ou removida. */\n onChange?: (tags: string[]) => void\n /** Teclas que criam a tag. Padrão: `['Enter', ',']`. */\n separators?: TagInputSeparator[]\n /** Número máximo de tags. Mostra o contador ao lado do rótulo. */\n maxTags?: number\n /**\n * Valida cada tag antes de adicioná-la. Retorne uma mensagem de erro para\n * recusar, ou `true`/`undefined` para aceitar.\n */\n validate?: (tag: string, tags: string[]) => string | boolean | null | undefined\n /** Permite tags repetidas (comparação sem diferenciar maiúsculas). Padrão: `false`. */\n allowDuplicates?: boolean\n /** Adiciona o texto pendente como tag quando o campo perde o foco. Padrão: `false`. */\n addOnBlur?: boolean\n label?: ReactNode\n hideLabel?: boolean\n description?: ReactNode\n /** Mensagem de erro externa (tem precedência sobre os erros de validação internos). */\n error?: ReactNode\n invalid?: boolean\n /** Altura mínima do controle: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: TagInputSize\n /** Classe aplicada ao contêiner externo. */\n className?: string\n}\n\ntype ControlProps = Omit<\n TagInputProps,\n | 'label'\n | 'hideLabel'\n | 'description'\n | 'error'\n | 'className'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'validate'\n | 'maxTags'\n | 'allowDuplicates'\n> & {\n inputRef: React.Ref<HTMLInputElement>\n tags: string[]\n text: string\n setText: (text: string) => void\n tryAdd: (raw: string[]) => boolean\n removeAt: (index: number, focus: 'neighbor' | 'input') => void\n setError: (error: string | null) => void\n message: string\n tagButtons: React.MutableRefObject<Map<string, HTMLButtonElement>>\n inputEl: React.MutableRefObject<HTMLInputElement | null>\n /** Chaves das tags presentes na montagem (não animam a entrada). */\n initialKeys: React.MutableRefObject<Set<string>>\n frameMotion: ReturnType<typeof useShake>\n}\n\n/** Chave estável por tag: texto + ocorrência (suporta `allowDuplicates`). */\nfunction tagKeys(tags: string[]): string[] {\n const seen = new Map<string, number>()\n return tags.map((tag) => {\n const n = seen.get(tag) ?? 0\n seen.set(tag, n + 1)\n return `${tag}\\u0000${n}`\n })\n}\n\nconst PASTE_SPLIT = /[,;\\n\\r\\t]+/\n\nfunction TagInputControl({\n inputRef,\n tags,\n text,\n setText,\n tryAdd,\n removeAt,\n setError,\n message,\n tagButtons,\n inputEl,\n initialKeys,\n frameMotion,\n separators = ['Enter', ','],\n addOnBlur = false,\n invalid,\n size = 'md',\n required,\n disabled,\n readOnly,\n name,\n onKeyDown,\n onBlur,\n onPaste,\n placeholder,\n ...rest\n}: ControlProps) {\n const { t } = useLocale()\n const controlProps = useFieldControlProps({\n required,\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': rest['aria-describedby'],\n })\n const isDisabled = Boolean(controlProps.disabled)\n const interactive = !isDisabled && !readOnly\n const keys = tagKeys(tags)\n const { entries, leavingProps } = useExitingItems(\n tags.map((tag, index) => ({ tag, index, key: keys[index] })),\n (entry) => entry.key,\n )\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || !interactive) return\n const key = event.key as TagInputSeparator\n if (separators.includes(key) && !event.nativeEvent.isComposing) {\n // Sem texto, a tecla mantém o comportamento normal (Tab navega, Enter envia o formulário).\n if (!text.trim() || (key === 'Tab' && event.shiftKey)) {\n if (key === ',' || key === ';') event.preventDefault()\n return\n }\n event.preventDefault()\n tryAdd([text])\n return\n }\n if (event.key === 'Backspace' && !text && tags.length > 0) {\n event.preventDefault()\n removeAt(tags.length - 1, 'input')\n }\n }\n\n const handlePaste = (event: ClipboardEvent<HTMLInputElement>) => {\n onPaste?.(event)\n if (event.defaultPrevented || !interactive) return\n const pasted = event.clipboardData.getData('text')\n if (!PASTE_SPLIT.test(pasted)) return\n event.preventDefault()\n tryAdd(`${text}${pasted}`.split(PASTE_SPLIT))\n }\n\n return (\n // O mousedown só amplia a área de clique do input (que já é focável por teclado).\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-tag-input')}\n data-invalid={controlProps['aria-invalid'] || undefined}\n // Expõe o estado inativo do conjunto (tags + campo) — o contraste reduzido\n // dos itens desabilitados é isento pela WCAG 1.4.3.\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled || undefined}\n {...frameMotion}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) {\n event.preventDefault()\n inputEl.current?.focus()\n }\n }}\n >\n {entries.length > 0 && (\n // role=\"list\" explícito: o Safari remove a semântica de listas com list-style: none.\n <ul role=\"list\" className=\"or-tag-input__tags\">\n {entries.map(({ item, key, leaving }) =>\n leaving ? (\n <li key={key} className=\"or-tag-input__tag\" {...leavingProps(key)}>\n <span className=\"or-tag-input__tag-label\">{item.tag}</span>\n {interactive && (\n <span className=\"or-tag-input__remove\" aria-hidden=\"true\">\n <Icon name=\"close\" size={12} strokeWidth={2} />\n </span>\n )}\n </li>\n ) : (\n <li\n key={key}\n className=\"or-tag-input__tag\"\n data-enter={!initialKeys.current.has(key) || undefined}\n >\n <span className=\"or-tag-input__tag-label\">{item.tag}</span>\n {interactive && (\n <button\n ref={(el) => {\n if (el) tagButtons.current.set(key, el)\n else tagButtons.current.delete(key)\n }}\n type=\"button\"\n className=\"or-tag-input__remove\"\n aria-label={t('removeItem', { label: item.tag })}\n onClick={() => removeAt(item.index, 'neighbor')}\n >\n <Icon name=\"close\" size={12} strokeWidth={2} />\n </button>\n )}\n </li>\n ),\n )}\n </ul>\n )}\n <input\n ref={mergeRefs(inputEl, inputRef)}\n type=\"text\"\n className=\"or-control-frame__input or-tag-input__input\"\n value={text}\n placeholder={placeholder}\n readOnly={readOnly}\n autoComplete=\"off\"\n enterKeyHint=\"enter\"\n onChange={(event) => {\n const next = event.target.value\n setError(null)\n // Teclados virtuais nem sempre informam a tecla no keydown: trata o separador digitado aqui.\n const typed = separators.filter((s): s is ',' | ';' => s === ',' || s === ';')\n if (typed.some((sep) => next.endsWith(sep)) && next.length > text.length) {\n tryAdd(next.split(new RegExp(`[${typed.join('')}]`)))\n return\n }\n setText(next)\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onBlur={(event) => {\n onBlur?.(event)\n if (addOnBlur && interactive && text.trim()) tryAdd([text])\n }}\n {...rest}\n {...controlProps}\n required={controlProps.required && tags.length === 0}\n />\n {name &&\n tags.map((tag, index) => (\n <input\n key={`${tag}-${index}`}\n type=\"hidden\"\n name={name}\n value={tag}\n disabled={isDisabled}\n />\n ))}\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {message}\n </VisuallyHidden>\n </div>\n )\n}\n\n/**\n * Campo para digitar várias palavras-chave: Enter (ou vírgula) cria uma tag,\n * Backspace com o campo vazio remove a última. Colar texto separado por\n * vírgulas cria várias tags de uma vez.\n */\nexport const TagInput = forwardRef<HTMLInputElement, TagInputProps>(function TagInput(\n {\n label,\n hideLabel,\n description,\n error,\n required,\n disabled,\n id,\n className,\n value,\n defaultValue = [],\n onChange,\n maxTags,\n validate,\n allowDuplicates = false,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const [tags, setTags] = useControllableState<string[]>({ value, defaultValue, onChange })\n const [text, setText] = useState('')\n const [internalError, setInternalError] = useState<string | null>(null)\n const [message, setMessage] = useState('')\n const inputEl = useRef<HTMLInputElement | null>(null)\n const tagButtons = useRef(new Map<string, HTMLButtonElement>())\n const pendingFocus = useRef<string | null>(null)\n const initialKeys = useRef(new Set(tagKeys(tags)))\n const rejections = useRef(0)\n\n const announce = (msg: string) => setMessage((prev) => (prev === msg ? `${msg}\\u00a0` : msg))\n\n useEffect(() => {\n const target = pendingFocus.current\n if (target === null) return\n pendingFocus.current = null\n const next = target === 'input' ? null : tagButtons.current.get(target)\n ;(next ?? inputEl.current)?.focus()\n }, [tags])\n\n /** Tenta adicionar uma ou mais tags; devolve `true` se todas foram aceitas. */\n const tryAdd = (raw: string[]): boolean => {\n const next = [...tags]\n const added: string[] = []\n const rejected: string[] = []\n let firstError: string | null = null\n for (const candidate of raw.map((r) => r.trim()).filter(Boolean)) {\n let problem: string | null = null\n if (maxTags !== undefined && next.length >= maxTags)\n problem = t('maxItemsReached', { max: maxTags })\n else if (\n !allowDuplicates &&\n next.some((tag) => tag.toLowerCase() === candidate.toLowerCase())\n )\n problem = t('duplicateItem', { label: candidate })\n else {\n const result = validate?.(candidate, next)\n if (typeof result === 'string' && result) problem = result\n else if (result === false) problem = t('error')\n }\n if (problem) {\n firstError ??= problem\n rejected.push(candidate)\n } else {\n next.push(candidate)\n added.push(candidate)\n }\n }\n if (added.length) setTags(next)\n // Mantém no campo o que foi recusado, para o usuário corrigir.\n setText(rejected.join(', '))\n if (firstError) rejections.current += 1\n setInternalError(firstError)\n const parts = [\n added.length ? t('itemAdded', { label: added.join(', ') }) : '',\n firstError ?? '',\n ].filter(Boolean)\n if (parts.length) announce(parts.join('. '))\n return rejected.length === 0\n }\n\n const removeAt = (index: number, focus: 'neighbor' | 'input') => {\n const removed = tags[index]\n if (removed === undefined) return\n const next = tags.filter((_, i) => i !== index)\n const nextKeys = tagKeys(next)\n pendingFocus.current =\n focus === 'neighbor' ? (nextKeys[index] ?? nextKeys[index - 1] ?? 'input') : 'input'\n initialKeys.current.delete(tagKeys(tags)[index])\n setTags(next)\n setInternalError(null)\n announce(t('itemRemoved', { label: removed }))\n }\n\n const shownError = error ?? internalError ?? undefined\n // Tremor curto quando um erro surge (cada recusa conta, mesmo com a mesma mensagem).\n const frameMotion = useShake(\n internalError\n ? `${internalError}#${rejections.current}`\n : typeof error === 'string'\n ? error\n : Boolean(error),\n )\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={shownError}\n required={required}\n disabled={disabled}\n controlId={id}\n className={cx('or-tag-input-field', className)}\n labelAside={\n maxTags !== undefined ? (\n <span className=\"or-tag-input__count\">\n {tags.length}/{maxTags}\n </span>\n ) : undefined\n }\n >\n <TagInputControl\n inputRef={ref}\n inputEl={inputEl}\n tagButtons={tagButtons}\n initialKeys={initialKeys}\n frameMotion={frameMotion}\n tags={tags}\n text={text}\n setText={setText}\n tryAdd={tryAdd}\n removeAt={removeAt}\n setError={setInternalError}\n message={message}\n required={required}\n disabled={disabled}\n {...rest}\n />\n </Field>\n )\n})\n","import { useEffect, useRef, useState } from 'react'\nimport { useDebouncedValue } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './CharacterCount.css'\n\nexport interface CharacterCountProps {\n /** Id do texto do contador (referenciado por `aria-describedby`). */\n id: string\n count: number\n max: number\n}\n\n/**\n * Contador \"x de y caracteres\" (interno). O texto visível é ligado ao campo\n * por `aria-describedby`; uma região `aria-live=\"polite\"` separada anuncia a\n * contagem só quando a pessoa para de digitar — sem interromper a digitação.\n */\nexport function CharacterCount({ id, count, max }: CharacterCountProps) {\n const { t } = useLocale()\n const [initial] = useState(count)\n const dirty = useRef(false)\n if (count !== initial) dirty.current = true\n const settled = useDebouncedValue(count, 800)\n const [announcement, setAnnouncement] = useState('')\n\n useEffect(() => {\n if (!dirty.current) return\n setAnnouncement(t('characterCount', { count: settled, max }))\n }, [settled, max, t])\n\n const remaining = max - count\n const state = remaining <= 0 ? 'limit' : remaining <= Math.max(1, Math.ceil(max * 0.1)) ? 'near' : undefined\n\n return (\n <div className=\"or-character-count\" data-state={state}>\n <span id={id}>{t('characterCount', { count, max })}</span>\n <VisuallyHidden aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </VisuallyHidden>\n </div>\n )\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type TextareaHTMLAttributes,\n} from 'react'\nimport { useId, useIsomorphicLayoutEffect } from '../../hooks'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport { Field, useFieldControlProps } from '../Field'\nimport { CharacterCount } from '../TextField/CharacterCount'\nimport type { TextFieldBaseProps } from '../TextField/TextField'\nimport { useErrorShake } from '../TextField/useErrorShake'\nimport '../TextField/FormMotion.css'\nimport './TextArea.css'\n\nexport interface TextAreaProps extends TextFieldBaseProps, TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Número de linhas visíveis (altura mínima com `autoResize`). Padrão: 3. */\n rows?: number\n /** Cresce automaticamente conforme o conteúdo, sem barra de rolagem. */\n autoResize?: boolean\n /** Com `autoResize`, limita o crescimento a este número de linhas (depois rola). */\n maxRows?: number\n /** Mostra o contador \"x de y caracteres\". Requer `maxLength`. */\n showCount?: boolean\n}\n\ninterface TextAreaControlProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n size: NonNullable<TextAreaProps['size']>\n invalid?: boolean\n autoResize: boolean\n maxRows?: number\n describedBy?: string\n}\n\nconst TextAreaControl = forwardRef<HTMLTextAreaElement, TextAreaControlProps>(function TextAreaControl(\n {\n size,\n invalid,\n autoResize,\n maxRows,\n describedBy,\n className,\n onChange,\n onAnimationEnd,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n },\n ref,\n) {\n const innerRef = useRef<HTMLTextAreaElement>(null)\n const mergedRef = useMemo(() => mergeRefs(ref, innerRef), [ref])\n const controlProps = useFieldControlProps({\n 'aria-describedby': [ariaDescribedBy, describedBy].filter(Boolean).join(' ') || undefined,\n 'aria-invalid': invalid ? true : undefined,\n })\n const { shakeClassName, onAnimationEnd: onShakeEnd } = useErrorShake(controlProps['aria-invalid'] === true)\n\n const resize = useCallback(() => {\n const el = innerRef.current\n if (!el) return\n if (!autoResize) {\n el.style.removeProperty('height')\n el.style.removeProperty('overflow-y')\n return\n }\n const styles = window.getComputedStyle(el)\n const borders = (parseFloat(styles.borderTopWidth) || 0) + (parseFloat(styles.borderBottomWidth) || 0)\n el.style.height = 'auto'\n if (el.scrollHeight === 0) {\n // Elemento oculto (display: none) — mede de novo quando aparecer.\n el.style.removeProperty('height')\n return\n }\n let next = el.scrollHeight + borders\n if (maxRows) {\n const lineHeight = parseFloat(styles.lineHeight) || (parseFloat(styles.fontSize) || 15) * 1.55\n const padding = (parseFloat(styles.paddingTop) || 0) + (parseFloat(styles.paddingBottom) || 0)\n const max = lineHeight * maxRows + padding + borders\n el.style.overflowY = next > max ? 'auto' : 'hidden'\n next = Math.min(next, max)\n } else {\n el.style.overflowY = 'hidden'\n }\n el.style.height = `${next}px`\n }, [autoResize, maxRows])\n\n // Recalcula quando o valor (controlado) ou as opções mudam.\n useIsomorphicLayoutEffect(() => {\n resize()\n }, [resize, rest.value])\n\n // Recalcula quando a largura muda (quebra de linha diferente) ou o campo aparece.\n useEffect(() => {\n const el = innerRef.current\n if (!autoResize || !el || typeof ResizeObserver === 'undefined') return\n let lastWidth = el.offsetWidth\n const observer = new ResizeObserver(() => {\n const width = el.offsetWidth\n if (width === lastWidth) return\n lastWidth = width\n resize()\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [autoResize, resize])\n\n return (\n <textarea\n ref={mergedRef}\n className={cx(\n 'or-control',\n `or-control--${size}`,\n 'or-text-area__control',\n autoResize && 'or-text-area__control--auto',\n shakeClassName,\n className,\n )}\n onChange={(event) => {\n onChange?.(event)\n resize()\n }}\n onAnimationEnd={(event) => {\n onAnimationEnd?.(event)\n onShakeEnd(event)\n }}\n {...controlProps}\n {...rest}\n />\n )\n})\n\n/**\n * Campo de texto multilinha para comentários, descrições e mensagens. Pode\n * crescer com o conteúdo (`autoResize`) e mostrar contador de caracteres.\n * A `ref` e as props nativas vão para o `<textarea>`.\n */\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(function TextArea(\n {\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n optional,\n labelAside,\n disabled,\n id,\n className,\n style,\n size = 'md',\n rows = 3,\n autoResize = false,\n maxRows,\n showCount = false,\n maxLength,\n value,\n defaultValue,\n onChange,\n onValueChange,\n ...rest\n },\n ref,\n) {\n const countId = useId('or-text-area-count')\n const [uncontrolledLength, setUncontrolledLength] = useState(() => String(defaultValue ?? '').length)\n const length = value !== undefined ? String(value ?? '').length : uncontrolledLength\n const withCount = showCount && typeof maxLength === 'number'\n devWarning(showCount && maxLength === undefined, 'TextArea com `showCount` precisa de `maxLength`.')\n\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n setUncontrolledLength(event.target.value.length)\n onChange?.(event)\n onValueChange?.(event.target.value)\n }\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n labelAside={labelAside}\n className={cx('or-text-area', className)}\n style={style}\n >\n <TextAreaControl\n ref={ref}\n size={size}\n invalid={invalid}\n rows={rows}\n autoResize={autoResize}\n maxRows={maxRows}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n describedBy={withCount ? countId : undefined}\n {...rest}\n />\n {withCount && <CharacterCount id={countId} count={length} max={maxLength} />}\n </Field>\n )\n})\n","import { forwardRef, useState, type ChangeEvent, type InputHTMLAttributes, type ReactNode } from 'react'\nimport { useId } from '../../hooks'\nimport { cx, devWarning } from '../../utils'\nimport { Field } from '../Field'\nimport { CharacterCount } from './CharacterCount'\nimport { InputControl, type ControlSize } from './InputControl'\n\nexport type TextFieldType = 'text' | 'email' | 'url' | 'tel' | 'search'\nexport type TextFieldSize = ControlSize\n\n/** Props de rótulo, ajuda e validação comuns aos campos de texto. */\nexport interface TextFieldBaseProps {\n /** Rótulo visível do campo. Sempre informe um rótulo — use `hideLabel` para ocultá-lo. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda exibido abaixo do rótulo e ligado por `aria-describedby`. */\n description?: ReactNode\n /** Mensagem de erro. Quando presente, o campo fica inválido. */\n error?: ReactNode\n /** Força o estado inválido sem exibir mensagem (ex.: erro mostrado em um ErrorSummary). */\n invalid?: boolean\n /** Campo obrigatório: mostra `*` no rótulo e aplica `required`. */\n required?: boolean\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n /** Elemento à direita do rótulo (ex.: link \"Esqueceu a senha?\"). */\n labelAside?: ReactNode\n /** Altura do controle: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: TextFieldSize\n /** Chamado com o novo texto a cada alteração (atalho para `onChange`). */\n onValueChange?: (value: string) => void\n}\n\nexport interface TextFieldProps\n extends TextFieldBaseProps,\n Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'type'> {\n /** Tipo do campo. Para senhas use `PasswordField`; para números, `NumberField`. */\n type?: TextFieldType\n /** Ícone decorativo no início do campo. */\n startIcon?: ReactNode\n /** Ícone decorativo no fim do campo. */\n endIcon?: ReactNode\n /** Texto fixo antes do valor (ex.: `https://`, `R$`). É lido junto com a descrição. */\n prefix?: ReactNode\n /** Texto fixo depois do valor (ex.: `kg`, `.com.br`). É lido junto com a descrição. */\n suffix?: ReactNode\n /** Mostra o contador \"x de y caracteres\". Requer `maxLength`. */\n showCount?: boolean\n}\n\n/**\n * Campo de texto de uma linha com rótulo, ajuda, erro, ícones, prefixo/sufixo\n * e contador de caracteres. A `ref` e as props nativas vão para o `<input>`;\n * `className` e `style` vão para o contêiner do campo.\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n {\n label,\n hideLabel,\n description,\n error,\n invalid,\n required,\n optional,\n labelAside,\n disabled,\n id,\n className,\n style,\n size = 'md',\n type = 'text',\n showCount = false,\n maxLength,\n value,\n defaultValue,\n onChange,\n onValueChange,\n ...rest\n },\n ref,\n) {\n const countId = useId('or-text-field-count')\n const [uncontrolledLength, setUncontrolledLength] = useState(() => String(defaultValue ?? '').length)\n const length = value !== undefined ? String(value ?? '').length : uncontrolledLength\n const withCount = showCount && typeof maxLength === 'number'\n devWarning(showCount && maxLength === undefined, 'TextField com `showCount` precisa de `maxLength`.')\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setUncontrolledLength(event.target.value.length)\n onChange?.(event)\n onValueChange?.(event.target.value)\n }\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n labelAside={labelAside}\n className={cx('or-text-field', className)}\n style={style}\n >\n <InputControl\n ref={ref}\n type={type}\n size={size}\n invalid={invalid}\n value={value}\n defaultValue={defaultValue}\n maxLength={maxLength}\n onChange={handleChange}\n describedBy={withCount ? countId : undefined}\n after={withCount ? <CharacterCount id={countId} count={length} max={maxLength} /> : null}\n {...rest}\n />\n </Field>\n )\n})\n","import {\n forwardRef,\n useRef,\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useControllableState } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { cx, mergeRefs } from '../../utils'\nimport { Field, useFieldControlProps, type FieldControlProps } from '../Field'\nimport './TimeField.css'\n\nexport type TimeFieldSize = 'sm' | 'md' | 'lg'\n\nexport interface TimeFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size' | 'type'\n> {\n /** Horário no formato `HH:mm` (ou `HH:mm:ss` com `step` < 60). Controlado. */\n value?: string\n /** Horário inicial (não controlado). */\n defaultValue?: string\n /** Chamado com o novo horário (`HH:mm`) ou `''` quando apagado. */\n onChange?: (value: string, event: ChangeEvent<HTMLInputElement>) => void\n /** Horário mínimo (`HH:mm`). */\n min?: string\n /** Horário máximo (`HH:mm`). */\n max?: string\n /** Intervalo em segundos entre horários válidos. Ex.: `900` = 15 minutos. Padrão: 60. */\n step?: number\n /** Rótulo visível do campo. */\n label?: ReactNode\n /** Oculta o rótulo visualmente (continua acessível). */\n hideLabel?: boolean\n /** Texto de ajuda abaixo do rótulo. */\n description?: ReactNode\n /** Mensagem de erro. Quando presente, o campo fica inválido. */\n error?: ReactNode\n /** Mostra \"(opcional)\" ao lado do rótulo. */\n optional?: boolean\n /** Altura do campo: `sm` 32px, `md` 40px, `lg` 48px. */\n size?: TimeFieldSize\n}\n\nfunction FieldControl({\n id,\n children,\n}: {\n id?: string\n children: (props: FieldControlProps) => ReactNode\n}) {\n return <>{children(useFieldControlProps({ id }))}</>\n}\n\n/**\n * Campo de horário: `<input type=\"time\">` nativo com a aparência do Orange.\n * O navegador cuida da digitação por segmentos, do formato 12/24h do\n * sistema e do seletor nativo — com teclado e leitores de tela completos.\n */\nexport const TimeField = forwardRef<HTMLInputElement, TimeFieldProps>(function TimeField(\n {\n value: valueProp,\n defaultValue = '',\n onChange,\n min,\n max,\n step,\n label,\n hideLabel,\n description,\n error,\n required,\n optional,\n disabled,\n readOnly,\n size = 'md',\n id,\n className,\n style,\n ...rest\n },\n ref,\n) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [value, setValue] = useControllableState({ value: valueProp, defaultValue })\n const hasError = error !== undefined && error !== null && error !== false && error !== ''\n\n const openPicker = () => {\n const input = inputRef.current\n if (!input || disabled || readOnly) return\n input.focus()\n try {\n input.showPicker?.()\n } catch {\n // showPicker pode falhar sem gesto do usuário ou em navegadores antigos.\n }\n }\n\n return (\n <Field\n label={label}\n hideLabel={hideLabel}\n description={description}\n error={error}\n required={required}\n optional={optional}\n disabled={disabled}\n controlId={id}\n className={cx('or-time-field', className)}\n style={style}\n >\n <FieldControl id={id}>\n {(fieldProps) => (\n <div\n className={cx('or-control-frame', `or-control-frame--${size}`, 'or-time-field__frame')}\n data-invalid={hasError || undefined}\n aria-disabled={disabled || undefined}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n >\n {/* Atalho só para ponteiro: pelo teclado o horário é editado direto no campo. */}\n <span\n className=\"or-control-frame__addon or-control-frame__addon--start or-time-field__icon\"\n onPointerDown={(event) => {\n event.preventDefault()\n openPicker()\n }}\n >\n <Icon name=\"clock\" size=\"sm\" />\n </span>\n <input\n {...rest}\n {...fieldProps}\n ref={mergeRefs(inputRef, ref)}\n type=\"time\"\n className=\"or-control-frame__input or-time-field__input\"\n value={value}\n min={min}\n max={max}\n step={step}\n readOnly={readOnly}\n disabled={disabled}\n onChange={(event) => {\n setValue(event.target.value)\n onChange?.(event.target.value, event)\n }}\n />\n </div>\n )}\n </FieldControl>\n </Field>\n )\n})\n","import {\n createContext,\n forwardRef,\n useContext,\n useMemo,\n type ElementType,\n type LiHTMLAttributes,\n type OlHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { useLocale } from '../../providers'\nimport { cx, mergeRefs } from '../../utils'\nimport { useStaggerReveal } from '../List/useStaggerReveal'\nimport './Timeline.css'\n\nexport type TimelineVariant = 'default' | 'alternate'\nexport type TimelineTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info'\nexport type TimelineDate = Date | string | number\n\nexport interface TimelineProps extends OlHTMLAttributes<HTMLOListElement> {\n /**\n * `default`: linha à esquerda. `alternate`: eventos alternam dos dois lados\n * da linha (vira `default` em contêineres estreitos).\n */\n variant?: TimelineVariant\n /** Formato das datas dos itens (`Intl.DateTimeFormat`). Padrão: `{ dateStyle: 'medium' }`. */\n dateFormat?: Intl.DateTimeFormatOptions\n /**\n * Os eventos entram escalonados (80ms entre eles) quando a timeline aparece\n * na tela, e a linha vertical é \"desenhada\". Desligado com movimento reduzido.\n */\n animated?: boolean\n}\n\ninterface TimelineContextValue {\n dateFormat?: Intl.DateTimeFormatOptions\n}\n\nconst TimelineContext = createContext<TimelineContextValue>({})\n\n/**\n * Sequência cronológica de eventos — histórico de um pedido, changelog,\n * etapas de um processo. Renderiza um `<ol>` com datas em `<time>`.\n */\nexport const Timeline = forwardRef<HTMLOListElement, TimelineProps>(function Timeline(\n { variant = 'default', dateFormat, animated = false, className, children, ...rest },\n ref,\n) {\n const value = useMemo(() => ({ dateFormat }), [dateFormat])\n const reveal = useStaggerReveal<HTMLOListElement>(animated)\n const composedRef = useMemo(() => mergeRefs(ref, reveal.ref), [ref, reveal.ref])\n return (\n <TimelineContext.Provider value={value}>\n {/* `list-style: none` remove a semântica de lista no Safari/VoiceOver; o papel explícito a restaura. */}\n <ol\n ref={composedRef}\n role=\"list\"\n className={cx('or-timeline', `or-timeline--${variant}`, className)}\n data-reveal={reveal.state === 'idle' ? undefined : reveal.state}\n {...rest}\n >\n {children}\n </ol>\n </TimelineContext.Provider>\n )\n})\n\nexport interface TimelineItemProps extends Omit<LiHTMLAttributes<HTMLLIElement>, 'title'> {\n /** Título do evento. */\n title: ReactNode\n /** Texto de apoio abaixo do título. */\n description?: ReactNode\n /**\n * Data do evento. Strings `AAAA-MM-DD` são tratadas como data local (sem\n * deslocamento de fuso). Vira `<time dateTime>` formatado no idioma do provider.\n */\n date?: TimelineDate\n /** Texto exibido no lugar da data formatada (ex.: \"Agora\", \"Previsto\"). */\n dateLabel?: ReactNode\n /** Formato desta data; sobrescreve o `dateFormat` da `Timeline`. */\n dateFormat?: Intl.DateTimeFormatOptions\n /** Cor do marcador quadrado. Padrão: `neutral` (contorno). */\n tone?: TimelineTone\n /** Marca o evento atual: destaque visual e `aria-current=\"step\"`. */\n current?: boolean\n /**\n * Anel pulsando no marcador, para eventos \"ao vivo\" (em andamento).\n * Padrão: igual a `current`. O estado nunca depende só do pulso.\n */\n pulse?: boolean\n /** Ícone dentro do marcador (marcador maior). */\n icon?: ReactNode\n /** Elemento do título. Padrão: `p`. Use `h3`/`h4` se os eventos forem seções. */\n titleAs?: ElementType\n}\n\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})(?:-(\\d{2}))?$/\n\nfunction parseDate(value: TimelineDate): { date: Date; dateTime: string } | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : { date: value, dateTime: value.toISOString() }\n }\n if (typeof value === 'string') {\n const match = DATE_ONLY.exec(value.trim())\n if (match) {\n const [, y, m, d] = match\n return { date: new Date(Number(y), Number(m) - 1, d ? Number(d) : 1), dateTime: value.trim() }\n }\n }\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? null : { date, dateTime: date.toISOString() }\n}\n\n/** Evento de uma `Timeline`. */\nexport const TimelineItem = forwardRef<HTMLLIElement, TimelineItemProps>(function TimelineItem(\n {\n title,\n description,\n date,\n dateLabel,\n dateFormat,\n tone = 'neutral',\n current = false,\n pulse,\n icon,\n titleAs: Title = 'p',\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { locale } = useLocale()\n const context = useContext(TimelineContext)\n const parsed = date !== undefined ? parseDate(date) : null\n const format = dateFormat ?? context.dateFormat ?? { dateStyle: 'medium' }\n let formatted: ReactNode = dateLabel\n if (formatted === undefined && parsed) {\n try {\n formatted = new Intl.DateTimeFormat(locale, format).format(parsed.date)\n } catch {\n formatted = parsed.date.toLocaleDateString()\n }\n }\n const hasDate = formatted !== undefined && formatted !== null\n\n return (\n <li\n ref={ref}\n className={cx(\n 'or-timeline__item',\n `or-timeline__item--${tone}`,\n current && 'or-timeline__item--current',\n icon != null && icon !== false && 'or-timeline__item--with-icon',\n className,\n )}\n aria-current={current ? 'step' : undefined}\n {...rest}\n >\n <span\n className={cx('or-timeline__marker', (pulse ?? current) && 'or-pulse')}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n {hasDate &&\n (parsed ? (\n <time className=\"or-timeline__date\" dateTime={parsed.dateTime}>\n {formatted}\n </time>\n ) : (\n <span className=\"or-timeline__date\">{formatted}</span>\n ))}\n <div className=\"or-timeline__body\">\n <Title className=\"or-timeline__title\">{title}</Title>\n {description !== undefined && description !== null && (\n <div className=\"or-timeline__description\">{description}</div>\n )}\n {children}\n </div>\n </li>\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { cx } from '../../utils'\nimport { feedbackIcons, feedbackLabelKeys, type FeedbackTone } from '../Alert/feedback'\nimport { Button } from '../Button'\nimport { VisuallyHidden } from '../VisuallyHidden'\nimport './Toast.css'\n\nexport type ToastTone = FeedbackTone\n\nexport interface ToastProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Cor semântica e ícone. */\n tone?: ToastTone\n /** Mensagem principal, curta. */\n title?: ReactNode\n /** Detalhe opcional, em uma ou duas linhas. */\n description?: ReactNode\n /** Substitui o ícone do tom. `false` remove o ícone. */\n icon?: ReactNode | false\n /** Ação relacionada (ex.: \"Desfazer\"). */\n action?: ReactNode\n /** Quando informado, mostra o botão de fechar e o chama ao clicar. */\n onClose?: () => void\n}\n\n/**\n * Visual de uma notificação temporária. Normalmente é renderizado pelo\n * `ToastProvider` — chame `useToast().toast({...})` em vez de usá-lo direto.\n */\nexport const Toast = forwardRef<HTMLDivElement, ToastProps>(function Toast(\n { tone = 'neutral', title, description, icon, action, onClose, className, ...rest },\n ref,\n) {\n const { t } = useLocale()\n const labelKey = feedbackLabelKeys[tone]\n return (\n <div\n ref={ref}\n className={cx('or-toast', `or-toast--${tone}`, onClose && 'or-toast--closable', className)}\n {...rest}\n >\n {icon !== false && (\n <span className=\"or-toast__icon\" aria-hidden=\"true\">\n {icon ?? <Icon name={feedbackIcons[tone]} size=\"md\" />}\n </span>\n )}\n <div className=\"or-toast__main\">\n <div className=\"or-toast__message\" data-toast-message=\"\">\n {labelKey && <VisuallyHidden>{`${t(labelKey)}: `}</VisuallyHidden>}\n {title && <p className=\"or-toast__title\">{title}</p>}\n {description && <div className=\"or-toast__description\">{description}</div>}\n </div>\n {action && <div className=\"or-toast__action\">{action}</div>}\n </div>\n {onClose && (\n <Button\n className=\"or-toast__close\"\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={t('close')}\n startIcon={<Icon name=\"close\" size=\"sm\" />}\n onClick={onClose}\n />\n )}\n </div>\n )\n})\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { usePresence } from '../../hooks'\nimport { useLocale } from '../../providers'\nimport { cx, getFocusableElements } from '../../utils'\nimport { Button } from '../Button'\nimport { Portal } from '../Portal'\nimport { Toast, type ToastTone } from './Toast'\n\nexport type ToastPosition =\n 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'\n\nexport interface ToastAction {\n /** Rótulo do botão (ex.: \"Desfazer\"). */\n label: string\n /** Chamado no clique. O toast é fechado em seguida. */\n onClick: () => void\n}\n\nexport interface ToastOptions {\n /** Id próprio. Chamar `toast()` com um id existente substitui o conteúdo daquele toast. */\n id?: string\n title?: ReactNode\n description?: ReactNode\n /** Padrão: `neutral`. */\n tone?: ToastTone\n /** Substitui o ícone do tom. `false` remove o ícone. */\n icon?: ReactNode | false\n action?: ToastAction\n /**\n * Tempo em ms até fechar sozinho. `Infinity` mantém o toast até ser fechado.\n * Padrão: o `duration` do provider — ou `Infinity` quando há `action`.\n */\n duration?: number\n /** Mostra o botão de fechar. Padrão: `true`. */\n dismissible?: boolean\n /** Chamado quando o toast é fechado (pelo usuário, pelo tempo ou por `dismiss`). */\n onDismiss?: () => void\n /** Mostra a barra de tempo restante deste toast. Padrão: o `showProgress` do provider. */\n showProgress?: boolean\n}\n\nexport interface UseToastReturn {\n /** Mostra um toast e retorna o seu id. */\n toast: (options: ToastOptions) => string\n /** Fecha o toast com o id informado. */\n dismiss: (id: string) => void\n /** Fecha todos os toasts. */\n dismissAll: () => void\n}\n\nexport interface ToastProviderProps {\n children?: ReactNode\n /** Canto da tela onde a pilha aparece. */\n position?: ToastPosition\n /** Máximo de toasts visíveis ao mesmo tempo; os demais aguardam na fila. */\n limit?: number\n /** Tempo padrão (ms) até um toast fechar sozinho. */\n duration?: number\n /** Tecla que leva o foco para o toast mais recente. `false` desativa. */\n hotkey?: string | false\n /** Elemento onde a região é renderizada. Padrão: `document.body`. */\n container?: Element | null\n /**\n * Mostra uma barra fina com o tempo restante em toasts que fecham sozinhos.\n * Ela pausa junto com o timer (hover, foco, aba oculta).\n */\n showProgress?: boolean\n}\n\ninterface ToastRecord extends ToastOptions {\n id: string\n state: 'open' | 'closed'\n version: number\n}\n\ninterface Announcement {\n key: number\n text: string\n assertive: boolean\n}\n\n/** Tempo que um anúncio fica na região viva oculta. */\nconst ANNOUNCE_MS = 7000\n\nlet toastCounter = 0\nlet announceCounter = 0\n\nfunction createToastStore() {\n let items: ToastRecord[] = []\n const listeners = new Set<() => void>()\n return {\n get: () => items,\n set(next: ToastRecord[]) {\n items = next\n listeners.forEach((listener) => listener())\n },\n subscribe(listener: () => void) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n\nconst ToastContext = createContext<UseToastReturn | null>(null)\n\n/**\n * Hook para disparar toasts. Precisa estar dentro de um `ToastProvider`.\n * @example const { toast } = useToast(); toast({ title: 'Link copiado' })\n */\nexport function useToast(): UseToastReturn {\n const ctx = useContext(ToastContext)\n if (!ctx) throw new Error('[Orange] useToast precisa estar dentro de <ToastProvider>.')\n return ctx\n}\n\n/**\n * Provedor de toasts: guarda a fila, renderiza a pilha em um `Portal` e\n * anuncia cada mensagem em regiões vivas (educada; `danger` usa `role=\"alert\"`).\n * Coloque-o uma vez, perto da raiz da aplicação.\n */\nexport function ToastProvider({\n children,\n position = 'bottom-right',\n limit = 3,\n duration = 5000,\n hotkey = 'F8',\n container,\n showProgress = false,\n}: ToastProviderProps) {\n const { t } = useLocale()\n const visibleLimit = Math.max(1, limit)\n const limitRef = useRef(visibleLimit)\n limitRef.current = visibleLimit\n\n const [store] = useState(createToastStore)\n const toasts = useSyncExternalStore(store.subscribe, store.get, store.get)\n const [announcements, setAnnouncements] = useState<Announcement[]>([])\n const [hovered, setHovered] = useState(false)\n const [focusWithin, setFocusWithin] = useState(false)\n const [documentHidden, setDocumentHidden] = useState(false)\n\n const regionRef = useRef<HTMLElement>(null)\n const lastFocusOutside = useRef<HTMLElement | null>(null)\n const timeouts = useRef(new Set<ReturnType<typeof setTimeout>>())\n\n const later = useCallback((fn: () => void, ms: number) => {\n const handle = setTimeout(() => {\n timeouts.current.delete(handle)\n fn()\n }, ms)\n timeouts.current.add(handle)\n return handle\n }, [])\n\n useEffect(() => {\n const pending = timeouts.current\n return () => {\n pending.forEach(clearTimeout)\n pending.clear()\n }\n }, [])\n\n /**\n * Fecha um toast. Se o foco estava nele, vai para o toast vizinho ou volta\n * para onde estava antes de entrar na pilha. O item fica `closed` e é\n * removido do DOM pelo próprio ToastItem quando a animação de saída termina.\n */\n const dismiss = useCallback(\n (id: string) => {\n const items = store.get()\n const index = items.findIndex((item) => item.id === id)\n const record = items[index]\n if (!record || record.state === 'closed') return\n\n const region = regionRef.current\n const element = region\n ? Array.from(region.querySelectorAll<HTMLElement>('[data-toast-id]')).find(\n (el) => el.dataset.toastId === id,\n )\n : undefined\n if (region && element?.contains(document.activeElement)) {\n const open = Array.from(\n region.querySelectorAll<HTMLElement>('[data-toast-id][data-state=\"open\"]'),\n )\n const position = open.indexOf(element)\n const neighbor = open[position + 1] ?? open[position - 1]\n const target =\n (neighbor && getFocusableElements(neighbor)[0]) ||\n (lastFocusOutside.current?.isConnected ? lastFocusOutside.current : null)\n target?.focus()\n }\n\n // Na fila (além do limite) o toast não está na tela: sai sem animação.\n const queued = index >= limitRef.current\n store.set(\n queued\n ? items.filter((item) => item.id !== id)\n : items.map((item) => (item.id === id ? { ...item, state: 'closed' } : item)),\n )\n record.onDismiss?.()\n },\n [store],\n )\n\n /** Remove do store um toast cuja saída animada terminou (se não foi reaberto). */\n const remove = useCallback(\n (id: string) => {\n store.set(store.get().filter((item) => item.id !== id || item.state === 'open'))\n },\n [store],\n )\n\n const toast = useCallback(\n (options: ToastOptions) => {\n const id = options.id ?? `or-toast-${++toastCounter}`\n const items = store.get()\n const existing = items.find((item) => item.id === id)\n if (existing) {\n // reabrir durante a saída cancela a remoção: o item volta a `open`\n store.set(\n items.map((item) =>\n item.id === id\n ? { ...options, id, state: 'open', version: existing.version + 1 }\n : item,\n ),\n )\n } else {\n store.set([...items, { ...options, id, state: 'open', version: 0 }])\n }\n return id\n },\n [store],\n )\n\n const dismissAll = useCallback(() => {\n store.get().forEach((item) => dismiss(item.id))\n }, [store, dismiss])\n\n const announce = useCallback(\n (text: string, assertive: boolean) => {\n const key = ++announceCounter\n setAnnouncements((list) => [...list, { key, text, assertive }])\n later(() => setAnnouncements((list) => list.filter((a) => a.key !== key)), ANNOUNCE_MS)\n },\n [later],\n )\n\n const visible = toasts.slice(0, visibleLimit)\n const hasVisible = visible.length > 0\n const isTop = position.startsWith('top')\n // No topo, o mais recente fica em cima; embaixo, o mais recente fica junto à borda.\n // A ordem do DOM acompanha a ordem visual (WCAG 2.4.3).\n const ordered = isTop ? [...visible].reverse() : visible\n const paused = hovered || focusWithin || documentHidden\n\n // Sem toasts, a região sai do DOM: zera hover/foco (pointerleave não dispara).\n useEffect(() => {\n if (!hasVisible) {\n setHovered(false)\n setFocusWithin(false)\n }\n }, [hasVisible])\n\n useEffect(() => {\n const onVisibility = () => setDocumentHidden(document.visibilityState === 'hidden')\n document.addEventListener('visibilitychange', onVisibility)\n return () => document.removeEventListener('visibilitychange', onVisibility)\n }, [])\n\n // Atalho (F8): leva o foco para o toast mais recente.\n useEffect(() => {\n if (!hotkey) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== hotkey || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)\n return\n const newest = [...store.get()]\n .slice(0, limitRef.current)\n .reverse()\n .find((item) => item.state === 'open')\n if (!newest || !regionRef.current) return\n const item = Array.from(\n regionRef.current.querySelectorAll<HTMLElement>('[data-toast-id]'),\n ).find((el) => el.dataset.toastId === newest.id)\n const target = getFocusableElements(item ?? null)[0]\n if (!target) return\n event.preventDefault()\n target.focus()\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [hotkey, store])\n\n const api = useMemo<UseToastReturn>(\n () => ({ toast, dismiss, dismissAll }),\n [toast, dismiss, dismissAll],\n )\n\n const regionLabel = hotkey ? `${t('notifications')} (${hotkey})` : t('notifications')\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <Portal container={container}>\n {hasVisible && (\n <section\n ref={regionRef}\n aria-label={regionLabel}\n className={cx('or-toast-region', `or-toast-region--${position}`)}\n data-paused={paused || undefined}\n data-position={position}\n onPointerEnter={() => setHovered(true)}\n onPointerLeave={() => setHovered(false)}\n onFocus={(event) => {\n const from = event.relatedTarget as HTMLElement | null\n if (!from || !event.currentTarget.contains(from)) lastFocusOutside.current = from\n setFocusWithin(true)\n }}\n onBlur={(event) => {\n const to = event.relatedTarget as Node | null\n if (!to || !event.currentTarget.contains(to)) setFocusWithin(false)\n }}\n >\n <ol className=\"or-toast-region__list\">\n {ordered.map((record) => (\n <ToastItem\n key={record.id}\n record={record}\n paused={paused}\n defaultDuration={duration}\n showProgress={showProgress}\n onClose={dismiss}\n onRemove={remove}\n onAnnounce={announce}\n />\n ))}\n </ol>\n </section>\n )}\n <div\n className=\"or-visually-hidden\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n aria-relevant=\"additions text\"\n >\n {announcements\n .filter((a) => !a.assertive)\n .map((a) => (\n <p key={a.key}>{a.text}</p>\n ))}\n </div>\n <div\n className=\"or-visually-hidden\"\n role=\"alert\"\n aria-atomic=\"false\"\n aria-relevant=\"additions text\"\n >\n {announcements\n .filter((a) => a.assertive)\n .map((a) => (\n <p key={a.key}>{a.text}</p>\n ))}\n </div>\n </Portal>\n </ToastContext.Provider>\n )\n}\n\n/**\n * Texto do anúncio: prefixo do tom + título + descrição, com pausa (ponto)\n * entre título e descrição — `textContent` puro colaria as frases.\n */\nfunction getAnnouncementText(message: Element | null | undefined): string {\n if (!message) return ''\n const parts = Array.from(message.children)\n .map((child) => child.textContent?.replace(/\\s+/g, ' ').trim() ?? '')\n .filter(Boolean)\n return parts.reduce((text, part) => {\n if (!text) return part\n // depois do prefixo (\"Erro:\") ou de pontuação final, basta um espaço\n return /[.!?…:]$/.test(text) ? `${text} ${part}` : `${text}. ${part}`\n }, '')\n}\n\ninterface ToastItemProps {\n record: ToastRecord\n paused: boolean\n defaultDuration: number\n showProgress: boolean\n onClose: (id: string) => void\n onRemove: (id: string) => void\n onAnnounce: (text: string, assertive: boolean) => void\n}\n\nfunction ToastItem({\n record,\n paused,\n defaultDuration,\n showProgress,\n onClose,\n onRemove,\n onAnnounce,\n}: ToastItemProps) {\n const { id, state, version, action, tone = 'neutral', dismissible = true } = record\n const duration = record.duration ?? (action ? Infinity : defaultDuration)\n const timed = Number.isFinite(duration) && duration > 0\n\n // Saída animada: o item continua montado até a animação de saída terminar.\n const { present, nodeRef: itemRef } = usePresence<HTMLLIElement>(state === 'open')\n useEffect(() => {\n if (!present) onRemove(id)\n }, [present, id, onRemove])\n\n // Timer com pausa: guarda o tempo restante entre pausas.\n const remaining = useRef(duration)\n const timerVersion = useRef(version)\n useEffect(() => {\n if (timerVersion.current !== version) {\n timerVersion.current = version\n remaining.current = duration\n }\n if (state === 'closed' || paused || !timed) return\n const startedAt = Date.now()\n const handle = setTimeout(() => onClose(id), remaining.current)\n return () => {\n clearTimeout(handle)\n remaining.current = Math.max(0, remaining.current - (Date.now() - startedAt))\n }\n }, [id, state, version, paused, duration, timed, onClose])\n\n // Anuncia o texto quando o toast aparece (e a cada atualização de conteúdo).\n const announcedVersion = useRef(-1)\n useEffect(() => {\n if (announcedVersion.current === version) return\n announcedVersion.current = version\n const text = getAnnouncementText(itemRef.current?.querySelector('[data-toast-message]'))\n if (text) onAnnounce(text, tone === 'danger')\n }, [version, tone, onAnnounce, itemRef])\n\n const close = () => onClose(id)\n\n // Escape fecha o toast que contém o foco. Listener nativo no item: o\n // stopPropagation impede que diálogos abertos por baixo (que escutam no\n // document) também fechem.\n const escapeRef = useRef<() => void>(() => {})\n escapeRef.current = () => {\n if (state !== 'closed') close()\n }\n useEffect(() => {\n const item = itemRef.current\n if (!item) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return\n event.preventDefault()\n event.stopPropagation()\n escapeRef.current()\n }\n item.addEventListener('keydown', onKeyDown)\n return () => item.removeEventListener('keydown', onKeyDown)\n }, [itemRef])\n\n if (!present) return null\n\n const showTimer = (record.showProgress ?? showProgress) && timed\n\n return (\n <li\n ref={itemRef}\n className=\"or-toast-region__item\"\n data-toast-id={id}\n data-state={state}\n aria-hidden={state === 'closed' || undefined}\n >\n {/* __collapse: linha do grid que cresce/recolhe para a pilha se reacomodar */}\n <div className=\"or-toast-region__collapse\">\n <div className={cx('or-toast-region__toast', `or-toast-region__toast--${tone}`)}>\n <Toast\n tone={tone}\n title={record.title}\n description={record.description}\n icon={record.icon}\n action={\n action && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n action.onClick()\n close()\n }}\n >\n {action.label}\n </Button>\n )\n }\n onClose={dismissible ? close : undefined}\n />\n {showTimer && (\n // key: reinicia a barra quando o conteúdo do toast é atualizado\n <span\n key={version}\n className=\"or-toast-region__timer\"\n style={{ '--_timer-duration': `${duration}ms` } as CSSProperties}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </div>\n </li>\n )\n}\n","import { createContext, useContext } from 'react'\n\n/** Contexto interno que liga cada ToggleButton ao ToggleButtonGroup. */\nexport interface ToggleGroupContextValue {\n isPressed: (value: string) => boolean\n toggle: (value: string) => void\n}\n\nexport const ToggleGroupContext = createContext<ToggleGroupContextValue | null>(null)\n\nexport function useToggleGroup(): ToggleGroupContextValue | null {\n return useContext(ToggleGroupContext)\n}\n","import { forwardRef, type MouseEvent } from 'react'\nimport { useControllableState } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { cx, devWarning } from '../../utils'\nimport { Button, type ButtonProps } from '../Button'\nimport { rovingItemProps, useActionGroup } from '../ButtonGroup/context'\nimport { useToggleGroup } from './context'\nimport './ToggleButton.css'\n\nexport type ToggleButtonVariant = 'outline' | 'ghost'\n\nexport interface ToggleButtonProps extends Omit<ButtonProps, 'variant' | 'value' | 'onChange'> {\n /** Estilo visual em repouso. Pressionado, o botão ganha fundo, borda e barra laranjas. */\n variant?: ToggleButtonVariant\n /** Estado pressionado (controlado). */\n pressed?: boolean\n /** Estado pressionado inicial (não controlado). */\n defaultPressed?: boolean\n /** Chamado com o novo estado quando o usuário alterna o botão. */\n onPressedChange?: (pressed: boolean) => void\n /** Identificador do botão dentro de um `ToggleButtonGroup`. */\n value?: string\n /**\n * Mostra um indicador antes do rótulo: `+` solto e check pressionado (o\n * espaço é fixo, então a largura não muda). Padrão: `true` para botões com\n * texto e sem `startIcon`.\n */\n showCheck?: boolean\n}\n\n/**\n * Botão de alternância (liga/desliga) com `aria-pressed`. O rótulo não muda\n * entre os estados — o estado é comunicado pelo `aria-pressed` e, visualmente,\n * por fundo, borda, barra inferior e indicador (+ → check).\n */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(function ToggleButton(\n {\n variant,\n size,\n disabled,\n pressed: pressedProp,\n defaultPressed = false,\n onPressedChange,\n value,\n showCheck,\n iconOnly = false,\n startIcon,\n className,\n children,\n onClick,\n ...rest\n },\n ref,\n) {\n const group = useActionGroup()\n const toggleGroup = useToggleGroup()\n devWarning(\n toggleGroup !== null && value === undefined,\n 'ToggleButton dentro de ToggleButtonGroup precisa da prop `value`.',\n )\n const inGroup = toggleGroup !== null && value !== undefined\n\n const [ownPressed, setOwnPressed] = useControllableState({\n value: pressedProp,\n defaultValue: defaultPressed,\n onChange: onPressedChange,\n })\n const pressed = inGroup ? toggleGroup.isPressed(value) : ownPressed\n\n const groupVariant =\n group?.variant === 'ghost' || group?.variant === 'outline' ? group.variant : undefined\n const withCheck = (showCheck ?? (!iconOnly && !startIcon)) && !iconOnly\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (inGroup) toggleGroup.toggle(value)\n else setOwnPressed(!pressed)\n }\n\n return (\n <Button\n ref={ref}\n variant={variant ?? groupVariant ?? 'outline'}\n size={size ?? group?.size ?? 'md'}\n disabled={disabled ?? group?.disabled}\n iconOnly={iconOnly}\n startIcon={startIcon}\n aria-pressed={pressed}\n data-state={pressed ? 'on' : 'off'}\n value={value}\n className={cx('or-toggle-button', withCheck && 'or-toggle-button--with-check', className)}\n onClick={handleClick}\n {...rovingItemProps(group)}\n {...rest}\n >\n {withCheck ? (\n <>\n <span className=\"or-toggle-button__check\" aria-hidden=\"true\">\n <Icon name=\"plus\" className=\"or-toggle-button__check-off\" />\n <Icon name=\"check\" strokeWidth={2.25} className=\"or-toggle-button__check-on\" />\n </span>\n {children}\n </>\n ) : (\n children\n )}\n </Button>\n )\n})\n","import { forwardRef, useCallback, useMemo, type HTMLAttributes } from 'react'\nimport { useControllableState } from '../../hooks'\nimport { cx } from '../../utils'\nimport type { ButtonSize } from '../Button'\nimport { ButtonGroup, type ButtonGroupOrientation } from '../ButtonGroup/ButtonGroup'\nimport { ToggleGroupContext, type ToggleGroupContextValue } from './context'\nimport type { ToggleButtonVariant } from './ToggleButton'\n\ninterface ToggleButtonGroupBaseProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** Cola os botões, com bordas internas compartilhadas. */\n attached?: boolean\n orientation?: ButtonGroupOrientation\n /** Tamanho repassado aos ToggleButtons. */\n size?: ButtonSize\n /** Variante repassada aos ToggleButtons. */\n variant?: ToggleButtonVariant\n /** Desabilita todos os botões. */\n disabled?: boolean\n}\n\nexport interface ToggleButtonGroupSingleProps extends ToggleButtonGroupBaseProps {\n /** `single`: no máximo um botão pressionado (clicar no pressionado o solta). */\n type: 'single'\n /** Valor pressionado (controlado). `null` quando nenhum. */\n value?: string | null\n /** Valor inicial (não controlado). */\n defaultValue?: string | null\n onChange?: (value: string | null) => void\n}\n\nexport interface ToggleButtonGroupMultipleProps extends ToggleButtonGroupBaseProps {\n /** `multiple`: qualquer combinação de botões pressionados. */\n type: 'multiple'\n /** Valores pressionados (controlado). */\n value?: string[]\n /** Valores iniciais (não controlado). */\n defaultValue?: string[]\n onChange?: (value: string[]) => void\n}\n\nexport type ToggleButtonGroupProps = ToggleButtonGroupSingleProps | ToggleButtonGroupMultipleProps\n\ntype GroupValue = string | null | string[]\n\n/**\n * Agrupa ToggleButtons relacionados (`role=\"group\"`) e controla quais estão\n * pressionados. Cada botão continua sendo um `aria-pressed` independente.\n * Para uma escolha exclusiva e obrigatória, prefira o SegmentedControl.\n */\nexport const ToggleButtonGroup = forwardRef<HTMLDivElement, ToggleButtonGroupProps>(\n function ToggleButtonGroup(props, ref) {\n const {\n type,\n value: valueProp,\n defaultValue,\n onChange,\n attached = false,\n orientation,\n size,\n variant,\n disabled,\n className,\n children,\n ...rest\n } = props\n const multiple = type === 'multiple'\n\n const [value, setValue] = useControllableState<GroupValue>({\n value: valueProp,\n defaultValue: defaultValue ?? (multiple ? [] : null),\n onChange: onChange as ((value: GroupValue) => void) | undefined,\n })\n\n const isPressed = useCallback(\n (item: string) => (Array.isArray(value) ? value.includes(item) : value === item),\n [value],\n )\n\n const toggle = useCallback(\n (item: string) => {\n setValue((prev) => {\n if (multiple) {\n const list = Array.isArray(prev) ? prev : []\n return list.includes(item) ? list.filter((v) => v !== item) : [...list, item]\n }\n return prev === item ? null : item\n })\n },\n [multiple, setValue],\n )\n\n const ctx = useMemo<ToggleGroupContextValue>(() => ({ isPressed, toggle }), [isPressed, toggle])\n\n return (\n <ToggleGroupContext.Provider value={ctx}>\n <ButtonGroup\n ref={ref}\n attached={attached}\n orientation={orientation}\n size={size}\n variant={variant}\n disabled={disabled}\n className={cx('or-toggle-button-group', className)}\n data-type={type}\n {...rest}\n >\n {children}\n </ButtonGroup>\n </ToggleGroupContext.Provider>\n )\n },\n)\n","import {\n forwardRef,\n useMemo,\n useState,\n type ButtonHTMLAttributes,\n type FocusEvent as ReactFocusEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId, useMounted, usePresence } from '../../hooks'\nimport { Icon, type IconName } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { composeEventHandlers, cx, mergeRefs } from '../../utils'\nimport { getThemeScope, useLayer } from '../Modal/overlay'\nimport { useFloatingPanel, type FloatingPlacement } from '../Popover/floating'\nimport { Portal } from '../Portal'\nimport './Toggletip.css'\n\nexport type ToggletipPlacement = FloatingPlacement\nexport type ToggletipSize = 'sm' | 'md'\n\nexport interface ToggletipProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'content' | 'children'\n> {\n /** Explicação exibida na bolha e anunciada por leitores de tela. Evite links e botões. */\n content: ReactNode\n /** Nome acessível do botão. Padrão: \"Mais informações\". Prefira algo específico: \"Sobre a taxa de conversão\". */\n label?: string\n /** Posição preferida da bolha; inverte sozinha se faltar espaço. */\n placement?: ToggletipPlacement\n /** Distância do botão, em px. */\n offset?: number\n /** Ícone do botão. */\n icon?: IconName\n /** Tamanho do botão: `sm` 24px, `md` 32px. */\n size?: ToggletipSize\n /** Aberto (controlado). */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando a bolha abre ou fecha. */\n onOpenChange?: (open: boolean) => void\n}\n\n/**\n * Botão de informação que mostra uma explicação curta ao ser clicado. O\n * conteúdo entra numa região `aria-live`, então é anunciado mesmo sem mover o\n * foco (padrão \"toggletip\" do Inclusive Components).\n */\nexport const Toggletip = forwardRef<HTMLButtonElement, ToggletipProps>(function Toggletip(\n {\n content,\n label,\n placement = 'top',\n offset = 8,\n icon = 'info',\n size = 'sm',\n open,\n defaultOpen = false,\n onOpenChange,\n className,\n onClick,\n onBlur,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const mounted = useMounted()\n const visible = isOpen && mounted\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(visible)\n // Cada abertura monta uma bolha nova na região viva — inclusive se reabrir\n // durante a animação de saída —, garantindo que o texto seja anunciado de novo.\n const [openings, setOpenings] = useState(0)\n const [wasVisible, setWasVisible] = useState(visible)\n if (wasVisible !== visible) {\n setWasVisible(visible)\n if (visible) setOpenings((count) => count + 1)\n }\n const bubbleId = useId('or-toggletip')\n const [buttonEl, setButtonEl] = useState<HTMLButtonElement | null>(null)\n const [bubbleEl, setBubbleEl] = useState<HTMLDivElement | null>(null)\n\n const floating = useFloatingPanel({\n open: present,\n reference: buttonEl,\n floating: bubbleEl,\n placement,\n offset,\n arrow: true,\n })\n\n const { setNode, layerProps } = useLayer(visible, {\n onEscape: () => setOpen(false),\n onPointerDownOutside: () => setOpen(false),\n insideElements: () => [buttonEl],\n })\n\n const buttonRef = useMemo(() => mergeRefs<HTMLButtonElement>(ref, setButtonEl), [ref])\n const bubbleRef = useMemo(\n () => mergeRefs<HTMLDivElement>(setBubbleEl, setNode, nodeRef),\n [setNode, nodeRef],\n )\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n className={cx('or-toggletip-button', `or-toggletip-button--${size}`, className)}\n aria-label={label ?? t('moreInfo')}\n aria-expanded={visible}\n onClick={composeEventHandlers(onClick, (_event: ReactMouseEvent<HTMLButtonElement>) =>\n setOpen((v) => !v),\n )}\n onBlur={composeEventHandlers(onBlur, (event: ReactFocusEvent<HTMLButtonElement>) => {\n // Fecha quando o foco vai para outro controle (Tab, clique em outro campo).\n const next = event.relatedTarget as Node | null\n if (next && !bubbleEl?.contains(next)) setOpen(false)\n })}\n {...rest}\n >\n <Icon name={icon} size={size === 'sm' ? 'sm' : 'md'} />\n </button>\n <Portal>\n {/* A região existe desde a montagem; inserir a bolha nela dispara o anúncio. */}\n <div role=\"status\" aria-live=\"polite\" className=\"or-toggletip-region\">\n {present && (\n <div\n key={openings}\n ref={bubbleRef}\n id={bubbleId}\n data-state={state}\n data-side={floating.side}\n data-theme={getThemeScope(buttonEl)}\n className=\"or-floating or-toggletip\"\n style={floating.floatingStyles}\n {...layerProps}\n >\n {content}\n <span\n ref={floating.arrowRef}\n className=\"or-floating-arrow\"\n data-side={floating.side}\n style={floating.arrowStyle}\n aria-hidden=\"true\"\n />\n </div>\n )}\n </div>\n </Portal>\n </>\n )\n})\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { useIsomorphicLayoutEffect, useRovingFocus } from '../../hooks'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport type { ButtonSize } from '../Button'\nimport { ButtonGroup, type ButtonGroupProps } from '../ButtonGroup/ButtonGroup'\nimport {\n ActionGroupContext,\n applyGroupDefaults,\n useActionGroup,\n type ActionGroupContextValue,\n} from '../ButtonGroup/context'\nimport './Toolbar.css'\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical'\n\nconst ITEM_SELECTOR = '[data-roving-item]'\nconst ENABLED_ITEM_SELECTOR = '[data-roving-item]:not([disabled])'\n\n/** Campos de texto usam as setas para mover o cursor: a Toolbar não interfere. */\nfunction capturesArrowKeys(target: EventTarget | null) {\n if (!(target instanceof HTMLElement)) return false\n if (\n target.isContentEditable ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement\n )\n return true\n if (target instanceof HTMLInputElement) {\n return !['button', 'checkbox', 'reset', 'submit', 'image', 'color', 'file'].includes(\n target.type,\n )\n }\n return false\n}\n\nexport interface ToolbarProps extends HTMLAttributes<HTMLDivElement> {\n /** Direção da barra. Define quais setas movem o foco (←/→ ou ↑/↓). */\n orientation?: ToolbarOrientation\n /** Tamanho repassado aos botões da barra. */\n size?: ButtonSize\n /** Volta ao primeiro item depois do último (e vice-versa). */\n loop?: boolean\n /** Desenha a moldura (borda e fundo) da barra. */\n bordered?: boolean\n}\n\n/**\n * Barra de ferramentas (`role=\"toolbar\"`) com roving tabindex: a barra inteira\n * ocupa uma única parada de Tab e as setas movem o foco entre os itens.\n * Itens são os elementos com `data-roving-item` — IconButton, ToggleButton,\n * CopyButton, SplitButton e os `Button` filhos diretos são marcados\n * automaticamente.\n */\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(function Toolbar(\n {\n orientation = 'horizontal',\n size,\n loop = true,\n bordered = true,\n className,\n children,\n onKeyDown,\n onFocus,\n ...rest\n },\n ref,\n) {\n devWarning(\n !rest['aria-label'] && !rest['aria-labelledby'],\n 'Toolbar precisa de `aria-label` ou `aria-labelledby` (ex.: \"Formatação de texto\").',\n )\n\n const containerRef = useRef<HTMLDivElement>(null)\n const activeRef = useRef<HTMLElement | null>(null)\n const roving = useRovingFocus(containerRef, {\n orientation,\n loop,\n selector: ENABLED_ITEM_SELECTOR,\n })\n\n /** Garante uma única parada de Tab: o último item focado (ou o primeiro habilitado). */\n const syncTabStops = useCallback(() => {\n const container = containerRef.current\n if (!container) return\n const items = Array.from(container.querySelectorAll<HTMLElement>(ITEM_SELECTOR))\n const enabled = items.filter((el) => !el.hasAttribute('disabled'))\n if (!activeRef.current || !enabled.includes(activeRef.current))\n activeRef.current = enabled[0] ?? null\n for (const el of items) {\n const value = el === activeRef.current ? '0' : '-1'\n if (el.getAttribute('tabindex') !== value) el.setAttribute('tabindex', value)\n }\n }, [])\n\n useIsomorphicLayoutEffect(syncTabStops)\n\n // Itens podem surgir, sumir ou ser desabilitados sem que a Toolbar renderize.\n useEffect(() => {\n const container = containerRef.current\n if (!container || typeof MutationObserver === 'undefined') return\n const observer = new MutationObserver(syncTabStops)\n observer.observe(container, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['disabled', 'data-roving-item'],\n })\n return () => observer.disconnect()\n }, [syncTabStops])\n\n const handleFocus = (event: FocusEvent<HTMLDivElement>) => {\n onFocus?.(event)\n const target = event.target as HTMLElement\n const item = target.closest<HTMLElement>(ITEM_SELECTOR)\n if (item && containerRef.current?.contains(item) && item !== activeRef.current) {\n activeRef.current = item\n syncTabStops()\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey) return\n // Eventos de portais (ex.: menu do SplitButton) borbulham pela árvore React.\n if (!containerRef.current?.contains(event.target as Node)) return\n if (capturesArrowKeys(event.target)) return\n roving(event)\n }\n\n const ctx = useMemo<ActionGroupContextValue>(\n () => ({ size, variant: 'ghost', orientation, roving: true }),\n [size, orientation],\n )\n\n return (\n <ActionGroupContext.Provider value={ctx}>\n <div\n ref={mergeRefs(ref, containerRef)}\n role=\"toolbar\"\n aria-orientation={orientation}\n className={cx(\n 'or-toolbar',\n `or-toolbar--${orientation}`,\n bordered && 'or-toolbar--bordered',\n className,\n )}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n {...rest}\n >\n {applyGroupDefaults(children, ctx)}\n </div>\n </ActionGroupContext.Provider>\n )\n})\n\nexport type ToolbarGroupProps = ButtonGroupProps\n\n/**\n * Agrupa itens relacionados dentro da Toolbar (`role=\"group\"`). Use\n * `aria-label` quando o agrupamento tiver um nome (\"Alinhamento\").\n */\nexport const ToolbarGroup = forwardRef<HTMLDivElement, ToolbarGroupProps>(function ToolbarGroup(\n { className, ...rest },\n ref,\n) {\n return <ButtonGroup ref={ref} className={cx('or-toolbar__group', className)} {...rest} />\n})\n\nexport type ToolbarSeparatorProps = HTMLAttributes<HTMLDivElement>\n\n/** Divisor visual entre grupos de uma Toolbar (`role=\"separator\"`, não focável). */\nexport const ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(\n function ToolbarSeparator({ className, ...rest }, ref) {\n const orientation = useActionGroup()?.orientation ?? 'horizontal'\n const separatorOrientation = orientation === 'horizontal' ? 'vertical' : 'horizontal'\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={separatorOrientation}\n className={cx('or-toolbar__separator', className)}\n {...rest}\n />\n )\n },\n)\n","import {\n cloneElement,\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type FocusEvent as ReactFocusEvent,\n type HTMLAttributes,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId, useMounted, usePresence } from '../../hooks'\nimport { composeEventHandlers, cx, mergeRefs } from '../../utils'\nimport { getThemeScope, isFocusVisible, useLayer } from '../Modal/overlay'\nimport {\n joinIds,\n useFloatingPanel,\n useTriggerElement,\n type FloatingPlacement,\n} from '../Popover/floating'\nimport { Portal } from '../Portal'\nimport './Tooltip.css'\n\nexport type TooltipPlacement = FloatingPlacement\n\nexport interface TooltipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content' | 'children'> {\n /** Texto curto e não interativo (sem links ou botões). */\n content: ReactNode\n /** Gatilho focável (um único elemento, ex.: `Button`). Recebe `aria-describedby`. */\n children: ReactElement\n /** Posição preferida; inverte sozinha se faltar espaço. */\n placement?: TooltipPlacement\n /** Atraso para abrir no hover, em ms. No foco por teclado abre na hora. */\n delay?: number\n /** Atraso para fechar ao sair com o ponteiro, em ms (tempo para alcançar o tooltip). */\n closeDelay?: number\n /** Distância do gatilho, em px. */\n offset?: number\n /** Mostra a seta apontando para o gatilho. */\n arrow?: boolean\n /** Aberto (controlado). */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o tooltip abre ou fecha. */\n onOpenChange?: (open: boolean) => void\n /** Desliga o tooltip (o gatilho é renderizado sem alterações). */\n disabled?: boolean\n}\n\n// Depois que um tooltip fecha, o próximo abre sem atraso por um instante\n// (percorrer uma barra de ferramentas com o mouse fica fluido).\nlet lastClosedAt = 0\nconst WARM_WINDOW = 300\n\n/**\n * Rótulo curto que aparece ao passar o ponteiro ou focar um elemento.\n * Complementa (não substitui) o nome acessível do gatilho.\n */\nexport const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(function Tooltip(\n {\n content,\n children,\n placement = 'top',\n delay = 400,\n closeDelay = 150,\n offset = 8,\n arrow = true,\n open,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n className,\n style,\n onPointerEnter,\n onPointerLeave,\n ...rest\n },\n ref,\n) {\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const mounted = useMounted()\n const visible = isOpen && mounted && !disabled\n // Continua visível durante a saída (fade rápido de volta ao gatilho).\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(visible)\n const tooltipId = useId('or-tooltip')\n const [triggerEl, triggerRef] = useTriggerElement(children)\n const [tooltipEl, setTooltipEl] = useState<HTMLDivElement | null>(null)\n const openTimer = useRef<number | undefined>(undefined)\n const closeTimer = useRef<number | undefined>(undefined)\n const pointerFocus = useRef(false)\n\n const floating = useFloatingPanel({\n open: present,\n reference: triggerEl,\n floating: tooltipEl,\n placement,\n offset,\n arrow,\n })\n\n const clearTimers = () => {\n window.clearTimeout(openTimer.current)\n window.clearTimeout(closeTimer.current)\n }\n\n const show = (immediate = false) => {\n window.clearTimeout(closeTimer.current)\n if (isOpen) return\n window.clearTimeout(openTimer.current)\n if (immediate || delay <= 0 || Date.now() - lastClosedAt < WARM_WINDOW) setOpen(true)\n else openTimer.current = window.setTimeout(() => setOpen(true), delay)\n }\n\n const hide = (immediate = false) => {\n window.clearTimeout(openTimer.current)\n window.clearTimeout(closeTimer.current)\n if (!isOpen) return\n const close = () => {\n lastClosedAt = Date.now()\n setOpen(false)\n }\n if (immediate || closeDelay <= 0) close()\n else closeTimer.current = window.setTimeout(close, closeDelay)\n }\n\n useEffect(() => clearTimers, [])\n\n // Escape fecha sem mover o foco nem o ponteiro (WCAG 1.4.13).\n const { setNode, layerProps } = useLayer(visible, { onEscape: () => hide(true) })\n\n const tooltipRef = useMemo(\n () => mergeRefs<HTMLDivElement>(setTooltipEl, setNode, nodeRef, ref),\n [setNode, nodeRef, ref],\n )\n\n if (disabled) return children\n\n const childProps = children.props as HTMLAttributes<HTMLElement>\n const trigger = cloneElement(\n children as ReactElement<HTMLAttributes<HTMLElement> & { ref?: unknown }>,\n {\n ref: triggerRef,\n 'aria-describedby': joinIds(childProps['aria-describedby'], tooltipId),\n onPointerEnter: composeEventHandlers(\n childProps.onPointerEnter,\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.pointerType !== 'touch') show()\n },\n ),\n onPointerLeave: composeEventHandlers(\n childProps.onPointerLeave,\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.pointerType !== 'touch') hide()\n },\n ),\n onPointerDown: composeEventHandlers(childProps.onPointerDown, () => {\n // o foco que vem do clique não reabre o tooltip\n pointerFocus.current = true\n window.setTimeout(() => (pointerFocus.current = false), 0)\n hide(true)\n }),\n onFocus: composeEventHandlers(childProps.onFocus, (event: ReactFocusEvent<HTMLElement>) => {\n if (!pointerFocus.current && isFocusVisible(event.currentTarget)) show(true)\n }),\n onBlur: composeEventHandlers(childProps.onBlur, () => hide(true)),\n },\n )\n\n return (\n <>\n {trigger}\n <Portal>\n <div\n ref={present ? tooltipRef : undefined}\n id={tooltipId}\n role=\"tooltip\"\n hidden={!present}\n data-state={present ? state : undefined}\n data-side={floating.side}\n data-theme={present ? getThemeScope(triggerEl) : undefined}\n className={cx('or-floating', 'or-tooltip', className)}\n style={present ? { ...floating.floatingStyles, ...style } : style}\n onPointerEnter={composeEventHandlers(onPointerEnter, () =>\n window.clearTimeout(closeTimer.current),\n )}\n onPointerLeave={composeEventHandlers(onPointerLeave, () => hide())}\n {...rest}\n {...(visible ? layerProps : {})}\n >\n {content}\n {arrow && (\n <span\n ref={floating.arrowRef}\n className=\"or-floating-arrow\"\n data-side={floating.side}\n style={floating.arrowStyle}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </Portal>\n </>\n )\n})\n","import {\n arrow as arrowMiddleware,\n autoPlacement,\n autoUpdate,\n flip,\n offset as offsetMiddleware,\n shift,\n size,\n useFloating,\n type Middleware,\n} from '@floating-ui/react-dom'\nimport {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent as ReactFocusEvent,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type Ref,\n type RefObject,\n} from 'react'\nimport {\n useControllableState,\n useFocusTrap,\n useId,\n useIsomorphicLayoutEffect,\n useLockBodyScroll,\n useMediaQuery,\n useMounted,\n usePresence,\n useReducedMotion,\n} from '../../hooks'\nimport { Icon } from '../../icons'\nimport { useLocale } from '../../providers'\nimport { canUseDOM, clamp, cx, devWarning, getFocusableElements, mergeRefs } from '../../utils'\nimport { Button } from '../Button'\nimport { focusElement, getThemeScope, useLayer } from '../Modal/overlay'\nimport { Portal } from '../Portal'\nimport './Tour.css'\n\nexport type TourPlacement = 'top' | 'bottom' | 'left' | 'right' | 'auto'\n\n/** Alvo de um passo: seletor CSS, ref ou função que devolve o elemento. */\nexport type TourTarget = string | RefObject<Element | null> | (() => Element | null)\n\nexport interface TourStep {\n /**\n * Elemento destacado pelo recorte. Seletor CSS, ref ou função. Sem alvo — ou\n * com um alvo que não existe na página — o passo aparece centralizado, sem recorte.\n */\n target?: TourTarget\n /** Título do passo; nomeia o diálogo (junto com o `label` do tour). */\n title: ReactNode\n /** Texto do passo; descreve o diálogo via `aria-describedby`. */\n content: ReactNode\n /** Lado do alvo onde o diálogo aparece. `auto` escolhe o lado com mais espaço. */\n placement?: TourPlacement\n /** Imagem, vídeo ou ilustração exibida acima do título. */\n media?: ReactNode\n}\n\nexport interface TourProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'content' | 'children'> {\n /** Passos do tour, na ordem. */\n steps: TourStep[]\n /** Aberto (controlado). Use com `onOpenChange`. */\n open?: boolean\n /** Aberto inicialmente (não controlado). */\n defaultOpen?: boolean\n /** Chamado quando o tour abre ou fecha (concluir, pular, Escape). */\n onOpenChange?: (open: boolean) => void\n /** Índice do passo atual, a partir de 0 (controlado). Use com `onStepChange`. */\n step?: number\n /** Passo inicial (não controlado). O tour volta para ele ao fechar. */\n defaultStep?: number\n /** Chamado com o índice do passo pedido (Próximo/Voltar). */\n onStepChange?: (step: number) => void\n /** Chamado ao clicar em \"Concluir\" no último passo. */\n onFinish?: () => void\n /** Chamado com o índice do passo atual ao pular (botão \"Pular tour\" ou Escape). */\n onSkip?: (step: number) => void\n /** Nome do tour (ex.: \"Novidades do painel\"). Aparece como eyebrow e abre o nome acessível do diálogo. */\n label?: string\n /** Folga entre o alvo e a borda do recorte, em px. */\n spotlightPadding?: number\n /** Permite sair antes do fim: mostra \"Pular tour\" e aceita Escape. */\n dismissible?: boolean\n}\n\ntype TourMode = 'anchored' | 'center' | 'sheet'\ntype TourSide = 'top' | 'right' | 'bottom' | 'left'\ninterface Hole {\n x: number\n y: number\n w: number\n h: number\n}\n\n/** Distância entre a borda do recorte e o diálogo (inclui a seta), em px. */\nconst DIALOG_GAP = 12\n/** Margem mínima entre o diálogo e a borda da tela, em px. */\nconst VIEWPORT_PADDING = 12\n/** Transform do diálogo centralizado (só transform — assim ele desliza entre os modos). */\nconst CENTER_TRANSFORM = 'translate(calc(50vw - 50%), calc(50vh - 50%))'\n/** Janela em que o recorte e o diálogo deslizam após uma troca de passo, em ms. */\nconst GLIDE_WINDOW = 700\n\n/** Middleware que registra para qual alvo a posição foi calculada. */\nconst referenceMiddleware: Middleware = {\n name: 'orTourReference',\n fn: ({ elements }) => ({ data: { reference: elements.reference } }),\n}\n\nfunction resolveTarget(target: TourTarget | undefined): Element | null {\n if (!target || !canUseDOM) return null\n let element: Element | null = null\n if (typeof target === 'string') {\n try {\n element = document.querySelector(target)\n } catch {\n element = null\n }\n } else if (typeof target === 'function') {\n element = target()\n } else {\n element = target.current\n }\n return element?.isConnected ? element : null\n}\n\n/** O alvo (com a folga do recorte) está inteiro na tela? Elementos sem caixa contam como visíveis. */\nfunction isFullyVisible(element: Element, margin: number) {\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0) return true\n return (\n rect.top >= margin &&\n rect.left >= margin &&\n rect.bottom <= window.innerHeight - margin &&\n rect.right <= window.innerWidth - margin\n )\n}\n\n/** Espera o alvo parar de se mover (fim da rolagem suave) e chama `done`. */\nfunction waitForScrollEnd(element: Element, done: () => void) {\n let frame = 0\n let last = ''\n let stableFrames = 0\n const start = performance.now()\n const tick = () => {\n const rect = element.getBoundingClientRect()\n const key = `${Math.round(rect.top)}:${Math.round(rect.left)}`\n stableFrames = key === last ? stableFrames + 1 : 0\n last = key\n if (stableFrames >= 3 || performance.now() - start > 1000) {\n done()\n return\n }\n frame = requestAnimationFrame(tick)\n }\n frame = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(frame)\n}\n\n/**\n * Escreve o recorte como variáveis CSS na raiz (sem re-renderizar o React a\n * cada quadro de rolagem). Sem alvo, o recorte se fecha num ponto.\n */\nfunction paintSpotlight(\n root: HTMLElement,\n target: Element | null,\n padding: number,\n lastHole: { current: Hole | null },\n) {\n const vw = root.clientWidth || window.innerWidth\n const vh = root.clientHeight || window.innerHeight\n let hole: Hole\n if (target) {\n const rect = target.getBoundingClientRect()\n const left = clamp(Math.floor(rect.left - padding), 0, vw)\n const top = clamp(Math.floor(rect.top - padding), 0, vh)\n const right = clamp(Math.ceil(rect.right + padding), left, vw)\n const bottom = clamp(Math.ceil(rect.bottom + padding), top, vh)\n hole = { x: left, y: top, w: right - left, h: bottom - top }\n } else {\n const previous = lastHole.current\n hole = {\n x: Math.round(previous ? previous.x + previous.w / 2 : vw / 2),\n y: Math.round(previous ? previous.y + previous.h / 2 : vh / 2),\n w: 0,\n h: 0,\n }\n }\n lastHole.current = hole\n const style = root.style\n style.setProperty('--_hx', String(hole.x))\n style.setProperty('--_hy', String(hole.y))\n style.setProperty('--_hw', String(hole.w))\n style.setProperty('--_hh', String(hole.h))\n // Telas estreitas: a folha fica na metade oposta à do alvo.\n root.setAttribute('data-dock', target && hole.y + hole.h / 2 > vh / 2 ? 'top' : 'bottom')\n}\n\n/**\n * Tour guiado (onboarding com spotlight): apresenta novidades passo a passo,\n * destacando cada elemento com um recorte na tela escurecida. Cada passo é um\n * diálogo modal — o foco fica preso, vai para o título a cada passo e volta\n * para onde estava ao fechar. O alvo destacado não recebe cliques enquanto o\n * tour está aberto.\n */\nexport const Tour = forwardRef<HTMLDivElement, TourProps>(function Tour(\n {\n steps,\n open,\n defaultOpen = false,\n onOpenChange,\n step: stepProp,\n defaultStep = 0,\n onStepChange,\n onFinish,\n onSkip,\n label,\n spotlightPadding = 8,\n dismissible = true,\n className,\n onKeyDown,\n onFocus,\n ...rest\n },\n ref,\n) {\n const { t } = useLocale()\n const mounted = useMounted()\n const reducedMotion = useReducedMotion()\n const narrow = useMediaQuery('(max-width: 40rem)')\n const total = steps.length\n const lastIndex = Math.max(0, total - 1)\n devWarning(total === 0, 'Tour precisa de pelo menos um passo em `steps`.')\n\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const active = isOpen && mounted && total > 0\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(active)\n\n // Passo pedido (controlado ou não) × passo exibido: a troca espera a rolagem até o novo alvo.\n const silentRef = useRef(false)\n const [requestedStep, setRequestedStep] = useControllableState({\n value: stepProp,\n defaultValue: defaultStep,\n onChange: (value: number) => {\n if (!silentRef.current) onStepChange?.(value)\n },\n })\n const requestedIndex = clamp(requestedStep, 0, lastIndex)\n const [shownIndex, setShownIndex] = useState(requestedIndex)\n const [glide, setGlide] = useState(false)\n const openerRef = useRef<Element | null>(null)\n const [wasActive, setWasActive] = useState(active)\n if (wasActive !== active) {\n setWasActive(active)\n if (active) {\n if (canUseDOM) openerRef.current = document.activeElement\n setShownIndex(requestedIndex)\n setGlide(false)\n }\n }\n const index = clamp(shownIndex, 0, lastIndex)\n const current = steps[index] as TourStep | undefined\n const isFirst = index === 0\n const isLast = index === lastIndex\n\n const labelId = useId('or-tour-label')\n const titleId = useId('or-tour-title')\n const contentId = useId('or-tour-content')\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n const dialogRef = useRef<HTMLDivElement | null>(null)\n const headingRef = useRef<HTMLHeadingElement | null>(null)\n const arrowRef = useRef<HTMLSpanElement | null>(null)\n const lastFocusedRef = useRef<HTMLElement | null>(null)\n const holeRef = useRef<Hole | null>(null)\n const lastTransformRef = useRef<string | undefined>(undefined)\n const [positionerEl, setPositionerEl] = useState<HTMLDivElement | null>(null)\n\n // Alvo do passo exibido. Resolvido a cada render (refs, seletores e funções\n // podem mudar) — no layout effect e de novo no passivo, quando todas as refs\n // da página já foram ligadas. Durante a saída, o último alvo é mantido.\n const [target, setTarget] = useState<Element | null>(null)\n const targetRef = useRef<Element | null>(null)\n const stepTarget = current?.target\n const syncTarget = () => {\n if (!active) return\n const element = resolveTarget(stepTarget)\n if (element !== targetRef.current) {\n targetRef.current = element\n setTarget(element)\n }\n }\n useIsomorphicLayoutEffect(syncTarget)\n useEffect(syncTarget)\n\n const scrollBehavior: ScrollBehavior = reducedMotion ? 'auto' : 'smooth'\n\n // Troca de passo: rola o novo alvo para a vista e só então mostra o passo.\n useIsomorphicLayoutEffect(() => {\n if (!active || requestedIndex === shownIndex) return\n const commit = () => {\n setGlide(true)\n setShownIndex(requestedIndex)\n }\n const next = resolveTarget(steps[requestedIndex]?.target)\n if (!next || isFullyVisible(next, spotlightPadding)) {\n commit()\n return\n }\n next.scrollIntoView({ block: 'center', inline: 'nearest', behavior: scrollBehavior })\n // Movimento reduzido: a rolagem é instantânea, nada a esperar.\n if (reducedMotion) {\n commit()\n return\n }\n return waitForScrollEnd(next, commit)\n }, [active, requestedIndex, shownIndex])\n\n // Ao abrir (ou se o alvo mudar), garante que ele esteja na tela.\n useEffect(() => {\n if (!active || !target) return\n if (!isFullyVisible(target, spotlightPadding))\n target.scrollIntoView({ block: 'center', inline: 'nearest', behavior: scrollBehavior })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active, target])\n\n // O recorte e o diálogo só deslizam logo após uma troca de passo; fora disso\n // (rolagem, redimensionamento) acompanham o alvo sem atraso.\n useEffect(() => {\n if (!glide) return\n const timer = window.setTimeout(() => setGlide(false), GLIDE_WINDOW)\n return () => window.clearTimeout(timer)\n }, [glide, index])\n\n // Passo não controlado: ao fechar, volta ao passo inicial (sem disparar onStepChange).\n const openedOnceRef = useRef(false)\n useEffect(() => {\n if (active) {\n openedOnceRef.current = true\n return\n }\n if (!openedOnceRef.current || stepProp !== undefined) return\n silentRef.current = true\n setRequestedStep(defaultStep)\n silentRef.current = false\n }, [active, stepProp, defaultStep, setRequestedStep])\n\n // Foco: ao abrir vai para o título (useFocusTrap) e volta para quem estava focado ao fechar.\n useFocusTrap(dialogRef, active, { initialFocus: headingRef })\n\n // A cada troca de passo, o foco vai para o título do novo passo.\n const focusedIndexRef = useRef<number | null>(null)\n useEffect(() => {\n if (!active) {\n focusedIndexRef.current = null\n return\n }\n if (focusedIndexRef.current === null) {\n focusedIndexRef.current = index\n return\n }\n if (focusedIndexRef.current === index) return\n focusedIndexRef.current = index\n focusElement(headingRef.current ?? dialogRef.current)\n }, [active, index])\n\n const close = () => setOpen(false)\n const finish = () => {\n onFinish?.()\n close()\n }\n const skip = () => {\n onSkip?.(index)\n close()\n }\n const goNext = () => {\n if (isLast) finish()\n else setRequestedStep(index + 1)\n }\n const goBack = () => {\n if (!isFirst) setRequestedStep(index - 1)\n }\n\n // Camada modal: Escape (se dispensável) e foco que escapa voltam para o diálogo.\n const { setNode, layerProps } = useLayer(active, {\n modal: true,\n onEscape: dismissible ? () => skip() : undefined,\n onFocusOutside: () =>\n focusElement(lastFocusedRef.current?.isConnected ? lastFocusedRef.current : dialogRef.current),\n })\n\n useLockBodyScroll(active)\n\n // Posição do diálogo.\n const mode: TourMode = narrow ? 'sheet' : target ? 'anchored' : 'center'\n const placement = current?.placement ?? 'auto'\n const floating = useFloating({\n open: present && mode === 'anchored',\n strategy: 'fixed',\n placement: placement === 'auto' ? 'bottom' : placement,\n transform: false,\n elements: {\n reference: mode === 'anchored' ? target : null,\n floating: mode === 'anchored' ? positionerEl : null,\n },\n whileElementsMounted: autoUpdate,\n middleware: [\n offsetMiddleware(spotlightPadding + DIALOG_GAP),\n placement === 'auto'\n ? autoPlacement({\n allowedPlacements: ['bottom', 'top', 'right', 'left'],\n padding: VIEWPORT_PADDING,\n })\n : flip({ padding: VIEWPORT_PADDING }),\n shift({ padding: VIEWPORT_PADDING }),\n size({\n padding: VIEWPORT_PADDING,\n apply({ availableHeight, elements }) {\n elements.floating.style.setProperty(\n '--_tour-available-height',\n `${Math.max(0, Math.floor(availableHeight))}px`,\n )\n },\n }),\n arrowMiddleware({ element: arrowRef, padding: 8 }),\n referenceMiddleware,\n ],\n })\n const side = floating.placement.split('-')[0] as TourSide\n const positionedFor = (floating.middlewareData.orTourReference as { reference?: unknown } | undefined)\n ?.reference\n const fresh = floating.isPositioned && positionedFor === target\n let transform: string | undefined\n if (mode === 'center') transform = CENTER_TRANSFORM\n else if (mode === 'anchored')\n transform = fresh\n ? `translate(${Math.round(floating.x)}px, ${Math.round(floating.y)}px)`\n : (lastTransformRef.current ?? CENTER_TRANSFORM)\n useIsomorphicLayoutEffect(() => {\n lastTransformRef.current = transform\n })\n const arrowData = floating.middlewareData.arrow\n const arrowStyle: CSSProperties = {\n left: arrowData?.x != null ? `${arrowData.x}px` : undefined,\n top: arrowData?.y != null ? `${arrowData.y}px` : undefined,\n }\n\n // Recorte: acompanha o alvo (rolagem, redimensionamento, mudanças de layout).\n useIsomorphicLayoutEffect(() => {\n const root = rootRef.current\n if (!present || !root) return\n const paint = () => paintSpotlight(root, target, spotlightPadding, holeRef)\n if (!target) {\n paint()\n return\n }\n return autoUpdate(target, root, paint)\n }, [present, target, spotlightPadding])\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented || event.key !== 'Tab' || !event.shiftKey) return\n // Shift+Tab a partir do título (foco programático) dá a volta para o último controle.\n const dialog = dialogRef.current\n const heading = headingRef.current\n if (!dialog || !heading || document.activeElement !== heading) return\n const items = getFocusableElements(dialog).filter((el) => el.tabIndex >= 0)\n const before = items.filter(\n (el) => heading.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_PRECEDING,\n )\n if (before.length > 0) return\n event.preventDefault()\n focusElement(items[items.length - 1] ?? dialog)\n }\n\n const handleFocus = (event: ReactFocusEvent<HTMLDivElement>) => {\n onFocus?.(event)\n if (dialogRef.current?.contains(event.target)) lastFocusedRef.current = event.target as HTMLElement\n }\n\n const rootRefs = useMemo(() => mergeRefs<HTMLDivElement>(rootRef, setNode), [setNode])\n const dialogRefs = useMemo(\n () => mergeRefs<HTMLDivElement>(dialogRef, nodeRef as Ref<HTMLDivElement>, ref),\n [nodeRef, ref],\n )\n\n const tourLabel = label ?? t('tourLabel')\n\n return (\n <Portal>\n {present && current && (\n <div\n ref={rootRefs}\n className=\"or-tour\"\n data-state={state}\n data-mode={mode}\n data-spotlight={target ? 'on' : 'off'}\n data-glide={glide || undefined}\n data-theme={getThemeScope(target ?? openerRef.current)}\n inert={state === 'closed' || undefined}\n {...layerProps}\n >\n {/* Fundo escurecido com o recorte. Cobre a tela toda (inclusive o alvo): o tour é modal. */}\n <div\n className=\"or-tour__spotlight\"\n aria-hidden=\"true\"\n onMouseDown={(event) => event.preventDefault()}\n >\n <span className=\"or-tour__shade or-tour__shade--top\" />\n <span className=\"or-tour__shade or-tour__shade--bottom\" />\n <span className=\"or-tour__shade or-tour__shade--left\" />\n <span className=\"or-tour__shade or-tour__shade--right\" />\n <span className=\"or-tour__ring or-tour__ring--top\" />\n <span className=\"or-tour__ring or-tour__ring--bottom\" />\n <span className=\"or-tour__ring or-tour__ring--left\" />\n <span className=\"or-tour__ring or-tour__ring--right\" />\n </div>\n <div ref={setPositionerEl} className=\"or-tour__positioner\" style={{ transform }}>\n {/* onKeyDown só gerencia o Tab (ordem de foco); o diálogo em si não é um controle. */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <div\n ref={dialogRefs}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={`${labelId} ${titleId}`}\n aria-describedby={contentId}\n tabIndex={-1}\n data-state={state}\n data-side={mode === 'anchored' ? side : undefined}\n className={cx('or-tour__dialog', 'or-motion-pop', className)}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n {...rest}\n >\n {mode === 'anchored' && (\n <span\n ref={arrowRef}\n className=\"or-tour__arrow\"\n data-side={side}\n style={arrowStyle}\n aria-hidden=\"true\"\n />\n )}\n <div className=\"or-tour__header\">\n <p id={labelId} className=\"or-eyebrow or-tour__label\">\n {tourLabel}\n </p>\n {dismissible && (\n <Button variant=\"ghost\" size=\"sm\" className=\"or-tour__skip\" onClick={skip}>\n {t('tourSkip')}\n </Button>\n )}\n </div>\n <div className=\"or-tour__scroll\">\n <div key={index} className=\"or-tour__step\">\n {current.media && <div className=\"or-tour__media\">{current.media}</div>}\n <div className=\"or-tour__body\">\n <h2 ref={headingRef} id={titleId} tabIndex={-1} className=\"or-tour__title\">\n {current.title}\n </h2>\n <div id={contentId} className=\"or-tour__content\">\n {current.content}\n </div>\n </div>\n </div>\n </div>\n <div className=\"or-tour__footer\">\n {/* Um passo só (anúncio): sem contador nem pontos. */}\n {total > 1 && (\n <div className=\"or-tour__progress\">\n <span className=\"or-tour__dots\" aria-hidden=\"true\">\n {steps.map((_, i) => (\n <span\n key={i}\n className=\"or-tour__dot\"\n data-state={i < index ? 'complete' : i === index ? 'current' : 'upcoming'}\n />\n ))}\n </span>\n <span className=\"or-tour__counter\">\n {t('tourStepCounter', { current: index + 1, total })}\n </span>\n </div>\n )}\n <div className=\"or-tour__actions\">\n {!isFirst && (\n <Button variant=\"outline\" size=\"sm\" onClick={goBack}>\n {t('tourBack')}\n </Button>\n )}\n <Button\n size=\"sm\"\n endIcon={isLast ? undefined : <Icon name=\"arrow-right\" />}\n onClick={goNext}\n >\n {isLast ? t('finish') : t('next')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </Portal>\n )\n})\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { useControllableState, useId, usePresence } from '../../hooks'\nimport { Icon } from '../../icons'\nimport { cx, devWarning, mergeRefs } from '../../utils'\nimport './TreeView.css'\n\nexport interface TreeViewItem {\n /** Identificador único em toda a árvore. */\n id: string\n /** Rótulo exibido. */\n label: ReactNode\n /** Texto usado na busca por digitação quando `label` não é uma string. */\n textValue?: string\n /** Ícone do item. Sem ele, pastas e arquivos usam ícones padrão (veja `defaultIcons`). */\n icon?: ReactNode\n /** Itens filhos. Um item com `children` (mesmo vazio) é tratado como pasta. */\n children?: TreeViewItem[]\n /** Item focável, mas que não pode ser selecionado nem expandido. */\n disabled?: boolean\n}\n\nexport type TreeViewSelectionMode = 'single' | 'multiple' | 'none'\n\nexport interface TreeViewProps\n extends Omit<HTMLAttributes<HTMLUListElement>, 'onSelect' | 'defaultValue' | 'onChange' | 'children'> {\n /** Itens da árvore, aninhados via `children`. */\n items: TreeViewItem[]\n /** Ids dos itens expandidos (controlado). */\n expanded?: string[]\n /** Ids expandidos inicialmente (não controlado). */\n defaultExpanded?: string[]\n /** Chamado quando itens são expandidos ou recolhidos. */\n onExpandedChange?: (expanded: string[]) => void\n /** `single` (padrão), `multiple` ou `none` (só navegação). */\n selectionMode?: TreeViewSelectionMode\n /** Ids selecionados (controlado). */\n selected?: string[]\n /** Ids selecionados inicialmente (não controlado). */\n defaultSelected?: string[]\n /** Chamado quando a seleção muda. */\n onSelectedChange?: (selected: string[]) => void\n /** Ação padrão do item, disparada por Enter ou clique (ex.: abrir o arquivo). */\n onAction?: (item: TreeViewItem) => void\n /** Clicar na linha de uma pasta também a expande/recolhe. Padrão: `true`. */\n expandOnClick?: boolean\n /** Usa ícones de pasta/arquivo quando o item não define `icon`. Padrão: `true`. */\n defaultIcons?: boolean\n /** Altura das linhas: `sm` (28px) ou `md` (32px, padrão). */\n size?: 'sm' | 'md'\n}\n\ninterface NodeInfo {\n item: TreeViewItem\n level: number\n parentId: string | null\n /** Ids dos irmãos (incluindo o próprio). */\n siblings: string[]\n domId: string\n}\n\nconst isParent = (item: TreeViewItem) => Array.isArray(item.children)\n\nconst normalize = (value: string) =>\n value\n .normalize('NFD')\n .replace(/\\p{M}/gu, '')\n .toLocaleLowerCase()\n\n/**\n * Grupo de filhos com animação de altura (grid 0fr → 1fr). Permanece montado\n * durante a saída (`usePresence`), mas `inert` — fora do foco e da árvore de\n * acessibilidade — enquanto recolhe. Grupos já abertos na montagem da árvore\n * não animam a entrada.\n */\nfunction TreeGroup({ open, id, render }: { open: boolean; id: string; render: () => ReactNode }) {\n const { present, state, nodeRef } = usePresence<HTMLDivElement>(open)\n const [openOnMount] = useState(open)\n const [interacted, setInteracted] = useState(false)\n if (!interacted && open !== openOnMount) setInteracted(true)\n if (!present) return null\n return (\n <div\n ref={nodeRef}\n className={cx('or-tree__collapse', !interacted && 'or-tree__collapse--static')}\n data-state={state}\n inert={open ? undefined : true}\n >\n <ul id={id} role=\"group\" className=\"or-tree__group\">\n {render()}\n </ul>\n </div>\n )\n}\n\n/**\n * Árvore hierárquica navegável por teclado (padrão \"tree view\" do WAI-ARIA):\n * explorador de arquivos, categorias, estrutura de páginas.\n */\nexport const TreeView = forwardRef<HTMLUListElement, TreeViewProps>(function TreeView(\n {\n items,\n expanded: expandedProp,\n defaultExpanded = [],\n onExpandedChange,\n selectionMode = 'single',\n selected: selectedProp,\n defaultSelected = [],\n onSelectedChange,\n onAction,\n expandOnClick = true,\n defaultIcons = true,\n size = 'md',\n className,\n onKeyDown,\n onFocus,\n ...rest\n },\n ref,\n) {\n devWarning(\n !rest['aria-label'] && !rest['aria-labelledby'],\n 'TreeView precisa de `aria-label` ou `aria-labelledby`.',\n )\n const baseId = useId('or-tree')\n const treeRef = useRef<HTMLUListElement>(null)\n const composedRef = useMemo(() => mergeRefs(ref, treeRef), [ref])\n const [focusedId, setFocusedId] = useState<string | null>(null)\n const typeahead = useRef({ buffer: '', timer: undefined as ReturnType<typeof setTimeout> | undefined })\n\n const [expanded, setExpanded] = useControllableState<string[]>({\n value: expandedProp,\n defaultValue: defaultExpanded,\n onChange: onExpandedChange,\n })\n const [selected, setSelected] = useControllableState<string[]>({\n value: selectedProp,\n defaultValue: defaultSelected,\n onChange: onSelectedChange,\n })\n const expandedSet = useMemo(() => new Set(expanded), [expanded])\n const selectedSet = useMemo(() => new Set(selected), [selected])\n\n // Índice de todos os nós (pais, irmãos, nível) — independe da expansão.\n const nodes = useMemo(() => {\n const map = new Map<string, NodeInfo>()\n let counter = 0\n const walk = (list: TreeViewItem[], level: number, parentId: string | null) => {\n const siblings = list.map((i) => i.id)\n for (const item of list) {\n devWarning(map.has(item.id), `TreeView: id duplicado \"${item.id}\".`)\n map.set(item.id, { item, level, parentId, siblings, domId: `${baseId}-${counter++}` })\n if (item.children) walk(item.children, level + 1, item.id)\n }\n }\n walk(items, 1, null)\n return map\n }, [items, baseId])\n\n // Itens visíveis na ordem em que aparecem (pais expandidos revelam filhos).\n const visible = useMemo(() => {\n const out: string[] = []\n const walk = (list: TreeViewItem[]) => {\n for (const item of list) {\n out.push(item.id)\n if (item.children && expandedSet.has(item.id)) walk(item.children)\n }\n }\n walk(items)\n return out\n }, [items, expandedSet])\n\n const visibleSet = useMemo(() => new Set(visible), [visible])\n const tabbableId =\n focusedId && visibleSet.has(focusedId)\n ? focusedId\n : (selected.find((id) => visibleSet.has(id)) ?? visible[0] ?? null)\n\n /* Ações ------------------------------------------------------------------ */\n\n const focusItem = useCallback(\n (id: string | undefined) => {\n if (!id) return\n const info = nodes.get(id)\n const el = info ? document.getElementById(info.domId) : null\n if (!el) return\n setFocusedId(id)\n el.focus({ preventScroll: true })\n el.scrollIntoView({ block: 'nearest' })\n },\n [nodes],\n )\n\n const setItemExpanded = useCallback(\n (id: string, open: boolean) => {\n const info = nodes.get(id)\n if (!info || !isParent(info.item) || info.item.disabled) return\n setExpanded((prev) => {\n const has = prev.includes(id)\n if (open === has) return prev\n return open ? [...prev, id] : prev.filter((x) => x !== id)\n })\n },\n [nodes, setExpanded],\n )\n\n const selectItem = useCallback(\n (id: string, mode: 'replace' | 'toggle' | 'add' = 'replace') => {\n const info = nodes.get(id)\n if (!info || info.item.disabled || selectionMode === 'none') return\n if (selectionMode === 'single') {\n setSelected((prev) => (prev.length === 1 && prev[0] === id ? prev : [id]))\n return\n }\n setSelected((prev) => {\n const has = prev.includes(id)\n if (mode === 'add') return has ? prev : [...prev, id]\n if (mode === 'toggle') return has ? prev.filter((x) => x !== id) : [...prev, id]\n return [id]\n })\n },\n [nodes, selectionMode, setSelected],\n )\n\n const activate = useCallback(\n (id: string) => {\n const info = nodes.get(id)\n if (!info || info.item.disabled) return\n if (selectionMode === 'none') {\n if (isParent(info.item) && !onAction) setItemExpanded(id, !expandedSet.has(id))\n } else {\n selectItem(id, selectionMode === 'multiple' ? 'toggle' : 'replace')\n }\n onAction?.(info.item)\n },\n [nodes, selectionMode, onAction, setItemExpanded, expandedSet, selectItem],\n )\n\n const runTypeahead = (char: string, currentId: string) => {\n const state = typeahead.current\n clearTimeout(state.timer)\n state.buffer += normalize(char)\n state.timer = setTimeout(() => {\n state.buffer = ''\n }, 500)\n const query = state.buffer\n // Mesma letra repetida: percorre os itens que começam com ela.\n const cycling = query.length > 1 && query.split('').every((c) => c === query[0])\n const search = cycling ? query[0] : query\n const start = visible.indexOf(currentId)\n const offset = search.length === 1 ? 1 : 0\n for (let i = 0; i < visible.length; i++) {\n const id = visible[(start + offset + i) % visible.length]\n const item = nodes.get(id)!.item\n const text = item.textValue ?? (typeof item.label === 'string' ? item.label : '')\n if (normalize(text).startsWith(search)) {\n focusItem(id)\n return\n }\n }\n }\n\n /* Teclado ---------------------------------------------------------------- */\n\n const handleKeyDown = (event: KeyboardEvent<HTMLUListElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented) return\n const target = (event.target as HTMLElement).closest<HTMLElement>('[role=\"treeitem\"]')\n const currentId = target?.dataset.treeId\n if (!currentId || !nodes.has(currentId)) return\n const info = nodes.get(currentId)!\n const index = visible.indexOf(currentId)\n const multi = selectionMode === 'multiple'\n const open = expandedSet.has(currentId)\n\n switch (event.key) {\n case 'ArrowDown': {\n const next = visible[index + 1]\n if (next) {\n focusItem(next)\n if (multi && event.shiftKey) selectItem(next, 'add')\n }\n break\n }\n case 'ArrowUp': {\n const prev = visible[index - 1]\n if (prev) {\n focusItem(prev)\n if (multi && event.shiftKey) selectItem(prev, 'add')\n }\n break\n }\n case 'ArrowRight':\n if (isParent(info.item) && !info.item.disabled) {\n if (!open) setItemExpanded(currentId, true)\n else if (info.item.children?.length) focusItem(info.item.children[0].id)\n }\n break\n case 'ArrowLeft':\n if (isParent(info.item) && open && !info.item.disabled) setItemExpanded(currentId, false)\n else if (info.parentId) focusItem(info.parentId)\n break\n case 'Home':\n focusItem(visible[0])\n break\n case 'End':\n focusItem(visible[visible.length - 1])\n break\n case 'Enter':\n activate(currentId)\n break\n case ' ':\n if (selectionMode === 'none') activate(currentId)\n else selectItem(currentId, multi ? 'toggle' : 'replace')\n break\n case '*': {\n const toOpen = info.siblings.filter((id) => {\n const sibling = nodes.get(id)!.item\n return isParent(sibling) && !sibling.disabled && !expandedSet.has(id)\n })\n if (toOpen.length) setExpanded((prev) => [...prev, ...toOpen])\n break\n }\n default:\n if (multi && (event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'a') {\n const all = Array.from(nodes.values())\n .filter((n) => !n.item.disabled)\n .map((n) => n.item.id)\n setSelected(all.every((id) => selectedSet.has(id)) ? [] : all)\n break\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey && event.key.trim()) {\n runTypeahead(event.key, currentId)\n break\n }\n return\n }\n event.preventDefault()\n }\n\n /* Mouse ------------------------------------------------------------------ */\n\n const handleRowClick = (event: MouseEvent, item: TreeViewItem) => {\n const fromToggle = (event.target as HTMLElement).closest('.or-tree__toggle')\n focusItem(item.id)\n if (item.disabled) return\n if (fromToggle) {\n setItemExpanded(item.id, !expandedSet.has(item.id))\n return\n }\n if (isParent(item) && expandOnClick) setItemExpanded(item.id, !expandedSet.has(item.id))\n if (selectionMode !== 'none') selectItem(item.id, selectionMode === 'multiple' ? 'toggle' : 'replace')\n onAction?.(item)\n }\n\n /* Renderização ----------------------------------------------------------- */\n\n const renderIcon = (item: TreeViewItem, open: boolean) => {\n if (item.icon !== undefined) return item.icon\n if (!defaultIcons) return null\n return <Icon name={isParent(item) ? (open ? 'folder-open' : 'folder') : 'file'} size=\"sm\" />\n }\n\n /*\n * Estrutura do exemplo \"Navigation Treeview\" do APG: o <li> é apresentacional,\n * a linha é o `treeitem` e o grupo de filhos (irmão da linha) é associado por\n * `aria-owns`. O nome vem de `aria-labelledby` (só o rótulo, sem os filhos).\n */\n const renderItems = (list: TreeViewItem[], level: number): ReactNode =>\n list.map((item, index) => {\n const info = nodes.get(item.id)!\n const parent = isParent(item)\n const open = parent && expandedSet.has(item.id)\n const isSelected = selectedSet.has(item.id)\n const icon = renderIcon(item, open)\n const groupId = `${info.domId}-group`\n const labelId = `${info.domId}-label`\n const hasChildren = item.children !== undefined && item.children.length > 0\n const showGroup = open && hasChildren\n return (\n <li key={item.id} role=\"none\" className=\"or-tree__node\">\n {/* O teclado é tratado no onKeyDown da árvore (roving tabindex). */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n <div\n id={info.domId}\n role=\"treeitem\"\n className={cx('or-tree__item', item.disabled && 'or-tree__item--disabled')}\n style={{ '--_level': level } as CSSProperties}\n aria-level={level}\n aria-setsize={list.length}\n aria-posinset={index + 1}\n aria-expanded={parent ? open : undefined}\n aria-owns={showGroup ? groupId : undefined}\n aria-selected={\n selectionMode === 'multiple' ? isSelected : selectionMode === 'single' && isSelected ? true : undefined\n }\n aria-disabled={item.disabled || undefined}\n // nome só da própria linha (o conteúdo de aria-owns entraria no cálculo)\n aria-labelledby={labelId}\n tabIndex={item.id === tabbableId ? 0 : -1}\n data-tree-id={item.id}\n onClick={(event) => handleRowClick(event, item)}\n >\n <span className=\"or-tree__toggle\" aria-hidden=\"true\">\n {parent && <Icon name=\"chevron-right\" size=\"sm\" />}\n </span>\n {selectionMode === 'multiple' && (\n <span className=\"or-tree__checkbox\" aria-hidden=\"true\">\n {isSelected && <Icon name=\"check\" size={12} strokeWidth={2.5} />}\n </span>\n )}\n {icon && (\n <span className=\"or-tree__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"or-tree__label\" id={labelId}>\n {item.label}\n </span>\n </div>\n {hasChildren && (\n <TreeGroup open={open} id={groupId} render={() => renderItems(item.children!, level + 1)} />\n )}\n </li>\n )\n })\n\n return (\n <ul\n ref={composedRef}\n role=\"tree\"\n aria-multiselectable={selectionMode === 'multiple' || undefined}\n className={cx('or-tree', `or-tree--${size}`, `or-tree--select-${selectionMode}`, className)}\n onKeyDown={handleKeyDown}\n onFocus={(event) => {\n onFocus?.(event)\n const id = (event.target as HTMLElement).closest<HTMLElement>('[role=\"treeitem\"]')?.dataset.treeId\n if (id) setFocusedId(id)\n }}\n {...rest}\n >\n {renderItems(items, 1)}\n </ul>\n )\n})\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ElementType,\n type HTMLAttributes,\n} from 'react'\nimport { useIsomorphicLayoutEffect } from '../../hooks'\nimport { cx, mergeRefs } from '../../utils'\nimport './TruncatedText.css'\n\nexport interface TruncatedTextProps extends HTMLAttributes<HTMLElement> {\n /** Elemento renderizado. Padrão: `span` (exibido como bloco). */\n as?: ElementType\n /** Número máximo de linhas visíveis antes das reticências. Padrão: `1`. */\n lines?: number\n /**\n * Quando o texto estiver cortado, mostra o texto completo no `title` nativo\n * (dica ao passar o mouse). Um `title` passado explicitamente tem prioridade.\n */\n showTitle?: boolean\n /** Chamado quando o texto passa a estar (ou deixa de estar) cortado. */\n onTruncatedChange?: (truncated: boolean) => void\n}\n\n/**\n * Corta textos longos em um número fixo de linhas com reticências. O texto\n * completo continua no DOM — leitores de tela e a busca da página o encontram.\n */\nexport const TruncatedText = forwardRef<HTMLElement, TruncatedTextProps>(function TruncatedText(\n { as: Component = 'span', lines = 1, showTitle = false, onTruncatedChange, className, style, title, children, ...rest },\n ref,\n) {\n const innerRef = useRef<HTMLElement>(null)\n const composedRef = useMemo(() => mergeRefs(ref, innerRef), [ref])\n const [truncated, setTruncated] = useState(false)\n const [fullText, setFullText] = useState('')\n const onChangeRef = useRef(onTruncatedChange)\n onChangeRef.current = onTruncatedChange\n const lastReported = useRef<boolean | null>(null)\n const clamp = Math.max(1, Math.floor(lines))\n\n useIsomorphicLayoutEffect(() => {\n const el = innerRef.current\n if (!el) return\n const measure = () => {\n const next = clamp === 1 ? el.scrollWidth > el.clientWidth + 1 : el.scrollHeight > el.clientHeight + 1\n setTruncated(next)\n setFullText(el.textContent ?? '')\n if (lastReported.current !== next) {\n lastReported.current = next\n onChangeRef.current?.(next)\n }\n }\n measure()\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n return () => observer.disconnect()\n }, [clamp, children])\n\n return (\n <Component\n ref={composedRef}\n className={cx(\n 'or-truncated-text',\n clamp === 1 ? 'or-truncated-text--single' : 'or-truncated-text--multi',\n className,\n )}\n style={clamp === 1 ? style : ({ '--_lines': clamp, ...style } as CSSProperties)}\n title={title ?? (showTitle && truncated ? fullText : undefined)}\n data-truncated={truncated || undefined}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import { forwardRef, type ElementType, type HTMLAttributes } from 'react'\nimport { cx } from '../../utils'\nimport './Typography.css'\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\nexport type HeadingSize = 'display' | '5xl' | '4xl' | '3xl' | '2xl' | 'xl' | 'lg' | 'md'\n\nexport interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n /** Nível semântico (h1–h6). Defina pela hierarquia do documento, não pelo tamanho. */\n level?: HeadingLevel\n /** Tamanho visual, independente do nível semântico. */\n size?: HeadingSize\n}\n\nconst defaultSize: Record<HeadingLevel, HeadingSize> = {\n 1: '4xl',\n 2: '3xl',\n 3: '2xl',\n 4: 'xl',\n 5: 'lg',\n 6: 'md',\n}\n\n/** Títulos em Space Grotesk com espaçamento negativo, a voz do Orange. */\nexport const Heading = forwardRef<HTMLHeadingElement, HeadingProps>(function Heading(\n { level = 2, size, className, ...rest },\n ref,\n) {\n const Tag = `h${level}` as ElementType\n return (\n <Tag\n ref={ref}\n className={cx('or-heading', `or-heading--${size ?? defaultSize[level]}`, className)}\n {...rest}\n />\n )\n})\n\nexport type TextSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type TextTone = 'default' | 'muted' | 'subtle' | 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'inherit'\nexport type TextWeight = 'regular' | 'medium' | 'semibold' | 'bold'\n\nexport interface TextProps extends HTMLAttributes<HTMLElement> {\n /** Elemento renderizado. Padrão: `p`. */\n as?: ElementType\n size?: TextSize\n tone?: TextTone\n weight?: TextWeight\n /** Família tipográfica: `body` (Inter), `display` (Space Grotesk) ou `mono`. */\n font?: 'body' | 'display' | 'mono'\n /** Corta o texto em uma linha com reticências. */\n truncate?: boolean\n}\n\n/** Texto corrido com escala, tons e pesos do sistema. */\nexport const Text = forwardRef<HTMLElement, TextProps>(function Text(\n { as: Component = 'p', size = 'md', tone = 'default', weight, font = 'body', truncate, className, ...rest },\n ref,\n) {\n return (\n <Component\n ref={ref}\n className={cx(\n 'or-text',\n `or-text--${size}`,\n `or-text--tone-${tone}`,\n weight && `or-text--${weight}`,\n `or-text--font-${font}`,\n truncate && 'or-text--truncate',\n className,\n )}\n {...rest}\n />\n )\n})\n\nexport interface EyebrowProps extends HTMLAttributes<HTMLElement> {\n as?: ElementType\n /** Mostra o marcador quadrado laranja antes do texto. */\n marker?: boolean\n tone?: 'subtle' | 'accent'\n}\n\n/** Rótulo curto em caixa alta (ex.: \"COMPONENTES\"), usado acima de títulos. */\nexport const Eyebrow = forwardRef<HTMLElement, EyebrowProps>(function Eyebrow(\n { as: Component = 'p', marker = false, tone = 'subtle', className, children, ...rest },\n ref,\n) {\n return (\n <Component\n ref={ref}\n className={cx('or-eyebrow', 'or-eyebrow-text', `or-eyebrow-text--${tone}`, className)}\n {...rest}\n >\n {marker && <span className=\"or-eyebrow-text__marker\" aria-hidden=\"true\" />}\n {children}\n </Component>\n )\n})\n"],"names":["cx","values","out","v","k","on","setRef","ref","value","mergeRefs","refs","composeEventHandlers","external","internal","event","FOCUSABLE","getFocusableElements","root","el","clamp","min","max","canUseDOM","range","start","end","length","_","i","warned","isDevelopment","warnOnce","key","message","devWarning","condition","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useId","prefix","providedId","reactId","useReactId","useControllableState","defaultValue","onChange","setInternal","useState","isControlled","current","currentRef","useRef","onChangeRef","setValue","useCallback","next","resolved","useDisclosure","options","isOpen","setOpen","open","close","toggle","useMemo","useEventListener","type","handler","target","handlerRef","listener","e","useClickOutside","enabled","list","r","useEscapeKey","useMediaQuery","query","matches","setMatches","mql","update","useReducedMotion","useLockBodyScroll","locked","body","documentElement","prevOverflow","prevPadding","scrollbar","useFocusTrap","active","initialFocus","restoreFocus","previouslyFocused","raf","onKeyDown","focusables","first","last","activeEl","useRovingFocus","containerRef","orientation","loop","selector","container","items","index","prevKeys","nextKeys","useClipboard","timeout","copied","setCopied","timer","copy","text","useDebouncedValue","delay","debounced","setDebounced","t","usePrevious","useMounted","mounted","setMounted","usePresence","nodeRef","node","style","seconds","reduced","MIN","hasAnimation","hasTransition","done","a","started","onRun","noTransition","fallback","useInView","rootMargin","threshold","once","inView","setInView","setNode","observer","entry","useCountUp","duration","from","tick","now","p","useScrollDirection","tolerance","state","setState","ticking","y","delta","onScroll","AccordionContext","createContext","AccordionItemContext","useAccordionContext","component","ctx","useContext","useAccordionItemContext","toArray","Accordion","forwardRef","props","collapsible","headingLevel","disabled","variant","className","children","rest","multiple","openValues","setOpenValues","itemValue","prev","context","handleKeyDown","triggers","jsx","AccordionItem","accordion","id","itemDisabled","item","AccordionTrigger","onClick","Heading","jsxs","AccordionContent","present","expanded","setExpanded","composedRef","inner","outer","iconPaths","Fragment","iconNames","sizes","Icon","name","size","label","strokeWidth","px","ptBR","enUS","builtInMessages","interpolate","template","vars","themeNames","isThemeName","isThemeSetting","isHighContrastTheme","theme","getColorScheme","resolveTheme","setting","prefersLight","prefersMoreContrast","scheme","ThemeContext","LocaleContext","OrangeProvider","defaultTheme","themeProp","onThemeChange","themeTarget","locale","overrides","parent","inherits","internalTheme","setInternalTheme","resolvedTheme","ownSetTheme","setTheme","themeValue","localeValue","messages","content","fallbackLocale","fallbackTheme","useTheme","useLocale","VisuallyHidden","Component","focusable","buttonClassName","block","iconOnly","Button","loading","loadingText","startIcon","endIcon","feedbackIcons","feedbackLabelKeys","liveRoleFor","tone","moveFocusOutOf","element","all","previous","useFeedbackPresence","live","internalOpen","setInternalOpen","previousOpen","setPreviousOpen","reopened","setReopened","closing","Alert","title","icon","action","dismissible","onDismiss","rootRef","enter","hide","labelKey","role","dismiss","AppHeader","brand","currentHref","renderLink","actions","menuFooter","navLabel","sticky","hideOnScroll","collapseBelow","menuOpenProp","defaultMenuOpen","onMenuOpenChange","onFocus","onBlur","navId","headerRef","menuButtonRef","menuOpen","setMenuOpen","panel","prevMenuOpen","setPrevMenuOpen","iconMotion","setIconMotion","scrolledDown","setScrolledDown","focusWithin","setFocusWithin","scrollHidden","handleFocus","handleBlur","hasNav","ScrollWatcher","linkProps","direction","pastThreshold","down","Portal","createPortal","stack","isInside","highestHit","onEscape","modal","handlePointerDown","layers","hit","onPointerDownOutside","handleFocusIn","onFocusOutside","attach","detach","removeLayer","zIndexOf","raise","below","layer","z","own","useLayer","optionsRef","entryRef","mark","isTop","release","getThemeScope","origin","reactMajor","version","getElementRef","focusElement","getTabbableAfter","anchor","exclude","isFocusVisible","DialogShell","finalFocus","closeOnEscape","closeOnOverlayClick","rootClassName","externalPanelRef","panelRef","restoreRef","lastFocusedRef","themeRef","wasActiveRef","pointerDownOnOverlayRef","dismissRef","layerProps","getFinalFocus","focusLost","panelRefs","Drawer","defaultOpen","onOpenChange","description","placement","footer","hideCloseButton","trigger","disclosure","titleId","descriptionId","api","triggerElement","cloneElement","_event","splitLastWord","trimmed","Footer","columns","bottom","baseId","hasBrand","column","columnIndex","headingId","link","ExternalLink","InternalLink","lastWord","ActionGroupContext","useActionGroup","rovingItemProps","applyGroupDefaults","Children","child","isValidElement","extra","IconButton","group","SideNavContext","renderSlot","slot","collapsed","SideNav","collapsedProp","defaultCollapsed","onCollapsedChange","header","ariaLabel","setCollapsed","listCtx","toggleLabel","prevCollapsed","setPrevCollapsed","modeChanged","setModeChanged","switching","setSwitching","isItemActive","SideNavItem","href","badge","level","inList","isActive","initial","showRail","common","control","containsActive","SideNavGroup","openProp","hasActive","flyoutOpen","setFlyoutOpen","listId","groupRef","toggleRef","isFlyout","childCtx","SideNavSection","focusTarget","SkipLink","handleClick","BREAKPOINTS","AppShellContext","useAppShellContext","isElementOfType","AppShell","navigation","aside","asideLabel","navTitle","mainId","mainElement","skipLink","skipLinkLabel","navBreakpoint","navCollapsedProp","defaultNavCollapsed","onNavCollapsedChange","navOpenProp","defaultNavOpen","onNavOpenChange","stickyHeader","stickyNav","fullHeight","resolvedMainId","drawerId","isCompact","navCollapsed","setNavCollapsed","navOpen","setNavOpen","hasNavigation","hasHeader","toggleNav","headerNode","html","resolveNavigation","compact","sidebar","landmark","hasSidebar","drawer","closeOnLink","HeaderTag","MainTag","FooterTag","useAppShell","AppShellNavToggle","shell","defaultLabel","AvatarGroupContext","TONES","STATUS_KEYS","initialsOf","words","w","toneOf","hash","char","Avatar","src","alt","sizeProp","shapeProp","status","statusLabel","pulse","imgProps","shape","imgRef","loadState","setLoadState","img","initials","decorative","statusText","accessibleName","showImage","AvatarGroup","total","limit","visible","hidden","hiddenCount","hiddenNames","resolve","BackToTop","scrollContainer","position","showLabel","reducedMotion","setVisible","getScroller","scroller","top","presence","Badge","count","dot","showZero","overlap","hasCount","display","anchored","anchorElement","motion","setMotion","shownDisplay","setShownDisplay","leaving","classes","describedBy","indicator","Banner","isAccent","TitleTag","iconNode","MARKER_SHAPES","LINE_DASHES","markerPath","cy","colorStyle","color","useElementWidth","width","setWidth","entries","useChartMotion","armed","s","useChartExplorer","seriesCount","keys","describe","setActiveState","setLast","announcement","setAnnouncement","activeRef","setActive","move","series","lastIndex","onPointerLeave","point","ChartLegend","ChartTooltip","x","rows","edge","align","row","ChartFigure","source","hideCaption","legend","table","hintId","defaultShowData","dataId","showData","setShowData","caption","ri","cell","ci","VIZ_CATEGORICAL_COUNT","seriesColor","valueOf","datum","numberFormat","createValueFormatter","format","formatter","decimalsOf","exp","createAxisFormatter","ticks","step","maxAbs","decimals","round","niceScale","lo","hi","rough","magnitude","normalized","nice","tickTarget","textWidth","fontSize","truncate","formatList","crisp","extremes","data","si","GAP","AXIS_BAND","DEFAULT_HEIGHT","BarChart","summary","heightProp","valueFormat","categoryLabel","layout","showValues","highlight","horizontal","stacked","n","highlightIndex","d","colors","barColor","segments","pos","neg","totals","sum","ends","seg","domainMin","domainMax","labelled","anyLabels","valueLabelOf","plotRef","rowHeight","height","left","right","plotW","plotH","scale","categoryWidths","maxValueLabel","__","axisProbe","lastHalf","probe","axisFormat","span","band","slots","maxThickness","groupSpan","thickness","groupSize","offset","bandStart","baseline","rects","segs","cross","b","towardBase","explorer","segmentAt","sameSide","onPointer","box","py","along","across","within","motionRef","stagger","autoSummary","parts","valid","ext","tooltip","tickLabels","tickSpacing","tickEvery","l","widestCategory","categoryEvery","categorySpace","emphasis","bars","bar","center","room","BottomNavigation","valueProp","fixed","activeIndex","hiddenBadge","select","ItemContext","BreadcrumbItem","isCurrent","Breadcrumb","maxItems","itemsBeforeCollapse","itemsAfterCollapse","separator","revealed","setRevealed","listRef","focusAfterExpand","elements","shouldCollapse","wrap","before","afterStart","after","ButtonGroup","attached","orientationProp","parentSize","parentVariant","parentDisabled","roving","Card","interactive","CardLink","arrow","CardHeader","eyebrow","CardBody","CardFooter","divider","CardMedia","ratio","mediaStyle","useSlidingIndicator","axis","activeKey","rect","setRect","ready","setReady","measure","cancelled","MEDIA","DEFAULT_INTERVAL","MIN_INTERVAL","useSlidesPerView","sm","md","lg","xl","SlideContext","Carousel","indexProp","defaultIndex","onIndexChange","slidesPerView","gap","autoplay","controls","picker","onPointerEnter","onPointerDownCapture","onPointerCancel","onPointerUp","onClickCapture","onTouchStart","onTouchEnd","onTouchCancel","trackId","perView","visibleCount","slides","maxIndex","positions","navigable","rawIndex","setIndex","indexRef","maxIndexRef","interval","hasAutoplay","playing","setPlaying","userStarted","setUserStarted","hovered","setHovered","touching","setTouching","pageHidden","setPageHidden","prevAutoplay","setPrevAutoplay","paused","rotating","stopRotation","remainingRef","startedAt","handle","goTo","canPrev","canNext","goPrev","goNext","trackRef","pendingRef","pendingTimer","fromScrollRef","lastScrolledRef","reducedRef","getSlideElements","track","els","rtl","offsets","nearestIndex","m","best","clearPending","smooth","onUserScrollRef","_next","frame","sync","pending","onScrollEnd","handleTrackClick","pointerRef","pointerTimer","entering","to","pickerRef","handlePickerKeyDown","slideIds","pad","rootStyle","CarouselSlide","labelledBy","useErrorShake","invalid","shaking","setShaking","onAnimationEnd","hasContent","FieldsetBase","appearance","hideLegend","error","required","optional","announceRequired","contentProps","ariaDescribedBy","hasDescription","hasError","errorId","shakeClassName","CheckboxGroupContext","useCheckboxGroup","Checkbox","indeterminate","checked","onCheckedChange","inputId","innerRef","mergedRef","isInvalid","isDisabled","inGroup","isChecked","handleChange","CheckboxGroup","hideLabel","option","ChipGroupContext","Chip","selectedProp","defaultSelected","onSelectedChange","disabledProp","ownSelected","setOwnSelected","selected","touched","setTouched","ChipGroup","single","labelId","setSelected","chipValue","isOn","CodeBlock","code","language","showLineNumbers","startingLineNumber","highlightLines","maxHeight","copyable","onCopy","codeLabel","hasCopied","setHasCopied","lines","highlighted","lastLineNumber","handleCopy","line","lineNumber","isHighlighted","Text","FieldContext","useField","useFieldControlProps","field","Field","controlIdProp","labelAside","controlId","normalizeHex","input","match","c","isLightColor","hex","channel","FieldSlot","ColorField","swatches","readOnly","placeholder","pickerTextId","swatchesTextId","swatchesRef","setText","formatError","setFormatError","swatch","checkedIndex","popped","setPopped","commit","commitSwatch","handleTextChange","raw","handleTextBlur","swatchesDisabled","handleSwatchKeyDown","errorMessage","controlProps","hasRunningAnimation","useExitingItems","keyOf","signature","setPrev","setLeaving","removed","useShake","signal","useInlinePresence","changed","normalizeText","defaultOptionFilter","q","findMatch","map","j","HighlightMatch","nextEnabledIndex","firstEnabledIndex","lastEnabledIndex","useListboxPopup","floatingStyles","useFloating","flip","shift","availableHeight","autoUpdate","reference","side","Freeze","frozen","useAnnouncer","setMessage","announce","run","useScrollActiveIntoView","activeId","ListboxOptionItem","onSelect","onHover","initialSelected","toggled","ComboboxControl","inputRef","hasLabel","onInputChange","filter","emptyMessage","clearable","listboxId","inputEl","frameEl","popupEl","region","setQuery","setActiveIndex","lastSelected","selectedOption","o","selectedLabel","inputText","setInputText","typing","filtered","fn","optionId","activeOption","openList","focus","closeList","selectOption","clear","exact","clearPresence","Combobox","normalize","matchesHotkey","hotkey","part","mods","meta","ctrl","toDomId","CommandPalette","groups","setActiveId","resultsRef","highlightRef","wasOpen","setWasOpen","terms","groupIndex","haystack","term","enabledItems","activeOptionId","results","flushSync","groupLabelId","shortcut","isPromiseLike","ConfirmDialog","confirmLabel","cancelLabel","onConfirm","onCancel","setPending","cancelRef","confirmRef","mountedRef","cancel","confirm","result","useConfirm","setOptions","resolveRef","settle","Container","useFloatingPanel","floating","strategy","arrowRef","offsetMiddleware","availableWidth","arrowMiddleware","arrowData","arrowStyle","useTriggerElement","setElement","childRef","returnFocusIfLost","joinIds","ids","unique","MenuContext","ITEM_SELECTOR","getItems","menu","getTextValue","MenuPanel","themeOrigin","focusOnOpen","onClose","insideElements","menuEl","setMenuEl","typeahead","closeRef","focusAt","repeated","search","menuRef","MenuItemBase","closeOnSelect","textValue","onActivate","onKeyUp","onPointerMove","spacePressed","activate","useChangedSinceMount","setChanged","renderIcon","DropdownItem","DropdownCheckboxItem","defaultChecked","setChecked","animate","RadioGroupContext","DropdownRadioGroup","onValueChange","setCurrent","DropdownRadioItem","DropdownSeparator","DropdownLabel","ContextMenu","areaEl","areaRef","setPoint","openAt","clientX","clientY","returnTarget","saved","handleClose","reason","childProps","area","CopyButton","copiedLabel","doneLabel","getCurrencyFormat","currency","currencyDisplay","currencyFormatter","symbolIndex","integerIndex","fractionDigits","currencyName","parseAmount","decimal","negative","lastDot","lastComma","decimalIndex","sep","occurrences","digitsAfter","integer","fraction","digits","f","CurrencyField","CurrencyFieldControl","errorSignal","localeProp","providerLocale","shake","allowNegative","focused","setFocused","caret","formatted","emit","allowed","removedBefore","parsed","addon","startOfDay","date","addDays","amount","addMonths","lastDay","daysInMonth","addYears","year","month","isSameDay","isSameMonth","compareDay","startOfWeek","weekStartsOn","diff","endOfWeek","clampDate","isOutOfRange","getMonthGrid","toISODate","capitalize","patternCache","getDateFormatPattern","cached","pattern","order","literal","segmentLength","maskDateInput","isLast","consumed","segment","needed","atBoundary","len","chunk","formatDateInput","parseDateInput","day","monthIndex","monthKey","Calendar","defaultMonth","isDateDisabled","showTodayButton","autoFocus","headingIdProp","generatedId","gridRef","shouldFocusRef","today","view","setView","focusedDate","updateFocused","valueKey","formatters","make","weeks","weekdays","moveFocus","canShowMonth","renderNavButton","onDayKeyDown","todayDisabled","currentKey","long","week","iso","outside","isToday","FieldControl","DatePicker","formatHint","letters","longFormatter","dialogId","internalError","setInternalError","buttonRef","frameRef","dialogRef","caretRef","emittedRef","isUnavailable","masked","digitsBefore","handleInputKeyDown","closeAndFocusButton","handleSelect","dialogElement","setDialogElement","frameRefCallback","presenceRef","dialogRefCallback","buttonLabel","fieldProps","presetLabelKeys","resolvePresetRange","DAY_MS","differenceInDays","dayKey","isSameRange","startOfMonth","getRangeError","minLength","maxLength","isDateUnavailable","isRangeAllowed","constraints","getKeyboardTarget","shiftKey","applyDateMask","readDateInput","rangeKey","fitView","isBetween","RangeCalendar","visibleMonths","startDescriptionId","endDescriptionId","wide","monthCount","monthCountRef","setAnchor","updateView","firstOverride","prevFirst","nextFirst","startKey","endKey","nextAnchor","breaksLength","months","lastMonth","isVisible","firstDay","previewTarget","previewEdge","rangeStart","rangeEnd","other","previewing","backward","headingIds","renderDay","inBand","isAnchor","isPreviewEdge","filled","isStart","isEnd","renderMonth","isFirst","EMPTY_RANGE","DateRangePicker","presets","texts","setTexts","blurred","setBlurred","read","rangeFromTexts","startDate","endDate","applyRange","startInput","endInput","edgeError","startError","endError","rangeError","days","rangeMessage","hasExternalError","resolvedPresets","preset","renderInput","DescriptionList","termVariant","termWidth","divided","DescriptionGroup","DescriptionTerm","DescriptionDetails","Divider","spacing","labelPosition","Dropdown","triggerEl","triggerRef","triggerProps","triggerId","menuId","keyboardClick","openMenu","viaKeyboard","EmptyState","illustration","secondaryAction","animated","NATIVE_FOCUSABLE","resolveFocusTarget","ErrorSummary","errors","onItemClick","hasErrors","lastErrors","shownErrors","lineHeightOf","lineHeight","ExpandableText","expandedProp","defaultExpanded","onExpandedChange","Content","showMoreLabel","showLessLabel","contentId","contentRef","overflowing","setOverflowing","unclamped","wasUnclamped","showButton","Fieldset","itemCounter","createId","matchesAccept","file","accept","tokens","token","formatFileSize","bytes","units","Dropzone","onFiles","dragDepth","dragging","setDragging","buttonTextId","transfer","files","hasFiles","FileStatus","progress","play","FileRow","onRemove","onExited","WithField","FileUploader","maxSize","maxFiles","onFilesChange","onFilesAdded","onFileRemove","setItems","countError","setCountError","setOrder","dropGhost","g","maxSizeLabel","addFiles","incoming","kept","validCount","overflow","added","fileError","accepted","rejected","only","ghost","removeItem","exitDuration","buttons","fieldError","isLeaving","FormContext","useForm","collectValues","form","submitter","one","cleanErrors","sameErrors","isVisibleControl","firstTabbable","visibleControlFor","findField","byId","fieldset","byDocumentOrder","orderFields","focusField","Form","validate","onSubmit","errorsProp","errorSummary","errorSummaryTitle","onReset","onInputCapture","onChangeCapture","onKeyUpCapture","onBlurCapture","formRef","summaryRef","submittingRef","validationErrors","setValidationErrors","submitCount","setSubmitCount","isSubmitting","setSubmitting","focusRequest","setFocusRequest","revalidateTick","setRevalidateTick","externalKey","externalErrors","dismissed","setDismissed","dismissedNames","snapshotRef","previousExternal","merged","errorCount","handledTick","fresh","handledFocus","scheduleRevalidation","handleSubmit","handleReset","getError","fields","nameById","summaryItems","handleItemClick","FormActions","createResponsiveStyles","gapToCss","toTrackCount","isBreakpointMap","addResponsive","varName","classPrefix","toCss","bp","isListElement","as","Grid","minItemWidth","rowGap","columnGap","responsive","hasVars","spanToCss","GridItem","COMBINING_MARK","fold","caseSensitive","accentSensitive","escapeRegExp","findRanges","queries","folded","starts","piece","found","ranges","Highlight","markClassName","queryKey","cursor","HoverCard","openDelay","closeDelay","cardId","cardEl","setCardEl","openTimer","closeTimer","pointerFocus","scheduleOpen","scheduleClose","immediate","cardRef","toSize","SkeletonSwap","loaded","skeleton","previousLoaded","setPreviousLoaded","Skeleton","shapeClassName","SkeletonText","lastLineWidth","lineNodes","toNumber","Image","fit","fallbackSrc","bordered","decoding","onLoad","onError","initialSrc","currentSrc","setCurrentSrc","sources","setSources","handleLoad","handleError","aspectRatio","frameStyle","InlineEdit","onSave","showButtons","saveOnBlur","inputProps","editing","setEditing","draft","setDraft","setError","saving","setSaving","interacted","setInteracted","flash","setFlash","setErrorCount","displayRef","focusDisplayRef","savingRef","editingRef","startEditing","finish","save","validationError","shown","KEYS","ALIASES","normalizeKey","lower","resolveKey","symbols","resolver","Kbd","pressed","pressedKeys","isPressed","INSET","MARKER_R","LineChart","endLabels","includeZero","maskId","dashes","shapes","zero","lastIndexOf","endLabelText","li","maxEndLabel","lastCategoryHalf","baseValue","points","runs","pathOf","markersEverywhere","cx0","cy0","placed","endLabelY","yy","ys","maxCategory","every","showCategory","seriesRuns","base","isolated","linkClassName","LinkImpl","rel","showArrow","Link","useStaggerReveal","viewRef","ListContext","List","reveal","isOrdered","counterStyle","ListItem","listIcon","itemIcon","showIcon","ListboxContext","EMPTY","TYPEAHEAD_TIMEOUT","optionDomId","safe","isGroup","sameValues","ListboxControl","listboxRef","selectionMode","selectionFollowsFocus","tabIndex","onMouseDown","onMouseUp","ariaLabelledBy","setRaw","selectedValues","selectedSet","listboxEl","activeValue","anchorRef","rangeRef","onShakeEnd","scrollToOption","scroll","announceCount","inOptionOrder","set","ordered","known","selectOne","extendTo","between","toggleAll","moveTo","runTypeahead","begin","candidate","resetTypeahead","listbox","labelEl","focusList","pointer","mod","prevKey","nextKey","handleMouseDown","handleMouseUp","ListboxGroup","renderItem","ListboxOption","Listbox","Spinner","LoadingOverlay","spinnerSize","backdropRef","getMeterLevel","low","high","optimum","valueRegion","optimumRegion","levelTone","Meter","lowProp","highProp","optimumProp","showValue","formatValue","toneProp","showThresholds","ariaLabelledby","ariaDescribedby","safeMax","hasRegions","toPercent","percent","valueText","thresholds","Modal","ModalBody","ModalFooter","toIndex","fromIndex","currentMonth","MonthPaginator","monthFormat","atMin","atMax","transition","setTransition","go","renderButton","unavailable","MultiSelectControl","maxSelected","chipButtons","pendingFocus","setValues","optionFor","selectedOptions","initialValues","chipEntries","leavingProps","limitReached","remove","focusAfter","neighbor","clearAll","hasValues","MultiSelect","InputControl","suffix","leading","trailing","frameClassName","ariaInvalid","ref2","affixId","hasPrefix","hasSuffix","prefixId","suffixId","handleFrameMouseDown","roundTo","createParser","isSpaceGroup","pieces","NumberField","largeStep","formatOptions","hideStepper","inputMode","editingText","setEditingText","optionsKey","parse","maxFractionDigits","nf","upper","big","resolveCurrent","typed","bump","setBump","announceBump","stepBy","setTo","repeatTimer","pointerStepped","stopRepeat","stepperProps","canDecrement","canIncrement","allowsNegative","allowsFraction","PageHeader","breadcrumbs","back","revealStyle","backLink","getPageItems","page","siblingCount","boundaryCount","startPages","endPages","siblingsStart","siblingsEnd","Paginator","pageProp","defaultPage","onPageChange","totalPages","totalItems","pageSizeProp","defaultPageSize","onPageSizeChange","pageSizeOptions","showFirstLast","getPageHref","selectId","focusCurrent","pageSize","setPageSize","rawPage","setPage","prevPage","setPrevPage","renderControl","opts","itemClass","edges","pages","showInfo","nextSize","firstItem","useInverseTheme","scope","inverse","Paper","padding","border","elevation","inverseTheme","PasswordRequirements","requirements","met","dirty","settled","requirement","PasswordField","requirementsLabel","visibleProp","defaultVisible","onVisibleChange","autoComplete","requirementsId","pendingSelection","hasRequirements","selection","handleToggle","hadFocus","PATTERNS","toChars","PinInputControl","onComplete","mask","inputs","chars","setChars","complete","pops","popOrder","clampIndex","joined","fill","handleInput","handlePaste","groupRest","PinInput","Popover","closeOnOutsideClick","showCloseButton","panelEl","setPanelEl","panelId","closeAndFocusTrigger","handleTriggerKeyDown","handlePanelKeyDown","ProgressBar","dimensions","ProgressCircle","stroke","radius","circumference","showArc","dashOffset","useRadioGroup","Radio","RadioGroup","nameProp","Rating","labels","groupName","hover","setHover","pop","setPop","stars","optionLabel","clamped","SECOND","MINUTE","HOUR","DAY","WEEK","MONTH","YEAR","parseDate","selectUnit","numeric","abs","autoInterval","RelativeTime","updateInterval","relativeStyle","absoluteFormat","showTitle","setNow","timestamp","useRelative","shouldUpdate","unit","initialText","updated","fullDate","toMsList","longestTransition","longest","cs","durations","delays","Reveal","appear","setSettled","raf2","raf1","targets","SearchControl","onTextChange","onClearClick","Search","onSearch","onClear","debounce","formProps","lastEmitted","handleClear","SegmentedControl","fullWidth","idProp","setIndicator","setAnimate","optionDisabled","SelectControl","selectRef","syncPlaceholder","resolvedDefault","Select","snap","snapped","SliderControl","isRange","marks","thumbLabels","onCommit","thumbLabelId","railRef","lastActive","setLastActive","pct","topIndex","markList","labeledMarks","valueAt","handleRailPointerDown","up","inputRest","thumbId","Slider","onChangeEnd","restAll","minDistance","thumbLabelsProp","valuesRef","handleValueChange","handleCommit","outputText","fieldId","DRAG_THRESHOLD","SCROLL_EDGE","SCROLL_SPEED","FREEZE_TRANSFORM","announcementKeys","defaultGetKey","defaultGetLabel","defaultIsDisabled","identity","moveInSlots","isLocked","sequence","moved","findSlot","nearestSlot","distance","bestDistance","slotStarts","getScrollParent","vertical","scrollable","SortableListInner","itemsProp","defaultItems","onReorder","getKey","getItemLabel","isItemDisabled","moveControls","announcements","instructionsId","setList","drag","setDragState","setRenderTick","nodes","nodeRefs","dragRef","flipRef","focusRef","isLockedAt","activeDrag","latest","setDrag","callback","kind","L","custom","ensureVisible","listEl","V","viewStart","viewEnd","margin","prepareFlip","deltas","dx","dy","clearDragOffset","lift","moveLifted","updatePointerDrag","session","scrolled","lastEnd","autoScroll","speed","startPointerDrag","endPointer","pointerMove","onMove","onUp","onWindowBlur","moveByControl","sessions","original","isPointerDrag","prevIcon","nextIcon","firstIcon","lastIcon","prevText","nextText","firstText","lastText","itemLabel","itemLocked","isDragging","ForwardedSortableList","SortableList","PAD","Sparkline","showEndPoint","showMinMax","minIndex","isPrintableKey","SplitButton","menuLabel","groupVariant","resolvedVariant","resolvedSize","itemRefs","isPositioned","resolvedPlacement","sizeMiddleware","closeMenu","onTriggerClick","onTriggerKeyDown","selectItem","onMenuKeyDown","onMenuBlur","SplitterContext","useSplitterItem","EPSILON","STORAGE_PREFIX","finiteOr","sameSizes","isCollapsedAt","normalizeSizes","readPanel","minSize","resolveDefaults","panels","defaultSizes","partner","readStorage","writeStorage","lockDocument","formatPercent","Splitter","sizesProp","onSizesChange","onResizeEnd","storageKey","shiftStep","stackBelow","handleBefore","SplitterPanel","SplitterHandle","handlePairs","pair","defaults","rawSizes","setRawSizes","sizesRef","panelsRef","defaultsRef","onResizeEndRef","expandedRef","unlockRef","pendingEndRef","stored","rememberExpanded","final","expandedRange","pa","pb","resizePair","targetA","nextA","collapsePair","partnerSize","resolveDrag","isRtl","collapsedA","collapsedB","isHome","remembered","restore","handleKeyUp","handlesSize","available","handlePointerMove","handlePointerEnd","handleDoubleClick","handles","fallbackLabel","lowA","lowB","collapsedPanel","tracks","named","useScrollableRegion","setNeeded","check","scrolls","resize","mutation","_minSize","_maxSize","_collapsible","_collapsedSize","_defaultCollapsed","_label","_id","scrollFocus","onPointerDown","onLostPointerCapture","onDoubleClick","usable","Stack","justify","isList","Separator","StatGroupContext","nodeText","COUNT_DURATION","separators","tokenize","decimalAt","interpolateText","TREND_ICON","TREND_MESSAGE","DEFAULT_TONE","Stat","trend","deltaTone","help","Root","hasDelta","finalText","inViewRef","canCount","rawProgress","counting","StatGroup","cols","gridStyle","getStatus","activeStep","Stepper","steps","onStepClick","clickable","marker","Switch","checkedProp","switchId","INTERACTIVE","defaultRowId","readValue","isEmpty","TableInner","getRowId","sortProp","defaultSort","onSortChange","manualSort","selectable","selectedRows","defaultSelectedRows","onSelectionChange","getRowLabel","density","striped","emptyState","onRowClick","containerProps","tableId","captionId","selectAllRef","sortedByUser","sort","setSort","collator","getValue","factor","va","vb","visibleIds","selectedCount","allSelected","someSelected","toggleRow","handleSort","primaryKey","rowHeaderKey","handleRowClick","colCount","containerStyle","ariaSort","rowIndex","isSelected","headerCellId","checkboxId","rowLabel","cellClass","ForwardedTable","Table","resolveContainer","slugify","collectHeadings","used","heading","TableOfContents","headingSelector","collected","setCollected","mo","idsKey","io","minLevel","depth","TabsContext","useTabsContext","toIdPart","Tabs","activation","fitted","valueRef","initialize","setPanels","registerPanel","panelValue","prevValue","setPrevValue","animatePanels","setAnimatePanels","TabList","getTabs","tab","tabs","Tab","TabPanel","keepMounted","animationSeconds","Tag","removeLabel","pendingEvent","onRemoveRef","onEnd","handleRemove","tagKeys","tags","seen","tag","PASTE_SPLIT","TagInputControl","tryAdd","removeAt","tagButtons","initialKeys","frameMotion","addOnBlur","onPaste","pasted","TagInput","maxTags","allowDuplicates","setTags","rejections","msg","firstError","problem","shownError","CharacterCount","remaining","TextAreaControl","autoResize","maxRows","styles","borders","lastWidth","TextArea","showCount","countId","uncontrolledLength","setUncontrolledLength","withCount","TextField","TimeField","openPicker","TimelineContext","Timeline","dateFormat","DATE_ONLY","TimelineItem","dateLabel","Title","hasDate","Toast","ANNOUNCE_MS","toastCounter","announceCounter","createToastStore","listeners","ToastContext","useToast","ToastProvider","showProgress","visibleLimit","limitRef","store","toasts","useSyncExternalStore","setAnnouncements","documentHidden","setDocumentHidden","regionRef","lastFocusOutside","timeouts","later","ms","record","queued","toast","existing","dismissAll","assertive","hasVisible","onVisibility","newest","regionLabel","ToastItem","getAnnouncementText","defaultDuration","onAnnounce","timed","itemRef","timerVersion","announcedVersion","escapeRef","showTimer","ToggleGroupContext","useToggleGroup","ToggleButton","pressedProp","defaultPressed","onPressedChange","showCheck","toggleGroup","ownPressed","setOwnPressed","withCheck","ToggleButtonGroup","Toggletip","openings","setOpenings","wasVisible","setWasVisible","bubbleId","buttonEl","setButtonEl","bubbleEl","setBubbleEl","bubbleRef","ENABLED_ITEM_SELECTOR","capturesArrowKeys","Toolbar","syncTabStops","ToolbarGroup","ToolbarSeparator","separatorOrientation","lastClosedAt","WARM_WINDOW","Tooltip","tooltipId","tooltipEl","setTooltipEl","clearTimers","show","tooltipRef","DIALOG_GAP","VIEWPORT_PADDING","CENTER_TRANSFORM","GLIDE_WINDOW","referenceMiddleware","resolveTarget","isFullyVisible","waitForScrollEnd","stableFrames","paintSpotlight","lastHole","vw","vh","hole","Tour","stepProp","defaultStep","onStepChange","onFinish","onSkip","spotlightPadding","narrow","silentRef","requestedStep","setRequestedStep","requestedIndex","shownIndex","setShownIndex","glide","setGlide","openerRef","wasActive","setWasActive","headingRef","holeRef","lastTransformRef","positionerEl","setPositionerEl","setTarget","targetRef","stepTarget","syncTarget","scrollBehavior","openedOnceRef","focusedIndexRef","skip","goBack","mode","autoPlacement","positionedFor","transform","paint","dialog","rootRefs","dialogRefs","tourLabel","isParent","TreeGroup","render","openOnMount","TreeView","onAction","expandOnClick","defaultIcons","treeRef","focusedId","setFocusedId","expandedSet","counter","walk","parentId","siblings","visibleSet","tabbableId","focusItem","info","setItemExpanded","has","currentId","multi","toOpen","sibling","fromToggle","renderItems","groupId","hasChildren","showGroup","TruncatedText","onTruncatedChange","truncated","setTruncated","fullText","setFullText","lastReported","defaultSize","weight","font","Eyebrow"],"mappings":"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"}
|