@studiolxd/brand 46.0.0 → 47.1.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/dist/_shared/portal-container.js +9 -0
  3. package/dist/_types/atoms/AsyncMultiSelect/AsyncMultiSelect.d.ts +8 -7
  4. package/dist/_types/atoms/AsyncSelect/AsyncSelect.d.ts +8 -6
  5. package/dist/_types/atoms/InputPhone/InputPhone.d.ts +8 -5
  6. package/dist/_types/atoms/MenuButton/MenuButton.d.ts +22 -2
  7. package/dist/_types/atoms/MultiSelect/MultiSelect.d.ts +8 -6
  8. package/dist/_types/atoms/Popover/Popover.d.ts +8 -1
  9. package/dist/_types/atoms/Select/Select.d.ts +8 -7
  10. package/dist/_types/atoms/Tooltip/Tooltip.d.ts +7 -0
  11. package/dist/_types/constants/portal-container.d.ts +42 -0
  12. package/dist/_types/messages/BrandMessages.d.ts +29 -1
  13. package/dist/_types/messages/index.d.ts +1 -1
  14. package/dist/_types/molecules/Breadcrumb/Breadcrumb.d.ts +10 -2
  15. package/dist/_types/molecules/EmptyState/EmptyState.d.ts +2 -0
  16. package/dist/_types/molecules/Menu/Menu.d.ts +8 -1
  17. package/dist/_types/molecules/Modal/Modal.d.ts +8 -6
  18. package/dist/_types/molecules/OrgSwitcher/OrgSwitcher.d.ts +15 -1
  19. package/dist/_types/molecules/PageIntro/PageIntro.d.ts +12 -7
  20. package/dist/_types/molecules/PrevNextNav/PrevNextNav.d.ts +17 -2
  21. package/dist/_types/molecules/Sheet/Sheet.d.ts +8 -7
  22. package/dist/_types/molecules/SidebarNav/SidebarNav.d.ts +18 -3
  23. package/dist/_types/molecules/SiteNav/SiteNav.d.ts +9 -0
  24. package/dist/_types/molecules/TableOfContents/TableOfContents.d.ts +11 -2
  25. package/dist/_types/molecules/UserMenu/UserMenu.d.ts +16 -1
  26. package/dist/_types/sections/AppHeader/AppHeader.d.ts +8 -2
  27. package/dist/_types/sections/AppRoot/AppRoot.d.ts +12 -1
  28. package/dist/_types/sections/AppShell/AppShell.d.ts +14 -1
  29. package/dist/_types/sections/Hero/Hero.d.ts +4 -1
  30. package/dist/_types/sections/Sidebar/Sidebar.d.ts +27 -3
  31. package/dist/_types/sections/SiteHeader/SiteHeader.d.ts +22 -3
  32. package/dist/_types/sections/SiteShell/SiteShell.d.ts +11 -5
  33. package/dist/_types/templates/OnboardingShell/OnboardingShell.d.ts +19 -2
  34. package/dist/_types/templates/PublicPageShell/PublicPageShell.d.ts +42 -6
  35. package/dist/app-header.js +1 -1
  36. package/dist/app-launcher.js +62 -58
  37. package/dist/app-root.js +10 -8
  38. package/dist/app-shell.js +51 -50
  39. package/dist/async-multi-select.js +65 -64
  40. package/dist/async-select.js +49 -48
  41. package/dist/brand.css +12 -2
  42. package/dist/breadcrumb.js +24 -21
  43. package/dist/input-phone.js +38 -37
  44. package/dist/link.css +1 -1
  45. package/dist/menu-button.js +16 -14
  46. package/dist/menu.js +44 -40
  47. package/dist/modal.js +32 -31
  48. package/dist/multi-select.js +106 -105
  49. package/dist/onboarding-shell.js +36 -35
  50. package/dist/org-switcher.js +64 -59
  51. package/dist/page-intro.css +1 -1
  52. package/dist/page-intro.js +23 -17
  53. package/dist/popover.js +27 -22
  54. package/dist/prev-next-nav.js +38 -36
  55. package/dist/public-page-shell.js +24 -20
  56. package/dist/select.js +70 -69
  57. package/dist/sheet.js +30 -29
  58. package/dist/sidebar-nav.js +91 -90
  59. package/dist/sidebar.js +72 -71
  60. package/dist/site-header.js +44 -43
  61. package/dist/site-nav.js +27 -25
  62. package/dist/site-shell.js +23 -15
  63. package/dist/table-of-contents.js +30 -27
  64. package/dist/toaster.js +57 -53
  65. package/dist/tokens.css +2 -2
  66. package/dist/tooltip.js +45 -41
  67. package/dist/user-menu.js +58 -52
  68. package/package.json +1 -1
  69. package/src/tokens/molecules/page-intro.css +1 -1
  70. package/src/tokens/scss/molecules/_page-intro.scss +1 -1
@@ -16,10 +16,14 @@ export interface PrevNextNavProps {
16
16
  /**
17
17
  * Rótulo del control anterior. Sin `prevTitle` es el `aria-label` del
18
18
  * chevron; con `prevTitle` es el rótulo **visible** que lo encabeza.
19
- * Default: "Anterior"
19
+ * **Sin default**: sin él, sale de `prevNextNav.previous` del
20
+ * `BrandMessagesProvider`.
20
21
  */
21
22
  prevLabel?: string;
22
- /** Rótulo del control siguiente. Mismo contrato que `prevLabel`. Default: "Siguiente" */
23
+ /**
24
+ * Rótulo del control siguiente. Mismo contrato que `prevLabel`. **Sin
25
+ * default**: sale de `prevNextNav.next`.
26
+ */
23
27
  nextLabel?: string;
24
28
  /**
25
29
  * Título visible del destino anterior (el de la página, el capítulo…). Con
@@ -47,4 +51,15 @@ export interface PrevNextNavProps {
47
51
  /** Variante de densidad. Default: "md" */
48
52
  size?: 'sm' | 'md';
49
53
  }
54
+ /**
55
+ * Los dos textos del par, y los dos son **cromo**: «anterior» y «siguiente»
56
+ * dicen la dirección, no el destino. El destino —`prevTitle`, `nextTitle`, el
57
+ * rótulo del medio— es **contenido** y lo escribe la página.
58
+ */
59
+ export interface PrevNextNavMessages {
60
+ /** Rótulo del control anterior. */
61
+ previous: string;
62
+ /** Rótulo del control siguiente. */
63
+ next: string;
64
+ }
50
65
  export declare function PrevNextNav({ prevHref, nextHref, prevOnClick, nextOnClick, prevLabel, nextLabel, prevTitle, nextTitle, label, labelId, linkComponent, size, }: PrevNextNavProps): import("react/jsx-runtime").JSX.Element;
@@ -39,13 +39,14 @@ export interface SheetProps extends Omit<React.ComponentPropsWithoutRef<'div'>,
39
39
  /** Elemento que abre el panel. Sin él, la apertura la controla el consumidor. */
40
40
  trigger?: ReactNode;
41
41
  /**
42
- * Nodo DOM donde montar el portal del panel (reenviado a Base UI
43
- * `Portal.container`). Por defecto se monta en `document.body`, que
44
- * hereda el tema activado a nivel raíz (`html.dark`/`[data-theme="dark"]`)
45
- * sin configuración adicional. Solo hace falta pasarlo cuando el Sheet
46
- * vive dentro de una superficie **anidada** (un `.surface-dark` que no está
47
- * en la raíz, o dentro de `SiteShell`/`.site-shell`), ya que ese contexto
48
- * no llega a `document.body` por la cascada.
42
+ * Nodo DOM donde montar el portal del panel (reenviado a Base UI `Portal.container`).
43
+ * Por defecto, el nodo de la superficie que llegue por contexto:
44
+ * `SiteShell` publica el suyo, de modo que la capa hereda la talla de la
45
+ * superficie pública en vez de abrirse a la de aplicación. Si no hay
46
+ * superficie, `document.body` — que ya hereda el tema activado en la raíz
47
+ * (`html.dark`/`[data-theme="dark"]`) sin configuración adicional. Pásalo
48
+ * solo para llevar la capa a otro sitio: un `.surface-dark` **anidado**, el
49
+ * cajón de un shell propio. Gana siempre.
49
50
  */
50
51
  container?: React.ComponentPropsWithoutRef<typeof Dialog.Portal>['container'];
51
52
  /**
@@ -41,11 +41,14 @@ export type SidebarNavRenderLinkProps = React.AnchorHTMLAttributes<HTMLAnchorEle
41
41
  'aria-current'?: 'page';
42
42
  };
43
43
  export interface SidebarNavProps {
44
- /** Nombre accesible del `nav`. */
44
+ /**
45
+ * Nombre accesible del `nav`. **Sin default**: sin él, sale de
46
+ * `sidebarNav.label` del `BrandMessagesProvider`.
47
+ */
45
48
  label?: string;
46
49
  /**
47
- * Marca de las entradas vacías (`empty`). Por defecto, en castellano:
48
- * «sin docs».
50
+ * Marca de las entradas vacías (`empty`). **Sin default**: sale de
51
+ * `sidebarNav.empty`. Solo se lee cuando hay alguna entrada vacía.
49
52
  */
50
53
  emptyLabel?: string;
51
54
  /** Solo iconos: los enlaces con tooltip, los grupos como menú. Sin él, lo decide la `Sidebar` (rail). */
@@ -56,4 +59,16 @@ export interface SidebarNavProps {
56
59
  onValueChange?: (value: string[]) => void;
57
60
  renderLink?: (props: SidebarNavRenderLinkProps) => ReactNode;
58
61
  }
62
+ /**
63
+ * Los dos textos de la navegación, los dos **cromo**: el nombre de la región
64
+ * («Principal», el mismo en toda la suite) y la marca que se pone a una entrada
65
+ * sin contenido. Los rótulos de las entradas son **contenido** y siguen
66
+ * viniendo en `entries`.
67
+ */
68
+ export interface SidebarNavMessages {
69
+ /** Nombre accesible del `nav`. */
70
+ label: string;
71
+ /** Marca de las entradas sin contenido. */
72
+ empty: string;
73
+ }
59
74
  export declare function SidebarNav({ label, emptyLabel, rail, entries, defaultValue, value, onValueChange, renderLink, }: SidebarNavProps): import("react/jsx-runtime").JSX.Element;
@@ -49,4 +49,13 @@ export interface SiteNavProps {
49
49
  * `style-src 'self'` descarta el atributo sin avisar y el grupo de más caía
50
50
  * a la segunda fila.
51
51
  */
52
+ /**
53
+ * El único texto que el índice dice por su cuenta, y es **cromo**: el nombre de
54
+ * la región de navegación. Los grupos y sus enlaces son **contenido** y vienen
55
+ * en `groups`.
56
+ */
57
+ export interface SiteNavMessages {
58
+ /** Nombre accesible del `nav`. */
59
+ label: string;
60
+ }
52
61
  export declare function SiteNav({ groups, label, renderLink, className, }: SiteNavProps): import("react/jsx-runtime").JSX.Element;
@@ -17,8 +17,8 @@ export interface TableOfContentsProps extends Omit<React.ComponentPropsWithoutRe
17
17
  */
18
18
  activeId?: string;
19
19
  /**
20
- * Nombre accesible del `nav`. Por defecto, en castellano.
21
- * @default 'En esta página'
20
+ * Nombre accesible del `nav`. **Sin default**: sin él, sale de
21
+ * `tableOfContents.label` del `BrandMessagesProvider`.
22
22
  */
23
23
  ariaLabel?: string;
24
24
  /** Rótulo visible sobre la lista. Sin él, no se pinta ninguno. */
@@ -46,4 +46,13 @@ export interface TableOfContentsProps extends Omit<React.ComponentPropsWithoutRe
46
46
  * `{...rest}` (`id`, `data-*`, `role`…) se reenvía al `<nav>`. El nombre
47
47
  * accesible sigue siendo `ariaLabel`.
48
48
  */
49
+ /**
50
+ * El único texto que el índice dice por su cuenta, y es **cromo**: «En esta
51
+ * página» nombra la región, no la página. El rótulo visible (`title`) y los
52
+ * encabezados (`items`) son **contenido**.
53
+ */
54
+ export interface TableOfContentsMessages {
55
+ /** Nombre accesible del `nav`. */
56
+ label: string;
57
+ }
49
58
  export declare const TableOfContents: import("react").ForwardRefExoticComponent<TableOfContentsProps & import("react").RefAttributes<HTMLElement>>;
@@ -1,11 +1,26 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { MenuItem, MenuRenderLinkProps } from '../Menu/Menu';
3
3
  import './UserMenu.css';
4
+ /**
5
+ * Lo que el menú de cuenta dice por su cuenta, y es **cromo**: cómo se nombra
6
+ * su botón y cómo se cuentan las notificaciones sin leer. Los dos interpolan un
7
+ * dato —el nombre, el número—, así que son funciones. El nombre, el correo y
8
+ * los ítems son **contenido** y siguen viniendo por props.
9
+ */
10
+ export interface UserMenuMessages {
11
+ /** Nombre accesible del botón, a partir del nombre del usuario. */
12
+ trigger: (name: string) => string;
13
+ /** Nombre accesible del contador de notificaciones sin leer. */
14
+ unread: (count: number) => string;
15
+ }
4
16
  export interface UserMenuProps {
5
17
  name: string;
6
18
  email: string;
7
19
  avatarUrl?: string;
8
- /** Nombre accesible del botón. Por defecto, «Cuenta de ‹nombre›». */
20
+ /**
21
+ * Nombre accesible del botón. **Sin default**: sin él, sale de
22
+ * `userMenu.trigger` del `BrandMessagesProvider`, que recibe el nombre.
23
+ */
9
24
  label?: string;
10
25
  /** Sin nombre — avatar, badge y chevron: para la barra del AppHeader. El nombre sigue en el panel y en el nombre accesible. */
11
26
  compact?: boolean;
@@ -7,9 +7,15 @@ export interface AppHeaderProps {
7
7
  notifications?: ReactNode;
8
8
  /** Al final, siempre: el `UserMenu` (compacto). */
9
9
  end?: ReactNode;
10
- /** Texto accesible del botón de menú. */
10
+ /**
11
+ * Texto accesible del botón de menú. **Reenvío puro** al `MenuButton`: sin
12
+ * él, el botón lee `menuButton.open` del `BrandMessagesProvider`.
13
+ */
11
14
  menuLabel?: string;
12
- /** Texto accesible del botón cuando la sidebar está abierta («Cerrar menú»). */
15
+ /**
16
+ * Texto accesible del botón con la sidebar abierta. **Reenvío puro** al
17
+ * `MenuButton`: sin él, lee `menuButton.close`.
18
+ */
13
19
  menuCloseLabel?: string;
14
20
  /** id de la sidebar que gobierna el botón (`aria-controls`). */
15
21
  sidebarId?: string;
@@ -1,6 +1,17 @@
1
1
  import type { ReactNode } from 'react';
2
- export interface AppRootProps {
2
+ /**
3
+ * El único texto de la raíz, y es **cromo**: el enlace de salto al contenido
4
+ * dice lo mismo en todo el documento y en todos los productos.
5
+ */
6
+ export interface AppRootMessages {
3
7
  /** Texto del enlace de salto al contenido. */
8
+ skipToContent: string;
9
+ }
10
+ export interface AppRootProps {
11
+ /**
12
+ * Texto del enlace de salto al contenido. **Sin default**: sin él, sale de
13
+ * `appRoot.skipToContent` del `BrandMessagesProvider`.
14
+ */
4
15
  skipLabel?: string;
5
16
  /** Destino del salto: el `id` del contenido principal de la página. */
6
17
  skipHref?: string;
@@ -17,9 +17,22 @@ export interface AppShellProps {
17
17
  /** Ancho inicial de la sidebar desplegada (px). Sin él, el token `sidebar.width`. */
18
18
  defaultSidebarWidth?: number;
19
19
  onSidebarWidthChange?: (width: number) => void;
20
- /** Texto del enlace de salto al contenido (`SkipLink`). Default: castellano. */
20
+ /**
21
+ * Texto del enlace de salto al contenido (`SkipLink`). **Sin default**: sin
22
+ * él, sale de `appShell.skipToContent` del `BrandMessagesProvider`.
23
+ */
21
24
  skipLabel?: string;
22
25
  }
26
+ /**
27
+ * El único texto que el armazón dice por su cuenta, y es **cromo**: el enlace
28
+ * de salto al contenido dice lo mismo en todas las pantallas de todas las
29
+ * aplicaciones. Lo que hay dentro del armazón —la barra, la navegación, la
30
+ * página— lo escribe el producto.
31
+ */
32
+ export interface AppShellMessages {
33
+ /** Texto del enlace de salto al contenido. */
34
+ skipToContent: string;
35
+ }
23
36
  /**
24
37
  * El armazón de una aplicación: barra superior, barra lateral y contenido.
25
38
  * Lleva el estado de la sidebar (abierta, rail o cerrada; su ancho) y lo
@@ -4,7 +4,10 @@ import './Hero.css';
4
4
  export interface HeroProps {
5
5
  /** El título de la portada: un `Heading` de nivel 1 a talla 10 (display). */
6
6
  title: ReactNode;
7
- /** La frase bajo el título, opcional: `Paragraph size="large"`. */
7
+ /**
8
+ * La frase bajo el título, opcional: `Paragraph size="large"`. Termina en
9
+ * punto (ver Foundations → Redacción).
10
+ */
8
11
  description?: ReactNode;
9
12
  /** Uno o varios botones (`Button`), en fila con envoltura (`Inline`), bajo el texto. Van a talla `lg`: la escala del Hero lo pide, y el consumidor no tiene que acordarse de pasarla. */
10
13
  actions?: ReactNode;
@@ -1,6 +1,20 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import './Sidebar.css';
3
3
  export { useSidebar } from './SidebarContext';
4
+ /**
5
+ * Lo que la barra dice por su cuenta, y todo es **cromo**: su nombre de región,
6
+ * el nombre del asa que la ensancha y cómo se lee su ancho. Ninguno depende de
7
+ * qué haya dentro —eso lo escribe el producto en `children`—, así que los tres
8
+ * van al catálogo.
9
+ */
10
+ export interface SidebarMessages {
11
+ /** Nombre accesible del `aside`. */
12
+ label: string;
13
+ /** Nombre accesible del asa de redimensión. */
14
+ resizer: string;
15
+ /** Valor hablado del asa: el ancho con su unidad. */
16
+ resizerValue: (width: number) => string;
17
+ }
4
18
  export interface SidebarProps {
5
19
  /** Arriba del todo (un `Logo`). */
6
20
  logo?: ReactNode;
@@ -9,11 +23,21 @@ export interface SidebarProps {
9
23
  /** Pie fijo, fuera del scroll del panel. */
10
24
  footer?: ReactNode;
11
25
  id?: string;
12
- /** Nombre accesible del `aside`. Default: «Barra lateral» (castellano). Una app multiidioma debe pasarlo traducido. */
26
+ /**
27
+ * Nombre accesible del `aside`. **Sin default**: sin él, sale de
28
+ * `sidebar.label` del `BrandMessagesProvider`.
29
+ */
13
30
  label?: string;
14
- /** Texto accesible del asa de redimensión. Default: «Ancho de la barra lateral» (castellano). Una app multiidioma debe pasarlo traducido. */
31
+ /**
32
+ * Nombre accesible del asa de redimensión. **Sin default**: sale de
33
+ * `sidebar.resizer`. Solo se lee cuando el asa existe (escritorio, dentro de
34
+ * un `AppShell`, con la barra no cerrada).
35
+ */
15
36
  resizerLabel?: string;
16
- /** Valor hablado del asa: el ancho con su unidad. Default: «N píxeles» (castellano). Una app multiidioma debe pasarlo traducido. */
37
+ /**
38
+ * Valor hablado del asa: el ancho con su unidad. **Sin default**: sale de
39
+ * `sidebar.resizerValue`. Interpola el ancho, así que es una función.
40
+ */
17
41
  resizerValueText?: (width: number) => string;
18
42
  /** Fuerza el modo sin `AppShell` (Storybook, pruebas). Con shell, lo decide el shell. */
19
43
  mode?: 'open' | 'rail';
@@ -11,11 +11,20 @@ export type SiteHeaderLogoLinkProps = {
11
11
  export interface SiteHeaderProps {
12
12
  /** Destino del logotipo. */
13
13
  logoHref?: string;
14
- /** Texto accesible del enlace del logotipo. */
14
+ /**
15
+ * Texto accesible del enlace del logotipo. **Sin default**: sin él, sale de
16
+ * `siteHeader.logo` del `BrandMessagesProvider`.
17
+ */
15
18
  logoLabel?: string;
16
- /** aria-label del botón de menú. */
19
+ /**
20
+ * aria-label del botón de menú. **Reenvío puro** al `MenuButton`: sin él, el
21
+ * botón lee `menuButton.open`.
22
+ */
17
23
  menuLabel?: string;
18
- /** aria-label del botón de menú cuando está abierto («Cerrar menú»). */
24
+ /**
25
+ * aria-label del botón de menú abierto. **Reenvío puro** al `MenuButton`:
26
+ * sin él, lee `menuButton.close`.
27
+ */
19
28
  menuCloseLabel?: string;
20
29
  /** La marca. Por defecto el `Logo` de Studio LXD a `logoSize`; un producto de la suite pone la suya. */
21
30
  logo?: ReactNode;
@@ -55,4 +64,14 @@ export interface SiteHeaderProps {
55
64
  * El enlace de salto al contenido no va aquí: lo pone `AppRoot`, una vez por
56
65
  * documento.
57
66
  */
67
+ /**
68
+ * El único texto propio de la cabecera, y es **cromo**: qué hace el logotipo
69
+ * («ir al inicio»), no qué marca es. Lo que dice el botón de menú no se repite
70
+ * aquí —es un reenvío puro al `MenuButton`—, y los enlaces de `actions` y del
71
+ * panel son **contenido** del producto.
72
+ */
73
+ export interface SiteHeaderMessages {
74
+ /** Texto accesible del enlace del logotipo. */
75
+ logo: string;
76
+ }
58
77
  export declare function SiteHeader({ logoHref, logoLabel, menuLabel, menuCloseLabel, logoSize, logo, menuButtonSize, renderLogoLink, width, open, onOpenChange, children, settings, panelId, actions, language, }: SiteHeaderProps): import("react/jsx-runtime").JSX.Element;
@@ -17,10 +17,16 @@ export interface SiteShellProps {
17
17
  * Para las aplicaciones con barra y sidebar está `AppShell`.
18
18
  */
19
19
  /**
20
- * Reenvía el `ref` al nodo raíz (`.site-shell`): un `Modal`/`Sheet` abierto
21
- * desde dentro necesita apuntar su `container` aquí para heredar los tokens
22
- * de la superficie pública — el portal por defecto monta en `document.body`,
23
- * que no es descendiente de `.site-shell` (a diferencia del tema oscuro, que
24
- * se activa en `<html>` y sí llega a cualquier portal sin configuración).
20
+ * **Los portales que se abran dentro heredan la superficie.** El shell publica
21
+ * su nodo raíz por `PortalContainerContext`, y todo componente con portal
22
+ * —`Select`, `MultiSelect`, `DatePicker`, `Popover`, `Tooltip`, `Menu`,
23
+ * `Modal`, `Sheet`, `Toaster`…— lo toma como destino cuando no recibe
24
+ * `container`. Sin eso, la lista de un `Select` montaba en `document.body`,
25
+ * fuera de `.site-shell`, y se abría a la talla de aplicación mientras su
26
+ * campo iba a la pública. No hay nada que pasar en cada uso; la prop
27
+ * `container` sigue ahí para quien quiera otro destino y gana siempre.
28
+ *
29
+ * Reenvía además el `ref` al nodo raíz (`.site-shell`), para quien necesite
30
+ * apuntar ahí a mano.
25
31
  */
26
32
  export declare const SiteShell: import("react").ForwardRefExoticComponent<SiteShellProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -29,7 +29,10 @@ export interface OnboardingShellProps {
29
29
  * @deprecated Usa `preferences`.
30
30
  */
31
31
  switchers?: ReactNode;
32
- /** Nombre accesible de la banda de preferencias. Default: «Preferencias» (castellano). */
32
+ /**
33
+ * Nombre accesible de la banda de preferencias. **Reenvío puro** al
34
+ * `PublicPageShell`: sin él, la banda lee `publicPageShell.preferences`.
35
+ */
33
36
  preferencesLabel?: string;
34
37
  /**
35
38
  * El progreso: un `Stepper`. La ranura se monta siempre; es el `Stepper`
@@ -47,7 +50,11 @@ export interface OnboardingShellProps {
47
50
  * escritorio, y debajo y centrada en móvil.
48
51
  */
49
52
  exitAction?: ReactNode;
50
- /** Nombre accesible del grupo de acciones del pie. Default: «Acciones del paso» (castellano). */
53
+ /**
54
+ * Nombre accesible del grupo de acciones del pie. **Sin default**: sin él,
55
+ * sale de `onboardingShell.actions` del `BrandMessagesProvider`. Solo se lee
56
+ * cuando el paso trae alguna acción.
57
+ */
51
58
  actionsLabel?: string;
52
59
  /** `id` del `main` (`main-content` por defecto, destino del `SkipLink`). */
53
60
  id?: string;
@@ -101,4 +108,14 @@ export interface OnboardingShellProps {
101
108
  * dentro —un `Form`, un campo suelto, un `AvatarUpload`— sale a la talla que
102
109
  * le toca sin que la aplicación tenga que acordarse de pedirla.
103
110
  */
111
+ /**
112
+ * El único texto propio de la plantilla, y es **cromo**: el nombre del grupo de
113
+ * acciones del pie. Lo que digan los botones —«Continuar», «Atrás», «Omitir por
114
+ * ahora»— es **contenido** y viene en las ranuras. El nombre de la banda de
115
+ * preferencias tampoco está aquí: es un reenvío puro al `PublicPageShell`.
116
+ */
117
+ export interface OnboardingShellMessages {
118
+ /** Nombre accesible del grupo de acciones del pie. */
119
+ actions: string;
120
+ }
104
121
  export declare function OnboardingShell({ children, brand, preferences, switchers, preferencesLabel, stepper, primaryAction, backAction, exitAction, actionsLabel, id, shell, width, className, }: OnboardingShellProps): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
+ import { type ContainerSpace, type ContainerWidth } from '../../atoms/Container/Container';
2
3
  import './PublicPageShell.css';
3
4
  export interface PublicPageShellProps {
4
5
  /** El contenido de la página: lo que va dentro del `main`. */
@@ -19,8 +20,31 @@ export interface PublicPageShellProps {
19
20
  * pie, igual que `header` y `footer`.
20
21
  */
21
22
  preferences?: ReactNode;
22
- /** Nombre accesible de la banda de preferencias. Default: «Preferencias» (castellano). */
23
+ /**
24
+ * Nombre accesible de la banda de preferencias. **Sin default**: sin él,
25
+ * sale de `publicPageShell.preferences` del `BrandMessagesProvider`. Solo se
26
+ * lee cuando hay banda.
27
+ */
23
28
  preferencesLabel?: string;
29
+ /**
30
+ * Medida del contenido del `main`, tal cual la de `Container`. Por defecto
31
+ * `'xl'` (1280px), el ancho de las páginas públicas; `'full'` para que el
32
+ * contenido llegue tan lejos como la banda, que es lo que necesita una
33
+ * portada que abre con un `Hero` de lado a lado.
34
+ */
35
+ mainWidth?: ContainerWidth;
36
+ /**
37
+ * Aire vertical del `main`. Por defecto `'xl'`, el de una página pública
38
+ * corriente; `'none'` cuando lo que va dentro son secciones que ya traen su
39
+ * propio aire (ver `Container` § «Las secciones traen su aire»).
40
+ */
41
+ mainSpace?: ContainerSpace;
42
+ /**
43
+ * Quita el aire lateral del `main`, para contenido que debe tocar el borde
44
+ * de la pantalla. Por defecto `false`. Va con `mainWidth="full"`: sin él, el
45
+ * contenido seguiría acotado y solo se perdería el margen.
46
+ */
47
+ mainFlush?: boolean;
24
48
  /** `id` del `main` (`main-content` por defecto, destino del `SkipLink`). */
25
49
  id?: string;
26
50
  /**
@@ -50,10 +74,22 @@ export interface PublicPageShellProps {
50
74
  * flotante abierto desde la página —`ConsentPreferences`, un `Modal`, un
51
75
  * `Sheet`—: su portal monta por defecto en `document.body`, que no es
52
76
  * descendiente de `.site-shell` y por tanto no hereda el remapeo de superficie
53
- * pública. Apuntarlo al `main` no serviría: el `main` es un `Container`
54
- * acotado y con su aire, así que el panel quedaría metido dentro de la columna
55
- * de contenido en vez de flotar sobre la página. Con `shell={false}` no hay
56
- * marco y el `ref` se queda sin asignar: ahí el contenedor es el `AppShell` de
57
- * la app.
77
+ * pública. Apuntarlo al `main` no serviría: el `main` es un `Container` —por
78
+ * defecto acotado y con su aire—, así que el panel quedaría metido dentro de
79
+ * la columna de contenido en vez de flotar sobre la página. Con `shell={false}`
80
+ * no hay marco y el `ref` se queda sin asignar: ahí el contenedor es el
81
+ * `AppShell` de la app.
82
+ *
83
+ * **El `main` lleva los mismos mandos que un `Container`** (`mainWidth`,
84
+ * `mainSpace`, `mainFlush`), con los defaults de siempre. Es lo que permite que
85
+ * una portada abra con un `Hero` de lado a lado sin salirse del marco.
58
86
  */
87
+ /**
88
+ * El único texto del marco, y es **cromo**: el nombre de la banda donde viven
89
+ * el idioma y el tema. Lo que se ponga dentro es **contenido**.
90
+ */
91
+ export interface PublicPageShellMessages {
92
+ /** Nombre accesible de la banda de preferencias. */
93
+ preferences: string;
94
+ }
59
95
  export declare const PublicPageShell: import("react").ForwardRefExoticComponent<PublicPageShellProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -5,7 +5,7 @@ import { t } from "./_shared/appshellcontext.js";
5
5
  import { useContext as n, useState as r } from "react";
6
6
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
7
7
  //#region src/stories/sections/AppHeader/AppHeader.tsx
8
- function o({ start: o, notifications: s, end: c, menuLabel: l = "Menú de navegación", menuCloseLabel: u, sidebarId: d }) {
8
+ function o({ start: o, notifications: s, end: c, menuLabel: l, menuCloseLabel: u, sidebarId: d }) {
9
9
  let f = n(t), [p, m] = r(!1), h = f ? f.sidebar === "open" : p;
10
10
  return /* @__PURE__ */ a("header", {
11
11
  className: "app-header",