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

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:44:56.587Z
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
  ======================================== */
@@ -2133,6 +2418,16 @@ footer.primary a:hover {
2133
2418
  margin-right: var(--kds-spacing-2);
2134
2419
  }
2135
2420
 
2421
+ /* Ícono(s) en color primary. Para íconos MUI/SVG dentro del scope que, por el reset
2422
+ `.kds-theme-root svg { fill: currentColor }`, terminan heredando el color de texto
2423
+ (#333) en vez de su color propio — el `color="primary"` de MUI no le gana al contexto.
2424
+ Aplica al contenedor y a sus i/svg hijos. */
2425
+ .kds-icon-primary,
2426
+ .kds-icon-primary i,
2427
+ .kds-icon-primary svg {
2428
+ color: var(--kds-color-primary-main);
2429
+ }
2430
+
2136
2431
  /* Section title icon */
2137
2432
  .kds-stage-section-title i {
2138
2433
  vertical-align: middle;
@@ -2164,6 +2459,25 @@ body.dark {
2164
2459
  transition: border-color 0.2s, box-shadow 0.2s, outline-color 0.2s;
2165
2460
  }
2166
2461
 
2462
+ /* === TEXTAREA FIX === */
2463
+ /* BeerCSS base sets minimal block padding; add breathing room for textarea */
2464
+ .field > textarea {
2465
+ padding-block: 0.75rem;
2466
+ resize: vertical;
2467
+ }
2468
+
2469
+ .field.label > textarea {
2470
+ padding-block-start: 1.5rem;
2471
+ }
2472
+
2473
+ /* Field con .suffix (endIcon): el label en reposo no debe deslizarse bajo el ícono de la
2474
+ derecha. BeerCSS reserva el lado izquierdo para .prefix (--_start:3rem) pero NO el derecho
2475
+ para .suffix, así que un label largo se superponía con el ícono. Reservamos el ancho del
2476
+ ícono en el inset-inline-end (mismo valor que el padding que .prefix da al input). */
2477
+ .field.label.suffix > label {
2478
+ inset-inline-end: 2.9375rem;
2479
+ }
2480
+
2167
2481
  /* ==========================================
2168
2482
  NOTCH VISIBILITY (opacity)
2169
2483
  ========================================== */
@@ -2285,6 +2599,23 @@ body.dark {
2285
2599
  color: var(--error); /* Rojo error */
2286
2600
  }
2287
2601
 
2602
+ /* ==========================================
2603
+ PASSWORD REVEAL TOGGLE (KdsTextField `revealable`)
2604
+ El <a role="button"> reusa el posicionamiento de icono de BeerCSS
2605
+ (.field > a, pointer-events: all). Aquí solo: color del icono
2606
+ (on-surface-variant) y un focus ring accesible para el toggle
2607
+ navegable por teclado (BeerCSS hace `outline: inherit` en <a>).
2608
+ ========================================== */
2609
+ .field > a.kds-field-reveal {
2610
+ color: var(--on-surface-variant);
2611
+ }
2612
+
2613
+ .field > a.kds-field-reveal:focus-visible {
2614
+ outline: 2px solid var(--primary);
2615
+ outline-offset: 2px;
2616
+ border-radius: 50%;
2617
+ }
2618
+
2288
2619
  /* ==========================================
2289
2620
  LABEL COLOR
2290
2621
  Mantener sincronizado con border
@@ -2392,6 +2723,71 @@ body.dark {
2392
2723
  display: inline-flex;
2393
2724
  }
2394
2725
 
2726
+ /* ========================================
2727
+ Radix Tooltip (.kds-tooltip)
2728
+ Espejo de `.tooltip` pero para popovers de Radix:
2729
+ bg oscuro, texto blanco, sombra + animación fade/slide direccional.
2730
+ ======================================== */
2731
+
2732
+ .kds-tooltip {
2733
+ background-color: var(--kds-color-text-primary);
2734
+ color: var(--kds-color-background-paper);
2735
+ font-family: var(--kds-font-family-primary);
2736
+ font-size: var(--kds-font-size-xs);
2737
+ font-weight: var(--kds-font-weight-medium);
2738
+ line-height: var(--kds-line-height-normal);
2739
+ border-radius: var(--kds-radius-sm);
2740
+ padding: var(--kds-spacing-0-75) var(--kds-spacing-1-5);
2741
+ box-shadow: var(--kds-shadow-4);
2742
+ max-width: 280px;
2743
+ z-index: var(--kds-z-index-tooltip, 1500);
2744
+ user-select: none;
2745
+ /* Animación direccional según Radix data-side — coordinada con copy-row
2746
+ (cubic-bezier 0.2, 0.8, 0.2, 1) para un feel consistente del DS. */
2747
+ animation-duration: 240ms;
2748
+ animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
2749
+ will-change: transform, opacity;
2750
+ }
2751
+
2752
+ .kds-tooltip[data-state='closed'] {
2753
+ animation-duration: 140ms;
2754
+ animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);
2755
+ }
2756
+
2757
+ /* Direccional según data-side (Radix añade el attr en runtime).
2758
+ Cada lado entra desde su dirección con ~8px de offset (más visible que 4px). */
2759
+ .kds-tooltip[data-side='top'][data-state='delayed-open'],
2760
+ .kds-tooltip[data-side='top'][data-state='instant-open'] { animation-name: kds-tooltip-in-top; }
2761
+ .kds-tooltip[data-side='bottom'][data-state='delayed-open'],
2762
+ .kds-tooltip[data-side='bottom'][data-state='instant-open'] { animation-name: kds-tooltip-in-bottom; }
2763
+ .kds-tooltip[data-side='left'][data-state='delayed-open'],
2764
+ .kds-tooltip[data-side='left'][data-state='instant-open'] { animation-name: kds-tooltip-in-left; }
2765
+ .kds-tooltip[data-side='right'][data-state='delayed-open'],
2766
+ .kds-tooltip[data-side='right'][data-state='instant-open'] { animation-name: kds-tooltip-in-right; }
2767
+
2768
+ /* Fallback cuando no hay data-side resuelto aún */
2769
+ .kds-tooltip[data-state='delayed-open']:not([data-side]),
2770
+ .kds-tooltip[data-state='instant-open']:not([data-side]) {
2771
+ animation-name: kds-tooltip-in-top;
2772
+ }
2773
+
2774
+ .kds-tooltip[data-state='closed'] { animation-name: kds-tooltip-out; }
2775
+
2776
+ @keyframes kds-tooltip-in-top { from { opacity: 0; transform: translateY(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2777
+ @keyframes kds-tooltip-in-bottom { from { opacity: 0; transform: translateY(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2778
+ @keyframes kds-tooltip-in-left { from { opacity: 0; transform: translateX(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2779
+ @keyframes kds-tooltip-in-right { from { opacity: 0; transform: translateX(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2780
+
2781
+ @keyframes kds-tooltip-out {
2782
+ from { opacity: 1; transform: none; }
2783
+ to { opacity: 0; transform: scale(0.96); }
2784
+ }
2785
+
2786
+ /* Arrow (SVG path generado por Radix) */
2787
+ .kds-tooltip-arrow {
2788
+ fill: var(--kds-color-text-primary);
2789
+ }
2790
+
2395
2791
  /* ========================================
2396
2792
  Material Symbols Icon Sizing
2397
2793
  ======================================== */
@@ -2426,6 +2822,16 @@ body.dark {
2426
2822
  width: 100%;
2427
2823
  }
2428
2824
 
2825
+ /* Truncado en una línea con ellipsis. Incluye min-width:0 para que funcione
2826
+ dentro de contenedores flex/grid (el ítem puede encogerse por debajo de su
2827
+ contenido). Útil para nombres/asuntos largos en headers y filas. */
2828
+ .kds-truncate {
2829
+ min-width: 0;
2830
+ overflow: hidden;
2831
+ text-overflow: ellipsis;
2832
+ white-space: nowrap;
2833
+ }
2834
+
2429
2835
  .kds-max-w-sm {
2430
2836
  max-width: 400px;
2431
2837
  }
@@ -2469,6 +2875,11 @@ body.dark {
2469
2875
  display: flex;
2470
2876
  flex-direction: column;
2471
2877
  gap: var(--kds-spacing-3);
2878
+ /* Reset del fieldset nativo: sin borde/padding/margin por defecto del navegador. */
2879
+ margin: 0;
2880
+ padding: 0;
2881
+ border: 0;
2882
+ min-inline-size: 0;
2472
2883
  }
2473
2884
 
2474
2885
  /* Checkbox Label - BeerCSS override */
@@ -2519,21 +2930,57 @@ label.radio:has(input:disabled) {
2519
2930
  }
2520
2931
 
2521
2932
  /* ========================================
2522
- ONBOARDING COMPONENTS
2523
- Multi-stage onboarding flow with form validation
2933
+ RADIO GROUP — variante card (.kds-radio-group--card)
2934
+ Cada opción como fila con borde (estilo selección de banco/cuenta),
2935
+ manteniendo el control radio. Hover + opción seleccionada resaltada.
2524
2936
  ======================================== */
2525
-
2526
- /* Stage Layout - Individual stage wrapper */
2527
- .kds-stage {
2528
- max-width: var(--kds-onboarding-max-width);
2529
- margin: 0 auto;
2530
- width: 100%;
2937
+ .kds-radio-group--card {
2938
+ gap: var(--kds-spacing-2);
2531
2939
  }
2532
2940
 
2533
- /* Stage Header - Title and subtitle */
2534
- .kds-stage-header {
2535
- display: flex;
2536
- flex-direction: column;
2941
+ .kds-radio-group--card label.radio {
2942
+ gap: var(--kds-spacing-1-5);
2943
+ /* Vertical con un poco más de aire; horizontal reducido para pegar el radio a la izquierda. */
2944
+ padding: var(--kds-spacing-2) var(--kds-spacing-1-5);
2945
+ /* Bordes con los valores del bank selector. */
2946
+ border: 1px solid var(--kds-color-border-subtle);
2947
+ border-radius: var(--kds-radius-card);
2948
+ background: var(--kds-color-surface);
2949
+ transition: border-color 0.2s, background 0.2s;
2950
+ }
2951
+
2952
+ /* Leve separación extra entre el radio y el texto de la opción. */
2953
+ .kds-radio-group--card label.radio span {
2954
+ margin-left: var(--kds-spacing-0-5);
2955
+ }
2956
+
2957
+ .kds-radio-group--card label.radio:hover {
2958
+ border-color: var(--kds-color-border-default);
2959
+ }
2960
+
2961
+ /* Seleccionada: poco color primario — solo un fondo faint sutil + borde gris
2962
+ (el punto del radio ya comunica la selección). */
2963
+ .kds-radio-group--card label.radio:has(input:checked) {
2964
+ border-color: var(--kds-color-border-default);
2965
+ background: var(--kds-color-primary-faint);
2966
+ }
2967
+
2968
+ /* ========================================
2969
+ ONBOARDING COMPONENTS
2970
+ Multi-stage onboarding flow with form validation
2971
+ ======================================== */
2972
+
2973
+ /* Stage Layout - Individual stage wrapper */
2974
+ .kds-stage {
2975
+ max-width: var(--kds-onboarding-max-width);
2976
+ margin: 0 auto;
2977
+ width: 100%;
2978
+ }
2979
+
2980
+ /* Stage Header - Title and subtitle */
2981
+ .kds-stage-header {
2982
+ display: flex;
2983
+ flex-direction: column;
2537
2984
  align-items: flex-start;
2538
2985
  gap: var(--kds-spacing-1);
2539
2986
  margin-bottom: var(--kds-spacing-2);
@@ -3015,7 +3462,8 @@ footer > .kds-container-center {
3015
3462
  display: flex;
3016
3463
  align-items: center;
3017
3464
  gap: var(--kds-spacing-1);
3018
- padding: var(--kds-spacing-2);
3465
+ /* Padding compacto: vertical spacing-1 (8px), horizontal spacing-2 (16px). */
3466
+ padding: var(--kds-spacing-1) var(--kds-spacing-2);
3019
3467
  border-radius: var(--kds-radius-md);
3020
3468
  border: 1px solid;
3021
3469
  font-family: var(--kds-font-family-primary);
@@ -3025,7 +3473,7 @@ footer > .kds-container-center {
3025
3473
 
3026
3474
  @media (min-width: 768px) {
3027
3475
  .kds-alert {
3028
- padding: var(--kds-spacing-2);
3476
+ padding: var(--kds-spacing-1) var(--kds-spacing-2);
3029
3477
  flex: 1 1 auto;
3030
3478
  }
3031
3479
  }
@@ -3053,7 +3501,9 @@ footer > .kds-container-center {
3053
3501
  font-size: var(--kds-font-size-sm);
3054
3502
  font-weight: var(--kds-font-weight-semibold);
3055
3503
  line-height: var(--kds-line-height-normal);
3056
- margin-bottom: var(--kds-spacing-0-5);
3504
+ /* Solo margin-bottom: el padding del alert da el espaciado. Reset del resto para
3505
+ evitar el margin-block que BeerCSS aplica a <p> dentro del scope. */
3506
+ margin: 0 0 var(--kds-spacing-0-5);
3057
3507
  word-break: normal;
3058
3508
  overflow-wrap: break-word;
3059
3509
  }
@@ -3063,6 +3513,9 @@ footer > .kds-container-center {
3063
3513
  font-size: var(--kds-font-size-sm);
3064
3514
  font-weight: var(--kds-font-weight-regular);
3065
3515
  line-height: var(--kds-line-height-relaxed);
3516
+ /* Sin margen propio: el padding del alert es el único espaciado (evita el
3517
+ margin-block de <p> de BeerCSS dentro del scope). */
3518
+ margin: 0;
3066
3519
  word-break: normal;
3067
3520
  overflow-wrap: break-word;
3068
3521
  }
@@ -3108,6 +3561,32 @@ footer > .kds-container-center {
3108
3561
  color: var(--kds-color-error-dark);
3109
3562
  }
3110
3563
 
3564
+ /* Close button — icon-only, discreto, no usa kds-btn para no romper el flex layout del alert */
3565
+ .kds-alert-close {
3566
+ flex-shrink: 0;
3567
+ display: inline-flex;
3568
+ align-items: center;
3569
+ justify-content: center;
3570
+ width: 28px;
3571
+ height: 28px;
3572
+ padding: 0;
3573
+ background: transparent;
3574
+ border: 0;
3575
+ border-radius: 50%;
3576
+ color: inherit;
3577
+ cursor: pointer;
3578
+ transition: background-color 0.15s ease;
3579
+ }
3580
+
3581
+ .kds-alert-close:hover {
3582
+ background: rgba(0, 0, 0, 0.06);
3583
+ }
3584
+
3585
+ .kds-alert-close i {
3586
+ font-size: 18px;
3587
+ line-height: 1;
3588
+ }
3589
+
3111
3590
  /* Lists inside alerts */
3112
3591
  .kds-alert ul {
3113
3592
  padding-left: var(--kds-spacing-2);
@@ -4104,6 +4583,14 @@ dialog#surveyModal button.circle {
4104
4583
  text-align: center;
4105
4584
  }
4106
4585
 
4586
+ .kds-text-left {
4587
+ text-align: left;
4588
+ }
4589
+
4590
+ .kds-text-right {
4591
+ text-align: right;
4592
+ }
4593
+
4107
4594
  .kds-text-underline {
4108
4595
  text-decoration: underline;
4109
4596
  }
@@ -4120,6 +4607,54 @@ dialog#surveyModal button.circle {
4120
4607
  font-size: var(--kds-font-size-sm);
4121
4608
  }
4122
4609
 
4610
+ /* ── Font-size scale utilities (additive — opt-in companions to .kds-text-sm) ── */
4611
+ .kds-text-base {
4612
+ font-size: var(--kds-font-size-base);
4613
+ }
4614
+
4615
+ .kds-text-lg {
4616
+ font-size: var(--kds-font-size-lg);
4617
+ }
4618
+
4619
+ .kds-text-xl {
4620
+ font-size: var(--kds-font-size-xl);
4621
+ }
4622
+
4623
+ .kds-text-2xl {
4624
+ font-size: var(--kds-font-size-2xl);
4625
+ }
4626
+
4627
+ /* ── Font-weight utilities ── */
4628
+ .kds-fw-regular {
4629
+ font-weight: var(--kds-font-weight-regular);
4630
+ }
4631
+
4632
+ .kds-fw-medium {
4633
+ font-weight: var(--kds-font-weight-medium);
4634
+ }
4635
+
4636
+ .kds-fw-semibold {
4637
+ font-weight: var(--kds-font-weight-semibold);
4638
+ }
4639
+
4640
+ .kds-fw-bold {
4641
+ font-weight: var(--kds-font-weight-bold);
4642
+ }
4643
+
4644
+ /* ── Text-transform utilities ── */
4645
+ .kds-text-transform-none {
4646
+ text-transform: none;
4647
+ }
4648
+
4649
+ /* ── Soft background utilities (semantic muted backgrounds for callouts) ── */
4650
+ .kds-bg-warning-soft {
4651
+ background-color: var(--kds-color-warning-soft);
4652
+ }
4653
+
4654
+ .kds-bg-info-soft {
4655
+ background-color: var(--kds-color-info-soft);
4656
+ }
4657
+
4123
4658
  /* ── Typography variants ── */
4124
4659
  .kds-text-display1 {
4125
4660
  font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
@@ -4210,6 +4745,12 @@ dialog#surveyModal button.circle {
4210
4745
  color: var(--kds-color-primary-dark, #5B3179);
4211
4746
  }
4212
4747
 
4748
+ /* Inline emphasis: bold weight only, inherits size/color/family from context so it
4749
+ works as a highlighted fragment inside any other variant (body, heading, etc.). */
4750
+ .kds-text-strong {
4751
+ font-weight: var(--kds-font-weight-bold, 700);
4752
+ }
4753
+
4213
4754
  /* Display utilities */
4214
4755
  .kds-hidden {
4215
4756
  display: none;
@@ -4330,7 +4871,9 @@ dialog#surveyModal button.circle {
4330
4871
  ======================================== */
4331
4872
 
4332
4873
  .kds-badge {
4333
- display: inline-block;
4874
+ display: inline-flex;
4875
+ align-items: center;
4876
+ gap: 4px;
4334
4877
  padding: 2px 8px;
4335
4878
  border-radius: var(--kds-radius-sm);
4336
4879
  font-size: var(--kds-font-size-xs);
@@ -4338,6 +4881,40 @@ dialog#surveyModal button.circle {
4338
4881
  line-height: 1.5;
4339
4882
  }
4340
4883
 
4884
+ /* Icon prefix inside chip — small inline icon */
4885
+ .kds-badge > i.material-symbols-outlined {
4886
+ font-size: 14px;
4887
+ line-height: 1;
4888
+ }
4889
+
4890
+ /* Deletable chip close button — discreto, sin kds-btn (eso lo agrandaba ridículo) */
4891
+ .kds-badge-close {
4892
+ display: inline-flex;
4893
+ align-items: center;
4894
+ justify-content: center;
4895
+ width: 16px;
4896
+ height: 16px;
4897
+ margin-right: -2px;
4898
+ padding: 0;
4899
+ background: transparent;
4900
+ border: 0;
4901
+ border-radius: 50%;
4902
+ color: inherit;
4903
+ cursor: pointer;
4904
+ opacity: 0.7;
4905
+ transition: opacity 0.15s, background-color 0.15s;
4906
+ }
4907
+
4908
+ .kds-badge-close:hover {
4909
+ opacity: 1;
4910
+ background: rgba(0, 0, 0, 0.1);
4911
+ }
4912
+
4913
+ .kds-badge-close i {
4914
+ font-size: 14px;
4915
+ line-height: 1;
4916
+ }
4917
+
4341
4918
  .kds-badge.success {
4342
4919
  background-color: var(--kds-color-success-container);
4343
4920
  color: var(--kds-color-success-dark);
@@ -4549,21 +5126,46 @@ dialog#surveyModal button.circle {
4549
5126
  flex-shrink: 0;
4550
5127
  }
4551
5128
 
4552
- /* Merchant tile with logo variant */
5129
+ /* Merchant tile with logo variant — el logo (avatar del comercio) llena TODO el tile.
5130
+ `display: block` evita el desborde del auto-grid; `overflow: hidden` recorta la imagen
5131
+ a las esquinas redondeadas del tile. La imagen va CUADRADA (sin border-radius propio):
5132
+ solo el contenedor recorta, evitando el hairline sub-pixel del doble redondeo. El fondo
5133
+ se deja transparente bajo el logo como respaldo (no debe verse púrpura en los bordes). */
4553
5134
  .kds-merchant-tile.logo {
4554
- padding: var(--kds-spacing-0-5);
5135
+ padding: 0;
5136
+ display: block;
5137
+ overflow: hidden;
5138
+ background: transparent;
4555
5139
  }
4556
5140
 
4557
5141
  .kds-merchant-tile.logo img {
4558
5142
  width: 100%;
4559
5143
  height: 100%;
4560
5144
  object-fit: cover;
4561
- border-radius: var(--kds-radius-md);
5145
+ border-radius: 0;
5146
+ display: block;
5147
+ }
5148
+
5149
+ /* Variante para logos que traen su propio marco/forma (logos de comercio/servicio,
5150
+ no fotos): `contain` + padding para que el logo entre completo sin recortar sus
5151
+ esquinas. Opt-in: pasar className="kds-merchant-tile--contain". */
5152
+ .kds-merchant-tile.logo.kds-merchant-tile--contain {
5153
+ padding: var(--kds-spacing-1);
5154
+ }
5155
+ .kds-merchant-tile.logo.kds-merchant-tile--contain img {
5156
+ object-fit: contain;
4562
5157
  }
4563
5158
 
4564
5159
  .kds-merchant-meta {
4565
5160
  display: flex;
4566
5161
  flex-direction: column;
5162
+ gap: var(--kds-spacing-0-5);
5163
+ }
5164
+
5165
+ /* El meta controla su propio espaciado: anula el margin sibling de BeerCSS
5166
+ (`… + :is(p,h*,…) { margin-block-start: 1rem }`) que separaba de más las líneas. */
5167
+ .kds-merchant-meta > * {
5168
+ margin-block: 0 !important;
4567
5169
  }
4568
5170
 
4569
5171
  .kds-merchant-label {
@@ -4616,6 +5218,11 @@ dialog#surveyModal button.circle {
4616
5218
  color: var(--kds-color-text-primary);
4617
5219
  }
4618
5220
 
5221
+ /* Opt-in color modifier — switches the value to the LigoPay/khipu-blue tone */
5222
+ .kds-amount-value--info {
5223
+ color: var(--kds-color-info-blue); /* #5A5FE0 */
5224
+ }
5225
+
4619
5226
  .kds-amount-value small {
4620
5227
  font-size: 18px;
4621
5228
  font-weight: 500;
@@ -4973,7 +5580,7 @@ dialog#surveyModal button.circle {
4973
5580
  display: flex;
4974
5581
  align-items: center;
4975
5582
  justify-content: center;
4976
- gap: var(--kds-spacing-1);
5583
+ gap: var(--kds-spacing-0-5);
4977
5584
  color: var(--kds-color-gray-400);
4978
5585
  font-size: var(--kds-font-size-xs);
4979
5586
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -4985,6 +5592,17 @@ dialog#surveyModal button.circle {
4985
5592
  display: none;
4986
5593
  }
4987
5594
 
5595
+ .kds-screen > form {
5596
+ margin-block-start: 0 !important;
5597
+ }
5598
+
5599
+ /* Footer externo (desktop) adyacente a la card: cancela el gap del .kds-screen
5600
+ para que quede pegado debajo de la card y no flotando lejos. Las dos cards
5601
+ (header/body) sí conservan su separación. */
5602
+ .kds-screen > .kds-secure-footer {
5603
+ margin-top: calc(-1 * var(--kds-spacing-3));
5604
+ }
5605
+
4988
5606
  @media (max-width: 767px) {
4989
5607
  .kds-card-elevated > .kds-secure-footer {
4990
5608
  display: flex;
@@ -4992,10 +5610,6 @@ dialog#surveyModal button.circle {
4992
5610
  .kds-screen > .kds-secure-footer {
4993
5611
  display: none;
4994
5612
  }
4995
-
4996
- .kds-screen > form {
4997
- margin-block-start: 0 !important;
4998
- }
4999
5613
  }
5000
5614
 
5001
5615
  .kds-secure-footer-lock {
@@ -5017,6 +5631,30 @@ dialog#surveyModal button.circle {
5017
5631
  display: block;
5018
5632
  object-fit: contain;
5019
5633
  overflow: visible;
5634
+ /* Nudge óptico: la tinta del wordmark queda ~1px alta dentro de su viewBox (45x15),
5635
+ así que al centrar por caja se ve desalineada respecto a la baseline del texto. */
5636
+ position: relative;
5637
+ top: 1px;
5638
+ }
5639
+
5640
+ /* Divisor entre el logo de Khipu y el del PSP ("Khipu | klap") */
5641
+ .kds-secure-footer-sep {
5642
+ width: 1px;
5643
+ height: 0.85em;
5644
+ background: currentColor;
5645
+ opacity: 0.35;
5646
+ flex: 0 0 auto;
5647
+ }
5648
+
5649
+ /* Logo del PSP (proveedor de pagos): lo provee el consumidor, lo alineamos al mismo
5650
+ alto que el mark de Khipu. Sirve para <img> o un elemento con .kds-psp-mark. */
5651
+ .kds-secure-footer img,
5652
+ .kds-secure-footer .kds-psp-mark {
5653
+ height: 11px;
5654
+ width: auto;
5655
+ flex: 0 0 auto;
5656
+ display: block;
5657
+ object-fit: contain;
5020
5658
  }
5021
5659
 
5022
5660
  .kds-secure-footer-code {
@@ -5032,25 +5670,45 @@ dialog#surveyModal button.circle {
5032
5670
  background: none;
5033
5671
  border: 0;
5034
5672
  padding: 0;
5673
+ /* Reset del bare `button { height: 2.5rem }` de BeerCSS (scoped en .kds-theme-root):
5674
+ sin esto el toggle quedaba en una caja de 40px con el texto centrado → espacio
5675
+ irregular arriba (pegado al resumen) y abajo (~26px hasta el panel). Con height
5676
+ auto el botón ajusta a su contenido y el ritmo lo gobiernan los márgenes. */
5677
+ height: auto;
5035
5678
  color: var(--kds-color-primary-main);
5036
5679
  font-weight: var(--kds-font-weight-medium);
5037
5680
  font-size: var(--kds-font-size-sm);
5038
5681
  cursor: pointer;
5039
5682
  display: inline-flex;
5040
5683
  align-items: center;
5041
- gap: var(--kds-spacing-0-75);
5684
+ gap: 0;
5042
5685
  }
5043
5686
 
5044
- .kds-expand-toggle:hover {
5687
+ .kds-expand-toggle:hover,
5688
+ .kds-expand-toggle:focus,
5689
+ .kds-expand-toggle:active {
5045
5690
  background: transparent;
5691
+ outline: none;
5692
+ box-shadow: none;
5046
5693
  }
5047
5694
 
5048
- .kds-expand-toggle:hover span {
5695
+ .kds-expand-toggle:hover span,
5696
+ .kds-expand-toggle:focus span,
5697
+ .kds-expand-toggle:active span {
5049
5698
  text-decoration: underline;
5050
5699
  }
5051
5700
 
5052
5701
  .kds-expand-toggle i {
5053
5702
  font-size: var(--kds-font-size-base);
5703
+ /* BeerCSS estiliza el `i` bare como caja flex de 30px (height/width/min: 30px), que
5704
+ inflaba el toggle y dejaba aire vertical de más alrededor del label. La achicamos a
5705
+ 1.25em MANTENIENDO el centrado flex de BeerCSS (display:flex/align/justify) — así el
5706
+ caret queda compacto Y ópticamente centrado con el texto (no usar height:auto ni
5707
+ line-height:1: descentran el glifo). */
5708
+ width: 1.25em;
5709
+ height: 1.25em;
5710
+ min-width: 0;
5711
+ min-height: 0;
5054
5712
  transition: transform var(--kds-transition-shorter, 0.2s);
5055
5713
  }
5056
5714
 
@@ -5188,13 +5846,17 @@ dialog#surveyModal button.circle {
5188
5846
 
5189
5847
  .kds-status-block {
5190
5848
  text-align: center;
5191
- padding: var(--kds-spacing-6) 0;
5849
+ /* Padding vertical estándar: spacing-2 (16px), el mismo rhythm inter-elementos
5850
+ que usan kds-btn-stack y kds-hr-dashed. NO usar spacing-6 (48px): genera
5851
+ demasiado espacio cuando el bloque se compone con header/divider alrededor. */
5852
+ padding: var(--kds-spacing-2) 0;
5192
5853
  }
5193
5854
 
5194
5855
  .kds-status-block-icon {
5195
5856
  width: var(--kds-status-icon-size);
5196
5857
  height: var(--kds-status-icon-size);
5197
- margin: 0 auto var(--kds-spacing-3);
5858
+ /* spacing-2 (16px) icono→título: rhythm estándar inter-elementos. */
5859
+ margin: 0 auto var(--kds-spacing-2);
5198
5860
  border-radius: var(--kds-radius-full);
5199
5861
  display: grid;
5200
5862
  place-items: center;
@@ -5225,11 +5887,11 @@ dialog#surveyModal button.circle {
5225
5887
  color: var(--kds-color-success-main);
5226
5888
  }
5227
5889
 
5228
- /* Variant: pending (animated spinner) */
5890
+ /* Variant: pending (animated blue spinner, sin icono interno) */
5229
5891
  .kds-status-block[data-status="pending"] .kds-status-block-icon {
5230
5892
  background: transparent;
5231
5893
  border: 3px solid var(--kds-color-divider);
5232
- border-top-color: var(--kds-color-primary-main);
5894
+ border-top-color: var(--kds-color-info-main);
5233
5895
  animation: kds-spin 1s linear infinite;
5234
5896
  }
5235
5897
 
@@ -5247,12 +5909,21 @@ dialog#surveyModal button.circle {
5247
5909
  color: var(--kds-color-error-main);
5248
5910
  }
5249
5911
 
5912
+ /* Variant: info — usar SIEMPRE con icon "info_i" (i minúscula sin glyph circular)
5913
+ para que solo se vea nuestro círculo decorativo. Iconos como "info" tienen
5914
+ su propio círculo built-in → causarían doble círculo. */
5915
+ .kds-status-block[data-status="info"] .kds-status-block-icon {
5916
+ background: var(--kds-color-info-soft);
5917
+ border: var(--kds-border-width-md) solid var(--kds-color-info-main);
5918
+ color: var(--kds-color-info-main);
5919
+ }
5920
+
5250
5921
  /* Inline variant: icon left + text right */
5251
5922
  .kds-status-block.inline {
5252
5923
  text-align: left;
5253
5924
  display: flex;
5254
5925
  align-items: center;
5255
- gap: var(--kds-spacing-3);
5926
+ gap: var(--kds-spacing-2);
5256
5927
  padding: var(--kds-spacing-1) 0;
5257
5928
  }
5258
5929
 
@@ -5314,6 +5985,40 @@ dialog#surveyModal button.circle {
5314
5985
  background: var(--kds-color-divider);
5315
5986
  }
5316
5987
 
5988
+ /* Close button — top-right discreto, NO usa kds-btn (rompía el flex layout) */
5989
+ .kds-bottom-sheet-close {
5990
+ position: absolute;
5991
+ top: var(--kds-spacing-1);
5992
+ right: var(--kds-spacing-1);
5993
+ width: 32px;
5994
+ height: 32px;
5995
+ display: inline-flex;
5996
+ align-items: center;
5997
+ justify-content: center;
5998
+ padding: 0;
5999
+ background: transparent;
6000
+ border: 0;
6001
+ border-radius: 50%;
6002
+ color: var(--kds-color-text-secondary);
6003
+ cursor: pointer;
6004
+ transition: background-color 0.15s ease;
6005
+ }
6006
+
6007
+ .kds-bottom-sheet-close:hover {
6008
+ background: rgba(0, 0, 0, 0.06);
6009
+ }
6010
+
6011
+ .kds-bottom-sheet-close i {
6012
+ font-size: 20px;
6013
+ line-height: 1;
6014
+ }
6015
+
6016
+ /* Body container — separa el content del title/actions */
6017
+ .kds-bottom-sheet-body {
6018
+ text-align: left;
6019
+ margin-top: var(--kds-spacing-1);
6020
+ }
6021
+
5317
6022
  .kds-bottom-sheet-icon {
5318
6023
  font-size: var(--kds-font-size-4xl);
5319
6024
  }
@@ -5618,6 +6323,14 @@ dialog#surveyModal button.circle {
5618
6323
  margin-top: var(--kds-spacing-1);
5619
6324
  }
5620
6325
 
6326
+ /* Ritmo uniforme alrededor del toggle: spacing-2 arriba (resumen↔"Ver detalle")
6327
+ iguala el padding-top spacing-2 que la .kds-detail-list da debajo
6328
+ ("Ver detalle"↔primer label del panel). Antes el alto fijo del bare button
6329
+ (40px) hacía que el espacio de arriba y de abajo fueran distintos. */
6330
+ .kds-invoice-collapsible > .kds-expand-toggle {
6331
+ margin-top: var(--kds-spacing-2);
6332
+ }
6333
+
5621
6334
  /* -- Invoice Summary -- */
5622
6335
  .kds-invoice-summary {
5623
6336
  display: flex;
@@ -5641,6 +6354,22 @@ div.kds-invoice-header,
5641
6354
  padding: 0;
5642
6355
  border-radius: 0;
5643
6356
  align-content: initial;
6357
+ /* Override BeerCSS `header { min-height: ... }` — el header debe ajustarse a su
6358
+ contenido (sigue el alto del merchant tile: 64px→50px al colapsar). Sin esto
6359
+ quedaba un min-height fijo de 64px → hueco muerto debajo al colapsar en mobile. */
6360
+ min-height: 0;
6361
+ }
6362
+
6363
+ /* Mobile: center-align el header (merchant tile vs bloque monto+código) tanto
6364
+ expandido como colapsado. Al quitar el logo del header, el bloque de texto quedaba
6365
+ más bajo que el merchant tile y con `flex-start` dejaba hueco abajo; centrado los
6366
+ alinea. CSS-only (no depende de la clase .is-collapsed, que el JS de collapse no setea). */
6367
+ @media (max-width: 767px) {
6368
+ header.kds-invoice-header,
6369
+ div.kds-invoice-header,
6370
+ .kds-invoice-header {
6371
+ align-items: center;
6372
+ }
5644
6373
  }
5645
6374
 
5646
6375
  /* Reset BeerCSS sibling margin on <p> inside invoice header — specificity (0,4,1) ties BeerCSS, wins by source order */
@@ -5650,7 +6379,7 @@ div.kds-invoice-header,
5650
6379
  }
5651
6380
 
5652
6381
  .kds-invoice-amount {
5653
- font-weight: var(--kds-font-weight-bold);
6382
+ font-weight: var(--kds-font-weight-semibold);
5654
6383
  font-size: var(--kds-font-size-3xl);
5655
6384
  line-height: var(--kds-line-height-tight);
5656
6385
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -5671,10 +6400,16 @@ div.kds-invoice-header,
5671
6400
  color: var(--kds-color-gray-400);
5672
6401
  text-transform: uppercase;
5673
6402
  margin: 0;
5674
- margin-top: var(--kds-spacing-1);
6403
+ margin-block: unset;
6404
+ display: flex;
6405
+ gap: var(--kds-spacing-1-5);
5675
6406
  }
5676
6407
 
5677
6408
  .kds-invoice-code-value {
6409
+ color: var(--kds-color-gray-400);
6410
+ }
6411
+
6412
+ .kds-invoice-code-value--lowercase {
5678
6413
  text-transform: lowercase;
5679
6414
  }
5680
6415
 
@@ -5687,6 +6422,9 @@ div.kds-invoice-header,
5687
6422
  place-items: center;
5688
6423
  color: #fff;
5689
6424
  flex-shrink: 0;
6425
+ /* Clip the slightly-oversized logo (see `.kds-invoice-merchant img`) to the
6426
+ rounded square so it can fully cover the deep-purple background. */
6427
+ overflow: hidden;
5690
6428
  }
5691
6429
 
5692
6430
  .kds-invoice-merchant i {
@@ -5706,28 +6444,43 @@ div.kds-invoice-header,
5706
6444
  }
5707
6445
 
5708
6446
  .kds-invoice-merchant img {
5709
- width: 100%;
5710
- height: 100%;
6447
+ /* Slightly larger than the container (+2px, centered by the grid) so the
6448
+ logo overflows under the parent's rounded clip and the deep-purple
6449
+ background never peeks through at the corners when the logo shrinks. */
6450
+ width: calc(100% + 2px);
6451
+ height: calc(100% + 2px);
5711
6452
  object-fit: cover;
5712
6453
  border-radius: var(--kds-radius-md);
5713
6454
  }
5714
6455
 
5715
6456
  /* -- Card Title -- */
5716
6457
  .kds-card-title {
5717
- font-weight: 700;
6458
+ font-weight: var(--kds-font-weight-semibold);
5718
6459
  font-size: var(--kds-font-size-base);
5719
6460
  line-height: 1.5;
5720
6461
  letter-spacing: -0.31px;
5721
6462
  color: var(--kds-color-text-primary);
5722
- margin-bottom: var(--kds-spacing-2) !important;
6463
+ /* sin !important: no hay regla de margin-bottom para h1 en BeerCSS que competir, y así un
6464
+ consumidor puede anularlo (p.ej. FormTitle dentro de un Stack que ya da el espacio). */
6465
+ margin-bottom: var(--kds-spacing-2);
6466
+ }
6467
+
6468
+ /* Opt-in size modifiers (additive — do NOT change default 16/600) */
6469
+ .kds-card-title--lg {
6470
+ font-size: var(--kds-font-size-xl); /* 20px */
6471
+ font-weight: var(--kds-font-weight-semibold);
6472
+ }
6473
+
6474
+ .kds-card-title--xl {
6475
+ font-size: var(--kds-font-size-2xl); /* 24px */
6476
+ font-weight: var(--kds-font-weight-semibold);
5723
6477
  }
5724
6478
 
5725
6479
  /* -- Key-Value Grid -- */
5726
6480
  .kds-kv {
5727
6481
  display: grid;
5728
6482
  grid-template-columns: auto 1fr;
5729
- row-gap: var(--kds-spacing-1);
5730
- column-gap: var(--kds-spacing-1-5);
6483
+ column-gap: var(--kds-spacing-1);
5731
6484
  align-items: baseline;
5732
6485
  }
5733
6486
 
@@ -5744,7 +6497,7 @@ div.kds-invoice-header,
5744
6497
  margin: 0;
5745
6498
  font-size: var(--kds-font-size-sm);
5746
6499
  line-height: var(--kds-line-height-relaxed);
5747
- font-weight: var(--kds-font-weight-bold);
6500
+ font-weight: var(--kds-font-weight-semibold);
5748
6501
  letter-spacing: normal;
5749
6502
  color: var(--kds-color-gray-800);
5750
6503
  min-width: 0;
@@ -5772,16 +6525,28 @@ div.kds-invoice-header,
5772
6525
  .kds-detail-list {
5773
6526
  display: flex;
5774
6527
  flex-direction: column;
5775
- gap: var(--kds-spacing-1-5);
6528
+ /* spacing-2 entre grupos del detalle (separación estándar entre piezas de info
6529
+ distintas, ej. "Emisor cobro" vs "Descripción"). El padding-top da la misma
6530
+ separación spacing-2 arriba del primer grupo (Asunto↔Emisor cobro). */
6531
+ gap: var(--kds-spacing-2);
5776
6532
  margin: 0;
5777
- padding: 0 0 var(--kds-spacing-1);
6533
+ padding: var(--kds-spacing-2) 0 0;
5778
6534
  }
5779
6535
 
5780
- .kds-detail-group {
5781
- margin-bottom: var(--kds-spacing-1-5);
6536
+ @media (max-width: 767px) {
6537
+ .kds-detail-list {
6538
+ padding-bottom: var(--kds-spacing-2);
6539
+ }
5782
6540
  }
5783
6541
 
5784
- .kds-detail-group:last-child {
6542
+ .kds-detail-group {
6543
+ /* El espacio ENTRE grupos lo da el `gap` de .kds-detail-list (spacing-2).
6544
+ Dentro del grupo, label↔value llevan un gap chico (spacing-0-5) para un
6545
+ ritmo parejo: antes el dt iba pegado al dd (0px) y se veía desigual frente
6546
+ a los 16px entre los demás elementos del panel. */
6547
+ display: flex;
6548
+ flex-direction: column;
6549
+ gap: var(--kds-spacing-0-5);
5785
6550
  margin-bottom: 0;
5786
6551
  }
5787
6552
 
@@ -5790,7 +6555,7 @@ div.kds-invoice-header,
5790
6555
  letter-spacing: var(--kds-letter-spacing-wide);
5791
6556
  color: var(--kds-color-text-hint);
5792
6557
  text-transform: uppercase;
5793
- margin: 0 0 var(--kds-spacing-0-5);
6558
+ margin: 0;
5794
6559
  }
5795
6560
 
5796
6561
  .kds-detail-group dd {
@@ -5800,6 +6565,19 @@ div.kds-invoice-header,
5800
6565
  color: var(--kds-color-text-primary);
5801
6566
  }
5802
6567
 
6568
+ /* Imagen adjunta del cobro dentro del panel de detalle (ej. comprobante/producto).
6569
+ Reemplaza los inline styles del antiguo modal MerchantInfo: ancho contenido, borde
6570
+ y radio del DS. Va como un grupo más de la .kds-detail-list (hereda su gap). */
6571
+ .kds-detail-image {
6572
+ display: block;
6573
+ max-width: 100%;
6574
+ width: 160px;
6575
+ height: auto;
6576
+ object-fit: contain;
6577
+ border-radius: var(--kds-radius-md);
6578
+ border: 1px solid var(--kds-color-border);
6579
+ }
6580
+
5803
6581
  /* -- Amount Summary Row -- */
5804
6582
  .kds-amount-row {
5805
6583
  display: flex;
@@ -5859,16 +6637,16 @@ div.kds-invoice-header,
5859
6637
  font-size: var(--kds-font-size-sm);
5860
6638
  }
5861
6639
 
5862
- .kds-recap-list .k {
6640
+ .kds-recap-list .kds-key {
5863
6641
  color: var(--kds-color-text-secondary);
5864
6642
  }
5865
6643
 
5866
- .kds-recap-list .v {
6644
+ .kds-recap-list .kds-value {
5867
6645
  color: var(--kds-color-text-primary);
5868
6646
  font-weight: 500;
5869
6647
  }
5870
6648
 
5871
- .kds-recap-list .v.placeholder {
6649
+ .kds-recap-list .kds-value.placeholder {
5872
6650
  color: var(--kds-color-text-hint);
5873
6651
  }
5874
6652
 
@@ -5895,6 +6673,72 @@ a.kds-btn-success:disabled {
5895
6673
  box-shadow: none;
5896
6674
  }
5897
6675
 
6676
+ /* -- Button Warning (amber CTA) -- */
6677
+ button.kds-btn-warning,
6678
+ a.kds-btn-warning {
6679
+ background: var(--kds-color-warning-main);
6680
+ color: var(--kds-color-warning-contrast);
6681
+ border: none;
6682
+ }
6683
+
6684
+ button.kds-btn-warning:hover:not(:disabled),
6685
+ a.kds-btn-warning:hover:not(:disabled) {
6686
+ background: var(--kds-color-warning-dark);
6687
+ }
6688
+
6689
+ button.kds-btn-warning:active:not(:disabled),
6690
+ button.kds-btn-warning:focus-visible:not(:disabled),
6691
+ a.kds-btn-warning:active:not(:disabled),
6692
+ a.kds-btn-warning:focus-visible:not(:disabled) {
6693
+ background: var(--kds-color-warning-dark);
6694
+ outline: 2px solid var(--kds-color-warning-main);
6695
+ outline-offset: 2px;
6696
+ }
6697
+
6698
+ button.kds-btn-warning:disabled,
6699
+ a.kds-btn-warning:disabled {
6700
+ background-color: var(--kds-color-action-disabled-bg);
6701
+ color: var(--kds-color-action-disabled);
6702
+ box-shadow: none;
6703
+ }
6704
+
6705
+ button.kds-btn-warning::after {
6706
+ display: none;
6707
+ }
6708
+
6709
+ /* -- Button Error (red / destructive CTA) -- */
6710
+ button.kds-btn-error,
6711
+ a.kds-btn-error {
6712
+ background: var(--kds-color-error-main);
6713
+ color: var(--kds-color-error-contrast);
6714
+ border: none;
6715
+ }
6716
+
6717
+ button.kds-btn-error:hover:not(:disabled),
6718
+ a.kds-btn-error:hover:not(:disabled) {
6719
+ background: var(--kds-color-error-dark);
6720
+ }
6721
+
6722
+ button.kds-btn-error:active:not(:disabled),
6723
+ button.kds-btn-error:focus-visible:not(:disabled),
6724
+ a.kds-btn-error:active:not(:disabled),
6725
+ a.kds-btn-error:focus-visible:not(:disabled) {
6726
+ background: var(--kds-color-error-dark);
6727
+ outline: 2px solid var(--kds-color-error-main);
6728
+ outline-offset: 2px;
6729
+ }
6730
+
6731
+ button.kds-btn-error:disabled,
6732
+ a.kds-btn-error:disabled {
6733
+ background-color: var(--kds-color-action-disabled-bg);
6734
+ color: var(--kds-color-action-disabled);
6735
+ box-shadow: none;
6736
+ }
6737
+
6738
+ button.kds-btn-error::after {
6739
+ display: none;
6740
+ }
6741
+
5898
6742
  /* -- Field Helper Text -- */
5899
6743
  .kds-field-helper {
5900
6744
  font-size: var(--kds-font-size-xs);
@@ -5937,6 +6781,8 @@ button.kds-btn-success::after {
5937
6781
  /* -- Alert inline (borderless, used inside cards) -- */
5938
6782
  .kds-alert-inline {
5939
6783
  border: none;
6784
+ padding: var(--kds-spacing-1) var(--kds-spacing-1-5);
6785
+ margin-bottom: var(--kds-spacing-1-5);
5940
6786
  }
5941
6787
 
5942
6788
  /* -- Card dimmed (behind overlays) -- */
@@ -6038,17 +6884,42 @@ button.kds-btn-success::after {
6038
6884
  }
6039
6885
 
6040
6886
  .kds-bill-description-picture {
6041
- width: 120px;
6042
- height: 120px;
6887
+ max-width: 100px;
6043
6888
  object-fit: contain;
6044
6889
  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);
6890
+ margin-top: var(--kds-spacing-1-25);
6048
6891
  display: block;
6049
6892
  box-sizing: content-box;
6050
6893
  }
6051
6894
 
6895
+ /* -- Bill Attachments -- */
6896
+ .kds-bill-attachments {
6897
+ display: flex;
6898
+ flex-direction: column;
6899
+ gap: var(--kds-spacing-0-75);
6900
+ }
6901
+
6902
+ .kds-bill-attachment {
6903
+ display: inline-flex;
6904
+ align-items: center;
6905
+ justify-content: flex-start;
6906
+ width: fit-content;
6907
+ color: var(--kds-color-info-main);
6908
+ font-size: var(--kds-font-size-sm);
6909
+ font-weight: var(--kds-font-weight-medium);
6910
+ text-decoration: none;
6911
+ }
6912
+
6913
+ .kds-bill-attachment:hover span {
6914
+ text-decoration: underline;
6915
+ }
6916
+
6917
+ .kds-bill-attachment i {
6918
+ font-size: var(--kds-font-size-lg);
6919
+ min-width: unset;
6920
+ justify-content: flex-start;
6921
+ }
6922
+
6052
6923
  /* -- Share Card (mustContinue) -- */
6053
6924
  .kds-share-card {
6054
6925
  margin-top: var(--kds-spacing-2);
@@ -6174,12 +7045,38 @@ button.kds-btn-success::after {
6174
7045
  padding-bottom: 0;
6175
7046
  }
6176
7047
 
6177
- /* Payment stage full-viewport centered wrapper */
7048
+ /* Body card: alto mínimo estable para que NO salte entre estados de distinta altura
7049
+ (loader/progress ↔ formulario). Solo la body card = hijo directo de `.kds-screen`
7050
+ (los headers van dentro de `.kds-invoice-sticky-wrap`, no la afecta).
7051
+ Flex-column para que el contenido quede arriba y el footer interno (versión / secure
7052
+ footer) pueda pinearse al fondo con `margin-top: auto` aunque el contenido sea corto. */
7053
+ .kds-screen > .kds-card-elevated {
7054
+ min-height: 36rem;
7055
+ display: flex;
7056
+ flex-direction: column;
7057
+ /* mismo radio que el header (invoice-sticky usa radius-card); el base card-elevated
7058
+ es radius-md (8px) y quedaba distinto al header en desktop. */
7059
+ border-radius: var(--kds-radius-card);
7060
+ }
7061
+
7062
+ /* Variante sin radio superior: pantallas de resultado (éxito/fallo/timeout) que van
7063
+ SIN header arriba — la body card va sola y su tope queda plano (flush) en vez de
7064
+ con esquinas redondeadas sueltas. El padding del card sigue manejando el inset. */
7065
+ .kds-screen > .kds-card-elevated.kds-card-elevated--flush-top,
7066
+ .kds-card-elevated.kds-card-elevated--flush-top {
7067
+ border-top-left-radius: 0;
7068
+ border-top-right-radius: 0;
7069
+ }
7070
+
7071
+ /* Payment stage — full-viewport centered wrapper.
7072
+ Fondo muted (gris) para que las cards blancas (header + body) y el gap entre
7073
+ ellas se distingan; sin esto, card blanca sobre fondo blanco se funden. */
6178
7074
  .kds-payment-stage {
6179
7075
  min-height: 100vh;
6180
7076
  display: flex;
6181
7077
  justify-content: center;
6182
7078
  padding: var(--kds-spacing-2-5) var(--kds-spacing-2) var(--kds-spacing-8);
7079
+ background: var(--kds-color-background-muted);
6183
7080
  }
6184
7081
 
6185
7082
  /* Payment flow — narrow column */
@@ -6218,10 +7115,16 @@ button.kds-btn-success::after {
6218
7115
  padding-bottom: var(--kds-spacing-2);
6219
7116
  }
6220
7117
 
6221
- /* Invoice sticky card: progressive padding-top (expanded 20px → collapsed 8px).
6222
- Overrides base rule at same specificity; source order wins here. */
7118
+ /* Invoice sticky card padding (mobile).
7119
+ Top: estático 12px. Bottom: progresivo 16px (expandido, = desktop) → 8px (colapsado).
7120
+ El padding-bottom animado se reduce al colapsar — sin depender de que el clip-path
7121
+ corte el padding abruptamente. */
6223
7122
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6224
7123
  padding-top: var(--kds-spacing-1-5);
7124
+ padding-bottom: calc(
7125
+ var(--kds-spacing-2)
7126
+ - var(--kds-spacing-1) * var(--collapse-progress, 0)
7127
+ );
6225
7128
  }
6226
7129
 
6227
7130
 
@@ -6480,7 +7383,7 @@ button.kds-btn-success::after {
6480
7383
  inset: 0;
6481
7384
  background: var(--kds-modal-backdrop);
6482
7385
  display: none;
6483
- align-items: center;
7386
+ align-items: flex-start;
6484
7387
  justify-content: center;
6485
7388
  z-index: var(--kds-z-index-modal, 50);
6486
7389
  animation: kds-fade 0.2s ease both;
@@ -6508,7 +7411,7 @@ button.kds-btn-success::after {
6508
7411
  display: flex;
6509
7412
  align-items: center;
6510
7413
  justify-content: space-between;
6511
- padding: var(--kds-spacing-2) var(--kds-spacing-2) var(--kds-spacing-1);
7414
+ padding: var(--kds-spacing-1) var(--kds-spacing-2) var(--kds-spacing-1);
6512
7415
  }
6513
7416
 
6514
7417
  .kds-bank-modal-header h3 {
@@ -6533,11 +7436,8 @@ button.kds-btn-success::after {
6533
7436
  display: none;
6534
7437
  }
6535
7438
 
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 {
7439
+ /* Search field reutilizable (standalone o dentro del KdsBankModal). */
7440
+ .kds-search-field {
6541
7441
  width: 100%;
6542
7442
  padding: var(--kds-spacing-1-25) var(--kds-spacing-1-5);
6543
7443
  border: 1px solid var(--kds-color-divider);
@@ -6549,15 +7449,57 @@ button.kds-btn-success::after {
6549
7449
  background: var(--kds-color-surface);
6550
7450
  }
6551
7451
 
6552
- .kds-bank-modal-search input::placeholder {
7452
+ .kds-search-field::placeholder {
6553
7453
  color: var(--kds-color-text-hint);
6554
7454
  }
6555
7455
 
6556
- .kds-bank-modal-search input:focus {
7456
+ .kds-search-field:focus {
6557
7457
  border-color: var(--kds-color-primary-main);
6558
7458
  box-shadow: 0 0 0 2px var(--kds-color-primary-faint);
6559
7459
  }
6560
7460
 
7461
+ /* Variante con ícono (withIcon): lupa posicionada DENTRO del input, a la derecha. */
7462
+ .kds-search-field-wrapper {
7463
+ position: relative;
7464
+ width: 100%;
7465
+ }
7466
+
7467
+ .kds-search-field-icon {
7468
+ position: absolute;
7469
+ right: var(--kds-spacing-1-5);
7470
+ top: 50%;
7471
+ transform: translateY(-50%);
7472
+ font-size: 20px;
7473
+ color: var(--kds-color-text-hint);
7474
+ pointer-events: none;
7475
+ }
7476
+
7477
+ /* Espacio a la derecha del texto para no solaparse con la lupa. */
7478
+ .kds-search-field-wrapper .kds-search-field {
7479
+ padding-right: calc(var(--kds-spacing-1-5) + var(--kds-spacing-3));
7480
+ }
7481
+
7482
+ /* Variante angosta del field (prop `narrow` de KdsTextField): ancho reducido y texto
7483
+ centrado, para inputs de pocos caracteres dispuestos en fila (ej. segmentos de
7484
+ coordenadas o código). No crece ni se encoge dentro de un flex row. */
7485
+ .field.kds-field--narrow {
7486
+ width: 6rem;
7487
+ flex: 0 0 auto;
7488
+ /* En fila horizontal no aplica el margin vertical que BeerCSS da a fields
7489
+ hermanos (regla de "flow" `... + :is(.field,...)`, specificity ~0,3,1);
7490
+ sin el reset los siguientes quedan desalineados hacia abajo. `!important`
7491
+ para ganarle a esa regla de framework. */
7492
+ margin-block: 0 !important;
7493
+ }
7494
+
7495
+ .field.kds-field--narrow > input {
7496
+ text-align: center;
7497
+ }
7498
+
7499
+ .kds-bank-modal-search {
7500
+ padding: 0 var(--kds-spacing-2) var(--kds-spacing-1-5);
7501
+ }
7502
+
6561
7503
  .kds-bank-modal-body {
6562
7504
  flex: 1;
6563
7505
  overflow-y: auto;
@@ -6655,7 +7597,7 @@ button.kds-btn-success::after {
6655
7597
  min-width: 0;
6656
7598
  }
6657
7599
 
6658
- .kds-qr-text .title {
7600
+ .kds-qr-text .kds-qr-title {
6659
7601
  font-family: var(--kds-font-family-primary);
6660
7602
  font-weight: 600;
6661
7603
  font-size: var(--kds-font-size-sm);
@@ -6663,10 +7605,15 @@ button.kds-btn-success::after {
6663
7605
  color: var(--kds-color-text-primary);
6664
7606
  }
6665
7607
 
6666
- .kds-qr-text .sub {
7608
+ .kds-qr-text .kds-qr-subtitle {
6667
7609
  font-family: var(--kds-font-family-primary);
6668
7610
  font-size: var(--kds-font-size-caption);
6669
7611
  color: var(--kds-color-text-secondary);
7612
+ /* Trunca con ellipsis en lugar de wrap a 2 líneas — evita apretar el row
7613
+ cuando el contenedor es angosto (mobile o decorator constrained). */
7614
+ overflow: hidden;
7615
+ text-overflow: ellipsis;
7616
+ white-space: nowrap;
6670
7617
  }
6671
7618
 
6672
7619
  /* QR Badge - "Rápido" indicator */
@@ -6689,46 +7636,26 @@ button.kds-btn-success::after {
6689
7636
  font-size: 20px;
6690
7637
  }
6691
7638
 
6692
- /* Mobile responsive: Ajustes para pantallas pequeñas */
7639
+ /* Mobile responsive (≤480px): respira más mantenemos padding/gap/avatar igual
7640
+ que desktop y solo agregamos truncation al subtitle y `flex-shrink: 0` en los
7641
+ ítems que deben mantener su tamaño (avatar, badge, chevron). */
6693
7642
  @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
7643
  .kds-qr-avatar {
6700
- width: var(--kds-spacing-4-5);
6701
- height: var(--kds-spacing-4-5);
6702
7644
  flex-shrink: 0;
6703
7645
  }
6704
7646
 
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
7647
  .kds-qr-text .sub {
6716
- font-size: var(--kds-font-size-caption);
6717
- line-height: var(--kds-line-height-tight);
6718
7648
  overflow: hidden;
6719
7649
  text-overflow: ellipsis;
6720
7650
  white-space: nowrap;
6721
7651
  }
6722
7652
 
6723
7653
  .kds-qr-badge {
6724
- font-size: var(--kds-font-size-caption);
6725
- padding: var(--kds-spacing-0-25) var(--kds-spacing-0-75);
6726
7654
  flex-shrink: 0;
6727
7655
  }
6728
7656
 
6729
7657
  .kds-qr-row .material-symbols-outlined:last-child,
6730
7658
  .kds-qr-row .material-icons-round:last-child {
6731
- font-size: var(--kds-font-size-base);
6732
7659
  flex-shrink: 0;
6733
7660
  }
6734
7661
  }
@@ -6757,7 +7684,11 @@ button.kds-btn-success::after {
6757
7684
  border-radius: var(--kds-spacing-0-75);
6758
7685
  font-size: var(--kds-font-size-sm);
6759
7686
  cursor: pointer;
6760
- transition: background 0.12s ease;
7687
+ /* Transición más amplia y suave: bg + color + border ease-out */
7688
+ transition:
7689
+ background-color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7690
+ color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7691
+ border-top-color 280ms ease-out;
6761
7692
  position: relative;
6762
7693
  user-select: none;
6763
7694
  }
@@ -6766,19 +7697,21 @@ button.kds-btn-success::after {
6766
7697
  border-top: 0;
6767
7698
  }
6768
7699
 
6769
- .kds-copyable-table-row:hover {
7700
+ /* Hover NO aplica mientras la row esté en `.copied` o `.settling`
7701
+ (evita el flicker del hover state al desaparecer el verde de "copiado") */
7702
+ .kds-copyable-table-row:not(.copied):not(.settling):hover {
6770
7703
  background: var(--kds-color-primary-faint);
6771
7704
  }
6772
7705
 
6773
- .kds-copyable-table-row:hover + .kds-copyable-table-row {
7706
+ .kds-copyable-table-row:not(.copied):not(.settling):hover + .kds-copyable-table-row {
6774
7707
  border-top-color: transparent;
6775
7708
  }
6776
7709
 
6777
- .kds-copyable-table-row:active {
7710
+ .kds-copyable-table-row:not(.copied):not(.settling):active {
6778
7711
  background: var(--kds-color-primary-selected);
6779
7712
  }
6780
7713
 
6781
- .kds-copyable-table-row .k {
7714
+ .kds-copyable-table-row .kds-key {
6782
7715
  color: var(--kds-color-text-secondary);
6783
7716
  font-size: var(--kds-font-size-caption);
6784
7717
  letter-spacing: 0.3px;
@@ -6787,7 +7720,7 @@ button.kds-btn-success::after {
6787
7720
  flex: 0 0 auto;
6788
7721
  }
6789
7722
 
6790
- .kds-copyable-table-row .v {
7723
+ .kds-copyable-table-row .kds-value {
6791
7724
  color: var(--kds-color-text-primary);
6792
7725
  font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace;
6793
7726
  font-weight: var(--kds-font-weight-medium);
@@ -6803,17 +7736,18 @@ button.kds-btn-success::after {
6803
7736
  flex: 1 1 auto;
6804
7737
  }
6805
7738
 
6806
- .kds-copyable-table-row .v::after {
7739
+ .kds-copyable-table-row .kds-value::after {
6807
7740
  content: 'content_copy';
6808
7741
  font-family: 'Material Symbols Outlined';
6809
7742
  font-size: var(--kds-font-size-sm);
6810
7743
  color: var(--kds-color-primary-main);
6811
7744
  opacity: 0;
6812
- transition: opacity 0.12s ease;
7745
+ /* Transición coordinada con la row */
7746
+ transition: opacity 280ms cubic-bezier(0.2, 0.8, 0.2, 1);
6813
7747
  flex: 0 0 auto;
6814
7748
  }
6815
7749
 
6816
- .kds-copyable-table-row:hover .v::after {
7750
+ .kds-copyable-table-row:not(.copied):not(.settling):hover .kds-value::after {
6817
7751
  opacity: 0.7;
6818
7752
  }
6819
7753
 
@@ -6821,22 +7755,76 @@ button.kds-btn-success::after {
6821
7755
  background: var(--kds-color-success-soft);
6822
7756
  }
6823
7757
 
6824
- .kds-copyable-table-row.copied .v {
7758
+ .kds-copyable-table-row.copied .kds-value {
6825
7759
  color: var(--kds-color-success-dark);
6826
7760
  }
6827
7761
 
6828
- .kds-copyable-table-row.copied .v::after {
7762
+ .kds-copyable-table-row.copied .kds-value::after {
6829
7763
  content: 'check';
6830
7764
  font-family: 'Material Symbols Outlined';
6831
7765
  color: var(--kds-color-success-dark);
6832
7766
  opacity: 1;
6833
7767
  }
6834
7768
 
7769
+ /* `.settling`: estado de "recién copiado" — la row vuelve al normal sin
7770
+ activar hover. Dura lo mismo que la transición (~300ms) y se aplica
7771
+ desde React tras quitar `.copied`. */
7772
+ .kds-copyable-table-row.settling .kds-value::after {
7773
+ /* Mantén el check con opacity 0 mientras settling, fade out suave */
7774
+ opacity: 0;
7775
+ }
7776
+
6835
7777
  /* Disable BeerCSS ripple on copyable table rows */
6836
7778
  .kds-copyable-table-row::after {
6837
7779
  display: none;
6838
7780
  }
6839
7781
 
7782
+ /* ========================================
7783
+ GRID VARIANT (.kds-copyable-table--grid)
7784
+ Read-only grid of N text cells per row. No copy,
7785
+ no role=button, no "copy all". Cells share the row
7786
+ width equally. Used inside radio options, etc.
7787
+ ======================================== */
7788
+
7789
+ /* La grilla es solo columnas de texto (como el DataTable original): sin caja,
7790
+ borde, fondo ni sombra del contenedor copyable. */
7791
+ .kds-copyable-table--grid {
7792
+ border: 0;
7793
+ border-radius: 0;
7794
+ background: none;
7795
+ padding: 0;
7796
+ box-shadow: none;
7797
+ }
7798
+
7799
+ .kds-copyable-table-row--grid {
7800
+ display: flex;
7801
+ align-items: center;
7802
+ gap: var(--kds-spacing-1-5);
7803
+ padding: 0;
7804
+ /* Sin el divisor border-top que trae la fila base del copyable. */
7805
+ border-top: 0;
7806
+ cursor: default;
7807
+ user-select: text;
7808
+ }
7809
+
7810
+ /* Separación entre filas de la grilla (sin divisores). */
7811
+ .kds-copyable-table-row--grid + .kds-copyable-table-row--grid {
7812
+ margin-top: var(--kds-spacing-0-5);
7813
+ }
7814
+
7815
+ .kds-grid-cell {
7816
+ flex: 1 1 0;
7817
+ min-width: 0;
7818
+ font-size: var(--kds-font-size-sm);
7819
+ font-weight: var(--kds-font-weight-medium);
7820
+ color: var(--kds-color-text-primary);
7821
+ word-break: break-word;
7822
+ }
7823
+
7824
+ .kds-grid-cell--disabled {
7825
+ color: var(--kds-color-text-disabled);
7826
+ }
7827
+
6840
7828
  /* ========================================
6841
7829
  COPY-ALL BUTTON (.kds-copy-all-btn)
6842
7830
  Modifier for kds-btn kds-btn-outlined that adds
@@ -6894,6 +7882,14 @@ a.kds-copy-all-btn.copied:hover {
6894
7882
  min-height: unset;
6895
7883
  }
6896
7884
 
7885
+ /* Severity variants — default stays warning (backward-compatible) */
7886
+ .kds-section-note.kds-info { color: var(--kds-color-info-dark); }
7887
+ .kds-section-note.kds-info > i { color: var(--kds-color-info-dark); }
7888
+ .kds-section-note.kds-success { color: var(--kds-color-success-dark); }
7889
+ .kds-section-note.kds-success > i { color: var(--kds-color-success-dark); }
7890
+ .kds-section-note.kds-error { color: var(--kds-color-error-dark); }
7891
+ .kds-section-note.kds-error > i { color: var(--kds-color-error-dark); }
7892
+
6897
7893
  /* ========================================
6898
7894
  INFO TOOLTIP (.kds-info-tip)
6899
7895
  Inline info button with hover/click tooltip bubble.
@@ -6989,7 +7985,7 @@ a.kds-copy-all-btn.copied:hover {
6989
7985
  .kds-monto-row {
6990
7986
  display: flex;
6991
7987
  justify-content: space-between;
6992
- align-items: flex-end;
7988
+ align-items: flex-start;
6993
7989
  padding: var(--kds-spacing-1-75) 0 var(--kds-spacing-1);
6994
7990
  border-top: 1px dashed var(--kds-color-divider);
6995
7991
  margin-top: var(--kds-spacing-1-75);
@@ -7013,3 +8009,191 @@ a.kds-copy-all-btn.copied:hover {
7013
8009
  color: var(--kds-color-text-primary);
7014
8010
  }
7015
8011
 
8012
+ /* ========================================
8013
+ PAYMENT TOTAL (.kds-payment-total)
8014
+ Bloque "monto a pagar" para QR view y email templates.
8015
+ Portado desde paylink-ligopay → <kh:paymentTotal> + materialize-config.css.
8016
+ Variantes:
8017
+ - default: amount grande (3rem) en color primario Khipu.
8018
+ - email: amount compacto (1.5rem) en color texto primario.
8019
+ Responsive (default): mobile (≤ 1024px) centra y oculta titleMobile.
8020
+ ======================================== */
8021
+
8022
+ .kds-payment-total {
8023
+ /* Component-scoped tokens — overrideables sin tocar el CSS global. */
8024
+ --kds-payment-total-title-size: var(--kds-font-size-2xl); /* 24px */
8025
+ --kds-payment-total-label-size: var(--kds-font-size-xl); /* 20px */
8026
+ --kds-payment-amount-size: 3rem; /* 48px — destacado */
8027
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
8028
+ --kds-payment-amount-color: var(--kds-color-primary-main);
8029
+ --kds-payment-amount-weight: var(--kds-font-weight-medium);
8030
+
8031
+ text-align: left;
8032
+ }
8033
+
8034
+ .kds-payment-total-title,
8035
+ .kds-payment-total-title-mobile {
8036
+ font-size: var(--kds-payment-total-title-size);
8037
+ font-weight: var(--kds-font-weight-semibold);
8038
+ color: var(--kds-color-text-primary);
8039
+ margin-bottom: var(--kds-spacing-4);
8040
+ }
8041
+
8042
+ .kds-payment-total-title-mobile {
8043
+ display: none;
8044
+ }
8045
+
8046
+ .kds-payment-total .kds-payment-label {
8047
+ font-size: var(--kds-payment-total-label-size);
8048
+ font-weight: var(--kds-font-weight-semibold);
8049
+ color: var(--kds-color-text-primary);
8050
+ margin-bottom: var(--kds-spacing-1);
8051
+ padding-top: 0;
8052
+ }
8053
+
8054
+ .kds-payment-total .kds-payment-amount {
8055
+ font-size: var(--kds-payment-amount-size);
8056
+ font-weight: var(--kds-payment-amount-weight);
8057
+ line-height: var(--kds-payment-amount-line-height);
8058
+ color: var(--kds-payment-amount-color);
8059
+ margin-bottom: var(--kds-spacing-4);
8060
+ }
8061
+
8062
+ .kds-payment-total .kds-payment-amount .kds-payment-total-decimal-sup,
8063
+ .kds-invoice-amount .kds-payment-total-decimal-sup {
8064
+ font-size: var(--kds-font-size-decimal-sup);
8065
+ font-weight: var(--kds-font-weight-semibold);
8066
+ position: relative;
8067
+ top: 0;
8068
+ }
8069
+
8070
+ /* Variante email: amount compacto en color texto primario, alineación izquierda fija */
8071
+ .kds-payment-total--email {
8072
+ --kds-payment-amount-size: var(--kds-font-size-2xl); /* 24px */
8073
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
8074
+ --kds-payment-amount-color: var(--kds-color-text-primary);
8075
+ --kds-payment-amount-weight: var(--kds-font-weight-semibold);
8076
+ }
8077
+
8078
+ /* Tone modifier: swaps the amount color to the khipu-blue / LigoPay info blue.
8079
+ Combinable with --email or with the default variant. */
8080
+ .kds-payment-total--tone-info {
8081
+ --kds-payment-amount-color: var(--kds-color-info-blue); /* #5A5FE0 */
8082
+ }
8083
+
8084
+ /* Centered modifier: removes the asymmetric desktop padding (which exists for
8085
+ LigoPay QR view) and centers all internal text. Composable with --email and
8086
+ --tone-info. */
8087
+ .kds-payment-total--centered {
8088
+ padding-left: 0;
8089
+ padding-top: 0;
8090
+ text-align: center;
8091
+ }
8092
+ .kds-payment-total--centered .kds-payment-total-title,
8093
+ .kds-payment-total--centered .kds-payment-total-title-mobile,
8094
+ .kds-payment-total--centered .kds-payment-label,
8095
+ .kds-payment-total--centered .kds-payment-amount {
8096
+ text-align: center;
8097
+ }
8098
+
8099
+ /* Responsive: mobile ≤ 1024px — centra y conmuta los títulos (sólo variante default) */
8100
+ @media (max-width: 1024px) {
8101
+ .kds-payment-total {
8102
+ text-align: center;
8103
+ }
8104
+
8105
+ .kds-payment-total .kds-payment-total-title {
8106
+ display: none;
8107
+ }
8108
+
8109
+ .kds-payment-total .kds-payment-total-title-mobile {
8110
+ display: block;
8111
+ text-align: center;
8112
+ }
8113
+
8114
+ .kds-payment-total .kds-payment-label,
8115
+ .kds-payment-total .kds-payment-amount {
8116
+ text-align: center;
8117
+ }
8118
+
8119
+ /* Email mantiene alineación izquierda incluso en mobile (matchea email clients) */
8120
+ .kds-payment-total--email,
8121
+ .kds-payment-total--email .kds-payment-label,
8122
+ .kds-payment-total--email .kds-payment-amount {
8123
+ text-align: left;
8124
+ }
8125
+ }
8126
+
8127
+ /* ==========================================================================
8128
+ GRID UTILITIES — semantic aliases for BeerCSS .grid / .s* / .m* / .l*
8129
+
8130
+ Estas utilidades son ALIAS de las clases cortas de BeerCSS para que
8131
+ consumers (payment, LigoPay, Grails legacy) puedan escribir markup con
8132
+ nombres descriptivos sin renunciar al grid de 12 columnas de BeerCSS.
8133
+
8134
+ Convención (estilo Bootstrap responsive):
8135
+ - kds-grid → .grid (12-col CSS grid + 1rem gap)
8136
+ - kds-col-sm-{1..12} → .s{1..12} (mobile, siempre aplica)
8137
+ - kds-col-md-{1..12} → .m{1..12} (>=601px)
8138
+ - kds-col-lg-{1..12} → .l{1..12} (>=993px)
8139
+
8140
+ Las definiciones originales de BeerCSS NO se tocan; estas son aditivas.
8141
+ ========================================================================== */
8142
+
8143
+ .kds-grid {
8144
+ --_gap: 1rem;
8145
+ display: grid;
8146
+ grid-template-columns: repeat(12, 1fr);
8147
+ gap: var(--_gap);
8148
+ block-size: auto;
8149
+ }
8150
+
8151
+ .kds-grid.kds-grid-no-space { --_gap: 0rem; }
8152
+ .kds-grid.kds-grid-medium-space { --_gap: 1.5rem; }
8153
+ .kds-grid.kds-grid-large-space { --_gap: 2rem; }
8154
+
8155
+ .kds-grid > * { margin: 0; }
8156
+
8157
+ .kds-col-sm-1 { grid-area: auto/span 1; }
8158
+ .kds-col-sm-2 { grid-area: auto/span 2; }
8159
+ .kds-col-sm-3 { grid-area: auto/span 3; }
8160
+ .kds-col-sm-4 { grid-area: auto/span 4; }
8161
+ .kds-col-sm-5 { grid-area: auto/span 5; }
8162
+ .kds-col-sm-6 { grid-area: auto/span 6; }
8163
+ .kds-col-sm-7 { grid-area: auto/span 7; }
8164
+ .kds-col-sm-8 { grid-area: auto/span 8; }
8165
+ .kds-col-sm-9 { grid-area: auto/span 9; }
8166
+ .kds-col-sm-10 { grid-area: auto/span 10; }
8167
+ .kds-col-sm-11 { grid-area: auto/span 11; }
8168
+ .kds-col-sm-12 { grid-area: auto/span 12; }
8169
+
8170
+ @media only screen and (min-width: 601px) {
8171
+ .kds-col-md-1 { grid-area: auto/span 1; }
8172
+ .kds-col-md-2 { grid-area: auto/span 2; }
8173
+ .kds-col-md-3 { grid-area: auto/span 3; }
8174
+ .kds-col-md-4 { grid-area: auto/span 4; }
8175
+ .kds-col-md-5 { grid-area: auto/span 5; }
8176
+ .kds-col-md-6 { grid-area: auto/span 6; }
8177
+ .kds-col-md-7 { grid-area: auto/span 7; }
8178
+ .kds-col-md-8 { grid-area: auto/span 8; }
8179
+ .kds-col-md-9 { grid-area: auto/span 9; }
8180
+ .kds-col-md-10 { grid-area: auto/span 10; }
8181
+ .kds-col-md-11 { grid-area: auto/span 11; }
8182
+ .kds-col-md-12 { grid-area: auto/span 12; }
8183
+ }
8184
+
8185
+ @media only screen and (min-width: 993px) {
8186
+ .kds-col-lg-1 { grid-area: auto/span 1; }
8187
+ .kds-col-lg-2 { grid-area: auto/span 2; }
8188
+ .kds-col-lg-3 { grid-area: auto/span 3; }
8189
+ .kds-col-lg-4 { grid-area: auto/span 4; }
8190
+ .kds-col-lg-5 { grid-area: auto/span 5; }
8191
+ .kds-col-lg-6 { grid-area: auto/span 6; }
8192
+ .kds-col-lg-7 { grid-area: auto/span 7; }
8193
+ .kds-col-lg-8 { grid-area: auto/span 8; }
8194
+ .kds-col-lg-9 { grid-area: auto/span 9; }
8195
+ .kds-col-lg-10 { grid-area: auto/span 10; }
8196
+ .kds-col-lg-11 { grid-area: auto/span 11; }
8197
+ .kds-col-lg-12 { grid-area: auto/span 12; }
8198
+ }
8199
+