@studiolxd/brand 49.9.0 → 49.11.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 CHANGED
@@ -7,6 +7,111 @@ 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.11.0] — 2026-09-19
11
+
12
+ > **Minor.** Tres decisiones de maqueta sobre lo que la 49.10.0 dejó puesto: dónde va el
13
+ > distintivo en el lanzador, que su panel crezca en vez de desplazarse, y que un grupo largo
14
+ > del índice público quepa a dos columnas bajo un solo título.
15
+
16
+ ### El distintivo va encima del nombre, y su hueco se reserva siempre
17
+
18
+ En `AppLauncher`, el distintivo de la baldosa se pinta **sobre** el nombre de la app, no a su
19
+ lado. Y su fila se pinta **siempre**, lleve distintivo la baldosa o no: vacía es el hueco
20
+ reservado que deja todos los nombres de la rejilla a la misma altura, de modo que una app que
21
+ estrena píldora no empuja hacia abajo el nombre de su vecina.
22
+
23
+ El alto de esa fila es el de una `Tag` y sale de sus tokens —
24
+ `app-launcher.tile-badge-block-size` = `calc({tag.font-size} * {tag.line-height} + 2 *
25
+ {tag.padding-block})` —, así que sigue cuadrando si la píldora cambia de talla. No hay medida
26
+ escrita a mano.
27
+
28
+ ### El panel del lanzador crece con su contenido
29
+
30
+ El panel **no tiene tope propio**: con las doce aplicaciones de la suite se ve entero. El único
31
+ límite es el hueco que de verdad queda en la ventana (`--available-height`, que mide Base UI y
32
+ que `app-launcher.content-max-height` no hace más que nombrar); solo cuando ni ese hueco da, el
33
+ panel se recorta ahí y hace scroll. Un tope propio —una altura fija, «tantas filas»— recortaría
34
+ la rejilla teniendo pantalla de sobra, y ahora lo impide un guardián sobre la hoja
35
+ (`AppLauncher.panel.test.ts`).
36
+
37
+ La rejilla pasa a **dos columnas en un panel estrecho** y tres desde `sm`
38
+ (`app-launcher.content-columns-narrow`, nuevo, junto al `content-columns` de siempre): con tres
39
+ columnas en móvil, doce baldosas dejaban los nombres partidos en tres líneas.
40
+
41
+ ### `SiteNav`: un grupo a dos columnas, bajo un solo título
42
+
43
+ `SiteNavGroup` gana **`columns?: 1 | 2`** (por defecto `1`, el grupo de siempre). Con `2` el
44
+ grupo ocupa en la rejilla el **ancho de dos** —doce tramos en `md`, ocho en `lg`, seis en `xl`—
45
+ y reparte sus ítems en **dos columnas bajo un solo título**. Es lo que da sitio a un grupo largo
46
+ —«Aplicaciones», con las diez o doce de la suite— sin partirlo en dos grupos con dos cabeceras,
47
+ que sería otro índice.
48
+
49
+ - El pasillo entre esas dos columnas es el mismo que separa dos grupos
50
+ (`site-nav.item-column-gap`, nuevo, que apunta a `group-gap`): más estrecho, el grupo ancho se
51
+ leería como dos grupos pegados.
52
+ - Los ítems se leen **por filas**, en el orden del DOM.
53
+ - **Por debajo de `md` vuelve a una columna**, como todo el índice.
54
+ - El grupo ancho cuenta **por dos** en el tope de columnas (`site-nav.columns-max`) y queda
55
+ fuera del reparto de la última fila: ya ocupa lo que le toca y no tiene sobrante que recoger.
56
+ - `disabled` y `badge` de la 49.10.0 siguen valiendo dentro de las dos columnas.
57
+
58
+ El dato viaja en `data-group-columns`, nunca en un atributo `style` — el mismo motivo que
59
+ `data-columns`.
60
+
61
+ ## [49.10.0] — 2026-09-18
62
+
63
+ > **Minor.** La suite marca productos como «próximamente»: se ven en su sitio pero apagados,
64
+ > sin navegación y con un distintivo. Ni la baldosa del `AppLauncher` ni el ítem del `SiteNav`
65
+ > lo admitían.
66
+
67
+ ### La entrada apagada con distintivo, en el lanzador y en el índice del sitio
68
+
69
+ `LauncherApp` y `SiteNavItem` ganan las mismas dos claves, `disabled` y `badge`.
70
+
71
+ Con **`disabled`** la entrada se ve en su sitio pero **no navega**: deja de ser un `<a>` —en
72
+ `SiteNav`, ni siquiera pasa por `renderLink`: no hay destino que dar—, se pinta como un enlace
73
+ inactivo (`<span role="link" aria-disabled="true">`, donde el atributo sí es válido y el lector
74
+ lo anuncia como no disponible) y **sin `tabIndex`**, así que el tabulador la salta. La tinta
75
+ apagada es la de un control deshabilitado del sistema (`color.disabled.text-on-light|dark`), que
76
+ no baja de 3:1 sobre la superficie — el mínimo de WCAG 1.4.11 para un componente inactivo, y el
77
+ motivo de no inventar un gris más claro. Tampoco se rellena ni subraya bajo el puntero: el
78
+ `:hover` alcanza también a un `<span>`, de ahí el `:not()` en las reglas de estado.
79
+
80
+ **`badge`** es el distintivo, y su texto llega **ya traducido** desde la aplicación: es
81
+ contenido —como el nombre de la app o el rótulo del ítem—, no cromo. Vale con `disabled`
82
+ («Próximamente») y sin él («Beta»), y sobre una entrada apagada va en `Tag neutral` en vez de
83
+ `info`: una píldora de novedad sobre algo que no lleva a ningún sitio se leería como disponible.
84
+ En `SiteNav` el distintivo es **hermano del enlace**, no hijo suyo — dentro, la línea de hover
85
+ (que en el DS es una línea bajo el elemento, no `text-decoration`) cruzaría también la píldora,
86
+ y el nombre accesible del enlace arrastraría el estado.
87
+
88
+ `badge` **generaliza `isNew`** del lanzador, que es este mismo distintivo con el texto del
89
+ catálogo (`appLauncher.new`). `isNew` **sigue funcionando y no se retira**; con los dos puestos,
90
+ manda `badge`.
91
+
92
+ ### Los `exports` declaran `default`, para que un Node CommonJS pueda `require()`
93
+
94
+ Las 170 subrutas condicionales de `package.json#exports` llevaban solo `types` e `import`.
95
+ `import` casa únicamente con la condición de importación, así que un Node CommonJS —los
96
+ workers de la suite empaquetados con esbuild en formato cjs, o un `tsx` cualquiera— que hiciera
97
+ `require('@studiolxd/brand/email')` moría con `ERR_PACKAGE_PATH_NOT_EXPORTED`. Ahora cada
98
+ subruta añade `default` apuntando **al mismo fichero ESM**, que es lo que Node necesita para
99
+ cargarlo por `require(esm)`: no se publica una segunda copia en CJS ni cambia el formato de
100
+ nada. Las subrutas que ya eran una cadena (CSS, SCSS, JSON, assets) no cambian — una cadena
101
+ vale para toda condición.
102
+
103
+ Lo vigilan dos guardianes, porque quedarse sin `default` no rompe ningún build: un test
104
+ (`scripts/exports-default.test.ts`, en `pnpm test`) y un paso de `release:check`, ambos
105
+ fallando si alguna subruta condicional se queda sin `default` o si `default` no apunta al mismo
106
+ fichero que `import`.
107
+
108
+ Tokens nuevos: `app-launcher.tile-disabled-color`, `site-nav.item-disabled-color`,
109
+ `site-nav.item-badge-gap` y sus pares `surface-dark-*`, todos por referencia a
110
+ `color.disabled.text-on-light|dark` — sin colores nuevos en la paleta.
111
+
112
+ De paso, la doc del `AppLauncher` pierde el apartado «Color de dato», que describía una prop
113
+ `accent` de `LauncherApp` retirada hace versiones.
114
+
10
115
  ## [49.9.0] — 2026-09-18
11
116
 
12
117
  > **Minor.** Tres huecos del sistema: la segunda línea del ítem de menú admite un nodo, el
@@ -193,6 +193,7 @@ var e = {
193
193
  "--app-launcher-trigger-label-color": "#111e30",
194
194
  "--app-launcher-content-min-width": "20rem",
195
195
  "--app-launcher-content-columns": "3",
196
+ "--app-launcher-content-columns-narrow": "2",
196
197
  "--app-launcher-content-gap": "0.25rem",
197
198
  "--app-launcher-content-bg": "#ffffff",
198
199
  "--app-launcher-content-border-width": "1px",
@@ -208,12 +209,14 @@ var e = {
208
209
  "--app-launcher-tile-padding-block": "0.5rem",
209
210
  "--app-launcher-tile-padding-inline": "1rem",
210
211
  "--app-launcher-tile-gap": "0.25rem",
212
+ "--app-launcher-tile-badge-block-size": "calc(0.875rem * 1 + 2 * 0.25rem)",
211
213
  "--app-launcher-tile-border-radius": "0px",
212
214
  "--app-launcher-tile-name-font-size": "0.875rem",
213
215
  "--app-launcher-tile-name-font-weight": "300",
214
216
  "--app-launcher-tile-name-line-height": "1.3",
215
217
  "--app-launcher-tile-name-color": "#111e30",
216
218
  "--app-launcher-tile-name-active-font-weight": "500",
219
+ "--app-launcher-tile-disabled-color": "#4a4a4a",
217
220
  "--app-launcher-trigger-hover-bg": "#111e30",
218
221
  "--app-launcher-trigger-hover-color": "#ffffff",
219
222
  "--app-launcher-tile-highlighted-bg": "#111e30",
@@ -2888,6 +2891,9 @@ var e = {
2888
2891
  "--site-nav-item-hover-color": "#111e30",
2889
2892
  "--site-nav-item-underline-offset": "2px",
2890
2893
  "--site-nav-item-hover-line-width": "1px",
2894
+ "--site-nav-item-disabled-color": "#4a4a4a",
2895
+ "--site-nav-item-badge-gap": "0.5rem",
2896
+ "--site-nav-item-column-gap": "2rem",
2891
2897
  "--site-nav-item-current-font-weight": "300",
2892
2898
  "--site-nav-focus-ring-width": "2px",
2893
2899
  "--site-nav-focus-ring-offset": "2px",
@@ -23,7 +23,26 @@ export interface LauncherApp {
23
23
  id: string;
24
24
  name: string;
25
25
  url: string;
26
+ /**
27
+ * Marca de app nueva. **`badge` lo generaliza**: `isNew` es el mismo
28
+ * distintivo con un único texto, el del catálogo (`appLauncher.new`). Se
29
+ * mantiene por compatibilidad y sigue valiendo; con `badge` puesto, manda
30
+ * `badge`.
31
+ */
26
32
  isNew?: boolean;
33
+ /**
34
+ * Producto anunciado y todavía no disponible: la baldosa se ve en su sitio
35
+ * pero **apagada y sin navegación** — no es un `<a>`, no tiene `href` que
36
+ * seguir y el tabulador no se detiene en ella.
37
+ */
38
+ disabled?: boolean;
39
+ /**
40
+ * Texto del distintivo de la baldosa («Próximamente», «Nuevo», «Beta»…).
41
+ * Llega **ya traducido** desde la aplicación: es contenido de la suite, como
42
+ * el nombre de la app, no cromo del lanzador. Generaliza `isNew`, que es
43
+ * este mismo distintivo con el texto del catálogo.
44
+ */
45
+ badge?: string;
27
46
  }
28
47
  export interface AppLauncherLabels {
29
48
  /**
@@ -10,6 +10,18 @@ export interface SiteNavItem {
10
10
  target?: string;
11
11
  /** Relación del enlace. Con `target="_blank"` y sin valor, se aplica `noopener noreferrer`. */
12
12
  rel?: string;
13
+ /**
14
+ * Producto anunciado y todavía no disponible: el ítem se ve en su sitio pero
15
+ * **apagado y sin navegación** — no es un enlace, no pasa por `renderLink` y
16
+ * el tabulador no se detiene en él.
17
+ */
18
+ disabled?: boolean;
19
+ /**
20
+ * Texto del distintivo junto al rótulo («Próximamente», «Nuevo», «Beta»…).
21
+ * Llega **ya traducido**: es contenido de ESTE sitio, como el propio rótulo,
22
+ * no cromo del índice.
23
+ */
24
+ badge?: string;
13
25
  }
14
26
  export interface SiteNavGroup {
15
27
  id: string;
@@ -17,6 +29,16 @@ export interface SiteNavGroup {
17
29
  label: string;
18
30
  /** Si se indica, la cabecera es también un enlace (la portada de la sección). */
19
31
  href?: string;
32
+ /**
33
+ * En cuántas columnas se reparten los ítems de ESTE grupo, bajo **un solo
34
+ * título**. Por defecto `1`, el grupo de siempre. Con `2` —el caso de un
35
+ * grupo largo, como «Aplicaciones»— el grupo ocupa en la rejilla el ancho de
36
+ * dos y sus ítems se pintan en dos columnas dentro de él; por debajo de `md`
37
+ * vuelve a una, como todo lo demás. No es otro componente ni dos grupos: la
38
+ * cabecera sigue siendo una, y con ella el encabezado por el que se recorre
39
+ * el índice.
40
+ */
41
+ columns?: 1 | 2;
20
42
  items: SiteNavItem[];
21
43
  }
22
44
  export type SiteNavRenderLinkProps = {
@@ -48,6 +70,10 @@ export interface SiteNavProps {
48
70
  * en `data-columns`, no en un atributo `style`: una app con
49
71
  * `style-src 'self'` descarta el atributo sin avisar y el grupo de más caía
50
72
  * a la segunda fila.
73
+ *
74
+ * Un grupo puede valer por dos (`columns: 2`): ocupa el ancho de dos en la
75
+ * rejilla y reparte sus ítems en dos columnas bajo un solo título. El dato va
76
+ * también en un atributo, `data-group-columns`, por el mismo motivo.
51
77
  */
52
78
  /**
53
79
  * El único texto que el índice dice por su cuenta, y es **cromo**: el nombre de
@@ -1 +1 @@
1
- .app-launcher__trigger{all:unset;box-sizing:border-box;width:var(--app-launcher-trigger-size);height:var(--app-launcher-trigger-size);border-radius:var(--app-launcher-trigger-border-radius);color:var(--app-launcher-trigger-color);cursor:pointer;transition:box-shadow var(--app-launcher-transition-duration) var(--app-launcher-transition-easing);justify-content:center;align-items:center;display:flex}.app-launcher__trigger:hover{background-color:var(--app-launcher-trigger-hover-bg);color:var(--app-launcher-trigger-hover-color)}.app-launcher__trigger:focus-visible{outline:var(--app-launcher-focus-ring-width) solid var(--app-launcher-focus-ring-color);outline-offset:var(--app-launcher-focus-ring-offset)}.app-launcher__trigger--label{gap:var(--app-launcher-trigger-label-gap);width:auto;height:auto;padding-block:var(--app-launcher-trigger-label-padding-block);padding-inline:var(--app-launcher-trigger-label-padding-inline);border-radius:var(--app-launcher-trigger-label-border-radius);color:var(--app-launcher-trigger-label-color)}.app-launcher__trigger-label{font-size:var(--app-launcher-trigger-label-font-size);font-weight:var(--app-launcher-trigger-label-font-weight);line-height:var(--app-launcher-trigger-label-line-height)}.app-launcher__trigger--label:hover{color:var(--app-launcher-trigger-label-color);background-color:#0000}.app-launcher__content{box-sizing:border-box;background-color:var(--app-launcher-content-bg);border-width:var(--app-launcher-content-border-width);border-style:solid;border-color:var(--app-launcher-content-border-color);border-radius:var(--app-launcher-content-border-radius);box-shadow:var(--app-launcher-content-shadow);padding-block:var(--app-launcher-content-padding-block);padding-inline:var(--app-launcher-content-padding-inline);min-width:var(--app-launcher-content-min-width);transform-origin:var(--transform-origin);animation-duration:var(--app-launcher-transition-duration);animation-timing-function:var(--app-launcher-transition-easing);max-height:var(--app-launcher-content-max-height,var(--available-height));overscroll-behavior:contain;outline:none;overflow-y:auto}.app-launcher__content[data-open]{animation-name:app-launcher-in}.app-launcher__content[data-closed]{animation-name:app-launcher-out}@keyframes app-launcher-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes app-launcher-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}.app-launcher__grid{grid-template-columns:repeat(var(--app-launcher-content-columns), 1fr);gap:var(--app-launcher-content-gap);margin:0;padding:0;list-style:none;display:grid}.app-launcher__tile{box-sizing:border-box;align-items:center;gap:var(--app-launcher-tile-gap);padding-block:var(--app-launcher-tile-padding-block);padding-inline:var(--app-launcher-tile-padding-inline);border-radius:var(--app-launcher-tile-border-radius);box-shadow:none;text-align:start;cursor:pointer;transition:background-color var(--app-launcher-transition-duration) var(--app-launcher-transition-easing), box-shadow var(--app-launcher-transition-duration) var(--app-launcher-transition-easing);outline:none;text-decoration:none;display:flex}.app-launcher__tile:hover,.app-launcher__tile:focus-visible{background-color:var(--app-launcher-tile-highlighted-bg);color:var(--app-launcher-tile-highlighted-color)}.app-launcher__tile:hover .app-launcher__tile-name,.app-launcher__tile:focus-visible .app-launcher__tile-name{color:inherit}.app-launcher__tile:focus-visible{outline:var(--app-launcher-focus-ring-width) solid var(--app-launcher-focus-ring-color);outline-offset:var(--app-launcher-focus-ring-offset)}.app-launcher__tile--active .app-launcher__tile-name{font-weight:var(--app-launcher-tile-name-active-font-weight)}.app-launcher__tile-name{font-size:var(--app-launcher-tile-name-font-size);font-weight:var(--app-launcher-tile-name-font-weight);line-height:var(--app-launcher-tile-name-line-height);color:var(--app-launcher-tile-name-color)}.app-launcher__tile-badge{pointer-events:none}.app-launcher__tile:hover .app-launcher__tile-badge,.app-launcher__tile:focus-visible .app-launcher__tile-badge{--tag-info-bg:var(--app-launcher-tile-badge-hover-bg);--tag-info-color:var(--app-launcher-tile-badge-hover-color)}.app-launcher__positioner{z-index:var(--app-launcher-content-z-index)}
1
+ .app-launcher__trigger{all:unset;box-sizing:border-box;width:var(--app-launcher-trigger-size);height:var(--app-launcher-trigger-size);border-radius:var(--app-launcher-trigger-border-radius);color:var(--app-launcher-trigger-color);cursor:pointer;transition:box-shadow var(--app-launcher-transition-duration) var(--app-launcher-transition-easing);justify-content:center;align-items:center;display:flex}.app-launcher__trigger:hover{background-color:var(--app-launcher-trigger-hover-bg);color:var(--app-launcher-trigger-hover-color)}.app-launcher__trigger:focus-visible{outline:var(--app-launcher-focus-ring-width) solid var(--app-launcher-focus-ring-color);outline-offset:var(--app-launcher-focus-ring-offset)}.app-launcher__trigger--label{gap:var(--app-launcher-trigger-label-gap);width:auto;height:auto;padding-block:var(--app-launcher-trigger-label-padding-block);padding-inline:var(--app-launcher-trigger-label-padding-inline);border-radius:var(--app-launcher-trigger-label-border-radius);color:var(--app-launcher-trigger-label-color)}.app-launcher__trigger-label{font-size:var(--app-launcher-trigger-label-font-size);font-weight:var(--app-launcher-trigger-label-font-weight);line-height:var(--app-launcher-trigger-label-line-height)}.app-launcher__trigger--label:hover{color:var(--app-launcher-trigger-label-color);background-color:#0000}.app-launcher__content{box-sizing:border-box;background-color:var(--app-launcher-content-bg);border-width:var(--app-launcher-content-border-width);border-style:solid;border-color:var(--app-launcher-content-border-color);border-radius:var(--app-launcher-content-border-radius);box-shadow:var(--app-launcher-content-shadow);padding-block:var(--app-launcher-content-padding-block);padding-inline:var(--app-launcher-content-padding-inline);min-width:var(--app-launcher-content-min-width);transform-origin:var(--transform-origin);animation-duration:var(--app-launcher-transition-duration);animation-timing-function:var(--app-launcher-transition-easing);max-height:var(--app-launcher-content-max-height,var(--available-height));overscroll-behavior:contain;outline:none;overflow-y:auto}.app-launcher__content[data-open]{animation-name:app-launcher-in}.app-launcher__content[data-closed]{animation-name:app-launcher-out}@keyframes app-launcher-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes app-launcher-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}.app-launcher__grid{grid-template-columns:repeat(var(--app-launcher-content-columns-narrow), 1fr);gap:var(--app-launcher-content-gap);margin:0;padding:0;list-style:none;display:grid}@media (width>=480px){.app-launcher__grid{grid-template-columns:repeat(var(--app-launcher-content-columns), 1fr)}}.app-launcher__grid>li{min-inline-size:0}.app-launcher__tile{box-sizing:border-box;align-items:flex-start;gap:var(--app-launcher-tile-gap);padding-block:var(--app-launcher-tile-padding-block);padding-inline:var(--app-launcher-tile-padding-inline);border-radius:var(--app-launcher-tile-border-radius);box-shadow:none;text-align:start;cursor:pointer;transition:background-color var(--app-launcher-transition-duration) var(--app-launcher-transition-easing), box-shadow var(--app-launcher-transition-duration) var(--app-launcher-transition-easing);outline:none;flex-direction:column;text-decoration:none;display:flex}.app-launcher__tile:not(.app-launcher__tile--disabled):hover,.app-launcher__tile:focus-visible{background-color:var(--app-launcher-tile-highlighted-bg);color:var(--app-launcher-tile-highlighted-color)}.app-launcher__tile:not(.app-launcher__tile--disabled):hover .app-launcher__tile-name,.app-launcher__tile:focus-visible .app-launcher__tile-name{color:inherit}.app-launcher__tile:focus-visible{outline:var(--app-launcher-focus-ring-width) solid var(--app-launcher-focus-ring-color);outline-offset:var(--app-launcher-focus-ring-offset)}.app-launcher__tile--active .app-launcher__tile-name{font-weight:var(--app-launcher-tile-name-active-font-weight)}.app-launcher__tile.app-launcher__tile--disabled{cursor:default}.app-launcher__tile--disabled .app-launcher__tile-name{color:var(--app-launcher-tile-disabled-color)}.app-launcher__tile-badge-row{min-block-size:var(--app-launcher-tile-badge-block-size);align-items:center;display:flex}.app-launcher__tile-name{font-size:var(--app-launcher-tile-name-font-size);font-weight:var(--app-launcher-tile-name-font-weight);line-height:var(--app-launcher-tile-name-line-height);color:var(--app-launcher-tile-name-color)}.app-launcher__tile-badge{pointer-events:none}.app-launcher__tile:not(.app-launcher__tile--disabled):hover .app-launcher__tile-badge,.app-launcher__tile:focus-visible .app-launcher__tile-badge{--tag-info-bg:var(--app-launcher-tile-badge-hover-bg);--tag-info-color:var(--app-launcher-tile-badge-hover-color)}.app-launcher__positioner{z-index:var(--app-launcher-content-z-index)}
@@ -10,19 +10,27 @@ import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
10
10
  import { Popover as l } from "@base-ui/react/popover";
11
11
  //#region src/stories/molecules/AppLauncher/AppLauncher.tsx
12
12
  function u({ app: t, isCurrent: n, newLabel: i }) {
13
- let a = e("appLauncher");
14
- return /* @__PURE__ */ c("a", {
13
+ let a = e("appLauncher"), l = t.badge ?? (t.isNew ? a("new", i) : void 0), u = /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s("span", {
14
+ className: "app-launcher__tile-badge-row",
15
+ children: l && /* @__PURE__ */ s(r, {
16
+ variant: t.disabled ? "neutral" : "info",
17
+ className: "app-launcher__tile-badge",
18
+ children: l
19
+ })
20
+ }), /* @__PURE__ */ s("span", {
21
+ className: "app-launcher__tile-name",
22
+ children: t.name
23
+ })] });
24
+ return t.disabled ? /* @__PURE__ */ s("span", {
25
+ className: "app-launcher__tile app-launcher__tile--disabled",
26
+ role: "link",
27
+ "aria-disabled": "true",
28
+ children: u
29
+ }) : /* @__PURE__ */ s("a", {
15
30
  href: t.url,
16
31
  className: `app-launcher__tile${n ? " app-launcher__tile--active" : ""}`,
17
32
  "aria-current": n ? "page" : void 0,
18
- children: [/* @__PURE__ */ s("span", {
19
- className: "app-launcher__tile-name",
20
- children: t.name
21
- }), t.isNew && /* @__PURE__ */ s(r, {
22
- variant: "info",
23
- className: "app-launcher__tile-badge",
24
- children: a("new", i)
25
- })]
33
+ children: u
26
34
  });
27
35
  }
28
36
  function d({ apps: e, currentAppId: t, newLabel: n }) {