energy-foundations 2.5.0-beta.0 → 2.5.0-beta.2

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.
@@ -5,7 +5,7 @@ $grid-config: (
5
5
  desktop: (max-columns: 12, gap: 24px)
6
6
  ) !default;
7
7
 
8
- $grid-config-editorial: (
8
+ $grid-config-b: (
9
9
  mobile-v2: (max-columns: 4, gap: 16px),
10
10
  tablet-v2: (max-columns: 8, gap: 24px),
11
11
  desktop-v2: (max-columns: 12, gap: 24px)
@@ -12,7 +12,7 @@ For Layout A/B, read [the layout guide](./04-layouts.md) before choosing contain
12
12
 
13
13
  ## Grid
14
14
 
15
- `rds-col`, `rds-col-ld-6`, `rds-col-md-4`, `rds-col-md-4-offset-2`, `rds-col-sd-4`, `rds-grid`, `rds-grid-editorial`, `rds-layout-editorial`, `rds-layout-max`, `rds-variables`
15
+ `rds-col`, `rds-col-ld-6`, `rds-col-md-4`, `rds-col-md-4-offset-2`, `rds-col-sd-4`, `rds-grid`, `rds-layout`, `rds-layout-max`, `rds-variables`
16
16
 
17
17
  ## Spacing
18
18
 
@@ -385,16 +385,35 @@
385
385
 
386
386
  ## Mixins
387
387
 
388
+ ### _elevation.scss
389
+
390
+ | Mixin | Parameters |
391
+ |---|---|
392
+ | rds-style-effect-overlay | — |
393
+ | rds-style-effect-glass | — |
394
+ | rds-style-effect-glassnavy | — |
395
+
388
396
  ### _layout.scss
389
397
 
390
398
  | Mixin | Parameters |
391
399
  |---|---|
392
400
  | breakpoint | $breakpoint |
401
+ | layout-max | — |
402
+ | grid | — |
403
+
404
+ ### _shadow.scss
405
+
406
+ | Mixin | Parameters |
407
+ |---|---|
408
+ | rds-style-shadow-s | — |
409
+ | rds-style-shadow-m | — |
410
+ | rds-style-shadow-negative | — |
393
411
 
394
412
  ### _state.scss
395
413
 
396
414
  | Mixin | Parameters |
397
415
  |---|---|
416
+ | rds-style-state-disabled | — |
398
417
  | rds-style-border-focus | $color: $rds-color-interactive-border-state-focus,
399
418
  $borderWidth: 2px,
400
419
  $internalColor: $rds-color-neutral-white,
@@ -6,10 +6,10 @@ Layout A es el valor por defecto y Layout B es editorial y opt-in. No migres por
6
6
 
7
7
  | Perfil | Contexto tipográfico | Contenedor | Grid |
8
8
  |---|---|---|---|
9
- | A | body sin atributo data-rds-layout | .rds-layout-max | .rds-grid |
10
- | B | body[data-rds-layout="b"] | .rds-layout-editorial | .rds-grid-editorial |
9
+ | A | body sin atributo data-rds-layout | .rds-layout-max o @include rds.layout-max (contextual) | .rds-grid |
10
+ | B | body[data-rds-layout="b"] | .rds-layout-max o @include rds.layout-max (contextual) | .rds-grid (contextual) |
11
11
 
12
- Estas tres capas son independientes. Un contenedor editorial local no activa el contexto tipográfico B. Los helpers rds-col-* y Flex responsive siguen usando los cortes de A; no los trates como helpers B.
12
+ El contenedor .rds-layout-max y el grid .rds-grid siguen automáticamente el atributo del body. No existe contenedor ni clase de grid editorial local. Los helpers rds-col-* y Flex responsive siguen usando los cortes de A; no los trates como helpers B.
13
13
 
14
14
  Solo la página o el shell controla el atributo global. Dos perfiles tipográficos simultáneos requieren un contexto local diseñado expresamente; no alternes el body desde componentes individuales.
15
15
 
@@ -17,88 +17,176 @@ Solo la página o el shell controla el atributo global. Dos perfiles tipográfic
17
17
 
18
18
  ### Breakpoints Sass
19
19
 
20
- A Layout A Breakpoints default
20
+ A Layout A Sin atributo en el body (por defecto)
21
21
  `mobile`: max-width: 719px
22
22
  `tablet`: min-width: 720px
23
23
  `desktop`: min-width: 1280px
24
24
  `desktop-large`: min-width: 1440px
25
25
  `ultrawide`: min-width: 1600px
26
- B Layout B Breakpoints editoriales
27
- `mobile-v2`: max-width: 799px
28
- `tablet-v2`: min-width: 800px
29
- `desktop-v2`: min-width: 1024px
30
- `desktop-large-v2`: min-width: 1250px
31
- `ultrawide-v2`: min-width: 1584px
26
+ B Layout B Con body[data-rds-layout="b"]
27
+ `mobile`: max-width: 799px
28
+ `tablet`: min-width: 800px
29
+ `desktop`: min-width: 1024px
30
+ `desktop-large`: min-width: 1250px
31
+ `ultrawide`: min-width: 1584px
32
32
 
33
- Los nombres `*-v2` se conservan por compatibilidad. Representan los breakpoints de Layout B.
33
+ Los nombres son los mismos en ambos layouts: el atributo del `body` decide qué valor se aplica.
34
34
 
35
35
  ```scss
36
36
  .component {
37
37
  // Mobile first
38
38
 
39
39
  @include breakpoint(tablet) {
40
- // Layout A desde 720px
40
+ // Layout A desde 720px y Layout B desde 800px, según el body
41
41
  }
42
+ }
43
+ ```
44
+
45
+ #### Breakpoints contextuales
42
46
 
43
- @include breakpoint(tablet-v2) {
44
- // Layout B desde 800px
47
+ `breakpoint` siempre tiene en cuenta el layout declarado en el `body` para los nombres semánticos (`mobile`, `tablet`, `desktop`, `desktop-large` y `ultrawide`). No hay parámetros ni configuración que activar:
48
+
49
+ ```scss
50
+ @use 'energy-foundations/src/rds-variables' as rds;
51
+
52
+ .card {
53
+ flex-direction: column;
54
+
55
+ @include rds.breakpoint(desktop) {
56
+ flex-direction: row;
45
57
  }
46
58
  }
47
59
  ```
48
60
 
61
+ El mixin genera dos reglas excluyentes: desktop desde 1280px bajo `body:not([data-rds-layout="b"])`
62
+ y desde 1024px bajo `body[data-rds-layout="b"]`. `:where()` no aumenta la especificidad.
63
+ Sin atributo, o con `data-rds-layout="a"`, se aplica A. El mismo CSS compilado sirve para ambos layouts.
64
+ Los estilos base quedan fuera del mixin y se comparten.
65
+
66
+ También puede usarse en el nivel raíz, escribiendo los selectores dentro del bloque. Ambas formas aplican los mismos cortes:
67
+
68
+ ```scss
69
+ @include rds.breakpoint(desktop) {
70
+ .card {
71
+ flex-direction: row;
72
+ }
73
+ }
74
+ ```
75
+
76
+ En el nivel raíz, Sass no permite al mixin inspeccionar los selectores del bloque, así que el contexto se añade delante (`:where(body…) .card`). Por eso, dentro del bloque solo deben ir selectores cuyos ancestros estén dentro del `body`. Usa la forma anidada cuando el selector:
77
+
78
+ - sea `:root`, `html` o `body`;
79
+ - dependa de una clase o atributo del `body` o del `html`, como `.dark .card`, `[dir='rtl'] .card` o `.no-js .card`.
80
+
81
+ Tampoco escribas declaraciones sueltas en el nivel raíz: se aplicarían sobre el propio `body`.
82
+
83
+ Los breakpoints anidados reutilizan el layout del breakpoint exterior, así que solo se añade un contexto:
84
+
85
+ ```scss
86
+ .card {
87
+ @include rds.breakpoint(tablet) {
88
+ gap: 16px;
89
+
90
+ @include rds.breakpoint(desktop) {
91
+ gap: 24px; // A: 720px y 1280px · B: 800px y 1024px
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ En la forma anidada, la condición del layout se comprueba sobre el propio elemento seleccionado, así que funcionan también las condiciones del `body` o del `html` y los propios `body`, `html` y `:root`:
98
+
99
+ ```scss
100
+ :root {
101
+ --page-gap: 16px;
102
+
103
+ @include rds.breakpoint(desktop) {
104
+ --page-gap: 24px;
105
+ }
106
+ }
107
+
108
+ .dark .card {
109
+ @include rds.breakpoint(tablet) {
110
+ padding: 24px; // funciona aunque .dark esté en el body
111
+ }
112
+ }
113
+ ```
114
+
115
+ - La condición se inserta al principio del elemento seleccionado: `.dark :where(body[data-rds-layout='b'], body[data-rds-layout='b'] *).card`. Así siguen funcionando `&--modificador`, `&__elemento`, `&:hover` y los pseudoelementos.
116
+ - `html` y `:root` comprueban su `body` hijo con `:has()`: `:where(:has(> body[data-rds-layout='b'])):root`. Requiere Chrome 105, Safari 15.4 o Firefox 121; en navegadores sin `:has()` esa regla no se aplica y se mantiene el valor base.
117
+ - Todas las condiciones van dentro de `:where()`, así que la especificidad no cambia.
118
+ - Un selector que ya limita el layout a mano (`body[data-rds-layout='b'] .card`) compila y solo se aplica en Layout B, con los cortes de B.
119
+
120
+ Las claves personalizadas añadidas al mapa `$breakpoints` son cortes fijos que no dependen del `body`.
121
+ Los valores se leen del mapa `$breakpoints` configurado por el consumidor. Si falta uno de los dos cortes de un nombre semántico, la compilación falla.
122
+ Una clave desconocida mantiene el warning histórico.
123
+
124
+ El contexto se resuelve a partir del `body` del documento, así que no funciona dentro de Shadow DOM. Un iframe utiliza el atributo de su propio `body`.
125
+ En Vue `scoped`, el contexto global debe quedar fuera del scope: utiliza un bloque de estilos no scoped para estas reglas.
126
+ El atributo global del `body` selecciona B y las clases `.rds-layout-max` y `.rds-grid` adaptan sus reglas al contexto.
127
+
128
+ Si distribuyes CSS precompilado, el atributo del `body` debe estar presente en la página para seleccionar el perfil correspondiente.
129
+
130
+ Las primitivas internas que necesitan cortes fijos (helpers `rds-col-*`, Flex responsive y la escala tipográfica) usan un mixin interno que no forma parte de la API pública.
131
+ En páginas sin atributo, los cortes son los mismos que antes: no es necesario migrar las integraciones existentes de Layout A.
132
+
49
133
  ### Contenedores
50
134
 
51
135
  LEGACY
52
136
  `.rds-e-layout-max`
53
- Alias compatible de `.rds-layout-max`.
54
- LAYOUT A
137
+ Alias compatible de `.rds-layout-max`, con el mismo comportamiento contextual.
138
+ CONTEXTUAL A/B
55
139
  `.rds-layout-max`
56
- Padding 16px mobile, 24px tablet y 32px desktop. Máximo 1600px.
57
- LAYOUT B
58
- `.rds-layout-editorial`
59
- Padding progresivo hasta 72px. Máximo editorial de 1584px.
140
+ Layout A: padding 16px mobile, 24px tablet y 32px desktop, máximo 1600px. Layout B: padding progresivo hasta 72px, máximo 1584px.
141
+ MIXIN SASS
142
+ `@include layout-max`
143
+ El mismo contenedor aplicado a tu propio selector, para cuando no puedes o no quieres añadir la clase al HTML.
60
144
 
61
- ### Riesgo: doble fuente de verdad
62
-
63
- El contexto tipográfico del `body` y las clases de contenedor y grid son independientes. La librería no detecta ni corrige automáticamente las combinaciones incoherentes.
64
-
65
- #### Caso incoherente: tipografía B con maquetación A
145
+ `.rds-layout-max` sigue el layout declarado en `body[data-rds-layout]`: aplica los márgenes de A sin atributo (o con `"a"`) y los de B con `data-rds-layout="b"`. Así, componentes y plantillas transversales no necesitan conocer el layout de la página.
66
146
 
67
147
  ```html
68
148
  <body data-rds-layout="b">
69
- <main class="rds-layout-max">
70
- <div class="rds-grid"><!-- Contenido --></div>
71
- </main>
149
+ <main class="rds-layout-max">...</main>
72
150
  </body>
73
151
  ```
74
152
 
75
- La tipografía cambia a desktop desde 1024px, pero el grid no pasa a 12 columnas hasta 1280px. El contenedor conserva los márgenes de A. Por ejemplo, a 1100px se combina tipografía desktop B con el grid de 8 columnas de A.
153
+ - No existe un contenedor editorial local: el contenedor siempre sigue al `body`.
154
+ - Los selectores de contexto usan `:where()`, así que la especificidad es la misma que la de una clase simple.
76
155
 
77
- #### Caso incoherente: tipografía A con maquetación B
156
+ #### Como mixin Sass
78
157
 
79
- ```html
80
- <body>
81
- <main class="rds-layout-editorial">
82
- <div class="rds-grid-editorial"><!-- Contenido --></div>
83
- </main>
84
- </body>
158
+ Si no puedes añadir la clase al HTML (por ejemplo, en un componente de AEM o en una plantilla de terceros), aplica el mismo contenedor desde Sass con `layout-max`:
159
+
160
+ ```scss
161
+ @use 'energy-foundations/src/rds-variables' as rds;
162
+
163
+ .portal-main {
164
+ @include rds.layout-max;
165
+ }
85
166
  ```
86
167
 
87
- El grid pasa a 12 columnas desde 1024px y el contenedor usa los márgenes de B, pero la tipografía mantiene la escala base de A hasta 1280px.
168
+ Genera exactamente las mismas reglas que `.rds-layout-max`, aplicadas a tu selector: los márgenes de A o de B según el atributo del `body`, sin parámetros que elegir.
169
+
170
+ - Debe usarse dentro de un selector; en el nivel raíz la compilación falla con un mensaje claro.
171
+ - Funciona con cualquier selector, también sobre el propio `body` o con condiciones del `body` o del `html`, como `.dark .portal-main`.
172
+ - La especificidad es la de tu selector: el mixin no la aumenta.
173
+ - Puedes combinarlo con tus propias reglas; declara después las que quieras que prevalezcan.
88
174
 
89
- #### Composición recomendada para una página B
175
+ ### Composición contextual
176
+
177
+ El contenedor `.rds-layout-max` y el grid `.rds-grid` siguen al `body`, por lo que la página no necesita seleccionar una clase de grid editorial alternativa.
90
178
 
91
179
  ```html
92
180
  <body data-rds-layout="b">
93
- <main class="rds-layout-editorial">
94
- <div class="rds-grid-editorial"><!-- Contenido --></div>
181
+ <main class="rds-layout-max">
182
+ <div class="rds-grid"><!-- Contenido --></div>
95
183
  </main>
96
184
  </body>
97
185
  ```
98
186
 
99
- Para una página A, omite el atributo y combina `.rds-layout-max` con `.rds-grid`. La clase del contenedor solo controla ancho y márgenes: no crea un grid ni selecciona la tipografía.
187
+ Con `data-rds-layout="b"`, la tipografía, el contenedor y el grid usan los cortes de Layout B. Para Layout A, omite el atributo. El contenedor solo controla ancho y márgenes; el grid controla columnas y gaps.
100
188
 
101
- Resuelve el perfil una sola vez en el shell de Vue o en el Page Component de AEM y deriva de esa decisión las tres capas. Al cambiar de ruta, actualiza tanto el contexto global como el contenedor y el grid del destino.
189
+ Resuelve el perfil una sola vez en el shell de Vue o en el Page Component de AEM. Al cambiar de ruta, actualiza el contexto global del destino y las primitivas se adaptan.
102
190
 
103
191
  Esta composición no cambia los helpers `rds-col-*` ni Flex responsive: siguen usando los breakpoints de A. Para spans editoriales, utiliza las reglas Sass del perfil B descritas en Grid.
104
192
 
@@ -128,6 +216,24 @@ No existe una escala tipográfica específica para tablet. El breakpoint `deskto
128
216
 
129
217
  ## Grid: columnas, offsets y perfil editorial
130
218
 
219
+ ### Mixin Sass de grid
220
+
221
+ El mixin público `grid` aplica el mismo comportamiento que `.rds-grid` a un selector propio, sin añadir esa clase al HTML:
222
+
223
+ ```scss
224
+ @use 'energy-foundations/src/rds-variables' as rds;
225
+
226
+ .mi-grid {
227
+ @include rds.grid;
228
+ }
229
+ ```
230
+
231
+ También está disponible desde `energy-foundations/src/mixins/layout`. Con `@use 'energy-foundations/src/rds-variables' as *`, se incluye mediante `@include grid`.
232
+
233
+ La clase `.rds-grid` consume ese mismo mixin. Ambos conservan display, ancho completo, centrado, columnas y gaps según los mapas `$grid-config` y `$grid-config-b` y el layout global del `body`. Inclúyelo dentro de un selector de un elemento descendiente del `body`; invocarlo en la raíz de la hoja Sass produce un error explícito.
234
+
235
+ El mixin solo configura el contenedor: no incorpora `layout-max`, no genera utilidades de columnas y no cambia `rds-col-*` ni sus offsets.
236
+
131
237
  ### Columnas y offsets · Layout A
132
238
 
133
239
  El perfil A usa 4 columnas con gap de 16px hasta 719px, 8 columnas con gap de 16px desde 720px y 12 columnas con gap de 24px desde 1280px.
@@ -155,15 +261,14 @@ Los offsets disponibles van de cero a `máximo de columnas - n`.
155
261
  </article>
156
262
  ```
157
263
 
158
- ### Grid editorial · Layout B
264
+ ### Grid contextual · Layout B
159
265
 
160
- El grid editorial usa los cortes de B, pero los helpers `rds-col-*` actuales se generan con los de A.
161
- Por tanto, no basta con cambiar la clase del grid para sincronizar los spans.
162
- Para un componente editorial, define sus columnas con los mixins de B:
266
+ El grid `.rds-grid` usa automáticamente los cortes de B cuando el `body` tiene `data-rds-layout="b"`.
267
+ Los helpers `rds-col-*` actuales se generan con los cortes de A. Para spans que sigan el layout de la página, define las columnas en el Sass del componente con `breakpoint`, que aplica los cortes de A o B según el `body`:
163
268
 
164
269
  ```html
165
- <div class="rds-layout-editorial">
166
- <div class="rds-grid-editorial">
270
+ <div class="rds-layout-max">
271
+ <div class="rds-grid">
167
272
  <article class="portal-editorial-card">Contenido</article>
168
273
  </div>
169
274
  </div>
@@ -175,12 +280,12 @@ Para un componente editorial, define sus columnas con los mixins de B:
175
280
  .portal-editorial-card {
176
281
  grid-column: span 4;
177
282
 
178
- @include rds.breakpoint(tablet-v2) {
179
- grid-column: span 4;
283
+ @include rds.breakpoint(tablet) {
284
+ grid-column: span 4; // A: desde 720px · B: desde 800px
180
285
  }
181
286
 
182
- @include rds.breakpoint(desktop-v2) {
183
- grid-column: span 6;
287
+ @include rds.breakpoint(desktop) {
288
+ grid-column: span 6; // A: desde 1280px · B: desde 1024px
184
289
  }
185
290
  }
186
291
  ```
@@ -303,8 +408,8 @@ El layout debe resolverse en el Page Component, template o policy porque esa cap
303
408
  ```html
304
409
  <!-- Layout B: selección editorial -->
305
410
  <body data-rds-layout="b">
306
- <main class="rds-layout-editorial">
307
- <div class="rds-grid-editorial"><!-- Contenido --></div>
411
+ <main class="rds-layout-max">
412
+ <div class="rds-grid"><!-- Contenido --></div>
308
413
  </main>
309
414
  </body>
310
415
  ```
@@ -336,5 +441,15 @@ Los componentes comunes y moleculares:
336
441
  - No se duplican como componente A y componente B.
337
442
  - Permiten que el Page Component y Foundations resuelvan el contexto.
338
443
 
339
- Los componentes específicos de portal siguen el mismo contrato. Pueden usar un contenedor editorial local, pero `.rds-layout-editorial` por sí sola no cambia los breakpoints tipográficos de toda la página.
444
+ Los componentes específicos de portal siguen el mismo contrato. `.rds-layout-max` adapta sus márgenes al atributo del `body`, pero ninguna clase cambia por sí sola los breakpoints tipográficos de la página.
445
+
446
+ Si la plantilla HTL no permite añadir la clase al contenedor, aplica el mismo comportamiento desde el Sass del componente:
447
+
448
+ ```scss
449
+ @use 'energy-foundations/src/rds-variables' as rds;
450
+
451
+ .cmp-page__main {
452
+ @include rds.layout-max;
453
+ }
454
+ ```
340
455
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "energy-foundations",
3
- "version": "2.5.0-beta.0",
3
+ "version": "2.5.0-beta.2",
4
4
  "config": {
5
5
  "commitizen": {
6
6
  "path": "node_modules/cz-customizable"
@@ -98,6 +98,7 @@
98
98
  "storybook:preview": "npx http-server storybook-static",
99
99
  "stylelint": "npx stylelint '**/*.scss'",
100
100
  "stylelint:fix": "npx stylelint '**/*.scss' --fix",
101
+ "test:breakpoints": "node tests/verify-breakpoints.mjs",
101
102
  "test:typography": "node tests/verify-typography.mjs"
102
103
  },
103
104
  "style": "dist/style.css",
@@ -3,74 +3,17 @@
3
3
  *************************/
4
4
  @use 'sass:map';
5
5
  @use '../rds-variables' as *;
6
+ @use '../mixins/breakpoint-fixed' as *;
6
7
 
8
+ // Contextual container: follows the page layout declared on body[data-rds-layout].
9
+ // Also available as the `layout-max` mixin for custom selectors.
7
10
  .rds-e-layout-max,
8
11
  .rds-layout-max {
9
- padding: 0 $g-padding-mobile;
10
-
11
- @include breakpoint(tablet) {
12
- padding: 0 $g-padding-tablet;
13
- }
14
-
15
- @include breakpoint(desktop) {
16
- padding: 0 $g-padding-desktop;
17
- }
18
-
19
- @include breakpoint(ultrawide) {
20
- margin: 0 auto;
21
- max-width: 1600px;
22
- padding: 0 $g-padding-ultrawide;
23
- }
24
- }
25
-
26
- .rds-layout-editorial {
27
- padding: 0 $g-padding-mobile;
28
-
29
- @include breakpoint(tablet-v2) {
30
- padding: 0 $g-padding-tablet;
31
- }
32
-
33
- @include breakpoint(desktop-v2) {
34
- padding: 0 $g-padding-desktop;
35
- }
36
-
37
- @include breakpoint(desktop-large-v2) {
38
- padding: 0 72px;
39
- }
40
-
41
- @include breakpoint(ultrawide-v2) {
42
- margin: 0 auto;
43
- max-width: 1584px;
44
- padding: 0 72px;
45
- }
12
+ @include layout-max;
46
13
  }
47
14
 
48
15
  .rds-grid {
49
- display: grid;
50
- margin-left: auto;
51
- margin-right: auto;
52
- width: 100%;
53
-
54
- @each $breakpoint, $config in $grid-config {
55
- @include breakpoint($breakpoint) {
56
- gap: map.get($config, gap);
57
- grid-template-columns: repeat(map.get($config, max-columns), 1fr);
58
- }
59
- }
60
- }
61
-
62
- .rds-grid-editorial {
63
- display: grid;
64
- margin-left: auto;
65
- margin-right: auto;
66
- width: 100%;
67
-
68
- @each $breakpoint, $config in $grid-config-editorial {
69
- @include breakpoint($breakpoint) {
70
- gap: map.get($config, gap);
71
- grid-template-columns: repeat(map.get($config, max-columns), 1fr);
72
- }
73
- }
16
+ @include grid;
74
17
  }
75
18
 
76
19
  // Map of breakpoint names to abbreviations
@@ -86,7 +29,7 @@ $breakpoint-abbr: (
86
29
  $max-columns: map.get($config, max-columns);
87
30
  $abbr: map.get($breakpoint-abbr, $breakpoint);
88
31
 
89
- @include breakpoint($breakpoint) {
32
+ @include fixed-breakpoint($breakpoint) {
90
33
  // Clases sin offset: rds-col-sd-3
91
34
  @for $i from 1 through $max-columns {
92
35
  .rds-col-#{$abbr}-#{$i} {
@@ -111,7 +54,7 @@ $breakpoint-abbr: (
111
54
 
112
55
  @for $i from 1 through $max-columns {
113
56
  .rds-col-#{$i} {
114
- @include breakpoint($breakpoint) {
57
+ @include fixed-breakpoint($breakpoint) {
115
58
  grid-column: span #{$i};
116
59
  }
117
60
  }
@@ -153,7 +96,7 @@ $flex-prefix: 'rds-flex';
153
96
  @each $breakpoint, $config in $grid-config {
154
97
  $abbr: map.get($breakpoint-abbr, $breakpoint);
155
98
 
156
- @include breakpoint($breakpoint) {
99
+ @include fixed-breakpoint($breakpoint) {
157
100
  .#{$flex-prefix}-#{$abbr}-row {
158
101
  flex-direction: row;
159
102
  }
@@ -186,7 +129,7 @@ $flex-prefix: 'rds-flex';
186
129
  @each $breakpoint, $config in $grid-config {
187
130
  $abbr: map.get($breakpoint-abbr, $breakpoint);
188
131
 
189
- @include breakpoint($breakpoint) {
132
+ @include fixed-breakpoint($breakpoint) {
190
133
  .#{$flex-prefix}-grow-#{$abbr} {
191
134
  flex-grow: 1;
192
135
  }
@@ -1,4 +1,4 @@
1
- /** Auto-generated by generateIconLayers.js on 2026-10-15T08:50:14.974Z */
1
+ /** Auto-generated by generateIconLayers.js on 2026-10-22T09:48:17.799Z */
2
2
  /* eslint-disable */
3
3
  export const iconLayers = {
4
4
  "calendar_active": 8,
@@ -1,4 +1,4 @@
1
- /** Auto-generated by generateIconLayers.js on 2026-10-15T08:50:14.974Z */
1
+ /** Auto-generated by generateIconLayers.js on 2026-10-22T09:48:17.799Z */
2
2
  /* eslint-disable */
3
3
  export const iconLayers: Record<string, number> = {
4
4
  "calendar_active": 8,
@@ -1,4 +1,4 @@
1
- /** Auto-generated by generateIconLayers.js on 2026-10-15T08:50:14.974Z */
1
+ /** Auto-generated by generateIconLayers.js on 2026-10-22T09:48:17.799Z */
2
2
  /* eslint-disable */
3
3
  export const iconNames = [
4
4
  "ac-aire-acondicionado",
@@ -1,4 +1,4 @@
1
- /** Auto-generated by generateIconLayers.js on 2026-10-15T08:50:14.974Z */
1
+ /** Auto-generated by generateIconLayers.js on 2026-10-22T09:48:17.799Z */
2
2
  /* eslint-disable */
3
3
  export const iconNames: string[] = [
4
4
  "ac-aire-acondicionado",
@@ -0,0 +1,26 @@
1
+ @use 'sass:map';
2
+ @use '../variables/layout' as *;
3
+
4
+ // Internal fixed media query, independent of body[data-rds-layout].
5
+ // Not forwarded by rds-variables: consumers must use `breakpoint`.
6
+ @mixin fixed-breakpoint($breakpoint) {
7
+ $value: map.get($breakpoints, $breakpoint);
8
+
9
+ // If the key exists in the map
10
+ @if $value {
11
+ @if $breakpoint == mobile or $breakpoint == mobile-v2 {
12
+ @media (max-width: $value) {
13
+ @content;
14
+ }
15
+ } @else {
16
+ @media (min-width: $value) {
17
+ @content;
18
+ }
19
+ }
20
+ }
21
+
22
+ // If the key doesn't exist in the map
23
+ @else {
24
+ @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + "Please make sure it is defined in `$breakpoints` map.";
25
+ }
26
+ }