@studiolxd/brand 49.7.0 → 49.8.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.
- package/CHANGELOG.md +59 -0
- package/dist/_shared/tokens.js +3 -0
- package/dist/_types/molecules/Banner/Banner.d.ts +9 -4
- package/dist/_types/sections/AppShell/AppShell.d.ts +12 -1
- package/dist/alert.js +40 -35
- package/dist/app-shell.css +1 -1
- package/dist/app-shell.js +63 -44
- package/dist/banner.css +1 -1
- package/dist/banner.js +25 -21
- package/dist/brand.css +709 -1
- package/dist/sidebar.css +1 -1
- package/dist/tokens.css +694 -1
- package/package.json +1 -1
- package/src/tokens/index.css +5 -0
- package/src/tokens/molecules/banner.css +3 -0
- package/src/tokens/molecules/banner.ts +1 -1
- package/src/tokens/scss/molecules/_banner.scss +3 -0
- package/src/tokens/surface-light.css +685 -0
- package/src/tokens/tokens.json +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,65 @@ El paquete sigue [semver](https://semver.org/lang/es/): **patch** para bug fixes
|
|
|
7
7
|
regeneración de `dist`, **minor** para componentes/props/variantes/tokens nuevos, **major**
|
|
8
8
|
para breaking changes.
|
|
9
9
|
|
|
10
|
+
## [49.8.0] — 2026-09-18
|
|
11
|
+
|
|
12
|
+
> **Minor.** Lo que cae dentro de un `Banner` lee con la tinta del relleno en todas las
|
|
13
|
+
> variantes, llega `Banner variant="error"`, y `AppShell` gana la ranura `banner` por encima
|
|
14
|
+
> de la cabecera.
|
|
15
|
+
|
|
16
|
+
### Los botones dentro del aviso ya no salen blancos sobre amarillo
|
|
17
|
+
|
|
18
|
+
`Banner` declaraba superficie solo en `info`: en `warning` fijaba a tinta el aspa y se
|
|
19
|
+
olvidaba de la ranura de acciones, así que sobre página oscura un `Button variant="outline"`
|
|
20
|
+
heredaba la tinta ambiente y salía **blanco sobre amarillo** (1,50:1). `Alert warning` tenía
|
|
21
|
+
el mismo hueco.
|
|
22
|
+
|
|
23
|
+
La respuesta no es un `!important` por componente sino la pieza que faltaba en el sistema de
|
|
24
|
+
superficies: **`.surface-light`**, el contrapunto de `.surface-dark`, para el interior de un
|
|
25
|
+
relleno **claro y universal**. `.surface-invert` no valía —es la cara *contraria* a la
|
|
26
|
+
ambiente, o sea oscura sobre página clara— y `.surface-dark` es justo al revés. La clase no
|
|
27
|
+
está en `DARK_SELECTORS`: sobre página clara no hace nada, porque los tokens ya están en
|
|
28
|
+
claro, y `src/tokens/surface-light.css` —generado por `pnpm build:tokens`, con los mismos
|
|
29
|
+
nombres y valores que `surface-invert.css`— los devuelve a claro cuando cae dentro de una
|
|
30
|
+
superficie oscura.
|
|
31
|
+
|
|
32
|
+
`Banner warning` la abre sobre el contenido, las acciones y el aspa (y copia antes su tinta
|
|
33
|
+
en `--banner-ink`, que es lo que consumen contenido y acciones); `Alert warning` hace lo
|
|
34
|
+
mismo por el camino que ya tenía (`interiorSurface`). Un botón, un enlace o el aspa dentro
|
|
35
|
+
del aviso leen en prusia en las dos superficies **sin que el consumidor configure nada**.
|
|
36
|
+
|
|
37
|
+
### `Banner variant="error"`
|
|
38
|
+
|
|
39
|
+
`error` es para el estado que hay que ver antes que nada: la suplantación es el caso de
|
|
40
|
+
referencia. Relleno de error del sistema —`error-fill` / `error-fill-text`, los mismos roles
|
|
41
|
+
que `Alert error`, universales en las dos superficies— con el aspa y las acciones en la
|
|
42
|
+
tinta del relleno, que declara la raíz (`.surface-dark`) como en `info`. Tokens
|
|
43
|
+
`banner.error.*` calcados de `banner.warning.*`.
|
|
44
|
+
|
|
45
|
+
Con la variante llega el **rol por variante**, el mismo criterio que en `Alert`: `warning` y
|
|
46
|
+
`error` interrumpen (`role="alert"`, `aria-live="assertive"`) e `info` informa sin
|
|
47
|
+
interrumpir (`role="status"`, `aria-live="polite"`). Las props `role` y `aria-live` siguen
|
|
48
|
+
mandando. Es un cambio de comportamiento en `warning`, que antes anunciaba como `status`.
|
|
49
|
+
|
|
50
|
+
### `AppShell`: la ranura `banner`, por encima de la cabecera
|
|
51
|
+
|
|
52
|
+
Prop `banner?: ReactNode`, pintada **antes de `header`** dentro de `.app-shell` y a ancho
|
|
53
|
+
completo. Es para el estado de sesión que no se puede perder de vista —la suplantación—: va
|
|
54
|
+
por encima de todo, incluida la cabecera. La maqueta no cambia: el armazón sigue siendo una
|
|
55
|
+
columna de `100dvh`, el cuerpo se queda con lo que sobra (`flex: 1; min-block-size: 0`) y la
|
|
56
|
+
sidebar sigue midiendo el cien por cien del cuerpo. La cabecera es `sticky` contra un
|
|
57
|
+
contenedor que no hace scroll, así que la barra ni la tapa ni queda tapada.
|
|
58
|
+
|
|
59
|
+
En **móvil**, el cajón de la sidebar y su velo arrancaban en
|
|
60
|
+
`calc(var(--app-header-height) + env(safe-area-inset-top))`: con barra tienen que arrancar
|
|
61
|
+
por debajo de cabecera **más** barra. Como el alto de la barra lo decide su contenido —el
|
|
62
|
+
mensaje parte en dos líneas, las acciones apilan— no se puede fijar: el armazón la mide con
|
|
63
|
+
un `ResizeObserver` y publica el alto en `--app-shell-banner-height` por el CSSOM
|
|
64
|
+
(`useCssProperties`, como ya hacía con `--app-shell-sidebar-width`). De ahí sale
|
|
65
|
+
`--app-shell-chrome-block-start`, el offset único que consumen el velo (`AppShell.css`) y el
|
|
66
|
+
cajón (`Sidebar.css`, con fallback para un `Sidebar` fuera de un `AppShell`). Sin ranura
|
|
67
|
+
`banner` el valor es cero y todo queda como estaba.
|
|
68
|
+
|
|
10
69
|
## [49.7.0] — 2026-09-18
|
|
11
70
|
|
|
12
71
|
> **Minor.** El legend de `Fieldset` gana aire por debajo, igual que un `Heading` suelto.
|
package/dist/_shared/tokens.js
CHANGED
|
@@ -2149,6 +2149,9 @@ var e = {
|
|
|
2149
2149
|
"--banner-warning-color": "#111e30",
|
|
2150
2150
|
"--banner-warning-border-color": "#ffcd00",
|
|
2151
2151
|
"--banner-warning-close-color": "#111e30",
|
|
2152
|
+
"--banner-error-bg": "#b30000",
|
|
2153
|
+
"--banner-error-color": "#ffffff",
|
|
2154
|
+
"--banner-error-border-color": "#b30000",
|
|
2152
2155
|
"--calendar-planner-gap": "0.5rem",
|
|
2153
2156
|
"--calendar-planner-font-family": "\"Google Sans Flex\", system-ui, sans-serif",
|
|
2154
2157
|
"--calendar-planner-nav-color": "#111e30",
|
|
@@ -8,9 +8,13 @@ export interface BannerMessages {
|
|
|
8
8
|
/** Nombre accesible del aspa que descarta la barra. */
|
|
9
9
|
dismiss: string;
|
|
10
10
|
}
|
|
11
|
-
export type BannerVariant = 'info' | 'warning';
|
|
11
|
+
export type BannerVariant = 'info' | 'warning' | 'error';
|
|
12
12
|
export interface BannerProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Intención de la barra. Default `'info'` (relleno prusia); `'warning'` es el
|
|
15
|
+
* relleno de aviso y `'error'` el de error, para el estado que hay que ver
|
|
16
|
+
* antes que nada.
|
|
17
|
+
*/
|
|
14
18
|
variant?: BannerVariant;
|
|
15
19
|
/** El mensaje. Texto corriente: una frase, no un bloque. */
|
|
16
20
|
children?: React.ReactNode;
|
|
@@ -42,8 +46,9 @@ export interface BannerProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
|
42
46
|
* No fija su posición: `sticky` lo decide la aplicación con el layout del
|
|
43
47
|
* sistema. Tampoco se oculta sola — `onDismiss` avisa y la app decide.
|
|
44
48
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
49
|
+
* El rol sale de la variante, como en `Alert`: `error` y `warning` interrumpen
|
|
50
|
+
* (`alert`, live `assertive`) y `info` informa sin interrumpir (`status`, live
|
|
51
|
+
* `polite`). Ambos se pueden sobrescribir.
|
|
47
52
|
*
|
|
48
53
|
* Extiende los atributos nativos de `<div>` y reenvía `{...rest}` al raíz.
|
|
49
54
|
*/
|
|
@@ -4,6 +4,17 @@ import './AppShell.css';
|
|
|
4
4
|
export { useAppShell } from './AppShellContext';
|
|
5
5
|
export type { AppShellContextValue, SidebarState } from './AppShellContext';
|
|
6
6
|
export interface AppShellProps {
|
|
7
|
+
/**
|
|
8
|
+
* Ranura para una barra de sistema (`Banner`), **por encima de todo, incluida
|
|
9
|
+
* la cabecera**. Es para el estado de sesión que no se puede perder de vista
|
|
10
|
+
* —la suplantación es el caso de referencia—, no para un aviso de pantalla:
|
|
11
|
+
* eso es un `Alert` dentro del contenido.
|
|
12
|
+
*
|
|
13
|
+
* El armazón la mide (`ResizeObserver`) y publica su alto en
|
|
14
|
+
* `--app-shell-banner-height`, de donde lo toman el cajón de la sidebar y su
|
|
15
|
+
* velo para arrancar por debajo de cabecera **más** barra en móvil.
|
|
16
|
+
*/
|
|
17
|
+
banner?: ReactNode;
|
|
7
18
|
/** La barra superior: un `AppHeader`. Siempre visible. */
|
|
8
19
|
header: ReactNode;
|
|
9
20
|
/** La barra lateral: un `Sidebar`. Columna en escritorio, cajón en móvil. */
|
|
@@ -40,4 +51,4 @@ export interface AppShellMessages {
|
|
|
40
51
|
* modo y su asa) y `SidebarNav` (rail). Persistir el estado es del producto:
|
|
41
52
|
* `onSidebarChange` / `onSidebarWidthChange` avisan de cada cambio.
|
|
42
53
|
*/
|
|
43
|
-
export declare function AppShell({ header, sidebar, children, defaultSidebar, sidebarState, onSidebarChange, defaultSidebarWidth, onSidebarWidthChange, skipLabel, }: AppShellProps): import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
export declare function AppShell({ banner, header, sidebar, children, defaultSidebar, sidebarState, onSidebarChange, defaultSidebarWidth, onSidebarWidthChange, skipLabel, }: AppShellProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/alert.js
CHANGED
|
@@ -10,40 +10,45 @@ var o = {
|
|
|
10
10
|
success: "status",
|
|
11
11
|
error: "alert",
|
|
12
12
|
warning: "alert"
|
|
13
|
-
}, s =
|
|
13
|
+
}, s = {
|
|
14
|
+
default: " surface-invert",
|
|
15
|
+
warning: " surface-light",
|
|
16
|
+
success: "",
|
|
17
|
+
error: ""
|
|
18
|
+
}, c = n(function({ className: e, children: t, ...n }, r) {
|
|
14
19
|
return /* @__PURE__ */ i("p", {
|
|
15
20
|
ref: r,
|
|
16
21
|
className: ["alert__title", e ?? ""].filter(Boolean).join(" "),
|
|
17
22
|
...n,
|
|
18
23
|
children: t
|
|
19
24
|
});
|
|
20
|
-
}),
|
|
25
|
+
}), l = n(function({ className: e, children: t, ...n }, r) {
|
|
21
26
|
return /* @__PURE__ */ i("div", {
|
|
22
27
|
ref: r,
|
|
23
28
|
className: ["alert__description", e ?? ""].filter(Boolean).join(" "),
|
|
24
29
|
...n,
|
|
25
30
|
children: t
|
|
26
31
|
});
|
|
27
|
-
}),
|
|
32
|
+
}), u = n(function({ className: e, children: t, ...n }, r) {
|
|
28
33
|
return /* @__PURE__ */ i("div", {
|
|
29
34
|
ref: r,
|
|
30
35
|
className: ["alert__actions", e ?? ""].filter(Boolean).join(" "),
|
|
31
36
|
...n,
|
|
32
37
|
children: t
|
|
33
38
|
});
|
|
34
|
-
}),
|
|
35
|
-
let
|
|
36
|
-
if (
|
|
37
|
-
let
|
|
39
|
+
}), d = n(function({ variant: n = "default", title: c, description: l, actions: u, dismissible: d = !1, onDismiss: f, finalFocus: p, closeLabel: m, className: h, children: g, role: _, ...v }, y) {
|
|
40
|
+
let b = e("alert"), [x, S] = r(!1);
|
|
41
|
+
if (x) return null;
|
|
42
|
+
let C = [
|
|
38
43
|
"alert",
|
|
39
44
|
n === "default" ? "" : `alert--${n}`,
|
|
40
45
|
n === "success" || n === "error" ? "surface-dark" : "",
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
].filter(Boolean).join(" "),
|
|
44
|
-
function
|
|
46
|
+
d ? "alert--dismissible" : "",
|
|
47
|
+
h ?? ""
|
|
48
|
+
].filter(Boolean).join(" "), w = s[n];
|
|
49
|
+
function T() {
|
|
45
50
|
if (typeof document > "u") return;
|
|
46
|
-
let e =
|
|
51
|
+
let e = p?.current;
|
|
47
52
|
if (e) {
|
|
48
53
|
e.focus();
|
|
49
54
|
return;
|
|
@@ -51,41 +56,41 @@ var o = {
|
|
|
51
56
|
let t = document.body, n = t.hasAttribute("tabindex");
|
|
52
57
|
n || t.setAttribute("tabindex", "-1"), t.focus(), n || t.removeAttribute("tabindex");
|
|
53
58
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
59
|
+
function E() {
|
|
60
|
+
T(), f ? f() : S(!0);
|
|
56
61
|
}
|
|
57
62
|
return /* @__PURE__ */ a("div", {
|
|
58
|
-
ref:
|
|
59
|
-
role:
|
|
60
|
-
className:
|
|
61
|
-
...
|
|
63
|
+
ref: y,
|
|
64
|
+
role: _ ?? o[n],
|
|
65
|
+
className: C,
|
|
66
|
+
...v,
|
|
62
67
|
children: [/* @__PURE__ */ a("div", {
|
|
63
|
-
className: `alert__content${
|
|
68
|
+
className: `alert__content${w}`,
|
|
64
69
|
children: [
|
|
65
|
-
|
|
70
|
+
c && /* @__PURE__ */ i("p", {
|
|
66
71
|
className: "alert__title",
|
|
67
|
-
children: s
|
|
68
|
-
}),
|
|
69
|
-
c && /* @__PURE__ */ i("div", {
|
|
70
|
-
className: "alert__description",
|
|
71
72
|
children: c
|
|
72
73
|
}),
|
|
73
|
-
h,
|
|
74
74
|
l && /* @__PURE__ */ i("div", {
|
|
75
|
-
className: "
|
|
75
|
+
className: "alert__description",
|
|
76
76
|
children: l
|
|
77
|
+
}),
|
|
78
|
+
g,
|
|
79
|
+
u && /* @__PURE__ */ i("div", {
|
|
80
|
+
className: "alert__actions",
|
|
81
|
+
children: u
|
|
77
82
|
})
|
|
78
83
|
]
|
|
79
|
-
}),
|
|
80
|
-
className: `alert__close${
|
|
81
|
-
label:
|
|
82
|
-
onClick:
|
|
84
|
+
}), d && /* @__PURE__ */ i(t, {
|
|
85
|
+
className: `alert__close${w}`,
|
|
86
|
+
label: b("close", m),
|
|
87
|
+
onClick: E
|
|
83
88
|
})]
|
|
84
89
|
});
|
|
85
|
-
}),
|
|
86
|
-
Title:
|
|
87
|
-
Description:
|
|
88
|
-
Actions:
|
|
90
|
+
}), f = Object.assign(d, {
|
|
91
|
+
Title: c,
|
|
92
|
+
Description: l,
|
|
93
|
+
Actions: u
|
|
89
94
|
});
|
|
90
95
|
//#endregion
|
|
91
|
-
export {
|
|
96
|
+
export { f as Alert, u as AlertActions, l as AlertDescription, c as AlertTitle };
|
package/dist/app-shell.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.app-shell{--app-shell-sidebar-width:var(--sidebar-width);flex-direction:column;block-size:100dvh;display:flex;overflow:clip}.app-shell__body{flex:1;min-block-size:0;display:flex;position:relative}.app-shell__content{min-inline-size:0;padding-inline:var(--section-padding-inline);padding-block:var(--section-padding-block-lg);flex:1;padding-block-end:max(var(--section-padding-block-lg), env(safe-area-inset-bottom));padding-inline-end:max(var(--section-padding-inline), env(safe-area-inset-right));overflow:auto}.app-shell__backdrop{inset:0;background-color:var(--sidebar-backdrop-bg);opacity:var(--sidebar-backdrop-opacity);z-index:var(--sidebar-backdrop-z-index);position:fixed;inset-block-start:
|
|
1
|
+
.app-shell{--app-shell-sidebar-width:var(--sidebar-width);--app-shell-banner-height:0px;--app-shell-chrome-block-start:calc(var(--app-shell-banner-height) + var(--app-header-height) + env(safe-area-inset-top));flex-direction:column;block-size:100dvh;display:flex;overflow:clip}.app-shell__banner{flex-shrink:0}.app-shell__body{flex:1;min-block-size:0;display:flex;position:relative}.app-shell__content{min-inline-size:0;padding-inline:var(--section-padding-inline);padding-block:var(--section-padding-block-lg);flex:1;padding-block-end:max(var(--section-padding-block-lg), env(safe-area-inset-bottom));padding-inline-end:max(var(--section-padding-inline), env(safe-area-inset-right));overflow:auto}.app-shell__backdrop{inset:0;background-color:var(--sidebar-backdrop-bg);opacity:var(--sidebar-backdrop-opacity);z-index:var(--sidebar-backdrop-z-index);position:fixed;inset-block-start:var(--app-shell-chrome-block-start)}
|
package/dist/app-shell.js
CHANGED
|
@@ -16,67 +16,86 @@ function p() {
|
|
|
16
16
|
return n(), e.addEventListener("change", n), () => e.removeEventListener("change", n);
|
|
17
17
|
}, []), e;
|
|
18
18
|
}
|
|
19
|
-
function m({
|
|
20
|
-
let
|
|
21
|
-
|
|
22
|
-
}, [
|
|
23
|
-
|
|
24
|
-
}, [
|
|
19
|
+
function m({ banner: i, header: f, sidebar: m, children: h, defaultSidebar: g = "open", sidebarState: _, onSidebarChange: v, defaultSidebarWidth: y, onSidebarWidthChange: b, skipLabel: x }) {
|
|
20
|
+
let S = e("appShell"), C = p(), [w, T] = l(g), [E, D] = l(!1), [O, k] = l(y), A = C ? _ ?? w : E ? "open" : "closed", j = o((e) => {
|
|
21
|
+
C ? (T(e), v?.(e)) : D(e === "open");
|
|
22
|
+
}, [C, v]), M = o(() => j(A === "open" ? "closed" : "open"), [j, A]), N = o(() => j("closed"), [j]), P = o((e) => {
|
|
23
|
+
k(e), b?.(e);
|
|
24
|
+
}, [b]);
|
|
25
25
|
s(() => {
|
|
26
|
-
if (
|
|
26
|
+
if (C || !E) return;
|
|
27
27
|
let e = (e) => {
|
|
28
|
-
e.key === "Escape" &&
|
|
28
|
+
e.key === "Escape" && D(!1);
|
|
29
29
|
};
|
|
30
30
|
document.addEventListener("keydown", e);
|
|
31
31
|
let t = document.body.style.overflow;
|
|
32
32
|
return document.body.style.overflow = "hidden", () => {
|
|
33
33
|
document.removeEventListener("keydown", e), document.body.style.overflow = t;
|
|
34
34
|
};
|
|
35
|
-
}, [
|
|
36
|
-
let
|
|
37
|
-
sidebar:
|
|
38
|
-
setSidebar:
|
|
39
|
-
sidebarWidth:
|
|
40
|
-
setSidebarWidth:
|
|
41
|
-
toggleSidebar:
|
|
42
|
-
closeSidebar:
|
|
43
|
-
isDesktop:
|
|
35
|
+
}, [C, E]);
|
|
36
|
+
let F = c(() => ({
|
|
37
|
+
sidebar: A,
|
|
38
|
+
setSidebar: j,
|
|
39
|
+
sidebarWidth: O ?? 0,
|
|
40
|
+
setSidebarWidth: P,
|
|
41
|
+
toggleSidebar: M,
|
|
42
|
+
closeSidebar: N,
|
|
43
|
+
isDesktop: C
|
|
44
44
|
}), [
|
|
45
|
-
k,
|
|
46
45
|
A,
|
|
47
|
-
D,
|
|
48
|
-
N,
|
|
49
46
|
j,
|
|
47
|
+
O,
|
|
48
|
+
P,
|
|
50
49
|
M,
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
N,
|
|
51
|
+
C
|
|
52
|
+
]), [I, L] = l(0), R = o((e) => {
|
|
53
|
+
if (!e) return;
|
|
54
|
+
let t = () => L(e.getBoundingClientRect().height);
|
|
55
|
+
t();
|
|
56
|
+
let n = new ResizeObserver(t);
|
|
57
|
+
return n.observe(e), () => {
|
|
58
|
+
n.disconnect(), L(0);
|
|
59
|
+
};
|
|
60
|
+
}, []), z = n({
|
|
61
|
+
"--app-shell-sidebar-width": O ? `${O}px` : void 0,
|
|
62
|
+
"--app-shell-banner-height": i ? `${I}px` : void 0
|
|
63
|
+
}), B = !C && E;
|
|
53
64
|
return /* @__PURE__ */ u(a.Provider, {
|
|
54
|
-
value:
|
|
65
|
+
value: F,
|
|
55
66
|
children: /* @__PURE__ */ d(r, { children: [/* @__PURE__ */ u(t, {
|
|
56
67
|
href: "#main-content",
|
|
57
|
-
children:
|
|
68
|
+
children: S("skipToContent", x)
|
|
58
69
|
}), /* @__PURE__ */ d("div", {
|
|
59
|
-
ref:
|
|
70
|
+
ref: z,
|
|
60
71
|
className: "app-shell",
|
|
61
|
-
"data-sidebar":
|
|
62
|
-
children: [
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
"data-sidebar": A,
|
|
73
|
+
children: [
|
|
74
|
+
i && /* @__PURE__ */ u("div", {
|
|
75
|
+
ref: R,
|
|
76
|
+
className: "app-shell__banner",
|
|
77
|
+
children: i
|
|
78
|
+
}),
|
|
79
|
+
f,
|
|
80
|
+
/* @__PURE__ */ d("div", {
|
|
81
|
+
className: "app-shell__body",
|
|
82
|
+
children: [
|
|
83
|
+
m,
|
|
84
|
+
B && /* @__PURE__ */ u("div", {
|
|
85
|
+
className: "app-shell__backdrop",
|
|
86
|
+
onClick: N,
|
|
87
|
+
"aria-hidden": "true"
|
|
88
|
+
}),
|
|
89
|
+
/* @__PURE__ */ u("main", {
|
|
90
|
+
id: "main-content",
|
|
91
|
+
tabIndex: -1,
|
|
92
|
+
className: "app-shell__content",
|
|
93
|
+
inert: B || void 0,
|
|
94
|
+
children: h
|
|
95
|
+
})
|
|
96
|
+
]
|
|
97
|
+
})
|
|
98
|
+
]
|
|
80
99
|
})] })
|
|
81
100
|
});
|
|
82
101
|
}
|
package/dist/banner.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--banner-padding-block:var(--spacing-3);--banner-padding-inline:var(--spacing-5);--banner-gap:var(--spacing-4);--banner-close-size:var(--size-component-sm);--banner-close-inset:var(--spacing-2);--banner-border-width:var(--border-width-default);--banner-font-size:var(--text-font-size);--banner-line-height:var(--text-line-height);--banner-info-bg:var(--color-primary);--banner-info-color:var(--color-text-on-dark);--banner-info-border-color:var(--color-text-on-dark);--banner-warning-bg:var(--color-warning-fill);--banner-warning-border-color:var(--color-warning-fill);--banner-warning-color:var(--color-warning-fill-text);--banner-warning-close-color:var(--color-warning-fill-text)}.banner{box-sizing:border-box;background-color:var(--banner-bg);inline-size:100%;color:var(--banner-color);border-block:var(--banner-border-width) solid var(--banner-border-color);padding-block:var(--banner-padding-block);padding-inline:var(--banner-padding-inline);font-size:var(--banner-font-size);line-height:var(--banner-line-height);align-items:flex-start;gap:var(--banner-gap);border-inline:0;flex-direction:column;display:flex;position:relative}.banner.banner--dismissible{padding-inline-end:calc(var(--banner-close-inset) * 2 + var(--banner-close-size))}.banner__content{min-inline-size:0}.banner__actions{align-self:stretch;align-items:stretch;gap:var(--banner-gap);flex-direction:column;display:flex}.banner__actions>*{inline-size:100%}.banner .banner__close{--close-button-size:var(--banner-close-size);position:absolute;inset-block-start:var(--banner-close-inset);inset-inline-end:var(--banner-close-inset)}@media (width>=768px){.banner{flex-direction:row;align-items:center}.banner__content{flex:1}.banner__actions{flex-flow:wrap;align-self:auto;align-items:center}.banner__actions>*{inline-size:auto}}.banner.banner--info{--banner-bg:var(--banner-info-bg);--banner-color:var(--banner-info-color);--banner-border-color:var(--banner-info-border-color)}.banner.banner--warning{--banner-bg:var(--banner-warning-bg);--banner-color:var(--banner-warning-color);--banner-border-color:var(--banner-warning-border-color);--close-button-color:var(--banner-warning-close-color);--close-button-focus-ring-color:var(--banner-warning-close-color)}
|
|
1
|
+
:root{--banner-padding-block:var(--spacing-3);--banner-padding-inline:var(--spacing-5);--banner-gap:var(--spacing-4);--banner-close-size:var(--size-component-sm);--banner-close-inset:var(--spacing-2);--banner-border-width:var(--border-width-default);--banner-font-size:var(--text-font-size);--banner-line-height:var(--text-line-height);--banner-info-bg:var(--color-primary);--banner-info-color:var(--color-text-on-dark);--banner-info-border-color:var(--color-text-on-dark);--banner-warning-bg:var(--color-warning-fill);--banner-warning-border-color:var(--color-warning-fill);--banner-error-bg:var(--color-error-fill);--banner-error-color:var(--color-error-fill-text);--banner-error-border-color:var(--color-error-fill);--banner-warning-color:var(--color-warning-fill-text);--banner-warning-close-color:var(--color-warning-fill-text)}.banner{box-sizing:border-box;background-color:var(--banner-bg);inline-size:100%;color:var(--banner-color);border-block:var(--banner-border-width) solid var(--banner-border-color);padding-block:var(--banner-padding-block);padding-inline:var(--banner-padding-inline);font-size:var(--banner-font-size);line-height:var(--banner-line-height);--banner-ink:var(--banner-color);align-items:flex-start;gap:var(--banner-gap);border-inline:0;flex-direction:column;display:flex;position:relative}.banner.banner--dismissible{padding-inline-end:calc(var(--banner-close-inset) * 2 + var(--banner-close-size))}.banner__content{min-inline-size:0}.banner .banner__content,.banner .banner__actions{color:var(--banner-ink)}.banner__actions{align-self:stretch;align-items:stretch;gap:var(--banner-gap);flex-direction:column;display:flex}.banner__actions>*{inline-size:100%}.banner .banner__close{--close-button-size:var(--banner-close-size);position:absolute;inset-block-start:var(--banner-close-inset);inset-inline-end:var(--banner-close-inset)}@media (width>=768px){.banner{flex-direction:row;align-items:center}.banner__content{flex:1}.banner__actions{flex-flow:wrap;align-self:auto;align-items:center}.banner__actions>*{inline-size:auto}}.banner.banner--info{--banner-bg:var(--banner-info-bg);--banner-color:var(--banner-info-color);--banner-border-color:var(--banner-info-border-color)}.banner.banner--warning{--banner-bg:var(--banner-warning-bg);--banner-color:var(--banner-warning-color);--banner-border-color:var(--banner-warning-border-color);--close-button-color:var(--banner-warning-close-color);--close-button-focus-ring-color:var(--banner-warning-close-color)}.banner.banner--error{--banner-bg:var(--banner-error-bg);--banner-color:var(--banner-error-color);--banner-border-color:var(--banner-error-border-color)}
|
package/dist/banner.js
CHANGED
|
@@ -5,36 +5,40 @@ import { CloseButton as t } from "./close-button.js";
|
|
|
5
5
|
import { forwardRef as n } from "react";
|
|
6
6
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
7
7
|
//#region src/stories/molecules/Banner/Banner.tsx
|
|
8
|
-
var a =
|
|
9
|
-
|
|
8
|
+
var a = {
|
|
9
|
+
info: "status",
|
|
10
|
+
warning: "alert",
|
|
11
|
+
error: "alert"
|
|
12
|
+
}, o = n(function({ variant: n = "info", children: o, actions: s, onDismiss: c, dismissLabel: l, className: u, role: d, "aria-live": f, ...p }, m) {
|
|
13
|
+
let h = e("banner"), g = d ?? a[n], _ = [
|
|
10
14
|
"banner",
|
|
11
15
|
`banner--${n}`,
|
|
12
|
-
n === "info" ? "surface-dark" : "",
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
].filter(Boolean).join(" ");
|
|
16
|
+
n === "info" || n === "error" ? "surface-dark" : "",
|
|
17
|
+
c ? "banner--dismissible" : "",
|
|
18
|
+
u ?? ""
|
|
19
|
+
].filter(Boolean).join(" "), v = n === "warning" ? " surface-light" : "";
|
|
16
20
|
return /* @__PURE__ */ i("div", {
|
|
17
|
-
ref:
|
|
18
|
-
role:
|
|
19
|
-
"aria-live":
|
|
20
|
-
className:
|
|
21
|
-
...
|
|
21
|
+
ref: m,
|
|
22
|
+
role: g,
|
|
23
|
+
"aria-live": f ?? (g === "alert" ? "assertive" : "polite"),
|
|
24
|
+
className: _,
|
|
25
|
+
...p,
|
|
22
26
|
children: [
|
|
23
27
|
/* @__PURE__ */ r("div", {
|
|
24
|
-
className:
|
|
25
|
-
children: a
|
|
26
|
-
}),
|
|
27
|
-
o && /* @__PURE__ */ r("div", {
|
|
28
|
-
className: "banner__actions",
|
|
28
|
+
className: `banner__content${v}`,
|
|
29
29
|
children: o
|
|
30
30
|
}),
|
|
31
|
-
s && /* @__PURE__ */ r(
|
|
32
|
-
className:
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
s && /* @__PURE__ */ r("div", {
|
|
32
|
+
className: `banner__actions${v}`,
|
|
33
|
+
children: s
|
|
34
|
+
}),
|
|
35
|
+
c && /* @__PURE__ */ r(t, {
|
|
36
|
+
className: `banner__close${v}`,
|
|
37
|
+
label: h("dismiss", l),
|
|
38
|
+
onClick: c
|
|
35
39
|
})
|
|
36
40
|
]
|
|
37
41
|
});
|
|
38
42
|
});
|
|
39
43
|
//#endregion
|
|
40
|
-
export {
|
|
44
|
+
export { o as Banner };
|