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 +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +4 -3
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +40 -36
- package/package.json +1 -1
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:
|
|
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(
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
-
/**
|
|
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:
|
|
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(
|
package/dist/index.mjs.map
CHANGED
|
@@ -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: #
|
|
83
|
-
--rzl-surface: #
|
|
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
|
-
|
|
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
|
-
|
|
162
|
+
button[class*='rootzz-']:disabled {
|
|
145
163
|
cursor: not-allowed;
|
|
146
164
|
}
|
|
147
165
|
|
|
148
|
-
|
|
166
|
+
a[class*='rootzz-'] {
|
|
149
167
|
color: inherit;
|
|
150
168
|
text-decoration: none;
|
|
151
169
|
}
|
|
152
170
|
|
|
153
|
-
|
|
154
|
-
|
|
171
|
+
img[class*='rootzz-'],
|
|
172
|
+
svg[class*='rootzz-'] {
|
|
155
173
|
display: block;
|
|
156
174
|
}
|
|
157
175
|
|
|
158
|
-
|
|
176
|
+
img[class*='rootzz-'] {
|
|
159
177
|
max-width: 100%;
|
|
160
178
|
height: auto;
|
|
161
179
|
}
|
|
162
180
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
298
|
-
width:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
+
"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",
|