rootzz-layout 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -129,7 +129,7 @@ var SidebarProvider = SidebarContext.Provider;
129
129
  function useSidebar() {
130
130
  return react.useContext(SidebarContext);
131
131
  }
132
- function base({ size = 20, ...props }) {
132
+ function base({ size = 20, className, ...props }) {
133
133
  return {
134
134
  width: size,
135
135
  height: size,
@@ -138,6 +138,8 @@ function base({ size = 20, ...props }) {
138
138
  xmlns: "http://www.w3.org/2000/svg",
139
139
  "aria-hidden": true,
140
140
  focusable: false,
141
+ // Classe `rootzz-*` para o reset escopado alcançar o ícone sem precisar de `svg` global.
142
+ className: className ? `rootzz-icon-svg ${className}` : "rootzz-icon-svg",
141
143
  ...props
142
144
  };
143
145
  }
@@ -578,11 +580,10 @@ function AppsMenu({ source = true, label = "Aplicativos", title = "Aplicativos"
578
580
  {
579
581
  align: "start",
580
582
  ariaLabel: title,
581
- panelWidth: 332,
583
+ panelWidth: 400,
582
584
  panelClassName: "rootzz-apps",
583
585
  renderTrigger: ({ toggle, triggerProps }) => /* @__PURE__ */ jsxRuntime.jsx(IconButton, { onClick: toggle, "aria-label": label, title: label, ...triggerProps, children: /* @__PURE__ */ jsxRuntime.jsx(AppsGridIcon, { size: 22 }) }),
584
586
  children: [
585
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__title", children: title }),
586
587
  loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__status", children: "Carregando\u2026" }),
587
588
  error && !loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__status", children: "N\xE3o foi poss\xEDvel carregar os aplicativos." }),
588
589
  !loading && !error && items.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__grid rootzz-scrollbar-none", children: items.map((app, index) => /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useRef","useCallback","createContext","useContext","useEffect","useMemo","jsx","cx","jsxs","forwardRef","IconButton","Fragment","useId","isValidElement","Children","SearchBar"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Título exibido no topo do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={332}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n <div className=\"rootzz-apps__title\">{title}</div>\n\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
1
+ {"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useRef","useCallback","createContext","useContext","useEffect","useMemo","jsx","cx","jsxs","forwardRef","IconButton","Fragment","useId","isValidElement","Children","SearchBar"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, className, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n // Classe `rootzz-*` para o reset escopado alcançar o ícone sem precisar de `svg` global.\n className: className ? `rootzz-icon-svg ${className}` : 'rootzz-icon-svg',\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Rótulo acessível (aria-label) do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={400}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
package/dist/index.d.cts CHANGED
@@ -291,7 +291,7 @@ interface AppsMenuProps {
291
291
  source?: AppsSource;
292
292
  /** Rótulo acessível do botão. Padrão: "Aplicativos". */
293
293
  label?: string;
294
- /** Título exibido no topo do painel. Padrão: "Aplicativos". */
294
+ /** Rótulo acessível (aria-label) do painel. Padrão: "Aplicativos". */
295
295
  title?: string;
296
296
  }
297
297
  /** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */
package/dist/index.d.ts CHANGED
@@ -291,7 +291,7 @@ interface AppsMenuProps {
291
291
  source?: AppsSource;
292
292
  /** Rótulo acessível do botão. Padrão: "Aplicativos". */
293
293
  label?: string;
294
- /** Título exibido no topo do painel. Padrão: "Aplicativos". */
294
+ /** Rótulo acessível (aria-label) do painel. Padrão: "Aplicativos". */
295
295
  title?: string;
296
296
  }
297
297
  /** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */
package/dist/index.mjs CHANGED
@@ -127,7 +127,7 @@ var SidebarProvider = SidebarContext.Provider;
127
127
  function useSidebar() {
128
128
  return useContext(SidebarContext);
129
129
  }
130
- function base({ size = 20, ...props }) {
130
+ function base({ size = 20, className, ...props }) {
131
131
  return {
132
132
  width: size,
133
133
  height: size,
@@ -136,6 +136,8 @@ function base({ size = 20, ...props }) {
136
136
  xmlns: "http://www.w3.org/2000/svg",
137
137
  "aria-hidden": true,
138
138
  focusable: false,
139
+ // Classe `rootzz-*` para o reset escopado alcançar o ícone sem precisar de `svg` global.
140
+ className: className ? `rootzz-icon-svg ${className}` : "rootzz-icon-svg",
139
141
  ...props
140
142
  };
141
143
  }
@@ -576,11 +578,10 @@ function AppsMenu({ source = true, label = "Aplicativos", title = "Aplicativos"
576
578
  {
577
579
  align: "start",
578
580
  ariaLabel: title,
579
- panelWidth: 332,
581
+ panelWidth: 400,
580
582
  panelClassName: "rootzz-apps",
581
583
  renderTrigger: ({ toggle, triggerProps }) => /* @__PURE__ */ jsx(IconButton, { onClick: toggle, "aria-label": label, title: label, ...triggerProps, children: /* @__PURE__ */ jsx(AppsGridIcon, { size: 22 }) }),
582
584
  children: [
583
- /* @__PURE__ */ jsx("div", { className: "rootzz-apps__title", children: title }),
584
585
  loading && /* @__PURE__ */ jsx("div", { className: "rootzz-apps__status", children: "Carregando\u2026" }),
585
586
  error && !loading && /* @__PURE__ */ jsx("div", { className: "rootzz-apps__status", children: "N\xE3o foi poss\xEDvel carregar os aplicativos." }),
586
587
  !loading && !error && items.length > 0 && /* @__PURE__ */ jsx("div", { className: "rootzz-apps__grid rootzz-scrollbar-none", children: items.map((app, index) => /* @__PURE__ */ jsxs(
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useCallback","jsx","createContext","useContext","cx","IconButton","jsxs","useEffect","useRef","useId","Fragment","isValidElement","forwardRef","SearchBar"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Título exibido no topo do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={332}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n <div className=\"rootzz-apps__title\">{title}</div>\n\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
1
+ {"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useCallback","jsx","createContext","useContext","cx","IconButton","jsxs","useEffect","useRef","useId","Fragment","isValidElement","forwardRef","SearchBar"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, className, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n // Classe `rootzz-*` para o reset escopado alcançar o ícone sem precisar de `svg` global.\n className: className ? `rootzz-icon-svg ${className}` : 'rootzz-icon-svg',\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Rótulo acessível (aria-label) do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={400}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
package/dist/styles.css CHANGED
@@ -63,6 +63,9 @@
63
63
 
64
64
  /* Movimento */
65
65
  --rzl-duration: 200ms;
66
+ /* Troca de tema: texto/borda respondem rápido, fundo acompanha mais devagar. */
67
+ --rzl-theme-fg-duration: 120ms;
68
+ --rzl-theme-bg-duration: 320ms;
66
69
  --rzl-ease: cubic-bezier(0.4, 0, 0.2, 1);
67
70
 
68
71
  /* Tipografia — Google Sans é a fonte padrão (herde do app sobrescrevendo --rzl-font) */
@@ -79,8 +82,8 @@
79
82
  --rzl-active-bg: rgba(71, 112, 235, 0.16);
80
83
  --rzl-active-fg: var(--rzl-primary);
81
84
 
82
- --rzl-bg: #141414;
83
- --rzl-surface: #1c1c20;
85
+ --rzl-bg: #000000;
86
+ --rzl-surface: #000000; /* topbar e sidebar acompanham o fundo no dark */
84
87
 
85
88
  --rzl-fg: #ffffff;
86
89
  --rzl-fg-muted: rgba(255, 255, 255, 0.65);
@@ -100,6 +103,8 @@
100
103
  @media (prefers-reduced-motion: reduce) {
101
104
  .rootzz-layout {
102
105
  --rzl-duration: 0.01ms;
106
+ --rzl-theme-fg-duration: 0.01ms;
107
+ --rzl-theme-bg-duration: 0.01ms;
103
108
  }
104
109
  }
105
110
 
@@ -116,6 +121,16 @@
116
121
  border-color: var(--rzl-border);
117
122
  }
118
123
 
124
+ /* Transição suave de tema (claro ↔ escuro) nas superfícies e textos da lib.
125
+ Declarada ANTES das regras de componente, para que transições de movimento
126
+ já existentes (drawer, dropdown, hover) continuem prevalecendo onde forem
127
+ definidas. Usa --rzl-duration, então respeita `prefers-reduced-motion`. */
128
+ [class*='rootzz-'] {
129
+ transition: background-color var(--rzl-theme-bg-duration) var(--rzl-ease),
130
+ border-color var(--rzl-theme-fg-duration) var(--rzl-ease),
131
+ color var(--rzl-theme-fg-duration) var(--rzl-ease);
132
+ }
133
+
119
134
  .rootzz-layout {
120
135
  /* Layout do shell: coluna com topbar no topo e (sidebar + conteúdo) abaixo. */
121
136
  display: flex;
@@ -130,7 +145,10 @@
130
145
  -webkit-font-smoothing: subpixel-antialiased;
131
146
  }
132
147
 
133
- .rootzz-layout button {
148
+ /* Resets escopados aos elementos da própria lib (classes `rootzz-*`).
149
+ Nunca usam seletores de tag globais (`a`, `button`, `img`…), para não
150
+ vazar no conteúdo do consumidor dentro de `.rootzz-content__inner`. */
151
+ button[class*='rootzz-'] {
134
152
  font: inherit;
135
153
  letter-spacing: inherit;
136
154
  color: inherit;
@@ -141,40 +159,33 @@
141
159
  cursor: pointer;
142
160
  }
143
161
 
144
- .rootzz-layout button:disabled {
162
+ button[class*='rootzz-']:disabled {
145
163
  cursor: not-allowed;
146
164
  }
147
165
 
148
- .rootzz-layout a {
166
+ a[class*='rootzz-'] {
149
167
  color: inherit;
150
168
  text-decoration: none;
151
169
  }
152
170
 
153
- .rootzz-layout img,
154
- .rootzz-layout svg {
171
+ img[class*='rootzz-'],
172
+ svg[class*='rootzz-'] {
155
173
  display: block;
156
174
  }
157
175
 
158
- .rootzz-layout img {
176
+ img[class*='rootzz-'] {
159
177
  max-width: 100%;
160
178
  height: auto;
161
179
  }
162
180
 
163
- .rootzz-layout ul,
164
- .rootzz-layout ol {
165
- margin: 0;
166
- padding: 0;
167
- list-style: none;
168
- }
169
-
170
- .rootzz-layout input,
171
- .rootzz-layout textarea,
172
- .rootzz-layout select {
181
+ input[class*='rootzz-'],
182
+ textarea[class*='rootzz-'],
183
+ select[class*='rootzz-'] {
173
184
  font: inherit;
174
185
  color: inherit;
175
186
  }
176
187
 
177
- .rootzz-layout :focus-visible {
188
+ [class*='rootzz-']:focus-visible {
178
189
  outline: 2px solid var(--rzl-primary);
179
190
  outline-offset: 2px;
180
191
  }
@@ -228,7 +239,7 @@
228
239
  display: flex;
229
240
  flex-shrink: 0;
230
241
  align-items: center;
231
- gap: 0.125rem;
242
+ gap: 8px;
232
243
  }
233
244
 
234
245
  /* Botão de menu (hambúrguer): só no mobile. Especificidade dupla
@@ -243,7 +254,7 @@
243
254
  padding: 0 1rem;
244
255
  }
245
256
  .rootzz-topbar__right {
246
- gap: 0.25rem;
257
+ gap: 8px;
247
258
  }
248
259
  }
249
260
 
@@ -294,8 +305,8 @@
294
305
  }
295
306
 
296
307
  .rootzz-brand__app-icon {
297
- height: 28px;
298
- width: 28px;
308
+ height: 35px;
309
+ width: 35px;
299
310
  object-fit: contain;
300
311
  flex-shrink: 0;
301
312
  }
@@ -431,7 +442,7 @@
431
442
  .rootzz-dropdown__panel {
432
443
  position: absolute;
433
444
  top: 100%;
434
- margin-top: 0.5rem;
445
+ margin-top: 4px;
435
446
  z-index: var(--rzl-z-dropdown);
436
447
  transform-origin: top;
437
448
  padding: 0.375rem 0;
@@ -467,15 +478,6 @@
467
478
  padding: 0.5rem;
468
479
  }
469
480
 
470
- .rootzz-apps__title {
471
- padding: 0.25rem 0.5rem 0.5rem;
472
- font-size: 0.75rem;
473
- font-weight: 600;
474
- text-transform: uppercase;
475
- letter-spacing: 0.025em;
476
- color: var(--rzl-fg-subtle);
477
- }
478
-
479
481
  .rootzz-apps__status {
480
482
  padding: 1.5rem 0.5rem;
481
483
  text-align: center;
@@ -514,7 +516,7 @@
514
516
 
515
517
  .rootzz-apps__label {
516
518
  font-size: 0.75rem;
517
- font-weight: 500;
519
+ font-weight: 400;
518
520
  line-height: 1.25;
519
521
  color: var(--rzl-fg);
520
522
  }
@@ -524,6 +526,8 @@
524
526
  display: flex;
525
527
  align-items: center;
526
528
  gap: 0.5rem;
529
+ /* 8px de gap entre os ícones + 4px aqui = 12px do usuário até os ícones. */
530
+ margin-left: 4px;
527
531
  max-width: 220px;
528
532
  padding: 0.25rem 0.5rem 0.25rem 0.25rem;
529
533
  border-radius: 9999px;
@@ -844,7 +848,7 @@
844
848
  padding-right: 0.5rem;
845
849
  border-radius: var(--rzl-radius);
846
850
  text-align: left;
847
- font-size: 16px;
851
+ font-size: 15px;
848
852
  color: var(--rzl-fg);
849
853
  transition: background-color var(--rzl-duration) var(--rzl-ease),
850
854
  color var(--rzl-duration) var(--rzl-ease);
@@ -931,7 +935,7 @@
931
935
  /* Alinhado ao padding do item simples (.rootzz-sidebar-item). */
932
936
  padding-left: 0.75rem;
933
937
  padding-right: 0.5rem;
934
- font-size: 0.875rem;
938
+ font-size: 14px;
935
939
  font-weight: 400;
936
940
  text-transform: uppercase;
937
941
  letter-spacing: 0.05em;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rootzz-layout",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Shell de aplicação (Topbar + Sidebar + Content) da Eduzz para React. Leve, sem dependências de runtime e em CSS puro (sem Tailwind no consumidor).",
5
5
  "license": "MIT",
6
6
  "author": "Eduzz",