@aurea-uds/react 0.40.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -98,7 +98,7 @@ export interface SidebarItem {
98
98
  export type SidebarVariant = "floating" | "flush" | "plain";
99
99
  export type SidebarScrollbar = "hover" | "visible";
100
100
  export type SidebarPlacement = "left" | "right";
101
- export declare function Sidebar({ items, current, collapsed, variant, placement, scrollbar, label, children, className, onClick, ...props }: HTMLAttributes<HTMLElement> & RefAttributes<HTMLElement> & {
101
+ export declare function Sidebar({ items, current, collapsed, variant, placement, scrollbar, label, header, footer, children, className, onClick, ...props }: HTMLAttributes<HTMLElement> & RefAttributes<HTMLElement> & {
102
102
  items?: SidebarItem[];
103
103
  current?: string;
104
104
  collapsed?: boolean;
@@ -106,7 +106,44 @@ export declare function Sidebar({ items, current, collapsed, variant, placement,
106
106
  placement?: SidebarPlacement;
107
107
  scrollbar?: SidebarScrollbar;
108
108
  label?: string;
109
+ /** O topo fixo (4-C): a marca do app (`Sidebar.Brand`), a busca. Não rola com a lista. */
110
+ header?: ReactNode;
111
+ /** O pé fixo (4-C): a pessoa e o sair (`Sidebar.User`), a lista curta (`Sidebar.Nav`), o cartão de destaque. Não rola com a lista. */
112
+ footer?: ReactNode;
109
113
  }): React.JSX.Element;
114
+ export declare namespace Sidebar {
115
+ export { SidebarBrand as Brand };
116
+ export { SidebarUser as User };
117
+ export { SidebarNav as Nav };
118
+ export { SidebarShow as Show };
119
+ }
120
+ /** A marca do app no topo da lateral: o `logo` (a letra, o desenho, a imagem), o nome e o subtítulo. `variant="tile"` (o
121
+ * padrão, a 11 das quinze) põe o logo num quadrinho na cor primária; `plain` (da 8 à 10) é o desenho solto e o nome
122
+ * grande. Recolhida, fica só o logo. */
123
+ declare function SidebarBrand({ logo, name, description, variant, className, ...props }: Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
124
+ logo: ReactNode;
125
+ name: ReactNode;
126
+ description?: ReactNode;
127
+ variant?: "tile" | "plain";
128
+ }): React.JSX.Element;
129
+ /** A pessoa no pé da lateral, numa caixinha: a foto (`avatar`), o nome, o papel e a ação (o sair). Recolhida, a foto e a ação, empilhadas. */
130
+ declare function SidebarUser({ avatar, name, description, action, className, ...props }: Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
131
+ avatar: ReactNode;
132
+ name: ReactNode;
133
+ description?: ReactNode;
134
+ action?: ReactNode;
135
+ }): React.JSX.Element;
136
+ /** Uma segunda lista com a pele da lateral (a do pé: Suporte, Ajustes). `label` é obrigatório: duas listas com o mesmo nome confundem o leitor de tela. */
137
+ declare function SidebarNav({ items, current, label, className, ...props }: Omit<HTMLAttributes<HTMLElement>, "children"> & {
138
+ items: SidebarItem[];
139
+ current?: string;
140
+ label: string;
141
+ }): React.JSX.Element;
142
+ /** O que só aparece com a lateral aberta (`when="expanded"`: a busca, o cartão de destaque) ou só recolhida (`when="collapsed"`: o botão da lupa). */
143
+ declare function SidebarShow({ when, children }: {
144
+ when: "expanded" | "collapsed";
145
+ children?: ReactNode;
146
+ }): React.JSX.Element | null;
110
147
  export type BottomNavVariant = "floating" | "edge";
111
148
  export type BottomNavIndicator = "none" | "subtle" | "pill" | "circle" | "circle-raised" | "circle-bold" | "circle-outline" | "capsule" | "expand";
112
149
  export type BottomNavWidth = "full" | "content";
@@ -177,3 +214,4 @@ export declare function CommandPaletteShell({ open, query, onQueryChange, onClos
177
214
  label?: string;
178
215
  children?: ReactNode;
179
216
  }): React.JSX.Element;
217
+ export {};
@@ -265,11 +265,49 @@ function fecharGavetaAoEscolher(e) {
265
265
  }
266
266
  catch { /* motor sem popover: não há gaveta */ }
267
267
  }
268
- export function Sidebar({ items, current, collapsed, variant = "floating", placement = "left", scrollbar = "hover", label, children, className, onClick, ...props }) {
268
+ // O TOPO E O PÉ FIXOS (4-C, o item 107 — as quinze laterais aprovadas pelo Victor em 21/10/2026, e o PV-15 de um
269
+ // segundo app). `header` e `footer` ficam presos; só o meio (a lista e o que vier em `children`) rola. Sem eles, a
270
+ // lateral continua a caixa de sempre — o mesmo HTML. As partes que moram neles (`Sidebar.Brand`, `Sidebar.User`,
271
+ // `Sidebar.Nav`, `Sidebar.Show`) sabem se a lateral está recolhida por este contexto, interno: o estado de recolher
272
+ // com gancho, para o app, é o 4-B.
273
+ const SidebarContext = React.createContext({ collapsed: false });
274
+ export function Sidebar({ items, current, collapsed, variant = "floating", placement = "left", scrollbar = "hover", label, header, footer, children, className, onClick, ...props }) {
269
275
  const s = useAureaStrings();
270
276
  const baseId = React.useId();
271
- return _jsxs("aside", { className: cx("sidebar", variant !== "floating" && `sidebar-${variant}`, collapsed && "sidebar-collapsed", placement === "right" && "sidebar-right", scrollbar === "visible" && "sidebar-scrollbar-visible", className), "data-placement": placement, onClick: e => { onClick?.(e); fecharGavetaAoEscolher(e); }, ...props, children: [items && items.length > 0 && _jsx("nav", { className: "sidebar-nav", "aria-label": label ?? s.sidebarLabel, children: sidebarList(items, { baseId, current, collapsed }) }), children] });
277
+ const lista = items && items.length > 0 && _jsx("nav", { className: "sidebar-nav", "aria-label": label ?? s.sidebarLabel, children: sidebarList(items, { baseId, current, collapsed }) });
278
+ const partes = header != null || footer != null;
279
+ const contexto = React.useMemo(() => ({ collapsed: !!collapsed, current }), [collapsed, current]);
280
+ return _jsx("aside", { className: cx("sidebar", variant !== "floating" && `sidebar-${variant}`, collapsed && "sidebar-collapsed", placement === "right" && "sidebar-right", scrollbar === "visible" && "sidebar-scrollbar-visible", partes && "sidebar-with-parts", className), "data-placement": placement, onClick: e => { onClick?.(e); fecharGavetaAoEscolher(e); }, ...props, children: _jsx(SidebarContext.Provider, { value: contexto, children: partes
281
+ ? _jsxs(_Fragment, { children: [header != null && _jsx("div", { className: "sidebar-header", children: header }), _jsxs("div", { className: "sidebar-body", children: [lista, children] }), footer != null && _jsx("div", { className: "sidebar-footer", children: footer })] })
282
+ : _jsxs(_Fragment, { children: [lista, children] }) }) });
272
283
  }
284
+ /** A marca do app no topo da lateral: o `logo` (a letra, o desenho, a imagem), o nome e o subtítulo. `variant="tile"` (o
285
+ * padrão, a 11 das quinze) põe o logo num quadrinho na cor primária; `plain` (da 8 à 10) é o desenho solto e o nome
286
+ * grande. Recolhida, fica só o logo. */
287
+ function SidebarBrand({ logo, name, description, variant = "tile", className, ...props }) {
288
+ const { collapsed } = React.useContext(SidebarContext);
289
+ return _jsxs("div", { className: cx("sidebar-brand", variant === "plain" && "sidebar-brand-plain", className), ...props, children: [_jsx("span", { className: "sidebar-brand-logo", "aria-hidden": "true", children: logo }), _jsxs("span", { className: cx("sidebar-brand-text", collapsed && "sr-only"), children: [_jsx("strong", { className: "sidebar-brand-name", children: name }), description != null && _jsx("span", { className: "sidebar-brand-description", children: description })] })] });
290
+ }
291
+ /** A pessoa no pé da lateral, numa caixinha: a foto (`avatar`), o nome, o papel e a ação (o sair). Recolhida, a foto e a ação, empilhadas. */
292
+ function SidebarUser({ avatar, name, description, action, className, ...props }) {
293
+ const { collapsed } = React.useContext(SidebarContext);
294
+ return _jsxs("div", { className: cx("sidebar-user", className), ...props, children: [avatar, _jsxs("span", { className: cx("sidebar-user-text", collapsed && "sr-only"), children: [_jsx("strong", { className: "sidebar-user-name", children: name }), description != null && _jsx("span", { className: "sidebar-user-description", children: description })] }), action] });
295
+ }
296
+ /** Uma segunda lista com a pele da lateral (a do pé: Suporte, Ajustes). `label` é obrigatório: duas listas com o mesmo nome confundem o leitor de tela. */
297
+ function SidebarNav({ items, current, label, className, ...props }) {
298
+ const ctx = React.useContext(SidebarContext);
299
+ const baseId = React.useId();
300
+ return _jsx("nav", { className: cx("sidebar-nav", className), "aria-label": label, ...props, children: sidebarList(items, { baseId, current: current ?? ctx.current, collapsed: ctx.collapsed }) });
301
+ }
302
+ /** O que só aparece com a lateral aberta (`when="expanded"`: a busca, o cartão de destaque) ou só recolhida (`when="collapsed"`: o botão da lupa). */
303
+ function SidebarShow({ when, children }) {
304
+ const { collapsed } = React.useContext(SidebarContext);
305
+ return (when === "collapsed") === collapsed ? _jsx(_Fragment, { children: children }) : null;
306
+ }
307
+ Sidebar.Brand = SidebarBrand;
308
+ Sidebar.User = SidebarUser;
309
+ Sidebar.Nav = SidebarNav;
310
+ Sidebar.Show = SidebarShow;
273
311
  const LEGADO = {
274
312
  flat: ["edge", "none"], surface: ["floating", "circle"], pill: ["floating", "pill"], dock: ["floating", "circle"]
275
313
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/react",
3
- "version": "0.40.0",
3
+ "version": "0.41.0",
4
4
  "description": "Os componentes React da Aurea UDS. Importe @aurea-uds/fonts/css e @aurea-uds/core/css junto.",
5
5
  "keywords": [
6
6
  "aurea",