rootzz-layout 0.1.4 → 0.1.6
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 +12 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.mjs +12 -3
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +96 -23
- 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
|
}
|
|
@@ -184,6 +186,9 @@ function SunIcon(props) {
|
|
|
184
186
|
function MoonIcon(props) {
|
|
185
187
|
return /* @__PURE__ */ jsxRuntime.jsx("svg", { ...base(props), children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z", ...stroke }) });
|
|
186
188
|
}
|
|
189
|
+
function ExternalLinkIcon(props) {
|
|
190
|
+
return /* @__PURE__ */ jsxRuntime.jsx("svg", { ...base(props), children: /* @__PURE__ */ jsxRuntime.jsx("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 }) });
|
|
191
|
+
}
|
|
187
192
|
var IconButton = react.forwardRef(function IconButton2({ children, badge, size = 40, className, type = "button", ...rest }, ref) {
|
|
188
193
|
const hasBadge = badge !== void 0 && badge !== false && badge !== null;
|
|
189
194
|
const isDot = badge === true;
|
|
@@ -260,14 +265,18 @@ function SidebarItem({ item, nested = false }) {
|
|
|
260
265
|
const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
261
266
|
item.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rootzz-sidebar-item__icon", children: item.icon }),
|
|
262
267
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "rootzz-sidebar-item__label", children: item.label }),
|
|
263
|
-
item.badge != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rootzz-sidebar-item__badge", children: item.badge })
|
|
268
|
+
item.badge != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rootzz-sidebar-item__badge", children: item.badge }),
|
|
269
|
+
item.external && /* @__PURE__ */ jsxRuntime.jsx(ExternalLinkIcon, { size: 16, className: "rootzz-sidebar-item__external", "aria-hidden": true })
|
|
264
270
|
] });
|
|
265
271
|
if (item.href && !item.disabled) {
|
|
272
|
+
const target = item.target ?? (item.external ? "_blank" : void 0);
|
|
273
|
+
const rel = target === "_blank" ? "noopener noreferrer" : void 0;
|
|
266
274
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
267
275
|
Link,
|
|
268
276
|
{
|
|
269
277
|
href: item.href,
|
|
270
|
-
target
|
|
278
|
+
target,
|
|
279
|
+
rel,
|
|
271
280
|
onClick: handleClick,
|
|
272
281
|
"aria-current": isActive ? "page" : void 0,
|
|
273
282
|
className,
|
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 /** 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"]}
|
|
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 { ExternalLinkIcon } from '../lib/icons';\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 {item.external && (\n <ExternalLinkIcon size={16} className=\"rootzz-sidebar-item__external\" aria-hidden />\n )}\n </>\n );\n\n if (item.href && !item.disabled) {\n // Link externo abre em nova aba por padrão (a menos que `target` seja explícito).\n const target = item.target ?? (item.external ? '_blank' : undefined);\n const rel = target === '_blank' ? 'noopener noreferrer' : undefined;\n return (\n <Link\n href={item.href}\n target={target}\n rel={rel}\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
|
@@ -97,6 +97,12 @@ interface MenuLink {
|
|
|
97
97
|
href?: string;
|
|
98
98
|
/** `target` do link (ex.: "_blank"). */
|
|
99
99
|
target?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Marca o item como link externo: exibe um ícone de link externo ao final e,
|
|
102
|
+
* por padrão, abre em nova aba (`target="_blank"` + `rel="noopener noreferrer"`)
|
|
103
|
+
* quando `target` não for informado explicitamente.
|
|
104
|
+
*/
|
|
105
|
+
external?: boolean;
|
|
100
106
|
/** Clique (alternativa a `href`). */
|
|
101
107
|
onClick?: (event: MouseEvent) => void;
|
|
102
108
|
/** Marca o item como ativo manualmente (sobrepõe `activeKey`). */
|
package/dist/index.d.ts
CHANGED
|
@@ -97,6 +97,12 @@ interface MenuLink {
|
|
|
97
97
|
href?: string;
|
|
98
98
|
/** `target` do link (ex.: "_blank"). */
|
|
99
99
|
target?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Marca o item como link externo: exibe um ícone de link externo ao final e,
|
|
102
|
+
* por padrão, abre em nova aba (`target="_blank"` + `rel="noopener noreferrer"`)
|
|
103
|
+
* quando `target` não for informado explicitamente.
|
|
104
|
+
*/
|
|
105
|
+
external?: boolean;
|
|
100
106
|
/** Clique (alternativa a `href`). */
|
|
101
107
|
onClick?: (event: MouseEvent) => void;
|
|
102
108
|
/** Marca o item como ativo manualmente (sobrepõe `activeKey`). */
|
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
|
}
|
|
@@ -182,6 +184,9 @@ function SunIcon(props) {
|
|
|
182
184
|
function MoonIcon(props) {
|
|
183
185
|
return /* @__PURE__ */ jsx("svg", { ...base(props), children: /* @__PURE__ */ jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z", ...stroke }) });
|
|
184
186
|
}
|
|
187
|
+
function ExternalLinkIcon(props) {
|
|
188
|
+
return /* @__PURE__ */ jsx("svg", { ...base(props), children: /* @__PURE__ */ jsx("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 }) });
|
|
189
|
+
}
|
|
185
190
|
var IconButton = forwardRef(function IconButton2({ children, badge, size = 40, className, type = "button", ...rest }, ref) {
|
|
186
191
|
const hasBadge = badge !== void 0 && badge !== false && badge !== null;
|
|
187
192
|
const isDot = badge === true;
|
|
@@ -258,14 +263,18 @@ function SidebarItem({ item, nested = false }) {
|
|
|
258
263
|
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
259
264
|
item.icon && /* @__PURE__ */ jsx("span", { className: "rootzz-sidebar-item__icon", children: item.icon }),
|
|
260
265
|
/* @__PURE__ */ jsx("span", { className: "rootzz-sidebar-item__label", children: item.label }),
|
|
261
|
-
item.badge != null && /* @__PURE__ */ jsx("span", { className: "rootzz-sidebar-item__badge", children: item.badge })
|
|
266
|
+
item.badge != null && /* @__PURE__ */ jsx("span", { className: "rootzz-sidebar-item__badge", children: item.badge }),
|
|
267
|
+
item.external && /* @__PURE__ */ jsx(ExternalLinkIcon, { size: 16, className: "rootzz-sidebar-item__external", "aria-hidden": true })
|
|
262
268
|
] });
|
|
263
269
|
if (item.href && !item.disabled) {
|
|
270
|
+
const target = item.target ?? (item.external ? "_blank" : void 0);
|
|
271
|
+
const rel = target === "_blank" ? "noopener noreferrer" : void 0;
|
|
264
272
|
return /* @__PURE__ */ jsx(
|
|
265
273
|
Link,
|
|
266
274
|
{
|
|
267
275
|
href: item.href,
|
|
268
|
-
target
|
|
276
|
+
target,
|
|
277
|
+
rel,
|
|
269
278
|
onClick: handleClick,
|
|
270
279
|
"aria-current": isActive ? "page" : void 0,
|
|
271
280
|
className,
|
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 /** 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"]}
|
|
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 { ExternalLinkIcon } from '../lib/icons';\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 {item.external && (\n <ExternalLinkIcon size={16} className=\"rootzz-sidebar-item__external\" aria-hidden />\n )}\n </>\n );\n\n if (item.href && !item.disabled) {\n // Link externo abre em nova aba por padrão (a menos que `target` seja explícito).\n const target = item.target ?? (item.external ? '_blank' : undefined);\n const rel = target === '_blank' ? 'noopener noreferrer' : undefined;\n return (\n <Link\n href={item.href}\n target={target}\n rel={rel}\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
|
@@ -61,8 +61,30 @@
|
|
|
61
61
|
--rzl-z-drawer: 50;
|
|
62
62
|
--rzl-z-dropdown: 60;
|
|
63
63
|
|
|
64
|
+
/* Glow da marca — gradiente decorativo no canto superior esquerdo, atrás de
|
|
65
|
+
todo o conteúdo. `--rzl-brand-glow-opacity` controla a intensidade (bem
|
|
66
|
+
clara por padrão); zere para desligar. As cores vêm da nova brand Eduzz
|
|
67
|
+
(laranja → âmbar → transparente). */
|
|
68
|
+
--rzl-brand-glow-opacity: 0.5;
|
|
69
|
+
--rzl-brand-glow: radial-gradient(
|
|
70
|
+
115% 115% at 12% 4%,
|
|
71
|
+
rgba(255, 106, 0, 0.55) 0%,
|
|
72
|
+
rgba(255, 145, 10, 0.45) 18%,
|
|
73
|
+
rgba(255, 178, 40, 0.32) 34%,
|
|
74
|
+
rgba(255, 205, 110, 0.18) 52%,
|
|
75
|
+
rgba(255, 224, 170, 0.08) 68%,
|
|
76
|
+
transparent 82%
|
|
77
|
+
);
|
|
78
|
+
--rzl-brand-glow-size: min(70vw, 900px);
|
|
79
|
+
|
|
64
80
|
/* Movimento */
|
|
65
81
|
--rzl-duration: 200ms;
|
|
82
|
+
/* Troca de tema: o fundo lidera (mais lento) e o texto/borda trocam rápido,
|
|
83
|
+
mas só depois que o fundo já escureceu/clareou (delay) — evita o "flash"
|
|
84
|
+
de texto claro sobre fundo ainda claro. Tudo termina junto. */
|
|
85
|
+
--rzl-theme-fg-duration: 150ms;
|
|
86
|
+
--rzl-theme-fg-delay: 150ms;
|
|
87
|
+
--rzl-theme-bg-duration: 300ms;
|
|
66
88
|
--rzl-ease: cubic-bezier(0.4, 0, 0.2, 1);
|
|
67
89
|
|
|
68
90
|
/* Tipografia — Google Sans é a fonte padrão (herde do app sobrescrevendo --rzl-font) */
|
|
@@ -100,6 +122,9 @@
|
|
|
100
122
|
@media (prefers-reduced-motion: reduce) {
|
|
101
123
|
.rootzz-layout {
|
|
102
124
|
--rzl-duration: 0.01ms;
|
|
125
|
+
--rzl-theme-fg-duration: 0.01ms;
|
|
126
|
+
--rzl-theme-fg-delay: 0ms;
|
|
127
|
+
--rzl-theme-bg-duration: 0.01ms;
|
|
103
128
|
}
|
|
104
129
|
}
|
|
105
130
|
|
|
@@ -116,8 +141,20 @@
|
|
|
116
141
|
border-color: var(--rzl-border);
|
|
117
142
|
}
|
|
118
143
|
|
|
144
|
+
/* Transição suave de tema (claro ↔ escuro) nas superfícies e textos da lib.
|
|
145
|
+
Declarada ANTES das regras de componente, para que transições de movimento
|
|
146
|
+
já existentes (drawer, dropdown, hover) continuem prevalecendo onde forem
|
|
147
|
+
definidas. Usa --rzl-duration, então respeita `prefers-reduced-motion`. */
|
|
148
|
+
[class*='rootzz-'] {
|
|
149
|
+
transition: background-color var(--rzl-theme-bg-duration) var(--rzl-ease),
|
|
150
|
+
border-color var(--rzl-theme-fg-duration) var(--rzl-ease) var(--rzl-theme-fg-delay),
|
|
151
|
+
color var(--rzl-theme-fg-duration) var(--rzl-ease) var(--rzl-theme-fg-delay);
|
|
152
|
+
}
|
|
153
|
+
|
|
119
154
|
.rootzz-layout {
|
|
120
155
|
/* Layout do shell: coluna com topbar no topo e (sidebar + conteúdo) abaixo. */
|
|
156
|
+
position: relative; /* contexto de empilhamento p/ o glow da marca (::before) */
|
|
157
|
+
z-index: 0;
|
|
121
158
|
display: flex;
|
|
122
159
|
flex-direction: column;
|
|
123
160
|
height: 100vh;
|
|
@@ -130,7 +167,29 @@
|
|
|
130
167
|
-webkit-font-smoothing: subpixel-antialiased;
|
|
131
168
|
}
|
|
132
169
|
|
|
133
|
-
|
|
170
|
+
/* Glow da marca: camada decorativa no canto superior esquerdo, ATRÁS de todo o
|
|
171
|
+
conteúdo (z-index -1, dentro do contexto de empilhamento da .rootzz-layout —
|
|
172
|
+
acima do fundo do shell, abaixo de topbar/sidebar/conteúdo). A topbar é opaca
|
|
173
|
+
e mascara o ponto mais quente do gradiente; sidebar e conteúdo são
|
|
174
|
+
transparentes, então o glow aparece por trás deles. `pointer-events: none`
|
|
175
|
+
garante que ele nunca capture cliques. */
|
|
176
|
+
.rootzz-layout::before {
|
|
177
|
+
content: "";
|
|
178
|
+
position: absolute;
|
|
179
|
+
top: 0;
|
|
180
|
+
left: 0;
|
|
181
|
+
z-index: -1;
|
|
182
|
+
width: var(--rzl-brand-glow-size);
|
|
183
|
+
height: var(--rzl-brand-glow-size);
|
|
184
|
+
background: var(--rzl-brand-glow);
|
|
185
|
+
opacity: var(--rzl-brand-glow-opacity);
|
|
186
|
+
pointer-events: none;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* Resets escopados aos elementos da própria lib (classes `rootzz-*`).
|
|
190
|
+
Nunca usam seletores de tag globais (`a`, `button`, `img`…), para não
|
|
191
|
+
vazar no conteúdo do consumidor dentro de `.rootzz-content__inner`. */
|
|
192
|
+
button[class*='rootzz-'] {
|
|
134
193
|
font: inherit;
|
|
135
194
|
letter-spacing: inherit;
|
|
136
195
|
color: inherit;
|
|
@@ -141,40 +200,33 @@
|
|
|
141
200
|
cursor: pointer;
|
|
142
201
|
}
|
|
143
202
|
|
|
144
|
-
|
|
203
|
+
button[class*='rootzz-']:disabled {
|
|
145
204
|
cursor: not-allowed;
|
|
146
205
|
}
|
|
147
206
|
|
|
148
|
-
|
|
207
|
+
a[class*='rootzz-'] {
|
|
149
208
|
color: inherit;
|
|
150
209
|
text-decoration: none;
|
|
151
210
|
}
|
|
152
211
|
|
|
153
|
-
|
|
154
|
-
|
|
212
|
+
img[class*='rootzz-'],
|
|
213
|
+
svg[class*='rootzz-'] {
|
|
155
214
|
display: block;
|
|
156
215
|
}
|
|
157
216
|
|
|
158
|
-
|
|
217
|
+
img[class*='rootzz-'] {
|
|
159
218
|
max-width: 100%;
|
|
160
219
|
height: auto;
|
|
161
220
|
}
|
|
162
221
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
padding: 0;
|
|
167
|
-
list-style: none;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
.rootzz-layout input,
|
|
171
|
-
.rootzz-layout textarea,
|
|
172
|
-
.rootzz-layout select {
|
|
222
|
+
input[class*='rootzz-'],
|
|
223
|
+
textarea[class*='rootzz-'],
|
|
224
|
+
select[class*='rootzz-'] {
|
|
173
225
|
font: inherit;
|
|
174
226
|
color: inherit;
|
|
175
227
|
}
|
|
176
228
|
|
|
177
|
-
|
|
229
|
+
[class*='rootzz-']:focus-visible {
|
|
178
230
|
outline: 2px solid var(--rzl-primary);
|
|
179
231
|
outline-offset: 2px;
|
|
180
232
|
}
|
|
@@ -198,7 +250,9 @@
|
|
|
198
250
|
gap: 0.5rem;
|
|
199
251
|
height: var(--rzl-topbar-height);
|
|
200
252
|
padding: 0 0.75rem;
|
|
201
|
-
|
|
253
|
+
/* Transparente para o glow da marca aparecer por trás da topbar; o fundo
|
|
254
|
+
opaco do shell vem de `.rootzz-layout` (var(--rzl-bg)). */
|
|
255
|
+
background: transparent;
|
|
202
256
|
border-bottom: 1px solid var(--rzl-border);
|
|
203
257
|
}
|
|
204
258
|
|
|
@@ -243,7 +297,7 @@
|
|
|
243
297
|
padding: 0 1rem;
|
|
244
298
|
}
|
|
245
299
|
.rootzz-topbar__right {
|
|
246
|
-
gap:
|
|
300
|
+
gap: 8px;
|
|
247
301
|
}
|
|
248
302
|
}
|
|
249
303
|
|
|
@@ -515,6 +569,8 @@
|
|
|
515
569
|
display: flex;
|
|
516
570
|
align-items: center;
|
|
517
571
|
gap: 0.5rem;
|
|
572
|
+
/* 8px de gap entre os ícones + 4px aqui = 12px do usuário até os ícones. */
|
|
573
|
+
margin-left: 4px;
|
|
518
574
|
max-width: 220px;
|
|
519
575
|
padding: 0.25rem 0.5rem 0.25rem 0.25rem;
|
|
520
576
|
border-radius: 9999px;
|
|
@@ -673,7 +729,9 @@
|
|
|
673
729
|
flex: 1 1 0%;
|
|
674
730
|
min-height: 0;
|
|
675
731
|
overflow-y: auto;
|
|
676
|
-
|
|
732
|
+
/* Fundo transparente para o glow da marca aparecer por trás; o fundo opaco
|
|
733
|
+
vem de `.rootzz-layout` (var(--rzl-bg)). */
|
|
734
|
+
background: transparent;
|
|
677
735
|
color: var(--rzl-fg);
|
|
678
736
|
}
|
|
679
737
|
|
|
@@ -792,7 +850,9 @@
|
|
|
792
850
|
height: 100%;
|
|
793
851
|
min-height: 0;
|
|
794
852
|
width: 100%;
|
|
795
|
-
|
|
853
|
+
/* Transparente para o glow da marca aparecer por trás da sidebar estática.
|
|
854
|
+
No drawer mobile, o fundo opaco vem do próprio `.rootzz-drawer`. */
|
|
855
|
+
background: transparent;
|
|
796
856
|
}
|
|
797
857
|
|
|
798
858
|
.rootzz-nav__header {
|
|
@@ -805,6 +865,7 @@
|
|
|
805
865
|
min-height: 0;
|
|
806
866
|
overflow-y: auto;
|
|
807
867
|
padding: 1.25rem;
|
|
868
|
+
padding-bottom: 2.5rem;
|
|
808
869
|
}
|
|
809
870
|
|
|
810
871
|
.rootzz-nav__list {
|
|
@@ -835,7 +896,7 @@
|
|
|
835
896
|
padding-right: 0.5rem;
|
|
836
897
|
border-radius: var(--rzl-radius);
|
|
837
898
|
text-align: left;
|
|
838
|
-
font-size:
|
|
899
|
+
font-size: 15px;
|
|
839
900
|
color: var(--rzl-fg);
|
|
840
901
|
transition: background-color var(--rzl-duration) var(--rzl-ease),
|
|
841
902
|
color var(--rzl-duration) var(--rzl-ease);
|
|
@@ -895,6 +956,12 @@
|
|
|
895
956
|
flex-shrink: 0;
|
|
896
957
|
}
|
|
897
958
|
|
|
959
|
+
/* Ícone de link externo ao final do item. */
|
|
960
|
+
.rootzz-sidebar-item__external {
|
|
961
|
+
flex-shrink: 0;
|
|
962
|
+
color: var(--rzl-fg-subtle);
|
|
963
|
+
}
|
|
964
|
+
|
|
898
965
|
/* ── SidebarGroup ─────────────────────────────────────────────────────── */
|
|
899
966
|
.rootzz-sidebar-group {
|
|
900
967
|
margin-top: 0.5rem;
|
|
@@ -904,6 +971,12 @@
|
|
|
904
971
|
margin-top: 0;
|
|
905
972
|
}
|
|
906
973
|
|
|
974
|
+
/* Item simples logo após um grupo: ganha o mesmo respiro do topo do grupo,
|
|
975
|
+
sem dobrar o espaço entre grupos consecutivos. */
|
|
976
|
+
.rootzz-sidebar-group + .rootzz-sidebar-item {
|
|
977
|
+
margin-top: 0.5rem;
|
|
978
|
+
}
|
|
979
|
+
|
|
907
980
|
.rootzz-sidebar-group__trigger {
|
|
908
981
|
width: 100%;
|
|
909
982
|
border-radius: var(--rzl-radius);
|
|
@@ -922,7 +995,7 @@
|
|
|
922
995
|
/* Alinhado ao padding do item simples (.rootzz-sidebar-item). */
|
|
923
996
|
padding-left: 0.75rem;
|
|
924
997
|
padding-right: 0.5rem;
|
|
925
|
-
font-size:
|
|
998
|
+
font-size: 14px;
|
|
926
999
|
font-weight: 400;
|
|
927
1000
|
text-transform: uppercase;
|
|
928
1001
|
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.6",
|
|
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",
|