@khipu/design-system 0.2.0-alpha.8 → 0.2.0-alpha.80

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.
@@ -11,7 +11,7 @@
11
11
  *
12
12
  * AUTO-GENERATED FILE - DO NOT EDIT MANUALLY
13
13
  * Source: design-system/src/tokens/tokens.json
14
- * Generated: 2026-05-15T14:55:41.527Z
14
+ * Generated: 2026-06-30T16:01:25.716Z
15
15
  *
16
16
  * To regenerate:
17
17
  * cd design-system && npm run tokens:generate
@@ -48,15 +48,21 @@
48
48
  --kds-color-success-main: #2E7D32;
49
49
  --kds-color-success-light: #4CAF50;
50
50
  --kds-color-success-dark: #1B5E20;
51
+ --kds-color-success-contrast: #FFFFFF;
51
52
  --kds-color-warning-main: #EF6C00;
52
53
  --kds-color-warning-light: #FF9800;
53
54
  --kds-color-warning-dark: #E65100;
55
+ --kds-color-warning-contrast: #FFFFFF;
56
+ --kds-color-warning-warm: #8A6D1A;
54
57
  --kds-color-error-main: #D32F2F;
55
58
  --kds-color-error-light: #EF5350;
56
59
  --kds-color-error-dark: #C62828;
60
+ --kds-color-error-contrast: #FFFFFF;
57
61
  --kds-color-info-main: #0288D1;
58
62
  --kds-color-info-light: #03A9F4;
59
63
  --kds-color-info-dark: #01579B;
64
+ --kds-color-info-contrast: #FFFFFF;
65
+ --kds-color-info-blue: #5A5FE0;
60
66
 
61
67
  /* Text colors */
62
68
  --kds-color-text-primary: #333333;
@@ -134,6 +140,8 @@
134
140
  --kds-font-weight-bold: 700;
135
141
 
136
142
  /* Font sizes (base scale xs–4xl: see responsive section below) */
143
+ --kds-font-size-decimal-sup: 0.5em;
144
+
137
145
  /* Line heights */
138
146
  --kds-line-height-tight: 1.2;
139
147
  --kds-line-height-snug: 1.375;
@@ -839,6 +847,10 @@ a.kds-btn {
839
847
  /* Spacing - Using design tokens */
840
848
  padding: var(--kds-spacing-button-padding); /* 0 16px */
841
849
  height: var(--kds-spacing-button-min-height); /* 44px */
850
+ /* min-height además de height: en contenedores flex-column (p.ej. pantallas de
851
+ resultado/timeout) el botón es flex-item y, con solo `height`, flex-shrink lo
852
+ colapsaba a la altura del texto (~21px). min-height impide que se encoja. */
853
+ min-height: var(--kds-spacing-button-min-height); /* 44px */
842
854
 
843
855
  /* Border - Using design token */
844
856
  border-radius: var(--kds-radius-button); /* 10px */
@@ -846,7 +858,10 @@ a.kds-btn {
846
858
 
847
859
  /* Interaction */
848
860
  cursor: pointer;
849
- transition: background .15s, box-shadow .15s, transform .05s;
861
+ transition: background-color var(--kds-transition-shorter) var(--kds-easing-standard),
862
+ color var(--kds-transition-shorter) var(--kds-easing-standard),
863
+ box-shadow var(--kds-transition-shorter) var(--kds-easing-standard),
864
+ transform var(--kds-transition-shortest) var(--kds-easing-standard);
850
865
  box-sizing: border-box;
851
866
  vertical-align: middle;
852
867
  }
@@ -978,7 +993,7 @@ a.kds-btn-text {
978
993
 
979
994
  button.kds-btn-text:hover:not(:disabled),
980
995
  a.kds-btn-text:hover:not(:disabled) {
981
- background: var(--kds-color-primary-hover); /* rgba(131, 71, 173, 0.04) */
996
+ color: var(--kds-color-primary-dark);
982
997
  }
983
998
 
984
999
  button.kds-btn-text:disabled,
@@ -988,6 +1003,30 @@ a.kds-btn-text:disabled {
988
1003
  box-shadow: none;
989
1004
  }
990
1005
 
1006
+ /* Error text (destructive, ghost) — red text, no fill/border. Para acciones
1007
+ destructivas secundarias que no deben competir con el CTA primario. */
1008
+ button.kds-btn-error-text,
1009
+ a.kds-btn-error-text {
1010
+ background: transparent;
1011
+ color: var(--kds-color-error-main);
1012
+ border: none;
1013
+ padding: 6px var(--kds-spacing-2);
1014
+ min-height: 32px;
1015
+ box-shadow: none;
1016
+ }
1017
+
1018
+ button.kds-btn-error-text:hover:not(:disabled),
1019
+ a.kds-btn-error-text:hover:not(:disabled) {
1020
+ color: var(--kds-color-error-dark);
1021
+ }
1022
+
1023
+ button.kds-btn-error-text:disabled,
1024
+ a.kds-btn-error-text:disabled {
1025
+ background: transparent;
1026
+ color: var(--kds-color-action-disabled);
1027
+ box-shadow: none;
1028
+ }
1029
+
991
1030
  /* Icon wrapper - control size via span container */
992
1031
  button.kds-btn > .kds-icon,
993
1032
  a.kds-btn > .kds-icon {
@@ -1073,63 +1112,90 @@ a.kds-btn.kds-btn-md {
1073
1112
  }
1074
1113
  }
1075
1114
 
1076
- /* Selection card */
1115
+ /* Selection card.
1116
+ IMPORTANTE: este componente se renderiza como `<button>`. BeerCSS aplica al
1117
+ `button` base: `display: inline-flex; align-items: center; justify-content: center;
1118
+ block-size: 2.5rem; padding: 0 1rem; background: var(--primary); color: on-primary`.
1119
+ Todas esas reglas hay que sobreescribirlas para que el card-selector funcione como
1120
+ un contenedor flex column de altura variable y alineado a la izquierda.
1121
+
1122
+ Convención del DS: spacing entre hijos via `gap` del flex padre + padding.
1123
+ Los elementos internos (.kds-card-selector-icon/-title/-description) NO usan margin. */
1077
1124
  .kds-card-selector {
1125
+ /* Reset BeerCSS button */
1126
+ display: flex;
1127
+ flex-direction: column;
1128
+ align-items: stretch;
1129
+ justify-content: flex-start;
1130
+ block-size: auto;
1131
+ inline-size: 100%;
1132
+ text-align: left;
1133
+ line-height: 1.5;
1134
+ color: var(--kds-color-text-primary);
1135
+ /* Estilos propios del card-selector */
1078
1136
  padding: var(--kds-spacing-3);
1137
+ gap: var(--kds-spacing-1-5);
1079
1138
  border-radius: var(--kds-radius-md);
1080
- border: 2px solid var(--kds-border-light);
1139
+ border: var(--kds-border-width-md) solid var(--kds-border-light);
1081
1140
  background: var(--kds-color-background-paper);
1082
1141
  transition: all 0.3s ease;
1083
- text-align: left;
1084
1142
  cursor: pointer;
1085
- display: flex;
1086
- flex-direction: column;
1087
1143
  }
1088
1144
 
1089
- .kds-card-selector:hover {
1090
- border-color: #D1D5DB; /* gray-300 */
1145
+ .kds-card-selector:hover:not(.selected) {
1146
+ border-color: var(--kds-color-primary-light);
1147
+ background: var(--kds-color-primary-hover);
1148
+ }
1149
+
1150
+ /* Override del ripple/overlay default de BeerCSS:
1151
+ `:is(.wave,.chip,.button,button,nav.tabbed>a,...):not([class*=ripple])::after`
1152
+ tiene specificity (0,2,4) según DevTools (Chrome cuenta cada selector dentro
1153
+ de :is() individualmente para algunos motores). Usamos !important — consistente
1154
+ con cómo se overridean otros estilos de BeerCSS en este archivo (67 usos previos).
1155
+ Antes pintaba negro porque `currentColor` resolvía a text-primary del card. */
1156
+ .kds-card-selector::after {
1157
+ background-image: radial-gradient(circle, var(--kds-color-primary-main) 1%, transparent 1%) !important;
1091
1158
  }
1092
1159
 
1093
1160
  .kds-card-selector.selected {
1094
- border-color: #3B82F6; /* blue-600 */
1095
- background: #EFF6FF; /* blue-50 */
1161
+ border-color: var(--kds-color-primary-main);
1162
+ background: var(--kds-color-primary-faint);
1096
1163
  box-shadow: var(--kds-shadow-md);
1097
1164
  }
1098
1165
 
1099
- /* Icon container */
1166
+ /* Icon container — spacing manejado por gap del padre, no margin */
1100
1167
  .kds-card-selector-icon {
1101
- width: 48px;
1102
- height: 48px;
1103
- background: #DBEAFE; /* blue-100 */
1104
- border-radius: 8px;
1168
+ width: var(--kds-spacing-6);
1169
+ height: var(--kds-spacing-6);
1170
+ background: var(--kds-color-primary-focus);
1171
+ border-radius: var(--kds-radius-sm);
1105
1172
  display: flex;
1106
1173
  align-items: center;
1107
1174
  justify-content: center;
1108
- margin-bottom: 16px;
1109
1175
  }
1110
1176
 
1111
1177
  .kds-card-selector-icon i,
1112
1178
  .kds-card-selector-icon svg {
1113
- width: 24px;
1114
- height: 24px;
1115
- min-width: 24px;
1116
- min-height: 24px;
1117
- color: #3B82F6; /* blue-600 */
1179
+ width: var(--kds-spacing-3);
1180
+ height: var(--kds-spacing-3);
1181
+ min-width: var(--kds-spacing-3);
1182
+ min-height: var(--kds-spacing-3);
1183
+ font-size: var(--kds-spacing-3);
1184
+ color: var(--kds-color-primary-main);
1118
1185
  }
1119
1186
 
1120
- /* Title */
1187
+ /* Title — spacing manejado por gap del padre, no margin */
1121
1188
  .kds-card-selector-title {
1122
- font-weight: 600;
1189
+ font-weight: var(--kds-font-weight-semibold);
1123
1190
  color: var(--kds-color-text-primary);
1124
- margin-bottom: 8px;
1125
- font-size: 16px;
1191
+ font-size: var(--kds-font-size-lg);
1126
1192
  }
1127
1193
 
1128
1194
  /* Description */
1129
1195
  .kds-card-selector-description {
1130
- font-size: 14px;
1131
- color: #4B5563; /* gray-600 */
1132
- line-height: 1.5;
1196
+ font-size: var(--kds-font-size-sm);
1197
+ color: var(--kds-color-text-secondary);
1198
+ line-height: var(--kds-line-height-normal);
1133
1199
  }
1134
1200
 
1135
1201
  /* Selected state - visual feedback via border only */
@@ -1141,14 +1207,22 @@ a.kds-btn.kds-btn-md {
1141
1207
  display: flex;
1142
1208
  flex-direction: column;
1143
1209
  gap: var(--kds-spacing-2);
1144
- padding: var(--kds-spacing-4);
1210
+ padding: var(--kds-spacing-2);
1145
1211
  border-radius: var(--kds-radius-lg);
1146
1212
  border: 2px solid var(--kds-border-medium);
1147
- max-width: 400px; /* Increased from 365px for better text spacing */
1213
+ /* Ancho mínimo aplicado a TODOS los planes así un plan sin badge en una
1214
+ grilla con un plan recomendado mantiene la misma anchura, y el badge nunca
1215
+ se superpone al título por estrechez del card. */
1216
+ min-width: 260px;
1217
+ max-width: 400px;
1148
1218
  background: var(--kds-surface-base);
1149
1219
  transition: all 0.3s ease;
1150
1220
  cursor: pointer;
1151
- height: 100%; /* Ensure cards fill grid height */
1221
+ /* Alto fijo: el card se estira al alto de su row del grid (align-items stretch
1222
+ es el default) — todas las cards de la misma fila quedan a la misma altura
1223
+ sin importar el contenido. `align-self: stretch` lo hace explícito. */
1224
+ height: 100%;
1225
+ align-self: stretch;
1152
1226
  }
1153
1227
 
1154
1228
  .kds-card-plan:hover {
@@ -1168,18 +1242,19 @@ a.kds-btn.kds-btn-md {
1168
1242
  box-shadow: var(--kds-shadow-elevation-4);
1169
1243
  }
1170
1244
 
1171
- /* Recommended Badge */
1245
+ /* Recommended Badge — inline dentro del card (no flotante).
1246
+ Es el primer hijo del .kds-card-plan, así que aparece arriba de todo
1247
+ el contenido, alineado a la izquierda. */
1172
1248
  .kds-card-plan-badge {
1173
- position: absolute;
1174
- top: -12px;
1175
- right: var(--kds-spacing-6);
1176
- padding: var(--kds-spacing-1) var(--kds-spacing-4);
1249
+ align-self: flex-start;
1250
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-1-5);
1177
1251
  background: var(--primary);
1178
1252
  color: white;
1179
- font-size: var(--kds-font-size-sm);
1253
+ font-size: var(--kds-font-size-xs);
1180
1254
  font-weight: var(--kds-font-weight-semibold);
1255
+ line-height: 1;
1181
1256
  border-radius: var(--kds-radius-full);
1182
- box-shadow: var(--kds-shadow-elevation-1);
1257
+ white-space: nowrap;
1183
1258
  }
1184
1259
 
1185
1260
  /* Plan Header */
@@ -1207,13 +1282,11 @@ a.kds-btn.kds-btn-md {
1207
1282
  display: flex;
1208
1283
  align-items: baseline;
1209
1284
  gap: var(--kds-spacing-2);
1210
- padding: var(--kds-spacing-4) 0;
1211
1285
  border-bottom: 1px solid var(--kds-border-light);
1212
- min-height: 88px; /* Standardize price area height */
1213
1286
  }
1214
1287
 
1215
1288
  .kds-price {
1216
- font-size: 42px;
1289
+ font-size: var(--kds-font-size-4xl);
1217
1290
  font-weight: var(--kds-font-weight-bold);
1218
1291
  color: var(--primary);
1219
1292
  line-height: 1.1;
@@ -1732,9 +1805,6 @@ a.kds-btn.kds-btn-md {
1732
1805
 
1733
1806
  .snackbar {
1734
1807
  position: fixed;
1735
- bottom: var(--kds-spacing-3);
1736
- left: 50%;
1737
- transform: translateX(-50%);
1738
1808
  z-index: var(--kds-z-index-snackbar);
1739
1809
  min-width: 344px;
1740
1810
  max-width: var(--kds-snackbar-max-width);
@@ -2032,6 +2102,221 @@ a.kds-btn-google:disabled {
2032
2102
  height: var(--kds-spacing-button-icon-size);
2033
2103
  }
2034
2104
 
2105
+ /* ========================================
2106
+ KDS LINEAR PROGRESS
2107
+ Native <progress> (KdsLinearProgress). Additive over BeerCSS `progress`,
2108
+ scoped to .kds-progress so other consumers are unaffected.
2109
+ ======================================== */
2110
+
2111
+ /* `progress` is inline-block by default → leaves a baseline (descender) gap
2112
+ below the bar. Block removes that gap so it sits flush with siblings. */
2113
+ .kds-progress {
2114
+ display: block;
2115
+ }
2116
+
2117
+ /* Animate the filled value when it changes (e.g. advancing a step). BeerCSS
2118
+ sets the value background but no transition, so the width jumps abruptly. */
2119
+ .kds-progress::-webkit-progress-value {
2120
+ transition: width var(--kds-transition-standard) var(--kds-easing-standard);
2121
+ }
2122
+
2123
+ .kds-progress::-moz-progress-bar {
2124
+ transition: width var(--kds-transition-standard) var(--kds-easing-standard);
2125
+ }
2126
+
2127
+ /* ========================================
2128
+ KDS SECURE LOADER
2129
+ Loader de espera: anillo circular + candado centrado + frases opcionales.
2130
+ El anillo reutiliza el spinner circular de BeerCSS, escalado.
2131
+ ======================================== */
2132
+
2133
+ .kds-secure-loader {
2134
+ display: flex;
2135
+ flex-direction: column;
2136
+ align-items: center;
2137
+ justify-content: center;
2138
+ gap: var(--kds-spacing-4);
2139
+ text-align: center;
2140
+ /* Llena y centra dentro de contenedores flex (pantalla de carga); en flujo
2141
+ normal (contenedor no-flex) se reduce a su contenido. */
2142
+ flex: 1 1 auto;
2143
+ }
2144
+
2145
+ .kds-secure-loader-text {
2146
+ display: flex;
2147
+ flex-direction: column;
2148
+ gap: var(--kds-spacing-0-25);
2149
+ }
2150
+
2151
+ .kds-secure-loader-title {
2152
+ margin: 0;
2153
+ font-family: var(--kds-font-family-primary);
2154
+ font-size: var(--kds-font-size-h6);
2155
+ font-weight: var(--kds-font-weight-semibold);
2156
+ line-height: var(--kds-line-height-snug);
2157
+ color: var(--kds-color-text-primary);
2158
+ }
2159
+
2160
+ .kds-secure-loader-message {
2161
+ margin: 0;
2162
+ font-family: var(--kds-font-family-secondary);
2163
+ font-size: var(--kds-font-size-body1);
2164
+ line-height: var(--kds-line-height-normal);
2165
+ color: var(--kds-color-primary-main);
2166
+ }
2167
+
2168
+ /* Caja del spinner con tamaño fijo: la animación no altera el layout.
2169
+ 6.25rem (100px) = tamaño del loader original (CircularProgress size=100). */
2170
+ .kds-secure-loader-spinner {
2171
+ position: relative;
2172
+ display: inline-grid;
2173
+ place-items: center;
2174
+ inline-size: var(--kds-secure-loader-size, 6.25rem);
2175
+ block-size: var(--kds-secure-loader-size, 6.25rem);
2176
+ }
2177
+
2178
+ /* Anillo: SVG nativo con arco vía stroke-dasharray, rotando. Replica el
2179
+ CircularProgress original (viewBox 44u, thickness 2, arco ~63%, disableShrink). */
2180
+ .kds-secure-loader-ring {
2181
+ inline-size: var(--kds-secure-loader-size, 6.25rem);
2182
+ block-size: var(--kds-secure-loader-size, 6.25rem);
2183
+ animation: kds-secure-loader-spin 1.2s linear infinite;
2184
+ }
2185
+
2186
+ .kds-secure-loader-ring circle {
2187
+ fill: none;
2188
+ stroke: var(--kds-color-primary-main);
2189
+ stroke-width: 2;
2190
+ stroke-linecap: round;
2191
+ /* circunferencia ≈ 2π·20.2 ≈ 127; arco visible ≈ 80 (~63%) */
2192
+ stroke-dasharray: 80 127;
2193
+ }
2194
+
2195
+ @keyframes kds-secure-loader-spin {
2196
+ to {
2197
+ transform: rotate(360deg);
2198
+ }
2199
+ }
2200
+
2201
+ /* Candado centrado sobre el anillo (~0.3 del diámetro). Centrado explícito
2202
+ (top/left 50% + translate) para que no dependa del grid ni se recorte. */
2203
+ .kds-secure-loader-lock {
2204
+ position: absolute;
2205
+ top: 50%;
2206
+ left: 50%;
2207
+ transform: translate(-50%, -50%);
2208
+ color: var(--kds-color-text-secondary);
2209
+ font-size: calc(var(--kds-secure-loader-size, 6.25rem) * 0.3);
2210
+ line-height: 1;
2211
+ pointer-events: none;
2212
+ }
2213
+
2214
+ /* ========================================
2215
+ KDS COPY BUTTON
2216
+ Chip compacto que muestra un valor + icono copy y lo copia al click.
2217
+ Acción inline (distinto de KdsCopyRow). Look del copy button de khenshin.
2218
+ ======================================== */
2219
+
2220
+ .kds-copy-button {
2221
+ display: inline-flex;
2222
+ align-items: center;
2223
+ gap: var(--kds-spacing-1);
2224
+ padding: var(--kds-spacing-0-25) var(--kds-spacing-1-5);
2225
+ /* No usar el alto de botón táctil de BeerCSS (~44px): es un chip compacto,
2226
+ su alto lo define el contenido + padding. */
2227
+ block-size: auto;
2228
+ min-block-size: 0;
2229
+ border: none;
2230
+ border-radius: var(--kds-radius-button);
2231
+ background: var(--kds-alert-info-bg);
2232
+ color: var(--kds-color-info-dark);
2233
+ font-family: var(--kds-font-family-secondary);
2234
+ font-size: var(--kds-font-size-sm);
2235
+ font-weight: var(--kds-font-weight-medium);
2236
+ line-height: var(--kds-line-height-normal);
2237
+ cursor: pointer;
2238
+ transition: background-color var(--kds-transition-shorter) var(--kds-easing-standard),
2239
+ color var(--kds-transition-shorter) var(--kds-easing-standard);
2240
+ }
2241
+
2242
+ /* active = hover: sin el aro de focus/active (outline morado de BeerCSS). */
2243
+ .kds-copy-button:focus,
2244
+ .kds-copy-button:focus-visible,
2245
+ .kds-copy-button:active {
2246
+ outline: none;
2247
+ }
2248
+
2249
+ /* value y copiedText se apilan en la MISMA celda de grid: la celda toma el
2250
+ ancho del texto más largo, por lo que el botón conserva su ancho al alternar
2251
+ entre "valor" y "copiado" (sin reflow). */
2252
+ .kds-copy-button-label {
2253
+ display: inline-grid;
2254
+ }
2255
+
2256
+ .kds-copy-button-value,
2257
+ .kds-copy-button-copied {
2258
+ grid-area: 1 / 1;
2259
+ white-space: nowrap;
2260
+ }
2261
+
2262
+ /* Estado por defecto: visible el valor, oculto (pero ocupando espacio) el copiado */
2263
+ .kds-copy-button-copied {
2264
+ visibility: hidden;
2265
+ }
2266
+
2267
+ /* Al copiar se invierte la visibilidad; el ancho no cambia */
2268
+ .kds-copy-button.copied .kds-copy-button-value {
2269
+ visibility: hidden;
2270
+ }
2271
+
2272
+ .kds-copy-button.copied .kds-copy-button-copied {
2273
+ visibility: visible;
2274
+ }
2275
+
2276
+ .kds-copy-button .material-symbols-outlined {
2277
+ font-size: 1rem;
2278
+ color: var(--kds-color-info-main);
2279
+ flex-shrink: 0;
2280
+ }
2281
+
2282
+ .kds-copy-button.copied {
2283
+ background: var(--kds-alert-success-bg);
2284
+ color: var(--kds-alert-success-text);
2285
+ animation: kds-copy-button-pulse var(--kds-transition-short) var(--kds-easing-standard);
2286
+ }
2287
+
2288
+ .kds-copy-button.copied .material-symbols-outlined {
2289
+ color: var(--kds-color-success-main);
2290
+ /* el check entra con un pop al copiar */
2291
+ animation: kds-copy-button-pop var(--kds-transition-short) var(--kds-easing-standard);
2292
+ }
2293
+
2294
+ @keyframes kds-copy-button-pulse {
2295
+ 0% {
2296
+ transform: scale(1);
2297
+ }
2298
+ 50% {
2299
+ transform: scale(1.04);
2300
+ }
2301
+ 100% {
2302
+ transform: scale(1);
2303
+ }
2304
+ }
2305
+
2306
+ @keyframes kds-copy-button-pop {
2307
+ 0% {
2308
+ transform: scale(0.3);
2309
+ opacity: 0;
2310
+ }
2311
+ 60% {
2312
+ transform: scale(1.25);
2313
+ opacity: 1;
2314
+ }
2315
+ 100% {
2316
+ transform: scale(1);
2317
+ }
2318
+ }
2319
+
2035
2320
  /* ========================================
2036
2321
  Link Styles
2037
2322
  ======================================== */
@@ -2164,6 +2449,17 @@ body.dark {
2164
2449
  transition: border-color 0.2s, box-shadow 0.2s, outline-color 0.2s;
2165
2450
  }
2166
2451
 
2452
+ /* === TEXTAREA FIX === */
2453
+ /* BeerCSS base sets minimal block padding; add breathing room for textarea */
2454
+ .field > textarea {
2455
+ padding-block: 0.75rem;
2456
+ resize: vertical;
2457
+ }
2458
+
2459
+ .field.label > textarea {
2460
+ padding-block-start: 1.5rem;
2461
+ }
2462
+
2167
2463
  /* ==========================================
2168
2464
  NOTCH VISIBILITY (opacity)
2169
2465
  ========================================== */
@@ -2285,6 +2581,23 @@ body.dark {
2285
2581
  color: var(--error); /* Rojo error */
2286
2582
  }
2287
2583
 
2584
+ /* ==========================================
2585
+ PASSWORD REVEAL TOGGLE (KdsTextField `revealable`)
2586
+ El <a role="button"> reusa el posicionamiento de icono de BeerCSS
2587
+ (.field > a, pointer-events: all). Aquí solo: color del icono
2588
+ (on-surface-variant) y un focus ring accesible para el toggle
2589
+ navegable por teclado (BeerCSS hace `outline: inherit` en <a>).
2590
+ ========================================== */
2591
+ .field > a.kds-field-reveal {
2592
+ color: var(--on-surface-variant);
2593
+ }
2594
+
2595
+ .field > a.kds-field-reveal:focus-visible {
2596
+ outline: 2px solid var(--primary);
2597
+ outline-offset: 2px;
2598
+ border-radius: 50%;
2599
+ }
2600
+
2288
2601
  /* ==========================================
2289
2602
  LABEL COLOR
2290
2603
  Mantener sincronizado con border
@@ -2392,6 +2705,71 @@ body.dark {
2392
2705
  display: inline-flex;
2393
2706
  }
2394
2707
 
2708
+ /* ========================================
2709
+ Radix Tooltip (.kds-tooltip)
2710
+ Espejo de `.tooltip` pero para popovers de Radix:
2711
+ bg oscuro, texto blanco, sombra + animación fade/slide direccional.
2712
+ ======================================== */
2713
+
2714
+ .kds-tooltip {
2715
+ background-color: var(--kds-color-text-primary);
2716
+ color: var(--kds-color-background-paper);
2717
+ font-family: var(--kds-font-family-primary);
2718
+ font-size: var(--kds-font-size-xs);
2719
+ font-weight: var(--kds-font-weight-medium);
2720
+ line-height: var(--kds-line-height-normal);
2721
+ border-radius: var(--kds-radius-sm);
2722
+ padding: var(--kds-spacing-0-75) var(--kds-spacing-1-5);
2723
+ box-shadow: var(--kds-shadow-4);
2724
+ max-width: 280px;
2725
+ z-index: var(--kds-z-index-tooltip, 1500);
2726
+ user-select: none;
2727
+ /* Animación direccional según Radix data-side — coordinada con copy-row
2728
+ (cubic-bezier 0.2, 0.8, 0.2, 1) para un feel consistente del DS. */
2729
+ animation-duration: 240ms;
2730
+ animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
2731
+ will-change: transform, opacity;
2732
+ }
2733
+
2734
+ .kds-tooltip[data-state='closed'] {
2735
+ animation-duration: 140ms;
2736
+ animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);
2737
+ }
2738
+
2739
+ /* Direccional según data-side (Radix añade el attr en runtime).
2740
+ Cada lado entra desde su dirección con ~8px de offset (más visible que 4px). */
2741
+ .kds-tooltip[data-side='top'][data-state='delayed-open'],
2742
+ .kds-tooltip[data-side='top'][data-state='instant-open'] { animation-name: kds-tooltip-in-top; }
2743
+ .kds-tooltip[data-side='bottom'][data-state='delayed-open'],
2744
+ .kds-tooltip[data-side='bottom'][data-state='instant-open'] { animation-name: kds-tooltip-in-bottom; }
2745
+ .kds-tooltip[data-side='left'][data-state='delayed-open'],
2746
+ .kds-tooltip[data-side='left'][data-state='instant-open'] { animation-name: kds-tooltip-in-left; }
2747
+ .kds-tooltip[data-side='right'][data-state='delayed-open'],
2748
+ .kds-tooltip[data-side='right'][data-state='instant-open'] { animation-name: kds-tooltip-in-right; }
2749
+
2750
+ /* Fallback cuando no hay data-side resuelto aún */
2751
+ .kds-tooltip[data-state='delayed-open']:not([data-side]),
2752
+ .kds-tooltip[data-state='instant-open']:not([data-side]) {
2753
+ animation-name: kds-tooltip-in-top;
2754
+ }
2755
+
2756
+ .kds-tooltip[data-state='closed'] { animation-name: kds-tooltip-out; }
2757
+
2758
+ @keyframes kds-tooltip-in-top { from { opacity: 0; transform: translateY(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2759
+ @keyframes kds-tooltip-in-bottom { from { opacity: 0; transform: translateY(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2760
+ @keyframes kds-tooltip-in-left { from { opacity: 0; transform: translateX(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2761
+ @keyframes kds-tooltip-in-right { from { opacity: 0; transform: translateX(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2762
+
2763
+ @keyframes kds-tooltip-out {
2764
+ from { opacity: 1; transform: none; }
2765
+ to { opacity: 0; transform: scale(0.96); }
2766
+ }
2767
+
2768
+ /* Arrow (SVG path generado por Radix) */
2769
+ .kds-tooltip-arrow {
2770
+ fill: var(--kds-color-text-primary);
2771
+ }
2772
+
2395
2773
  /* ========================================
2396
2774
  Material Symbols Icon Sizing
2397
2775
  ======================================== */
@@ -2426,6 +2804,16 @@ body.dark {
2426
2804
  width: 100%;
2427
2805
  }
2428
2806
 
2807
+ /* Truncado en una línea con ellipsis. Incluye min-width:0 para que funcione
2808
+ dentro de contenedores flex/grid (el ítem puede encogerse por debajo de su
2809
+ contenido). Útil para nombres/asuntos largos en headers y filas. */
2810
+ .kds-truncate {
2811
+ min-width: 0;
2812
+ overflow: hidden;
2813
+ text-overflow: ellipsis;
2814
+ white-space: nowrap;
2815
+ }
2816
+
2429
2817
  .kds-max-w-sm {
2430
2818
  max-width: 400px;
2431
2819
  }
@@ -2469,6 +2857,11 @@ body.dark {
2469
2857
  display: flex;
2470
2858
  flex-direction: column;
2471
2859
  gap: var(--kds-spacing-3);
2860
+ /* Reset del fieldset nativo: sin borde/padding/margin por defecto del navegador. */
2861
+ margin: 0;
2862
+ padding: 0;
2863
+ border: 0;
2864
+ min-inline-size: 0;
2472
2865
  }
2473
2866
 
2474
2867
  /* Checkbox Label - BeerCSS override */
@@ -2519,21 +2912,57 @@ label.radio:has(input:disabled) {
2519
2912
  }
2520
2913
 
2521
2914
  /* ========================================
2522
- ONBOARDING COMPONENTS
2523
- Multi-stage onboarding flow with form validation
2915
+ RADIO GROUP — variante card (.kds-radio-group--card)
2916
+ Cada opción como fila con borde (estilo selección de banco/cuenta),
2917
+ manteniendo el control radio. Hover + opción seleccionada resaltada.
2524
2918
  ======================================== */
2919
+ .kds-radio-group--card {
2920
+ gap: var(--kds-spacing-2);
2921
+ }
2525
2922
 
2526
- /* Stage Layout - Individual stage wrapper */
2527
- .kds-stage {
2528
- max-width: var(--kds-onboarding-max-width);
2529
- margin: 0 auto;
2530
- width: 100%;
2923
+ .kds-radio-group--card label.radio {
2924
+ gap: var(--kds-spacing-1-5);
2925
+ /* Vertical con un poco más de aire; horizontal reducido para pegar el radio a la izquierda. */
2926
+ padding: var(--kds-spacing-2) var(--kds-spacing-1-5);
2927
+ /* Bordes con los valores del bank selector. */
2928
+ border: 1px solid var(--kds-color-border-subtle);
2929
+ border-radius: var(--kds-radius-card);
2930
+ background: var(--kds-color-surface);
2931
+ transition: border-color 0.2s, background 0.2s;
2531
2932
  }
2532
2933
 
2533
- /* Stage Header - Title and subtitle */
2534
- .kds-stage-header {
2535
- display: flex;
2536
- flex-direction: column;
2934
+ /* Leve separación extra entre el radio y el texto de la opción. */
2935
+ .kds-radio-group--card label.radio span {
2936
+ margin-left: var(--kds-spacing-0-5);
2937
+ }
2938
+
2939
+ .kds-radio-group--card label.radio:hover {
2940
+ border-color: var(--kds-color-border-default);
2941
+ }
2942
+
2943
+ /* Seleccionada: poco color primario — solo un fondo faint sutil + borde gris
2944
+ (el punto del radio ya comunica la selección). */
2945
+ .kds-radio-group--card label.radio:has(input:checked) {
2946
+ border-color: var(--kds-color-border-default);
2947
+ background: var(--kds-color-primary-faint);
2948
+ }
2949
+
2950
+ /* ========================================
2951
+ ONBOARDING COMPONENTS
2952
+ Multi-stage onboarding flow with form validation
2953
+ ======================================== */
2954
+
2955
+ /* Stage Layout - Individual stage wrapper */
2956
+ .kds-stage {
2957
+ max-width: var(--kds-onboarding-max-width);
2958
+ margin: 0 auto;
2959
+ width: 100%;
2960
+ }
2961
+
2962
+ /* Stage Header - Title and subtitle */
2963
+ .kds-stage-header {
2964
+ display: flex;
2965
+ flex-direction: column;
2537
2966
  align-items: flex-start;
2538
2967
  gap: var(--kds-spacing-1);
2539
2968
  margin-bottom: var(--kds-spacing-2);
@@ -3015,7 +3444,8 @@ footer > .kds-container-center {
3015
3444
  display: flex;
3016
3445
  align-items: center;
3017
3446
  gap: var(--kds-spacing-1);
3018
- padding: var(--kds-spacing-2);
3447
+ /* Padding compacto: vertical spacing-1 (8px), horizontal spacing-2 (16px). */
3448
+ padding: var(--kds-spacing-1) var(--kds-spacing-2);
3019
3449
  border-radius: var(--kds-radius-md);
3020
3450
  border: 1px solid;
3021
3451
  font-family: var(--kds-font-family-primary);
@@ -3025,7 +3455,7 @@ footer > .kds-container-center {
3025
3455
 
3026
3456
  @media (min-width: 768px) {
3027
3457
  .kds-alert {
3028
- padding: var(--kds-spacing-2);
3458
+ padding: var(--kds-spacing-1) var(--kds-spacing-2);
3029
3459
  flex: 1 1 auto;
3030
3460
  }
3031
3461
  }
@@ -3053,7 +3483,9 @@ footer > .kds-container-center {
3053
3483
  font-size: var(--kds-font-size-sm);
3054
3484
  font-weight: var(--kds-font-weight-semibold);
3055
3485
  line-height: var(--kds-line-height-normal);
3056
- margin-bottom: var(--kds-spacing-0-5);
3486
+ /* Solo margin-bottom: el padding del alert da el espaciado. Reset del resto para
3487
+ evitar el margin-block que BeerCSS aplica a <p> dentro del scope. */
3488
+ margin: 0 0 var(--kds-spacing-0-5);
3057
3489
  word-break: normal;
3058
3490
  overflow-wrap: break-word;
3059
3491
  }
@@ -3063,6 +3495,9 @@ footer > .kds-container-center {
3063
3495
  font-size: var(--kds-font-size-sm);
3064
3496
  font-weight: var(--kds-font-weight-regular);
3065
3497
  line-height: var(--kds-line-height-relaxed);
3498
+ /* Sin margen propio: el padding del alert es el único espaciado (evita el
3499
+ margin-block de <p> de BeerCSS dentro del scope). */
3500
+ margin: 0;
3066
3501
  word-break: normal;
3067
3502
  overflow-wrap: break-word;
3068
3503
  }
@@ -3108,6 +3543,32 @@ footer > .kds-container-center {
3108
3543
  color: var(--kds-color-error-dark);
3109
3544
  }
3110
3545
 
3546
+ /* Close button — icon-only, discreto, no usa kds-btn para no romper el flex layout del alert */
3547
+ .kds-alert-close {
3548
+ flex-shrink: 0;
3549
+ display: inline-flex;
3550
+ align-items: center;
3551
+ justify-content: center;
3552
+ width: 28px;
3553
+ height: 28px;
3554
+ padding: 0;
3555
+ background: transparent;
3556
+ border: 0;
3557
+ border-radius: 50%;
3558
+ color: inherit;
3559
+ cursor: pointer;
3560
+ transition: background-color 0.15s ease;
3561
+ }
3562
+
3563
+ .kds-alert-close:hover {
3564
+ background: rgba(0, 0, 0, 0.06);
3565
+ }
3566
+
3567
+ .kds-alert-close i {
3568
+ font-size: 18px;
3569
+ line-height: 1;
3570
+ }
3571
+
3111
3572
  /* Lists inside alerts */
3112
3573
  .kds-alert ul {
3113
3574
  padding-left: var(--kds-spacing-2);
@@ -4104,6 +4565,14 @@ dialog#surveyModal button.circle {
4104
4565
  text-align: center;
4105
4566
  }
4106
4567
 
4568
+ .kds-text-left {
4569
+ text-align: left;
4570
+ }
4571
+
4572
+ .kds-text-right {
4573
+ text-align: right;
4574
+ }
4575
+
4107
4576
  .kds-text-underline {
4108
4577
  text-decoration: underline;
4109
4578
  }
@@ -4120,6 +4589,54 @@ dialog#surveyModal button.circle {
4120
4589
  font-size: var(--kds-font-size-sm);
4121
4590
  }
4122
4591
 
4592
+ /* ── Font-size scale utilities (additive — opt-in companions to .kds-text-sm) ── */
4593
+ .kds-text-base {
4594
+ font-size: var(--kds-font-size-base);
4595
+ }
4596
+
4597
+ .kds-text-lg {
4598
+ font-size: var(--kds-font-size-lg);
4599
+ }
4600
+
4601
+ .kds-text-xl {
4602
+ font-size: var(--kds-font-size-xl);
4603
+ }
4604
+
4605
+ .kds-text-2xl {
4606
+ font-size: var(--kds-font-size-2xl);
4607
+ }
4608
+
4609
+ /* ── Font-weight utilities ── */
4610
+ .kds-fw-regular {
4611
+ font-weight: var(--kds-font-weight-regular);
4612
+ }
4613
+
4614
+ .kds-fw-medium {
4615
+ font-weight: var(--kds-font-weight-medium);
4616
+ }
4617
+
4618
+ .kds-fw-semibold {
4619
+ font-weight: var(--kds-font-weight-semibold);
4620
+ }
4621
+
4622
+ .kds-fw-bold {
4623
+ font-weight: var(--kds-font-weight-bold);
4624
+ }
4625
+
4626
+ /* ── Text-transform utilities ── */
4627
+ .kds-text-transform-none {
4628
+ text-transform: none;
4629
+ }
4630
+
4631
+ /* ── Soft background utilities (semantic muted backgrounds for callouts) ── */
4632
+ .kds-bg-warning-soft {
4633
+ background-color: var(--kds-color-warning-soft);
4634
+ }
4635
+
4636
+ .kds-bg-info-soft {
4637
+ background-color: var(--kds-color-info-soft);
4638
+ }
4639
+
4123
4640
  /* ── Typography variants ── */
4124
4641
  .kds-text-display1 {
4125
4642
  font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
@@ -4210,6 +4727,12 @@ dialog#surveyModal button.circle {
4210
4727
  color: var(--kds-color-primary-dark, #5B3179);
4211
4728
  }
4212
4729
 
4730
+ /* Inline emphasis: bold weight only, inherits size/color/family from context so it
4731
+ works as a highlighted fragment inside any other variant (body, heading, etc.). */
4732
+ .kds-text-strong {
4733
+ font-weight: var(--kds-font-weight-bold, 700);
4734
+ }
4735
+
4213
4736
  /* Display utilities */
4214
4737
  .kds-hidden {
4215
4738
  display: none;
@@ -4330,7 +4853,9 @@ dialog#surveyModal button.circle {
4330
4853
  ======================================== */
4331
4854
 
4332
4855
  .kds-badge {
4333
- display: inline-block;
4856
+ display: inline-flex;
4857
+ align-items: center;
4858
+ gap: 4px;
4334
4859
  padding: 2px 8px;
4335
4860
  border-radius: var(--kds-radius-sm);
4336
4861
  font-size: var(--kds-font-size-xs);
@@ -4338,6 +4863,40 @@ dialog#surveyModal button.circle {
4338
4863
  line-height: 1.5;
4339
4864
  }
4340
4865
 
4866
+ /* Icon prefix inside chip — small inline icon */
4867
+ .kds-badge > i.material-symbols-outlined {
4868
+ font-size: 14px;
4869
+ line-height: 1;
4870
+ }
4871
+
4872
+ /* Deletable chip close button — discreto, sin kds-btn (eso lo agrandaba ridículo) */
4873
+ .kds-badge-close {
4874
+ display: inline-flex;
4875
+ align-items: center;
4876
+ justify-content: center;
4877
+ width: 16px;
4878
+ height: 16px;
4879
+ margin-right: -2px;
4880
+ padding: 0;
4881
+ background: transparent;
4882
+ border: 0;
4883
+ border-radius: 50%;
4884
+ color: inherit;
4885
+ cursor: pointer;
4886
+ opacity: 0.7;
4887
+ transition: opacity 0.15s, background-color 0.15s;
4888
+ }
4889
+
4890
+ .kds-badge-close:hover {
4891
+ opacity: 1;
4892
+ background: rgba(0, 0, 0, 0.1);
4893
+ }
4894
+
4895
+ .kds-badge-close i {
4896
+ font-size: 14px;
4897
+ line-height: 1;
4898
+ }
4899
+
4341
4900
  .kds-badge.success {
4342
4901
  background-color: var(--kds-color-success-container);
4343
4902
  color: var(--kds-color-success-dark);
@@ -4549,21 +5108,46 @@ dialog#surveyModal button.circle {
4549
5108
  flex-shrink: 0;
4550
5109
  }
4551
5110
 
4552
- /* Merchant tile with logo variant */
5111
+ /* Merchant tile with logo variant — el logo (avatar del comercio) llena TODO el tile.
5112
+ `display: block` evita el desborde del auto-grid; `overflow: hidden` recorta la imagen
5113
+ a las esquinas redondeadas del tile. La imagen va CUADRADA (sin border-radius propio):
5114
+ solo el contenedor recorta, evitando el hairline sub-pixel del doble redondeo. El fondo
5115
+ se deja transparente bajo el logo como respaldo (no debe verse púrpura en los bordes). */
4553
5116
  .kds-merchant-tile.logo {
4554
- padding: var(--kds-spacing-0-5);
5117
+ padding: 0;
5118
+ display: block;
5119
+ overflow: hidden;
5120
+ background: transparent;
4555
5121
  }
4556
5122
 
4557
5123
  .kds-merchant-tile.logo img {
4558
5124
  width: 100%;
4559
5125
  height: 100%;
4560
5126
  object-fit: cover;
4561
- border-radius: var(--kds-radius-md);
5127
+ border-radius: 0;
5128
+ display: block;
5129
+ }
5130
+
5131
+ /* Variante para logos que traen su propio marco/forma (logos de comercio/servicio,
5132
+ no fotos): `contain` + padding para que el logo entre completo sin recortar sus
5133
+ esquinas. Opt-in: pasar className="kds-merchant-tile--contain". */
5134
+ .kds-merchant-tile.logo.kds-merchant-tile--contain {
5135
+ padding: var(--kds-spacing-1);
5136
+ }
5137
+ .kds-merchant-tile.logo.kds-merchant-tile--contain img {
5138
+ object-fit: contain;
4562
5139
  }
4563
5140
 
4564
5141
  .kds-merchant-meta {
4565
5142
  display: flex;
4566
5143
  flex-direction: column;
5144
+ gap: var(--kds-spacing-0-5);
5145
+ }
5146
+
5147
+ /* El meta controla su propio espaciado: anula el margin sibling de BeerCSS
5148
+ (`… + :is(p,h*,…) { margin-block-start: 1rem }`) que separaba de más las líneas. */
5149
+ .kds-merchant-meta > * {
5150
+ margin-block: 0 !important;
4567
5151
  }
4568
5152
 
4569
5153
  .kds-merchant-label {
@@ -4616,6 +5200,11 @@ dialog#surveyModal button.circle {
4616
5200
  color: var(--kds-color-text-primary);
4617
5201
  }
4618
5202
 
5203
+ /* Opt-in color modifier — switches the value to the LigoPay/khipu-blue tone */
5204
+ .kds-amount-value--info {
5205
+ color: var(--kds-color-info-blue); /* #5A5FE0 */
5206
+ }
5207
+
4619
5208
  .kds-amount-value small {
4620
5209
  font-size: 18px;
4621
5210
  font-weight: 500;
@@ -4973,7 +5562,7 @@ dialog#surveyModal button.circle {
4973
5562
  display: flex;
4974
5563
  align-items: center;
4975
5564
  justify-content: center;
4976
- gap: var(--kds-spacing-1);
5565
+ gap: var(--kds-spacing-0-5);
4977
5566
  color: var(--kds-color-gray-400);
4978
5567
  font-size: var(--kds-font-size-xs);
4979
5568
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -4985,6 +5574,17 @@ dialog#surveyModal button.circle {
4985
5574
  display: none;
4986
5575
  }
4987
5576
 
5577
+ .kds-screen > form {
5578
+ margin-block-start: 0 !important;
5579
+ }
5580
+
5581
+ /* Footer externo (desktop) adyacente a la card: cancela el gap del .kds-screen
5582
+ para que quede pegado debajo de la card y no flotando lejos. Las dos cards
5583
+ (header/body) sí conservan su separación. */
5584
+ .kds-screen > .kds-secure-footer {
5585
+ margin-top: calc(-1 * var(--kds-spacing-3));
5586
+ }
5587
+
4988
5588
  @media (max-width: 767px) {
4989
5589
  .kds-card-elevated > .kds-secure-footer {
4990
5590
  display: flex;
@@ -4992,10 +5592,6 @@ dialog#surveyModal button.circle {
4992
5592
  .kds-screen > .kds-secure-footer {
4993
5593
  display: none;
4994
5594
  }
4995
-
4996
- .kds-screen > form {
4997
- margin-block-start: 0 !important;
4998
- }
4999
5595
  }
5000
5596
 
5001
5597
  .kds-secure-footer-lock {
@@ -5017,6 +5613,30 @@ dialog#surveyModal button.circle {
5017
5613
  display: block;
5018
5614
  object-fit: contain;
5019
5615
  overflow: visible;
5616
+ /* Nudge óptico: la tinta del wordmark queda ~1px alta dentro de su viewBox (45x15),
5617
+ así que al centrar por caja se ve desalineada respecto a la baseline del texto. */
5618
+ position: relative;
5619
+ top: 1px;
5620
+ }
5621
+
5622
+ /* Divisor entre el logo de Khipu y el del PSP ("Khipu | klap") */
5623
+ .kds-secure-footer-sep {
5624
+ width: 1px;
5625
+ height: 0.85em;
5626
+ background: currentColor;
5627
+ opacity: 0.35;
5628
+ flex: 0 0 auto;
5629
+ }
5630
+
5631
+ /* Logo del PSP (proveedor de pagos): lo provee el consumidor, lo alineamos al mismo
5632
+ alto que el mark de Khipu. Sirve para <img> o un elemento con .kds-psp-mark. */
5633
+ .kds-secure-footer img,
5634
+ .kds-secure-footer .kds-psp-mark {
5635
+ height: 11px;
5636
+ width: auto;
5637
+ flex: 0 0 auto;
5638
+ display: block;
5639
+ object-fit: contain;
5020
5640
  }
5021
5641
 
5022
5642
  .kds-secure-footer-code {
@@ -5032,25 +5652,45 @@ dialog#surveyModal button.circle {
5032
5652
  background: none;
5033
5653
  border: 0;
5034
5654
  padding: 0;
5655
+ /* Reset del bare `button { height: 2.5rem }` de BeerCSS (scoped en .kds-theme-root):
5656
+ sin esto el toggle quedaba en una caja de 40px con el texto centrado → espacio
5657
+ irregular arriba (pegado al resumen) y abajo (~26px hasta el panel). Con height
5658
+ auto el botón ajusta a su contenido y el ritmo lo gobiernan los márgenes. */
5659
+ height: auto;
5035
5660
  color: var(--kds-color-primary-main);
5036
5661
  font-weight: var(--kds-font-weight-medium);
5037
5662
  font-size: var(--kds-font-size-sm);
5038
5663
  cursor: pointer;
5039
5664
  display: inline-flex;
5040
5665
  align-items: center;
5041
- gap: var(--kds-spacing-0-75);
5666
+ gap: 0;
5042
5667
  }
5043
5668
 
5044
- .kds-expand-toggle:hover {
5669
+ .kds-expand-toggle:hover,
5670
+ .kds-expand-toggle:focus,
5671
+ .kds-expand-toggle:active {
5045
5672
  background: transparent;
5673
+ outline: none;
5674
+ box-shadow: none;
5046
5675
  }
5047
5676
 
5048
- .kds-expand-toggle:hover span {
5677
+ .kds-expand-toggle:hover span,
5678
+ .kds-expand-toggle:focus span,
5679
+ .kds-expand-toggle:active span {
5049
5680
  text-decoration: underline;
5050
5681
  }
5051
5682
 
5052
5683
  .kds-expand-toggle i {
5053
5684
  font-size: var(--kds-font-size-base);
5685
+ /* BeerCSS estiliza el `i` bare como caja flex de 30px (height/width/min: 30px), que
5686
+ inflaba el toggle y dejaba aire vertical de más alrededor del label. La achicamos a
5687
+ 1.25em MANTENIENDO el centrado flex de BeerCSS (display:flex/align/justify) — así el
5688
+ caret queda compacto Y ópticamente centrado con el texto (no usar height:auto ni
5689
+ line-height:1: descentran el glifo). */
5690
+ width: 1.25em;
5691
+ height: 1.25em;
5692
+ min-width: 0;
5693
+ min-height: 0;
5054
5694
  transition: transform var(--kds-transition-shorter, 0.2s);
5055
5695
  }
5056
5696
 
@@ -5188,13 +5828,17 @@ dialog#surveyModal button.circle {
5188
5828
 
5189
5829
  .kds-status-block {
5190
5830
  text-align: center;
5191
- padding: var(--kds-spacing-6) 0;
5831
+ /* Padding vertical estándar: spacing-2 (16px), el mismo rhythm inter-elementos
5832
+ que usan kds-btn-stack y kds-hr-dashed. NO usar spacing-6 (48px): genera
5833
+ demasiado espacio cuando el bloque se compone con header/divider alrededor. */
5834
+ padding: var(--kds-spacing-2) 0;
5192
5835
  }
5193
5836
 
5194
5837
  .kds-status-block-icon {
5195
5838
  width: var(--kds-status-icon-size);
5196
5839
  height: var(--kds-status-icon-size);
5197
- margin: 0 auto var(--kds-spacing-3);
5840
+ /* spacing-2 (16px) icono→título: rhythm estándar inter-elementos. */
5841
+ margin: 0 auto var(--kds-spacing-2);
5198
5842
  border-radius: var(--kds-radius-full);
5199
5843
  display: grid;
5200
5844
  place-items: center;
@@ -5225,11 +5869,11 @@ dialog#surveyModal button.circle {
5225
5869
  color: var(--kds-color-success-main);
5226
5870
  }
5227
5871
 
5228
- /* Variant: pending (animated spinner) */
5872
+ /* Variant: pending (animated blue spinner, sin icono interno) */
5229
5873
  .kds-status-block[data-status="pending"] .kds-status-block-icon {
5230
5874
  background: transparent;
5231
5875
  border: 3px solid var(--kds-color-divider);
5232
- border-top-color: var(--kds-color-primary-main);
5876
+ border-top-color: var(--kds-color-info-main);
5233
5877
  animation: kds-spin 1s linear infinite;
5234
5878
  }
5235
5879
 
@@ -5247,12 +5891,21 @@ dialog#surveyModal button.circle {
5247
5891
  color: var(--kds-color-error-main);
5248
5892
  }
5249
5893
 
5894
+ /* Variant: info — usar SIEMPRE con icon "info_i" (i minúscula sin glyph circular)
5895
+ para que solo se vea nuestro círculo decorativo. Iconos como "info" tienen
5896
+ su propio círculo built-in → causarían doble círculo. */
5897
+ .kds-status-block[data-status="info"] .kds-status-block-icon {
5898
+ background: var(--kds-color-info-soft);
5899
+ border: var(--kds-border-width-md) solid var(--kds-color-info-main);
5900
+ color: var(--kds-color-info-main);
5901
+ }
5902
+
5250
5903
  /* Inline variant: icon left + text right */
5251
5904
  .kds-status-block.inline {
5252
5905
  text-align: left;
5253
5906
  display: flex;
5254
5907
  align-items: center;
5255
- gap: var(--kds-spacing-3);
5908
+ gap: var(--kds-spacing-2);
5256
5909
  padding: var(--kds-spacing-1) 0;
5257
5910
  }
5258
5911
 
@@ -5314,6 +5967,40 @@ dialog#surveyModal button.circle {
5314
5967
  background: var(--kds-color-divider);
5315
5968
  }
5316
5969
 
5970
+ /* Close button — top-right discreto, NO usa kds-btn (rompía el flex layout) */
5971
+ .kds-bottom-sheet-close {
5972
+ position: absolute;
5973
+ top: var(--kds-spacing-1);
5974
+ right: var(--kds-spacing-1);
5975
+ width: 32px;
5976
+ height: 32px;
5977
+ display: inline-flex;
5978
+ align-items: center;
5979
+ justify-content: center;
5980
+ padding: 0;
5981
+ background: transparent;
5982
+ border: 0;
5983
+ border-radius: 50%;
5984
+ color: var(--kds-color-text-secondary);
5985
+ cursor: pointer;
5986
+ transition: background-color 0.15s ease;
5987
+ }
5988
+
5989
+ .kds-bottom-sheet-close:hover {
5990
+ background: rgba(0, 0, 0, 0.06);
5991
+ }
5992
+
5993
+ .kds-bottom-sheet-close i {
5994
+ font-size: 20px;
5995
+ line-height: 1;
5996
+ }
5997
+
5998
+ /* Body container — separa el content del title/actions */
5999
+ .kds-bottom-sheet-body {
6000
+ text-align: left;
6001
+ margin-top: var(--kds-spacing-1);
6002
+ }
6003
+
5317
6004
  .kds-bottom-sheet-icon {
5318
6005
  font-size: var(--kds-font-size-4xl);
5319
6006
  }
@@ -5618,6 +6305,14 @@ dialog#surveyModal button.circle {
5618
6305
  margin-top: var(--kds-spacing-1);
5619
6306
  }
5620
6307
 
6308
+ /* Ritmo uniforme alrededor del toggle: spacing-2 arriba (resumen↔"Ver detalle")
6309
+ iguala el padding-top spacing-2 que la .kds-detail-list da debajo
6310
+ ("Ver detalle"↔primer label del panel). Antes el alto fijo del bare button
6311
+ (40px) hacía que el espacio de arriba y de abajo fueran distintos. */
6312
+ .kds-invoice-collapsible > .kds-expand-toggle {
6313
+ margin-top: var(--kds-spacing-2);
6314
+ }
6315
+
5621
6316
  /* -- Invoice Summary -- */
5622
6317
  .kds-invoice-summary {
5623
6318
  display: flex;
@@ -5641,6 +6336,22 @@ div.kds-invoice-header,
5641
6336
  padding: 0;
5642
6337
  border-radius: 0;
5643
6338
  align-content: initial;
6339
+ /* Override BeerCSS `header { min-height: ... }` — el header debe ajustarse a su
6340
+ contenido (sigue el alto del merchant tile: 64px→50px al colapsar). Sin esto
6341
+ quedaba un min-height fijo de 64px → hueco muerto debajo al colapsar en mobile. */
6342
+ min-height: 0;
6343
+ }
6344
+
6345
+ /* Mobile: center-align el header (merchant tile vs bloque monto+código) tanto
6346
+ expandido como colapsado. Al quitar el logo del header, el bloque de texto quedaba
6347
+ más bajo que el merchant tile y con `flex-start` dejaba hueco abajo; centrado los
6348
+ alinea. CSS-only (no depende de la clase .is-collapsed, que el JS de collapse no setea). */
6349
+ @media (max-width: 767px) {
6350
+ header.kds-invoice-header,
6351
+ div.kds-invoice-header,
6352
+ .kds-invoice-header {
6353
+ align-items: center;
6354
+ }
5644
6355
  }
5645
6356
 
5646
6357
  /* Reset BeerCSS sibling margin on <p> inside invoice header — specificity (0,4,1) ties BeerCSS, wins by source order */
@@ -5650,7 +6361,7 @@ div.kds-invoice-header,
5650
6361
  }
5651
6362
 
5652
6363
  .kds-invoice-amount {
5653
- font-weight: var(--kds-font-weight-bold);
6364
+ font-weight: var(--kds-font-weight-semibold);
5654
6365
  font-size: var(--kds-font-size-3xl);
5655
6366
  line-height: var(--kds-line-height-tight);
5656
6367
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -5671,10 +6382,16 @@ div.kds-invoice-header,
5671
6382
  color: var(--kds-color-gray-400);
5672
6383
  text-transform: uppercase;
5673
6384
  margin: 0;
5674
- margin-top: var(--kds-spacing-1);
6385
+ margin-block: unset;
6386
+ display: flex;
6387
+ gap: var(--kds-spacing-1-5);
5675
6388
  }
5676
6389
 
5677
6390
  .kds-invoice-code-value {
6391
+ color: var(--kds-color-gray-400);
6392
+ }
6393
+
6394
+ .kds-invoice-code-value--lowercase {
5678
6395
  text-transform: lowercase;
5679
6396
  }
5680
6397
 
@@ -5687,6 +6404,9 @@ div.kds-invoice-header,
5687
6404
  place-items: center;
5688
6405
  color: #fff;
5689
6406
  flex-shrink: 0;
6407
+ /* Clip the slightly-oversized logo (see `.kds-invoice-merchant img`) to the
6408
+ rounded square so it can fully cover the deep-purple background. */
6409
+ overflow: hidden;
5690
6410
  }
5691
6411
 
5692
6412
  .kds-invoice-merchant i {
@@ -5706,28 +6426,43 @@ div.kds-invoice-header,
5706
6426
  }
5707
6427
 
5708
6428
  .kds-invoice-merchant img {
5709
- width: 100%;
5710
- height: 100%;
6429
+ /* Slightly larger than the container (+2px, centered by the grid) so the
6430
+ logo overflows under the parent's rounded clip and the deep-purple
6431
+ background never peeks through at the corners when the logo shrinks. */
6432
+ width: calc(100% + 2px);
6433
+ height: calc(100% + 2px);
5711
6434
  object-fit: cover;
5712
6435
  border-radius: var(--kds-radius-md);
5713
6436
  }
5714
6437
 
5715
6438
  /* -- Card Title -- */
5716
6439
  .kds-card-title {
5717
- font-weight: 700;
6440
+ font-weight: var(--kds-font-weight-semibold);
5718
6441
  font-size: var(--kds-font-size-base);
5719
6442
  line-height: 1.5;
5720
6443
  letter-spacing: -0.31px;
5721
6444
  color: var(--kds-color-text-primary);
5722
- margin-bottom: var(--kds-spacing-2) !important;
6445
+ /* sin !important: no hay regla de margin-bottom para h1 en BeerCSS que competir, y así un
6446
+ consumidor puede anularlo (p.ej. FormTitle dentro de un Stack que ya da el espacio). */
6447
+ margin-bottom: var(--kds-spacing-2);
6448
+ }
6449
+
6450
+ /* Opt-in size modifiers (additive — do NOT change default 16/600) */
6451
+ .kds-card-title--lg {
6452
+ font-size: var(--kds-font-size-xl); /* 20px */
6453
+ font-weight: var(--kds-font-weight-semibold);
6454
+ }
6455
+
6456
+ .kds-card-title--xl {
6457
+ font-size: var(--kds-font-size-2xl); /* 24px */
6458
+ font-weight: var(--kds-font-weight-semibold);
5723
6459
  }
5724
6460
 
5725
6461
  /* -- Key-Value Grid -- */
5726
6462
  .kds-kv {
5727
6463
  display: grid;
5728
6464
  grid-template-columns: auto 1fr;
5729
- row-gap: var(--kds-spacing-1);
5730
- column-gap: var(--kds-spacing-1-5);
6465
+ column-gap: var(--kds-spacing-1);
5731
6466
  align-items: baseline;
5732
6467
  }
5733
6468
 
@@ -5744,7 +6479,7 @@ div.kds-invoice-header,
5744
6479
  margin: 0;
5745
6480
  font-size: var(--kds-font-size-sm);
5746
6481
  line-height: var(--kds-line-height-relaxed);
5747
- font-weight: var(--kds-font-weight-bold);
6482
+ font-weight: var(--kds-font-weight-semibold);
5748
6483
  letter-spacing: normal;
5749
6484
  color: var(--kds-color-gray-800);
5750
6485
  min-width: 0;
@@ -5772,16 +6507,28 @@ div.kds-invoice-header,
5772
6507
  .kds-detail-list {
5773
6508
  display: flex;
5774
6509
  flex-direction: column;
5775
- gap: var(--kds-spacing-1-5);
6510
+ /* spacing-2 entre grupos del detalle (separación estándar entre piezas de info
6511
+ distintas, ej. "Emisor cobro" vs "Descripción"). El padding-top da la misma
6512
+ separación spacing-2 arriba del primer grupo (Asunto↔Emisor cobro). */
6513
+ gap: var(--kds-spacing-2);
5776
6514
  margin: 0;
5777
- padding: 0 0 var(--kds-spacing-1);
6515
+ padding: var(--kds-spacing-2) 0 0;
5778
6516
  }
5779
6517
 
5780
- .kds-detail-group {
5781
- margin-bottom: var(--kds-spacing-1-5);
6518
+ @media (max-width: 767px) {
6519
+ .kds-detail-list {
6520
+ padding-bottom: var(--kds-spacing-2);
6521
+ }
5782
6522
  }
5783
6523
 
5784
- .kds-detail-group:last-child {
6524
+ .kds-detail-group {
6525
+ /* El espacio ENTRE grupos lo da el `gap` de .kds-detail-list (spacing-2).
6526
+ Dentro del grupo, label↔value llevan un gap chico (spacing-0-5) para un
6527
+ ritmo parejo: antes el dt iba pegado al dd (0px) y se veía desigual frente
6528
+ a los 16px entre los demás elementos del panel. */
6529
+ display: flex;
6530
+ flex-direction: column;
6531
+ gap: var(--kds-spacing-0-5);
5785
6532
  margin-bottom: 0;
5786
6533
  }
5787
6534
 
@@ -5790,7 +6537,7 @@ div.kds-invoice-header,
5790
6537
  letter-spacing: var(--kds-letter-spacing-wide);
5791
6538
  color: var(--kds-color-text-hint);
5792
6539
  text-transform: uppercase;
5793
- margin: 0 0 var(--kds-spacing-0-5);
6540
+ margin: 0;
5794
6541
  }
5795
6542
 
5796
6543
  .kds-detail-group dd {
@@ -5800,6 +6547,19 @@ div.kds-invoice-header,
5800
6547
  color: var(--kds-color-text-primary);
5801
6548
  }
5802
6549
 
6550
+ /* Imagen adjunta del cobro dentro del panel de detalle (ej. comprobante/producto).
6551
+ Reemplaza los inline styles del antiguo modal MerchantInfo: ancho contenido, borde
6552
+ y radio del DS. Va como un grupo más de la .kds-detail-list (hereda su gap). */
6553
+ .kds-detail-image {
6554
+ display: block;
6555
+ max-width: 100%;
6556
+ width: 160px;
6557
+ height: auto;
6558
+ object-fit: contain;
6559
+ border-radius: var(--kds-radius-md);
6560
+ border: 1px solid var(--kds-color-border);
6561
+ }
6562
+
5803
6563
  /* -- Amount Summary Row -- */
5804
6564
  .kds-amount-row {
5805
6565
  display: flex;
@@ -5859,16 +6619,16 @@ div.kds-invoice-header,
5859
6619
  font-size: var(--kds-font-size-sm);
5860
6620
  }
5861
6621
 
5862
- .kds-recap-list .k {
6622
+ .kds-recap-list .kds-key {
5863
6623
  color: var(--kds-color-text-secondary);
5864
6624
  }
5865
6625
 
5866
- .kds-recap-list .v {
6626
+ .kds-recap-list .kds-value {
5867
6627
  color: var(--kds-color-text-primary);
5868
6628
  font-weight: 500;
5869
6629
  }
5870
6630
 
5871
- .kds-recap-list .v.placeholder {
6631
+ .kds-recap-list .kds-value.placeholder {
5872
6632
  color: var(--kds-color-text-hint);
5873
6633
  }
5874
6634
 
@@ -5895,6 +6655,72 @@ a.kds-btn-success:disabled {
5895
6655
  box-shadow: none;
5896
6656
  }
5897
6657
 
6658
+ /* -- Button Warning (amber CTA) -- */
6659
+ button.kds-btn-warning,
6660
+ a.kds-btn-warning {
6661
+ background: var(--kds-color-warning-main);
6662
+ color: var(--kds-color-warning-contrast);
6663
+ border: none;
6664
+ }
6665
+
6666
+ button.kds-btn-warning:hover:not(:disabled),
6667
+ a.kds-btn-warning:hover:not(:disabled) {
6668
+ background: var(--kds-color-warning-dark);
6669
+ }
6670
+
6671
+ button.kds-btn-warning:active:not(:disabled),
6672
+ button.kds-btn-warning:focus-visible:not(:disabled),
6673
+ a.kds-btn-warning:active:not(:disabled),
6674
+ a.kds-btn-warning:focus-visible:not(:disabled) {
6675
+ background: var(--kds-color-warning-dark);
6676
+ outline: 2px solid var(--kds-color-warning-main);
6677
+ outline-offset: 2px;
6678
+ }
6679
+
6680
+ button.kds-btn-warning:disabled,
6681
+ a.kds-btn-warning:disabled {
6682
+ background-color: var(--kds-color-action-disabled-bg);
6683
+ color: var(--kds-color-action-disabled);
6684
+ box-shadow: none;
6685
+ }
6686
+
6687
+ button.kds-btn-warning::after {
6688
+ display: none;
6689
+ }
6690
+
6691
+ /* -- Button Error (red / destructive CTA) -- */
6692
+ button.kds-btn-error,
6693
+ a.kds-btn-error {
6694
+ background: var(--kds-color-error-main);
6695
+ color: var(--kds-color-error-contrast);
6696
+ border: none;
6697
+ }
6698
+
6699
+ button.kds-btn-error:hover:not(:disabled),
6700
+ a.kds-btn-error:hover:not(:disabled) {
6701
+ background: var(--kds-color-error-dark);
6702
+ }
6703
+
6704
+ button.kds-btn-error:active:not(:disabled),
6705
+ button.kds-btn-error:focus-visible:not(:disabled),
6706
+ a.kds-btn-error:active:not(:disabled),
6707
+ a.kds-btn-error:focus-visible:not(:disabled) {
6708
+ background: var(--kds-color-error-dark);
6709
+ outline: 2px solid var(--kds-color-error-main);
6710
+ outline-offset: 2px;
6711
+ }
6712
+
6713
+ button.kds-btn-error:disabled,
6714
+ a.kds-btn-error:disabled {
6715
+ background-color: var(--kds-color-action-disabled-bg);
6716
+ color: var(--kds-color-action-disabled);
6717
+ box-shadow: none;
6718
+ }
6719
+
6720
+ button.kds-btn-error::after {
6721
+ display: none;
6722
+ }
6723
+
5898
6724
  /* -- Field Helper Text -- */
5899
6725
  .kds-field-helper {
5900
6726
  font-size: var(--kds-font-size-xs);
@@ -5937,6 +6763,8 @@ button.kds-btn-success::after {
5937
6763
  /* -- Alert inline (borderless, used inside cards) -- */
5938
6764
  .kds-alert-inline {
5939
6765
  border: none;
6766
+ padding: var(--kds-spacing-1) var(--kds-spacing-1-5);
6767
+ margin-bottom: var(--kds-spacing-1-5);
5940
6768
  }
5941
6769
 
5942
6770
  /* -- Card dimmed (behind overlays) -- */
@@ -6038,17 +6866,42 @@ button.kds-btn-success::after {
6038
6866
  }
6039
6867
 
6040
6868
  .kds-bill-description-picture {
6041
- width: 120px;
6042
- height: 120px;
6869
+ max-width: 100px;
6043
6870
  object-fit: contain;
6044
6871
  background: var(--kds-color-background-paper);
6045
- padding: var(--kds-spacing-1-25);
6046
- border-radius: var(--kds-radius-md);
6047
- margin-top: var(--kds-spacing-1);
6872
+ margin-top: var(--kds-spacing-1-25);
6048
6873
  display: block;
6049
6874
  box-sizing: content-box;
6050
6875
  }
6051
6876
 
6877
+ /* -- Bill Attachments -- */
6878
+ .kds-bill-attachments {
6879
+ display: flex;
6880
+ flex-direction: column;
6881
+ gap: var(--kds-spacing-0-75);
6882
+ }
6883
+
6884
+ .kds-bill-attachment {
6885
+ display: inline-flex;
6886
+ align-items: center;
6887
+ justify-content: flex-start;
6888
+ width: fit-content;
6889
+ color: var(--kds-color-info-main);
6890
+ font-size: var(--kds-font-size-sm);
6891
+ font-weight: var(--kds-font-weight-medium);
6892
+ text-decoration: none;
6893
+ }
6894
+
6895
+ .kds-bill-attachment:hover span {
6896
+ text-decoration: underline;
6897
+ }
6898
+
6899
+ .kds-bill-attachment i {
6900
+ font-size: var(--kds-font-size-lg);
6901
+ min-width: unset;
6902
+ justify-content: flex-start;
6903
+ }
6904
+
6052
6905
  /* -- Share Card (mustContinue) -- */
6053
6906
  .kds-share-card {
6054
6907
  margin-top: var(--kds-spacing-2);
@@ -6174,12 +7027,38 @@ button.kds-btn-success::after {
6174
7027
  padding-bottom: 0;
6175
7028
  }
6176
7029
 
6177
- /* Payment stage full-viewport centered wrapper */
7030
+ /* Body card: alto mínimo estable para que NO salte entre estados de distinta altura
7031
+ (loader/progress ↔ formulario). Solo la body card = hijo directo de `.kds-screen`
7032
+ (los headers van dentro de `.kds-invoice-sticky-wrap`, no la afecta).
7033
+ Flex-column para que el contenido quede arriba y el footer interno (versión / secure
7034
+ footer) pueda pinearse al fondo con `margin-top: auto` aunque el contenido sea corto. */
7035
+ .kds-screen > .kds-card-elevated {
7036
+ min-height: 36rem;
7037
+ display: flex;
7038
+ flex-direction: column;
7039
+ /* mismo radio que el header (invoice-sticky usa radius-card); el base card-elevated
7040
+ es radius-md (8px) y quedaba distinto al header en desktop. */
7041
+ border-radius: var(--kds-radius-card);
7042
+ }
7043
+
7044
+ /* Variante sin radio superior: pantallas de resultado (éxito/fallo/timeout) que van
7045
+ SIN header arriba — la body card va sola y su tope queda plano (flush) en vez de
7046
+ con esquinas redondeadas sueltas. El padding del card sigue manejando el inset. */
7047
+ .kds-screen > .kds-card-elevated.kds-card-elevated--flush-top,
7048
+ .kds-card-elevated.kds-card-elevated--flush-top {
7049
+ border-top-left-radius: 0;
7050
+ border-top-right-radius: 0;
7051
+ }
7052
+
7053
+ /* Payment stage — full-viewport centered wrapper.
7054
+ Fondo muted (gris) para que las cards blancas (header + body) y el gap entre
7055
+ ellas se distingan; sin esto, card blanca sobre fondo blanco se funden. */
6178
7056
  .kds-payment-stage {
6179
7057
  min-height: 100vh;
6180
7058
  display: flex;
6181
7059
  justify-content: center;
6182
7060
  padding: var(--kds-spacing-2-5) var(--kds-spacing-2) var(--kds-spacing-8);
7061
+ background: var(--kds-color-background-muted);
6183
7062
  }
6184
7063
 
6185
7064
  /* Payment flow — narrow column */
@@ -6218,10 +7097,16 @@ button.kds-btn-success::after {
6218
7097
  padding-bottom: var(--kds-spacing-2);
6219
7098
  }
6220
7099
 
6221
- /* Invoice sticky card: progressive padding-top (expanded 20px → collapsed 8px).
6222
- Overrides base rule at same specificity; source order wins here. */
7100
+ /* Invoice sticky card padding (mobile).
7101
+ Top: estático 12px. Bottom: progresivo 16px (expandido, = desktop) → 8px (colapsado).
7102
+ El padding-bottom animado se reduce al colapsar — sin depender de que el clip-path
7103
+ corte el padding abruptamente. */
6223
7104
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6224
7105
  padding-top: var(--kds-spacing-1-5);
7106
+ padding-bottom: calc(
7107
+ var(--kds-spacing-2)
7108
+ - var(--kds-spacing-1) * var(--collapse-progress, 0)
7109
+ );
6225
7110
  }
6226
7111
 
6227
7112
 
@@ -6480,7 +7365,7 @@ button.kds-btn-success::after {
6480
7365
  inset: 0;
6481
7366
  background: var(--kds-modal-backdrop);
6482
7367
  display: none;
6483
- align-items: center;
7368
+ align-items: flex-start;
6484
7369
  justify-content: center;
6485
7370
  z-index: var(--kds-z-index-modal, 50);
6486
7371
  animation: kds-fade 0.2s ease both;
@@ -6508,7 +7393,7 @@ button.kds-btn-success::after {
6508
7393
  display: flex;
6509
7394
  align-items: center;
6510
7395
  justify-content: space-between;
6511
- padding: var(--kds-spacing-2) var(--kds-spacing-2) var(--kds-spacing-1);
7396
+ padding: var(--kds-spacing-1) var(--kds-spacing-2) var(--kds-spacing-1);
6512
7397
  }
6513
7398
 
6514
7399
  .kds-bank-modal-header h3 {
@@ -6533,11 +7418,8 @@ button.kds-btn-success::after {
6533
7418
  display: none;
6534
7419
  }
6535
7420
 
6536
- .kds-bank-modal-search {
6537
- padding: 0 var(--kds-spacing-2) var(--kds-spacing-1-5);
6538
- }
6539
-
6540
- .kds-bank-modal-search input {
7421
+ /* Search field reutilizable (standalone o dentro del KdsBankModal). */
7422
+ .kds-search-field {
6541
7423
  width: 100%;
6542
7424
  padding: var(--kds-spacing-1-25) var(--kds-spacing-1-5);
6543
7425
  border: 1px solid var(--kds-color-divider);
@@ -6549,15 +7431,57 @@ button.kds-btn-success::after {
6549
7431
  background: var(--kds-color-surface);
6550
7432
  }
6551
7433
 
6552
- .kds-bank-modal-search input::placeholder {
7434
+ .kds-search-field::placeholder {
6553
7435
  color: var(--kds-color-text-hint);
6554
7436
  }
6555
7437
 
6556
- .kds-bank-modal-search input:focus {
7438
+ .kds-search-field:focus {
6557
7439
  border-color: var(--kds-color-primary-main);
6558
7440
  box-shadow: 0 0 0 2px var(--kds-color-primary-faint);
6559
7441
  }
6560
7442
 
7443
+ /* Variante con ícono (withIcon): lupa posicionada DENTRO del input, a la derecha. */
7444
+ .kds-search-field-wrapper {
7445
+ position: relative;
7446
+ width: 100%;
7447
+ }
7448
+
7449
+ .kds-search-field-icon {
7450
+ position: absolute;
7451
+ right: var(--kds-spacing-1-5);
7452
+ top: 50%;
7453
+ transform: translateY(-50%);
7454
+ font-size: 20px;
7455
+ color: var(--kds-color-text-hint);
7456
+ pointer-events: none;
7457
+ }
7458
+
7459
+ /* Espacio a la derecha del texto para no solaparse con la lupa. */
7460
+ .kds-search-field-wrapper .kds-search-field {
7461
+ padding-right: calc(var(--kds-spacing-1-5) + var(--kds-spacing-3));
7462
+ }
7463
+
7464
+ /* Variante angosta del field (prop `narrow` de KdsTextField): ancho reducido y texto
7465
+ centrado, para inputs de pocos caracteres dispuestos en fila (ej. segmentos de
7466
+ coordenadas o código). No crece ni se encoge dentro de un flex row. */
7467
+ .field.kds-field--narrow {
7468
+ width: 6rem;
7469
+ flex: 0 0 auto;
7470
+ /* En fila horizontal no aplica el margin vertical que BeerCSS da a fields
7471
+ hermanos (regla de "flow" `... + :is(.field,...)`, specificity ~0,3,1);
7472
+ sin el reset los siguientes quedan desalineados hacia abajo. `!important`
7473
+ para ganarle a esa regla de framework. */
7474
+ margin-block: 0 !important;
7475
+ }
7476
+
7477
+ .field.kds-field--narrow > input {
7478
+ text-align: center;
7479
+ }
7480
+
7481
+ .kds-bank-modal-search {
7482
+ padding: 0 var(--kds-spacing-2) var(--kds-spacing-1-5);
7483
+ }
7484
+
6561
7485
  .kds-bank-modal-body {
6562
7486
  flex: 1;
6563
7487
  overflow-y: auto;
@@ -6655,7 +7579,7 @@ button.kds-btn-success::after {
6655
7579
  min-width: 0;
6656
7580
  }
6657
7581
 
6658
- .kds-qr-text .title {
7582
+ .kds-qr-text .kds-qr-title {
6659
7583
  font-family: var(--kds-font-family-primary);
6660
7584
  font-weight: 600;
6661
7585
  font-size: var(--kds-font-size-sm);
@@ -6663,10 +7587,15 @@ button.kds-btn-success::after {
6663
7587
  color: var(--kds-color-text-primary);
6664
7588
  }
6665
7589
 
6666
- .kds-qr-text .sub {
7590
+ .kds-qr-text .kds-qr-subtitle {
6667
7591
  font-family: var(--kds-font-family-primary);
6668
7592
  font-size: var(--kds-font-size-caption);
6669
7593
  color: var(--kds-color-text-secondary);
7594
+ /* Trunca con ellipsis en lugar de wrap a 2 líneas — evita apretar el row
7595
+ cuando el contenedor es angosto (mobile o decorator constrained). */
7596
+ overflow: hidden;
7597
+ text-overflow: ellipsis;
7598
+ white-space: nowrap;
6670
7599
  }
6671
7600
 
6672
7601
  /* QR Badge - "Rápido" indicator */
@@ -6689,46 +7618,26 @@ button.kds-btn-success::after {
6689
7618
  font-size: 20px;
6690
7619
  }
6691
7620
 
6692
- /* Mobile responsive: Ajustes para pantallas pequeñas */
7621
+ /* Mobile responsive (≤480px): respira más mantenemos padding/gap/avatar igual
7622
+ que desktop y solo agregamos truncation al subtitle y `flex-shrink: 0` en los
7623
+ ítems que deben mantener su tamaño (avatar, badge, chevron). */
6693
7624
  @media (max-width: 480px) {
6694
- .kds-qr-row {
6695
- gap: var(--kds-spacing-1-5);
6696
- padding: var(--kds-spacing-1-5);
6697
- }
6698
-
6699
7625
  .kds-qr-avatar {
6700
- width: var(--kds-spacing-4-5);
6701
- height: var(--kds-spacing-4-5);
6702
7626
  flex-shrink: 0;
6703
7627
  }
6704
7628
 
6705
- .kds-qr-avatar .material-symbols-outlined,
6706
- .kds-qr-avatar .material-icons-round {
6707
- font-size: var(--kds-font-size-lg);
6708
- }
6709
-
6710
- .kds-qr-text .title {
6711
- font-size: var(--kds-font-size-xs);
6712
- line-height: var(--kds-line-height-tight);
6713
- }
6714
-
6715
7629
  .kds-qr-text .sub {
6716
- font-size: var(--kds-font-size-caption);
6717
- line-height: var(--kds-line-height-tight);
6718
7630
  overflow: hidden;
6719
7631
  text-overflow: ellipsis;
6720
7632
  white-space: nowrap;
6721
7633
  }
6722
7634
 
6723
7635
  .kds-qr-badge {
6724
- font-size: var(--kds-font-size-caption);
6725
- padding: var(--kds-spacing-0-25) var(--kds-spacing-0-75);
6726
7636
  flex-shrink: 0;
6727
7637
  }
6728
7638
 
6729
7639
  .kds-qr-row .material-symbols-outlined:last-child,
6730
7640
  .kds-qr-row .material-icons-round:last-child {
6731
- font-size: var(--kds-font-size-base);
6732
7641
  flex-shrink: 0;
6733
7642
  }
6734
7643
  }
@@ -6757,7 +7666,11 @@ button.kds-btn-success::after {
6757
7666
  border-radius: var(--kds-spacing-0-75);
6758
7667
  font-size: var(--kds-font-size-sm);
6759
7668
  cursor: pointer;
6760
- transition: background 0.12s ease;
7669
+ /* Transición más amplia y suave: bg + color + border ease-out */
7670
+ transition:
7671
+ background-color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7672
+ color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7673
+ border-top-color 280ms ease-out;
6761
7674
  position: relative;
6762
7675
  user-select: none;
6763
7676
  }
@@ -6766,19 +7679,21 @@ button.kds-btn-success::after {
6766
7679
  border-top: 0;
6767
7680
  }
6768
7681
 
6769
- .kds-copyable-table-row:hover {
7682
+ /* Hover NO aplica mientras la row esté en `.copied` o `.settling`
7683
+ (evita el flicker del hover state al desaparecer el verde de "copiado") */
7684
+ .kds-copyable-table-row:not(.copied):not(.settling):hover {
6770
7685
  background: var(--kds-color-primary-faint);
6771
7686
  }
6772
7687
 
6773
- .kds-copyable-table-row:hover + .kds-copyable-table-row {
7688
+ .kds-copyable-table-row:not(.copied):not(.settling):hover + .kds-copyable-table-row {
6774
7689
  border-top-color: transparent;
6775
7690
  }
6776
7691
 
6777
- .kds-copyable-table-row:active {
7692
+ .kds-copyable-table-row:not(.copied):not(.settling):active {
6778
7693
  background: var(--kds-color-primary-selected);
6779
7694
  }
6780
7695
 
6781
- .kds-copyable-table-row .k {
7696
+ .kds-copyable-table-row .kds-key {
6782
7697
  color: var(--kds-color-text-secondary);
6783
7698
  font-size: var(--kds-font-size-caption);
6784
7699
  letter-spacing: 0.3px;
@@ -6787,7 +7702,7 @@ button.kds-btn-success::after {
6787
7702
  flex: 0 0 auto;
6788
7703
  }
6789
7704
 
6790
- .kds-copyable-table-row .v {
7705
+ .kds-copyable-table-row .kds-value {
6791
7706
  color: var(--kds-color-text-primary);
6792
7707
  font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace;
6793
7708
  font-weight: var(--kds-font-weight-medium);
@@ -6803,17 +7718,18 @@ button.kds-btn-success::after {
6803
7718
  flex: 1 1 auto;
6804
7719
  }
6805
7720
 
6806
- .kds-copyable-table-row .v::after {
7721
+ .kds-copyable-table-row .kds-value::after {
6807
7722
  content: 'content_copy';
6808
7723
  font-family: 'Material Symbols Outlined';
6809
7724
  font-size: var(--kds-font-size-sm);
6810
7725
  color: var(--kds-color-primary-main);
6811
7726
  opacity: 0;
6812
- transition: opacity 0.12s ease;
7727
+ /* Transición coordinada con la row */
7728
+ transition: opacity 280ms cubic-bezier(0.2, 0.8, 0.2, 1);
6813
7729
  flex: 0 0 auto;
6814
7730
  }
6815
7731
 
6816
- .kds-copyable-table-row:hover .v::after {
7732
+ .kds-copyable-table-row:not(.copied):not(.settling):hover .kds-value::after {
6817
7733
  opacity: 0.7;
6818
7734
  }
6819
7735
 
@@ -6821,22 +7737,76 @@ button.kds-btn-success::after {
6821
7737
  background: var(--kds-color-success-soft);
6822
7738
  }
6823
7739
 
6824
- .kds-copyable-table-row.copied .v {
7740
+ .kds-copyable-table-row.copied .kds-value {
6825
7741
  color: var(--kds-color-success-dark);
6826
7742
  }
6827
7743
 
6828
- .kds-copyable-table-row.copied .v::after {
7744
+ .kds-copyable-table-row.copied .kds-value::after {
6829
7745
  content: 'check';
6830
7746
  font-family: 'Material Symbols Outlined';
6831
7747
  color: var(--kds-color-success-dark);
6832
7748
  opacity: 1;
6833
7749
  }
6834
7750
 
7751
+ /* `.settling`: estado de "recién copiado" — la row vuelve al normal sin
7752
+ activar hover. Dura lo mismo que la transición (~300ms) y se aplica
7753
+ desde React tras quitar `.copied`. */
7754
+ .kds-copyable-table-row.settling .kds-value::after {
7755
+ /* Mantén el check con opacity 0 mientras settling, fade out suave */
7756
+ opacity: 0;
7757
+ }
7758
+
6835
7759
  /* Disable BeerCSS ripple on copyable table rows */
6836
7760
  .kds-copyable-table-row::after {
6837
7761
  display: none;
6838
7762
  }
6839
7763
 
7764
+ /* ========================================
7765
+ GRID VARIANT (.kds-copyable-table--grid)
7766
+ Read-only grid of N text cells per row. No copy,
7767
+ no role=button, no "copy all". Cells share the row
7768
+ width equally. Used inside radio options, etc.
7769
+ ======================================== */
7770
+
7771
+ /* La grilla es solo columnas de texto (como el DataTable original): sin caja,
7772
+ borde, fondo ni sombra del contenedor copyable. */
7773
+ .kds-copyable-table--grid {
7774
+ border: 0;
7775
+ border-radius: 0;
7776
+ background: none;
7777
+ padding: 0;
7778
+ box-shadow: none;
7779
+ }
7780
+
7781
+ .kds-copyable-table-row--grid {
7782
+ display: flex;
7783
+ align-items: center;
7784
+ gap: var(--kds-spacing-1-5);
7785
+ padding: 0;
7786
+ /* Sin el divisor border-top que trae la fila base del copyable. */
7787
+ border-top: 0;
7788
+ cursor: default;
7789
+ user-select: text;
7790
+ }
7791
+
7792
+ /* Separación entre filas de la grilla (sin divisores). */
7793
+ .kds-copyable-table-row--grid + .kds-copyable-table-row--grid {
7794
+ margin-top: var(--kds-spacing-0-5);
7795
+ }
7796
+
7797
+ .kds-grid-cell {
7798
+ flex: 1 1 0;
7799
+ min-width: 0;
7800
+ font-size: var(--kds-font-size-sm);
7801
+ font-weight: var(--kds-font-weight-medium);
7802
+ color: var(--kds-color-text-primary);
7803
+ word-break: break-word;
7804
+ }
7805
+
7806
+ .kds-grid-cell--disabled {
7807
+ color: var(--kds-color-text-disabled);
7808
+ }
7809
+
6840
7810
  /* ========================================
6841
7811
  COPY-ALL BUTTON (.kds-copy-all-btn)
6842
7812
  Modifier for kds-btn kds-btn-outlined that adds
@@ -6894,6 +7864,14 @@ a.kds-copy-all-btn.copied:hover {
6894
7864
  min-height: unset;
6895
7865
  }
6896
7866
 
7867
+ /* Severity variants — default stays warning (backward-compatible) */
7868
+ .kds-section-note.kds-info { color: var(--kds-color-info-dark); }
7869
+ .kds-section-note.kds-info > i { color: var(--kds-color-info-dark); }
7870
+ .kds-section-note.kds-success { color: var(--kds-color-success-dark); }
7871
+ .kds-section-note.kds-success > i { color: var(--kds-color-success-dark); }
7872
+ .kds-section-note.kds-error { color: var(--kds-color-error-dark); }
7873
+ .kds-section-note.kds-error > i { color: var(--kds-color-error-dark); }
7874
+
6897
7875
  /* ========================================
6898
7876
  INFO TOOLTIP (.kds-info-tip)
6899
7877
  Inline info button with hover/click tooltip bubble.
@@ -6989,7 +7967,7 @@ a.kds-copy-all-btn.copied:hover {
6989
7967
  .kds-monto-row {
6990
7968
  display: flex;
6991
7969
  justify-content: space-between;
6992
- align-items: flex-end;
7970
+ align-items: flex-start;
6993
7971
  padding: var(--kds-spacing-1-75) 0 var(--kds-spacing-1);
6994
7972
  border-top: 1px dashed var(--kds-color-divider);
6995
7973
  margin-top: var(--kds-spacing-1-75);
@@ -7013,3 +7991,191 @@ a.kds-copy-all-btn.copied:hover {
7013
7991
  color: var(--kds-color-text-primary);
7014
7992
  }
7015
7993
 
7994
+ /* ========================================
7995
+ PAYMENT TOTAL (.kds-payment-total)
7996
+ Bloque "monto a pagar" para QR view y email templates.
7997
+ Portado desde paylink-ligopay → <kh:paymentTotal> + materialize-config.css.
7998
+ Variantes:
7999
+ - default: amount grande (3rem) en color primario Khipu.
8000
+ - email: amount compacto (1.5rem) en color texto primario.
8001
+ Responsive (default): mobile (≤ 1024px) centra y oculta titleMobile.
8002
+ ======================================== */
8003
+
8004
+ .kds-payment-total {
8005
+ /* Component-scoped tokens — overrideables sin tocar el CSS global. */
8006
+ --kds-payment-total-title-size: var(--kds-font-size-2xl); /* 24px */
8007
+ --kds-payment-total-label-size: var(--kds-font-size-xl); /* 20px */
8008
+ --kds-payment-amount-size: 3rem; /* 48px — destacado */
8009
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
8010
+ --kds-payment-amount-color: var(--kds-color-primary-main);
8011
+ --kds-payment-amount-weight: var(--kds-font-weight-medium);
8012
+
8013
+ text-align: left;
8014
+ }
8015
+
8016
+ .kds-payment-total-title,
8017
+ .kds-payment-total-title-mobile {
8018
+ font-size: var(--kds-payment-total-title-size);
8019
+ font-weight: var(--kds-font-weight-semibold);
8020
+ color: var(--kds-color-text-primary);
8021
+ margin-bottom: var(--kds-spacing-4);
8022
+ }
8023
+
8024
+ .kds-payment-total-title-mobile {
8025
+ display: none;
8026
+ }
8027
+
8028
+ .kds-payment-total .kds-payment-label {
8029
+ font-size: var(--kds-payment-total-label-size);
8030
+ font-weight: var(--kds-font-weight-semibold);
8031
+ color: var(--kds-color-text-primary);
8032
+ margin-bottom: var(--kds-spacing-1);
8033
+ padding-top: 0;
8034
+ }
8035
+
8036
+ .kds-payment-total .kds-payment-amount {
8037
+ font-size: var(--kds-payment-amount-size);
8038
+ font-weight: var(--kds-payment-amount-weight);
8039
+ line-height: var(--kds-payment-amount-line-height);
8040
+ color: var(--kds-payment-amount-color);
8041
+ margin-bottom: var(--kds-spacing-4);
8042
+ }
8043
+
8044
+ .kds-payment-total .kds-payment-amount .kds-payment-total-decimal-sup,
8045
+ .kds-invoice-amount .kds-payment-total-decimal-sup {
8046
+ font-size: var(--kds-font-size-decimal-sup);
8047
+ font-weight: var(--kds-font-weight-semibold);
8048
+ position: relative;
8049
+ top: 0;
8050
+ }
8051
+
8052
+ /* Variante email: amount compacto en color texto primario, alineación izquierda fija */
8053
+ .kds-payment-total--email {
8054
+ --kds-payment-amount-size: var(--kds-font-size-2xl); /* 24px */
8055
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
8056
+ --kds-payment-amount-color: var(--kds-color-text-primary);
8057
+ --kds-payment-amount-weight: var(--kds-font-weight-semibold);
8058
+ }
8059
+
8060
+ /* Tone modifier: swaps the amount color to the khipu-blue / LigoPay info blue.
8061
+ Combinable with --email or with the default variant. */
8062
+ .kds-payment-total--tone-info {
8063
+ --kds-payment-amount-color: var(--kds-color-info-blue); /* #5A5FE0 */
8064
+ }
8065
+
8066
+ /* Centered modifier: removes the asymmetric desktop padding (which exists for
8067
+ LigoPay QR view) and centers all internal text. Composable with --email and
8068
+ --tone-info. */
8069
+ .kds-payment-total--centered {
8070
+ padding-left: 0;
8071
+ padding-top: 0;
8072
+ text-align: center;
8073
+ }
8074
+ .kds-payment-total--centered .kds-payment-total-title,
8075
+ .kds-payment-total--centered .kds-payment-total-title-mobile,
8076
+ .kds-payment-total--centered .kds-payment-label,
8077
+ .kds-payment-total--centered .kds-payment-amount {
8078
+ text-align: center;
8079
+ }
8080
+
8081
+ /* Responsive: mobile ≤ 1024px — centra y conmuta los títulos (sólo variante default) */
8082
+ @media (max-width: 1024px) {
8083
+ .kds-payment-total {
8084
+ text-align: center;
8085
+ }
8086
+
8087
+ .kds-payment-total .kds-payment-total-title {
8088
+ display: none;
8089
+ }
8090
+
8091
+ .kds-payment-total .kds-payment-total-title-mobile {
8092
+ display: block;
8093
+ text-align: center;
8094
+ }
8095
+
8096
+ .kds-payment-total .kds-payment-label,
8097
+ .kds-payment-total .kds-payment-amount {
8098
+ text-align: center;
8099
+ }
8100
+
8101
+ /* Email mantiene alineación izquierda incluso en mobile (matchea email clients) */
8102
+ .kds-payment-total--email,
8103
+ .kds-payment-total--email .kds-payment-label,
8104
+ .kds-payment-total--email .kds-payment-amount {
8105
+ text-align: left;
8106
+ }
8107
+ }
8108
+
8109
+ /* ==========================================================================
8110
+ GRID UTILITIES — semantic aliases for BeerCSS .grid / .s* / .m* / .l*
8111
+
8112
+ Estas utilidades son ALIAS de las clases cortas de BeerCSS para que
8113
+ consumers (payment, LigoPay, Grails legacy) puedan escribir markup con
8114
+ nombres descriptivos sin renunciar al grid de 12 columnas de BeerCSS.
8115
+
8116
+ Convención (estilo Bootstrap responsive):
8117
+ - kds-grid → .grid (12-col CSS grid + 1rem gap)
8118
+ - kds-col-sm-{1..12} → .s{1..12} (mobile, siempre aplica)
8119
+ - kds-col-md-{1..12} → .m{1..12} (>=601px)
8120
+ - kds-col-lg-{1..12} → .l{1..12} (>=993px)
8121
+
8122
+ Las definiciones originales de BeerCSS NO se tocan; estas son aditivas.
8123
+ ========================================================================== */
8124
+
8125
+ .kds-grid {
8126
+ --_gap: 1rem;
8127
+ display: grid;
8128
+ grid-template-columns: repeat(12, 1fr);
8129
+ gap: var(--_gap);
8130
+ block-size: auto;
8131
+ }
8132
+
8133
+ .kds-grid.kds-grid-no-space { --_gap: 0rem; }
8134
+ .kds-grid.kds-grid-medium-space { --_gap: 1.5rem; }
8135
+ .kds-grid.kds-grid-large-space { --_gap: 2rem; }
8136
+
8137
+ .kds-grid > * { margin: 0; }
8138
+
8139
+ .kds-col-sm-1 { grid-area: auto/span 1; }
8140
+ .kds-col-sm-2 { grid-area: auto/span 2; }
8141
+ .kds-col-sm-3 { grid-area: auto/span 3; }
8142
+ .kds-col-sm-4 { grid-area: auto/span 4; }
8143
+ .kds-col-sm-5 { grid-area: auto/span 5; }
8144
+ .kds-col-sm-6 { grid-area: auto/span 6; }
8145
+ .kds-col-sm-7 { grid-area: auto/span 7; }
8146
+ .kds-col-sm-8 { grid-area: auto/span 8; }
8147
+ .kds-col-sm-9 { grid-area: auto/span 9; }
8148
+ .kds-col-sm-10 { grid-area: auto/span 10; }
8149
+ .kds-col-sm-11 { grid-area: auto/span 11; }
8150
+ .kds-col-sm-12 { grid-area: auto/span 12; }
8151
+
8152
+ @media only screen and (min-width: 601px) {
8153
+ .kds-col-md-1 { grid-area: auto/span 1; }
8154
+ .kds-col-md-2 { grid-area: auto/span 2; }
8155
+ .kds-col-md-3 { grid-area: auto/span 3; }
8156
+ .kds-col-md-4 { grid-area: auto/span 4; }
8157
+ .kds-col-md-5 { grid-area: auto/span 5; }
8158
+ .kds-col-md-6 { grid-area: auto/span 6; }
8159
+ .kds-col-md-7 { grid-area: auto/span 7; }
8160
+ .kds-col-md-8 { grid-area: auto/span 8; }
8161
+ .kds-col-md-9 { grid-area: auto/span 9; }
8162
+ .kds-col-md-10 { grid-area: auto/span 10; }
8163
+ .kds-col-md-11 { grid-area: auto/span 11; }
8164
+ .kds-col-md-12 { grid-area: auto/span 12; }
8165
+ }
8166
+
8167
+ @media only screen and (min-width: 993px) {
8168
+ .kds-col-lg-1 { grid-area: auto/span 1; }
8169
+ .kds-col-lg-2 { grid-area: auto/span 2; }
8170
+ .kds-col-lg-3 { grid-area: auto/span 3; }
8171
+ .kds-col-lg-4 { grid-area: auto/span 4; }
8172
+ .kds-col-lg-5 { grid-area: auto/span 5; }
8173
+ .kds-col-lg-6 { grid-area: auto/span 6; }
8174
+ .kds-col-lg-7 { grid-area: auto/span 7; }
8175
+ .kds-col-lg-8 { grid-area: auto/span 8; }
8176
+ .kds-col-lg-9 { grid-area: auto/span 9; }
8177
+ .kds-col-lg-10 { grid-area: auto/span 10; }
8178
+ .kds-col-lg-11 { grid-area: auto/span 11; }
8179
+ .kds-col-lg-12 { grid-area: auto/span 12; }
8180
+ }
8181
+