@khipu/design-system 0.2.0-alpha.5 → 0.2.0-alpha.50

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-14T20:21:09.081Z
14
+ * Generated: 2026-06-16T20:37:41.525Z
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;
@@ -846,7 +854,10 @@ a.kds-btn {
846
854
 
847
855
  /* Interaction */
848
856
  cursor: pointer;
849
- transition: background .15s, box-shadow .15s, transform .05s;
857
+ transition: background-color var(--kds-transition-shorter) var(--kds-easing-standard),
858
+ color var(--kds-transition-shorter) var(--kds-easing-standard),
859
+ box-shadow var(--kds-transition-shorter) var(--kds-easing-standard),
860
+ transform var(--kds-transition-shortest) var(--kds-easing-standard);
850
861
  box-sizing: border-box;
851
862
  vertical-align: middle;
852
863
  }
@@ -978,7 +989,7 @@ a.kds-btn-text {
978
989
 
979
990
  button.kds-btn-text:hover:not(:disabled),
980
991
  a.kds-btn-text:hover:not(:disabled) {
981
- background: var(--kds-color-primary-hover); /* rgba(131, 71, 173, 0.04) */
992
+ color: var(--kds-color-primary-dark);
982
993
  }
983
994
 
984
995
  button.kds-btn-text:disabled,
@@ -988,6 +999,30 @@ a.kds-btn-text:disabled {
988
999
  box-shadow: none;
989
1000
  }
990
1001
 
1002
+ /* Error text (destructive, ghost) — red text, no fill/border. Para acciones
1003
+ destructivas secundarias que no deben competir con el CTA primario. */
1004
+ button.kds-btn-error-text,
1005
+ a.kds-btn-error-text {
1006
+ background: transparent;
1007
+ color: var(--kds-color-error-main);
1008
+ border: none;
1009
+ padding: 6px var(--kds-spacing-2);
1010
+ min-height: 32px;
1011
+ box-shadow: none;
1012
+ }
1013
+
1014
+ button.kds-btn-error-text:hover:not(:disabled),
1015
+ a.kds-btn-error-text:hover:not(:disabled) {
1016
+ color: var(--kds-color-error-dark);
1017
+ }
1018
+
1019
+ button.kds-btn-error-text:disabled,
1020
+ a.kds-btn-error-text:disabled {
1021
+ background: transparent;
1022
+ color: var(--kds-color-action-disabled);
1023
+ box-shadow: none;
1024
+ }
1025
+
991
1026
  /* Icon wrapper - control size via span container */
992
1027
  button.kds-btn > .kds-icon,
993
1028
  a.kds-btn > .kds-icon {
@@ -1050,6 +1085,7 @@ a.kds-btn.kds-btn-md {
1050
1085
  padding: var(--kds-spacing-2);
1051
1086
  box-shadow: var(--kds-shadow-card);
1052
1087
  transition: box-shadow 0.3s ease;
1088
+ margin-block-start: 0 !important;
1053
1089
  }
1054
1090
 
1055
1091
  .kds-card-elevated:hover,
@@ -1072,63 +1108,90 @@ a.kds-btn.kds-btn-md {
1072
1108
  }
1073
1109
  }
1074
1110
 
1075
- /* Selection card */
1111
+ /* Selection card.
1112
+ IMPORTANTE: este componente se renderiza como `<button>`. BeerCSS aplica al
1113
+ `button` base: `display: inline-flex; align-items: center; justify-content: center;
1114
+ block-size: 2.5rem; padding: 0 1rem; background: var(--primary); color: on-primary`.
1115
+ Todas esas reglas hay que sobreescribirlas para que el card-selector funcione como
1116
+ un contenedor flex column de altura variable y alineado a la izquierda.
1117
+
1118
+ Convención del DS: spacing entre hijos via `gap` del flex padre + padding.
1119
+ Los elementos internos (.kds-card-selector-icon/-title/-description) NO usan margin. */
1076
1120
  .kds-card-selector {
1121
+ /* Reset BeerCSS button */
1122
+ display: flex;
1123
+ flex-direction: column;
1124
+ align-items: stretch;
1125
+ justify-content: flex-start;
1126
+ block-size: auto;
1127
+ inline-size: 100%;
1128
+ text-align: left;
1129
+ line-height: 1.5;
1130
+ color: var(--kds-color-text-primary);
1131
+ /* Estilos propios del card-selector */
1077
1132
  padding: var(--kds-spacing-3);
1133
+ gap: var(--kds-spacing-1-5);
1078
1134
  border-radius: var(--kds-radius-md);
1079
- border: 2px solid var(--kds-border-light);
1135
+ border: var(--kds-border-width-md) solid var(--kds-border-light);
1080
1136
  background: var(--kds-color-background-paper);
1081
1137
  transition: all 0.3s ease;
1082
- text-align: left;
1083
1138
  cursor: pointer;
1084
- display: flex;
1085
- flex-direction: column;
1086
1139
  }
1087
1140
 
1088
- .kds-card-selector:hover {
1089
- border-color: #D1D5DB; /* gray-300 */
1141
+ .kds-card-selector:hover:not(.selected) {
1142
+ border-color: var(--kds-color-primary-light);
1143
+ background: var(--kds-color-primary-hover);
1144
+ }
1145
+
1146
+ /* Override del ripple/overlay default de BeerCSS:
1147
+ `:is(.wave,.chip,.button,button,nav.tabbed>a,...):not([class*=ripple])::after`
1148
+ tiene specificity (0,2,4) según DevTools (Chrome cuenta cada selector dentro
1149
+ de :is() individualmente para algunos motores). Usamos !important — consistente
1150
+ con cómo se overridean otros estilos de BeerCSS en este archivo (67 usos previos).
1151
+ Antes pintaba negro porque `currentColor` resolvía a text-primary del card. */
1152
+ .kds-card-selector::after {
1153
+ background-image: radial-gradient(circle, var(--kds-color-primary-main) 1%, transparent 1%) !important;
1090
1154
  }
1091
1155
 
1092
1156
  .kds-card-selector.selected {
1093
- border-color: #3B82F6; /* blue-600 */
1094
- background: #EFF6FF; /* blue-50 */
1157
+ border-color: var(--kds-color-primary-main);
1158
+ background: var(--kds-color-primary-faint);
1095
1159
  box-shadow: var(--kds-shadow-md);
1096
1160
  }
1097
1161
 
1098
- /* Icon container */
1162
+ /* Icon container — spacing manejado por gap del padre, no margin */
1099
1163
  .kds-card-selector-icon {
1100
- width: 48px;
1101
- height: 48px;
1102
- background: #DBEAFE; /* blue-100 */
1103
- border-radius: 8px;
1164
+ width: var(--kds-spacing-6);
1165
+ height: var(--kds-spacing-6);
1166
+ background: var(--kds-color-primary-focus);
1167
+ border-radius: var(--kds-radius-sm);
1104
1168
  display: flex;
1105
1169
  align-items: center;
1106
1170
  justify-content: center;
1107
- margin-bottom: 16px;
1108
1171
  }
1109
1172
 
1110
1173
  .kds-card-selector-icon i,
1111
1174
  .kds-card-selector-icon svg {
1112
- width: 24px;
1113
- height: 24px;
1114
- min-width: 24px;
1115
- min-height: 24px;
1116
- color: #3B82F6; /* blue-600 */
1175
+ width: var(--kds-spacing-3);
1176
+ height: var(--kds-spacing-3);
1177
+ min-width: var(--kds-spacing-3);
1178
+ min-height: var(--kds-spacing-3);
1179
+ font-size: var(--kds-spacing-3);
1180
+ color: var(--kds-color-primary-main);
1117
1181
  }
1118
1182
 
1119
- /* Title */
1183
+ /* Title — spacing manejado por gap del padre, no margin */
1120
1184
  .kds-card-selector-title {
1121
- font-weight: 600;
1185
+ font-weight: var(--kds-font-weight-semibold);
1122
1186
  color: var(--kds-color-text-primary);
1123
- margin-bottom: 8px;
1124
- font-size: 16px;
1187
+ font-size: var(--kds-font-size-lg);
1125
1188
  }
1126
1189
 
1127
1190
  /* Description */
1128
1191
  .kds-card-selector-description {
1129
- font-size: 14px;
1130
- color: #4B5563; /* gray-600 */
1131
- line-height: 1.5;
1192
+ font-size: var(--kds-font-size-sm);
1193
+ color: var(--kds-color-text-secondary);
1194
+ line-height: var(--kds-line-height-normal);
1132
1195
  }
1133
1196
 
1134
1197
  /* Selected state - visual feedback via border only */
@@ -1140,14 +1203,22 @@ a.kds-btn.kds-btn-md {
1140
1203
  display: flex;
1141
1204
  flex-direction: column;
1142
1205
  gap: var(--kds-spacing-2);
1143
- padding: var(--kds-spacing-4);
1206
+ padding: var(--kds-spacing-2);
1144
1207
  border-radius: var(--kds-radius-lg);
1145
1208
  border: 2px solid var(--kds-border-medium);
1146
- max-width: 400px; /* Increased from 365px for better text spacing */
1209
+ /* Ancho mínimo aplicado a TODOS los planes así un plan sin badge en una
1210
+ grilla con un plan recomendado mantiene la misma anchura, y el badge nunca
1211
+ se superpone al título por estrechez del card. */
1212
+ min-width: 260px;
1213
+ max-width: 400px;
1147
1214
  background: var(--kds-surface-base);
1148
1215
  transition: all 0.3s ease;
1149
1216
  cursor: pointer;
1150
- height: 100%; /* Ensure cards fill grid height */
1217
+ /* Alto fijo: el card se estira al alto de su row del grid (align-items stretch
1218
+ es el default) — todas las cards de la misma fila quedan a la misma altura
1219
+ sin importar el contenido. `align-self: stretch` lo hace explícito. */
1220
+ height: 100%;
1221
+ align-self: stretch;
1151
1222
  }
1152
1223
 
1153
1224
  .kds-card-plan:hover {
@@ -1167,18 +1238,19 @@ a.kds-btn.kds-btn-md {
1167
1238
  box-shadow: var(--kds-shadow-elevation-4);
1168
1239
  }
1169
1240
 
1170
- /* Recommended Badge */
1241
+ /* Recommended Badge — inline dentro del card (no flotante).
1242
+ Es el primer hijo del .kds-card-plan, así que aparece arriba de todo
1243
+ el contenido, alineado a la izquierda. */
1171
1244
  .kds-card-plan-badge {
1172
- position: absolute;
1173
- top: -12px;
1174
- right: var(--kds-spacing-6);
1175
- padding: var(--kds-spacing-1) var(--kds-spacing-4);
1245
+ align-self: flex-start;
1246
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-1-5);
1176
1247
  background: var(--primary);
1177
1248
  color: white;
1178
- font-size: var(--kds-font-size-sm);
1249
+ font-size: var(--kds-font-size-xs);
1179
1250
  font-weight: var(--kds-font-weight-semibold);
1251
+ line-height: 1;
1180
1252
  border-radius: var(--kds-radius-full);
1181
- box-shadow: var(--kds-shadow-elevation-1);
1253
+ white-space: nowrap;
1182
1254
  }
1183
1255
 
1184
1256
  /* Plan Header */
@@ -1206,13 +1278,11 @@ a.kds-btn.kds-btn-md {
1206
1278
  display: flex;
1207
1279
  align-items: baseline;
1208
1280
  gap: var(--kds-spacing-2);
1209
- padding: var(--kds-spacing-4) 0;
1210
1281
  border-bottom: 1px solid var(--kds-border-light);
1211
- min-height: 88px; /* Standardize price area height */
1212
1282
  }
1213
1283
 
1214
1284
  .kds-price {
1215
- font-size: 42px;
1285
+ font-size: var(--kds-font-size-4xl);
1216
1286
  font-weight: var(--kds-font-weight-bold);
1217
1287
  color: var(--primary);
1218
1288
  line-height: 1.1;
@@ -1726,53 +1796,108 @@ a.kds-btn.kds-btn-md {
1726
1796
  }
1727
1797
 
1728
1798
  /* ========================================
1729
- Snackbar Positioning
1799
+ Snackbar Positioning & Styling
1730
1800
  ======================================== */
1731
1801
 
1732
1802
  .snackbar {
1733
1803
  position: fixed;
1734
- bottom: var(--kds-spacing-3);
1735
- left: 50%;
1736
- transform: translateX(-50%);
1737
1804
  z-index: var(--kds-z-index-snackbar);
1738
1805
  min-width: 344px;
1739
1806
  max-width: var(--kds-snackbar-max-width);
1740
1807
  box-shadow: var(--kds-shadow-8);
1808
+ border-radius: var(--kds-radius-md);
1809
+ padding: var(--kds-spacing-1-5) var(--kds-spacing-2);
1810
+ gap: var(--kds-spacing-1);
1811
+ font-family: var(--kds-font-family-primary);
1812
+ font-size: var(--kds-font-size-body2);
1813
+ font-weight: var(--kds-font-weight-medium);
1814
+ line-height: var(--kds-line-height-normal);
1815
+ letter-spacing: var(--kds-letter-spacing-normal);
1816
+ overflow: hidden;
1741
1817
  }
1742
1818
 
1743
1819
  /* Snackbar active state - ensure visibility when toggled via JS */
1744
1820
  .snackbar.active {
1745
1821
  visibility: visible !important;
1746
1822
  opacity: 1 !important;
1747
- transform: translateX(-50%) !important;
1748
1823
  }
1749
1824
 
1750
- /* Snackbar semantic variants - background + text/icon color */
1825
+ /* Snackbar semantic variants
1826
+ All use white text (--kds-color-primary-contrast) on solid semantic backgrounds */
1751
1827
  .snackbar.error {
1752
1828
  background-color: var(--kds-color-error-main) !important;
1753
- color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1829
+ color: var(--kds-color-primary-contrast) !important;
1754
1830
  }
1755
1831
 
1756
1832
  .snackbar.error i {
1757
- color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1833
+ color: var(--kds-color-primary-contrast) !important;
1758
1834
  }
1759
1835
 
1760
1836
  .snackbar.info {
1761
1837
  background-color: var(--kds-color-info-main) !important;
1762
- color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1838
+ color: var(--kds-color-primary-contrast) !important;
1763
1839
  }
1764
1840
 
1765
1841
  .snackbar.info i {
1766
- color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1842
+ color: var(--kds-color-primary-contrast) !important;
1767
1843
  }
1768
1844
 
1769
1845
  .snackbar.success {
1770
1846
  background-color: var(--kds-color-success-main) !important;
1771
- color: var(--on-success, var(--kds-color-primary-contrast)) !important;
1847
+ color: var(--kds-color-primary-contrast) !important;
1772
1848
  }
1773
1849
 
1774
1850
  .snackbar.success i {
1775
- color: var(--on-success, var(--kds-color-primary-contrast)) !important;
1851
+ color: var(--kds-color-primary-contrast) !important;
1852
+ }
1853
+
1854
+ /* Snackbar progress bar — animated timer for auto-dismiss */
1855
+ .snackbar[data-auto-dismiss]::after {
1856
+ content: '';
1857
+ position: absolute;
1858
+ bottom: 0;
1859
+ left: 0;
1860
+ height: 3px;
1861
+ width: 100%;
1862
+ background: rgba(255, 255, 255, 0.35);
1863
+ border-radius: 0 0 var(--kds-radius-md) var(--kds-radius-md);
1864
+ animation: kds-snackbar-timer var(--kds-snackbar-duration, 5s) linear forwards;
1865
+ }
1866
+
1867
+ @keyframes kds-snackbar-timer {
1868
+ from { width: 100%; }
1869
+ to { width: 0; }
1870
+ }
1871
+
1872
+ /* Snackbar close button */
1873
+ .kds-snackbar-close {
1874
+ background: none !important;
1875
+ border: none !important;
1876
+ color: var(--kds-color-primary-contrast) !important;
1877
+ cursor: pointer;
1878
+ padding: var(--kds-spacing-0-5) !important;
1879
+ margin: calc(-1 * var(--kds-spacing-0-5)) !important;
1880
+ margin-left: 0 !important;
1881
+ border-radius: var(--kds-radius-full) !important;
1882
+ display: flex;
1883
+ align-items: center;
1884
+ justify-content: center;
1885
+ flex-shrink: 0;
1886
+ opacity: 0.7;
1887
+ transition: opacity 150ms;
1888
+ min-width: auto !important;
1889
+ width: auto !important;
1890
+ height: auto !important;
1891
+ }
1892
+
1893
+ .kds-snackbar-close:hover {
1894
+ opacity: 1;
1895
+ background: rgba(255, 255, 255, 0.15) !important;
1896
+ }
1897
+
1898
+ .kds-snackbar-close i {
1899
+ font-size: 18px !important;
1900
+ color: var(--kds-color-primary-contrast) !important;
1776
1901
  }
1777
1902
 
1778
1903
  /* ========================================
@@ -1973,6 +2098,210 @@ a.kds-btn-google:disabled {
1973
2098
  height: var(--kds-spacing-button-icon-size);
1974
2099
  }
1975
2100
 
2101
+ /* ========================================
2102
+ KDS LINEAR PROGRESS
2103
+ Native <progress> (KdsLinearProgress). Additive over BeerCSS `progress`,
2104
+ scoped to .kds-progress so other consumers are unaffected.
2105
+ ======================================== */
2106
+
2107
+ /* `progress` is inline-block by default → leaves a baseline (descender) gap
2108
+ below the bar. Block removes that gap so it sits flush with siblings. */
2109
+ .kds-progress {
2110
+ display: block;
2111
+ }
2112
+
2113
+ /* Animate the filled value when it changes (e.g. advancing a step). BeerCSS
2114
+ sets the value background but no transition, so the width jumps abruptly. */
2115
+ .kds-progress::-webkit-progress-value {
2116
+ transition: width var(--kds-transition-standard) var(--kds-easing-standard);
2117
+ }
2118
+
2119
+ .kds-progress::-moz-progress-bar {
2120
+ transition: width var(--kds-transition-standard) var(--kds-easing-standard);
2121
+ }
2122
+
2123
+ /* ========================================
2124
+ KDS SECURE LOADER
2125
+ Loader de espera: anillo circular + candado centrado + frases opcionales.
2126
+ El anillo reutiliza el spinner circular de BeerCSS, escalado.
2127
+ ======================================== */
2128
+
2129
+ .kds-secure-loader {
2130
+ display: flex;
2131
+ flex-direction: column;
2132
+ align-items: center;
2133
+ justify-content: center;
2134
+ gap: var(--kds-spacing-4);
2135
+ text-align: center;
2136
+ /* Llena y centra dentro de contenedores flex (pantalla de carga); en flujo
2137
+ normal (contenedor no-flex) se reduce a su contenido. */
2138
+ flex: 1 1 auto;
2139
+ }
2140
+
2141
+ .kds-secure-loader-text {
2142
+ display: flex;
2143
+ flex-direction: column;
2144
+ gap: var(--kds-spacing-0-25);
2145
+ }
2146
+
2147
+ .kds-secure-loader-title {
2148
+ margin: 0;
2149
+ font-family: var(--kds-font-family-primary);
2150
+ font-size: var(--kds-font-size-h6);
2151
+ font-weight: var(--kds-font-weight-semibold);
2152
+ line-height: var(--kds-line-height-snug);
2153
+ color: var(--kds-color-text-primary);
2154
+ }
2155
+
2156
+ .kds-secure-loader-message {
2157
+ margin: 0;
2158
+ font-family: var(--kds-font-family-secondary);
2159
+ font-size: var(--kds-font-size-body1);
2160
+ line-height: var(--kds-line-height-normal);
2161
+ color: var(--kds-color-primary-main);
2162
+ }
2163
+
2164
+ /* Caja del spinner con tamaño fijo: la animación no altera el layout.
2165
+ 6.25rem (100px) = tamaño del loader original (CircularProgress size=100). */
2166
+ .kds-secure-loader-spinner {
2167
+ position: relative;
2168
+ display: inline-grid;
2169
+ place-items: center;
2170
+ inline-size: var(--kds-secure-loader-size, 6.25rem);
2171
+ block-size: var(--kds-secure-loader-size, 6.25rem);
2172
+ }
2173
+
2174
+ /* Anillo: SVG nativo con arco vía stroke-dasharray, rotando. Replica el
2175
+ CircularProgress original (viewBox 44u, thickness 2, arco ~63%, disableShrink). */
2176
+ .kds-secure-loader-ring {
2177
+ inline-size: var(--kds-secure-loader-size, 6.25rem);
2178
+ block-size: var(--kds-secure-loader-size, 6.25rem);
2179
+ animation: kds-secure-loader-spin 1.2s linear infinite;
2180
+ }
2181
+
2182
+ .kds-secure-loader-ring circle {
2183
+ fill: none;
2184
+ stroke: var(--kds-color-primary-main);
2185
+ stroke-width: 2;
2186
+ stroke-linecap: round;
2187
+ /* circunferencia ≈ 2π·20.2 ≈ 127; arco visible ≈ 80 (~63%) */
2188
+ stroke-dasharray: 80 127;
2189
+ }
2190
+
2191
+ @keyframes kds-secure-loader-spin {
2192
+ to {
2193
+ transform: rotate(360deg);
2194
+ }
2195
+ }
2196
+
2197
+ /* Candado centrado sobre el anillo (~0.3 del diámetro). Centrado explícito
2198
+ (top/left 50% + translate) para que no dependa del grid ni se recorte. */
2199
+ .kds-secure-loader-lock {
2200
+ position: absolute;
2201
+ top: 50%;
2202
+ left: 50%;
2203
+ transform: translate(-50%, -50%);
2204
+ color: var(--kds-color-text-secondary);
2205
+ font-size: calc(var(--kds-secure-loader-size, 6.25rem) * 0.3);
2206
+ line-height: 1;
2207
+ pointer-events: none;
2208
+ }
2209
+
2210
+ /* ========================================
2211
+ KDS COPY BUTTON
2212
+ Chip compacto que muestra un valor + icono copy y lo copia al click.
2213
+ Acción inline (distinto de KdsCopyRow). Look del copy button de khenshin.
2214
+ ======================================== */
2215
+
2216
+ .kds-copy-button {
2217
+ display: inline-flex;
2218
+ align-items: center;
2219
+ gap: var(--kds-spacing-1);
2220
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-1-5);
2221
+ border: none;
2222
+ border-radius: var(--kds-radius-button);
2223
+ background: var(--kds-alert-info-bg);
2224
+ color: var(--kds-color-info-dark);
2225
+ font-family: var(--kds-font-family-secondary);
2226
+ font-size: var(--kds-font-size-sm);
2227
+ font-weight: var(--kds-font-weight-medium);
2228
+ line-height: var(--kds-line-height-normal);
2229
+ cursor: pointer;
2230
+ transition: background-color var(--kds-transition-shorter) var(--kds-easing-standard),
2231
+ color var(--kds-transition-shorter) var(--kds-easing-standard);
2232
+ }
2233
+
2234
+ /* value y copiedText se apilan en la MISMA celda de grid: la celda toma el
2235
+ ancho del texto más largo, por lo que el botón conserva su ancho al alternar
2236
+ entre "valor" y "copiado" (sin reflow). */
2237
+ .kds-copy-button-label {
2238
+ display: inline-grid;
2239
+ }
2240
+
2241
+ .kds-copy-button-value,
2242
+ .kds-copy-button-copied {
2243
+ grid-area: 1 / 1;
2244
+ white-space: nowrap;
2245
+ }
2246
+
2247
+ /* Estado por defecto: visible el valor, oculto (pero ocupando espacio) el copiado */
2248
+ .kds-copy-button-copied {
2249
+ visibility: hidden;
2250
+ }
2251
+
2252
+ /* Al copiar se invierte la visibilidad; el ancho no cambia */
2253
+ .kds-copy-button.copied .kds-copy-button-value {
2254
+ visibility: hidden;
2255
+ }
2256
+
2257
+ .kds-copy-button.copied .kds-copy-button-copied {
2258
+ visibility: visible;
2259
+ }
2260
+
2261
+ .kds-copy-button .material-symbols-outlined {
2262
+ font-size: 1rem;
2263
+ color: var(--kds-color-info-main);
2264
+ flex-shrink: 0;
2265
+ }
2266
+
2267
+ .kds-copy-button.copied {
2268
+ background: var(--kds-alert-success-bg);
2269
+ color: var(--kds-alert-success-text);
2270
+ animation: kds-copy-button-pulse var(--kds-transition-short) var(--kds-easing-standard);
2271
+ }
2272
+
2273
+ .kds-copy-button.copied .material-symbols-outlined {
2274
+ color: var(--kds-color-success-main);
2275
+ /* el check entra con un pop al copiar */
2276
+ animation: kds-copy-button-pop var(--kds-transition-short) var(--kds-easing-standard);
2277
+ }
2278
+
2279
+ @keyframes kds-copy-button-pulse {
2280
+ 0% {
2281
+ transform: scale(1);
2282
+ }
2283
+ 50% {
2284
+ transform: scale(1.04);
2285
+ }
2286
+ 100% {
2287
+ transform: scale(1);
2288
+ }
2289
+ }
2290
+
2291
+ @keyframes kds-copy-button-pop {
2292
+ 0% {
2293
+ transform: scale(0.3);
2294
+ opacity: 0;
2295
+ }
2296
+ 60% {
2297
+ transform: scale(1.25);
2298
+ opacity: 1;
2299
+ }
2300
+ 100% {
2301
+ transform: scale(1);
2302
+ }
2303
+ }
2304
+
1976
2305
  /* ========================================
1977
2306
  Link Styles
1978
2307
  ======================================== */
@@ -2105,6 +2434,17 @@ body.dark {
2105
2434
  transition: border-color 0.2s, box-shadow 0.2s, outline-color 0.2s;
2106
2435
  }
2107
2436
 
2437
+ /* === TEXTAREA FIX === */
2438
+ /* BeerCSS base sets minimal block padding; add breathing room for textarea */
2439
+ .field > textarea {
2440
+ padding-block: 0.75rem;
2441
+ resize: vertical;
2442
+ }
2443
+
2444
+ .field.label > textarea {
2445
+ padding-block-start: 1.5rem;
2446
+ }
2447
+
2108
2448
  /* ==========================================
2109
2449
  NOTCH VISIBILITY (opacity)
2110
2450
  ========================================== */
@@ -2192,12 +2532,16 @@ body.dark {
2192
2532
  Asegurar que el dropdown arrow sea visible
2193
2533
  ========================================== */
2194
2534
 
2195
- /* Select: mantener appearance nativa para mostrar el dropdown arrow */
2535
+ /* Select: reset nativo + arrow custom via SVG (iOS Safari ignora estilos con appearance:auto) */
2196
2536
  .field select {
2197
- /* BeerCSS puede estar ocultando el arrow, aseguramos que sea visible */
2198
- appearance: auto;
2199
- -webkit-appearance: auto;
2200
- -moz-appearance: auto;
2537
+ -webkit-appearance: none;
2538
+ -moz-appearance: none;
2539
+ appearance: none;
2540
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='%23333' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");
2541
+ background-repeat: no-repeat;
2542
+ background-position: right var(--kds-spacing-1) center;
2543
+ background-size: 20px;
2544
+ padding-right: var(--kds-spacing-4) !important;
2201
2545
  }
2202
2546
 
2203
2547
  /* ==========================================
@@ -2222,6 +2566,23 @@ body.dark {
2222
2566
  color: var(--error); /* Rojo error */
2223
2567
  }
2224
2568
 
2569
+ /* ==========================================
2570
+ PASSWORD REVEAL TOGGLE (KdsTextField `revealable`)
2571
+ El <a role="button"> reusa el posicionamiento de icono de BeerCSS
2572
+ (.field > a, pointer-events: all). Aquí solo: color del icono
2573
+ (on-surface-variant) y un focus ring accesible para el toggle
2574
+ navegable por teclado (BeerCSS hace `outline: inherit` en <a>).
2575
+ ========================================== */
2576
+ .field > a.kds-field-reveal {
2577
+ color: var(--on-surface-variant);
2578
+ }
2579
+
2580
+ .field > a.kds-field-reveal:focus-visible {
2581
+ outline: 2px solid var(--primary);
2582
+ outline-offset: 2px;
2583
+ border-radius: 50%;
2584
+ }
2585
+
2225
2586
  /* ==========================================
2226
2587
  LABEL COLOR
2227
2588
  Mantener sincronizado con border
@@ -2329,6 +2690,71 @@ body.dark {
2329
2690
  display: inline-flex;
2330
2691
  }
2331
2692
 
2693
+ /* ========================================
2694
+ Radix Tooltip (.kds-tooltip)
2695
+ Espejo de `.tooltip` pero para popovers de Radix:
2696
+ bg oscuro, texto blanco, sombra + animación fade/slide direccional.
2697
+ ======================================== */
2698
+
2699
+ .kds-tooltip {
2700
+ background-color: var(--kds-color-text-primary);
2701
+ color: var(--kds-color-background-paper);
2702
+ font-family: var(--kds-font-family-primary);
2703
+ font-size: var(--kds-font-size-xs);
2704
+ font-weight: var(--kds-font-weight-medium);
2705
+ line-height: var(--kds-line-height-normal);
2706
+ border-radius: var(--kds-radius-sm);
2707
+ padding: var(--kds-spacing-0-75) var(--kds-spacing-1-5);
2708
+ box-shadow: var(--kds-shadow-4);
2709
+ max-width: 280px;
2710
+ z-index: var(--kds-z-index-tooltip, 1500);
2711
+ user-select: none;
2712
+ /* Animación direccional según Radix data-side — coordinada con copy-row
2713
+ (cubic-bezier 0.2, 0.8, 0.2, 1) para un feel consistente del DS. */
2714
+ animation-duration: 240ms;
2715
+ animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
2716
+ will-change: transform, opacity;
2717
+ }
2718
+
2719
+ .kds-tooltip[data-state='closed'] {
2720
+ animation-duration: 140ms;
2721
+ animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);
2722
+ }
2723
+
2724
+ /* Direccional según data-side (Radix añade el attr en runtime).
2725
+ Cada lado entra desde su dirección con ~8px de offset (más visible que 4px). */
2726
+ .kds-tooltip[data-side='top'][data-state='delayed-open'],
2727
+ .kds-tooltip[data-side='top'][data-state='instant-open'] { animation-name: kds-tooltip-in-top; }
2728
+ .kds-tooltip[data-side='bottom'][data-state='delayed-open'],
2729
+ .kds-tooltip[data-side='bottom'][data-state='instant-open'] { animation-name: kds-tooltip-in-bottom; }
2730
+ .kds-tooltip[data-side='left'][data-state='delayed-open'],
2731
+ .kds-tooltip[data-side='left'][data-state='instant-open'] { animation-name: kds-tooltip-in-left; }
2732
+ .kds-tooltip[data-side='right'][data-state='delayed-open'],
2733
+ .kds-tooltip[data-side='right'][data-state='instant-open'] { animation-name: kds-tooltip-in-right; }
2734
+
2735
+ /* Fallback cuando no hay data-side resuelto aún */
2736
+ .kds-tooltip[data-state='delayed-open']:not([data-side]),
2737
+ .kds-tooltip[data-state='instant-open']:not([data-side]) {
2738
+ animation-name: kds-tooltip-in-top;
2739
+ }
2740
+
2741
+ .kds-tooltip[data-state='closed'] { animation-name: kds-tooltip-out; }
2742
+
2743
+ @keyframes kds-tooltip-in-top { from { opacity: 0; transform: translateY(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2744
+ @keyframes kds-tooltip-in-bottom { from { opacity: 0; transform: translateY(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2745
+ @keyframes kds-tooltip-in-left { from { opacity: 0; transform: translateX(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2746
+ @keyframes kds-tooltip-in-right { from { opacity: 0; transform: translateX(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2747
+
2748
+ @keyframes kds-tooltip-out {
2749
+ from { opacity: 1; transform: none; }
2750
+ to { opacity: 0; transform: scale(0.96); }
2751
+ }
2752
+
2753
+ /* Arrow (SVG path generado por Radix) */
2754
+ .kds-tooltip-arrow {
2755
+ fill: var(--kds-color-text-primary);
2756
+ }
2757
+
2332
2758
  /* ========================================
2333
2759
  Material Symbols Icon Sizing
2334
2760
  ======================================== */
@@ -2745,7 +3171,8 @@ dialog.modal .field.border:focus-within {
2745
3171
  padding: var(--kds-spacing-2);
2746
3172
  }
2747
3173
 
2748
- .snackbar {
3174
+ .snackbar,
3175
+ .snackbar.active {
2749
3176
  min-width: calc(100% - 32px);
2750
3177
  left: 16px;
2751
3178
  right: 16px;
@@ -3044,6 +3471,32 @@ footer > .kds-container-center {
3044
3471
  color: var(--kds-color-error-dark);
3045
3472
  }
3046
3473
 
3474
+ /* Close button — icon-only, discreto, no usa kds-btn para no romper el flex layout del alert */
3475
+ .kds-alert-close {
3476
+ flex-shrink: 0;
3477
+ display: inline-flex;
3478
+ align-items: center;
3479
+ justify-content: center;
3480
+ width: 28px;
3481
+ height: 28px;
3482
+ padding: 0;
3483
+ background: transparent;
3484
+ border: 0;
3485
+ border-radius: 50%;
3486
+ color: inherit;
3487
+ cursor: pointer;
3488
+ transition: background-color 0.15s ease;
3489
+ }
3490
+
3491
+ .kds-alert-close:hover {
3492
+ background: rgba(0, 0, 0, 0.06);
3493
+ }
3494
+
3495
+ .kds-alert-close i {
3496
+ font-size: 18px;
3497
+ line-height: 1;
3498
+ }
3499
+
3047
3500
  /* Lists inside alerts */
3048
3501
  .kds-alert ul {
3049
3502
  padding-left: var(--kds-spacing-2);
@@ -4040,20 +4493,76 @@ dialog#surveyModal button.circle {
4040
4493
  text-align: center;
4041
4494
  }
4042
4495
 
4043
- .kds-text-underline {
4044
- text-decoration: underline;
4496
+ .kds-text-left {
4497
+ text-align: left;
4498
+ }
4499
+
4500
+ .kds-text-right {
4501
+ text-align: right;
4502
+ }
4503
+
4504
+ .kds-text-underline {
4505
+ text-decoration: underline;
4506
+ }
4507
+
4508
+ .kds-text-no-decoration {
4509
+ text-decoration: none;
4510
+ }
4511
+
4512
+ .kds-text-muted {
4513
+ color: var(--on-surface-variant);
4514
+ }
4515
+
4516
+ .kds-text-sm {
4517
+ font-size: var(--kds-font-size-sm);
4518
+ }
4519
+
4520
+ /* ── Font-size scale utilities (additive — opt-in companions to .kds-text-sm) ── */
4521
+ .kds-text-base {
4522
+ font-size: var(--kds-font-size-base);
4523
+ }
4524
+
4525
+ .kds-text-lg {
4526
+ font-size: var(--kds-font-size-lg);
4527
+ }
4528
+
4529
+ .kds-text-xl {
4530
+ font-size: var(--kds-font-size-xl);
4531
+ }
4532
+
4533
+ .kds-text-2xl {
4534
+ font-size: var(--kds-font-size-2xl);
4535
+ }
4536
+
4537
+ /* ── Font-weight utilities ── */
4538
+ .kds-fw-regular {
4539
+ font-weight: var(--kds-font-weight-regular);
4540
+ }
4541
+
4542
+ .kds-fw-medium {
4543
+ font-weight: var(--kds-font-weight-medium);
4544
+ }
4545
+
4546
+ .kds-fw-semibold {
4547
+ font-weight: var(--kds-font-weight-semibold);
4548
+ }
4549
+
4550
+ .kds-fw-bold {
4551
+ font-weight: var(--kds-font-weight-bold);
4045
4552
  }
4046
4553
 
4047
- .kds-text-no-decoration {
4048
- text-decoration: none;
4554
+ /* ── Text-transform utilities ── */
4555
+ .kds-text-transform-none {
4556
+ text-transform: none;
4049
4557
  }
4050
4558
 
4051
- .kds-text-muted {
4052
- color: var(--on-surface-variant);
4559
+ /* ── Soft background utilities (semantic muted backgrounds for callouts) ── */
4560
+ .kds-bg-warning-soft {
4561
+ background-color: var(--kds-color-warning-soft);
4053
4562
  }
4054
4563
 
4055
- .kds-text-sm {
4056
- font-size: var(--kds-font-size-sm);
4564
+ .kds-bg-info-soft {
4565
+ background-color: var(--kds-color-info-soft);
4057
4566
  }
4058
4567
 
4059
4568
  /* ── Typography variants ── */
@@ -4146,6 +4655,12 @@ dialog#surveyModal button.circle {
4146
4655
  color: var(--kds-color-primary-dark, #5B3179);
4147
4656
  }
4148
4657
 
4658
+ /* Inline emphasis: bold weight only, inherits size/color/family from context so it
4659
+ works as a highlighted fragment inside any other variant (body, heading, etc.). */
4660
+ .kds-text-strong {
4661
+ font-weight: var(--kds-font-weight-bold, 700);
4662
+ }
4663
+
4149
4664
  /* Display utilities */
4150
4665
  .kds-hidden {
4151
4666
  display: none;
@@ -4266,7 +4781,9 @@ dialog#surveyModal button.circle {
4266
4781
  ======================================== */
4267
4782
 
4268
4783
  .kds-badge {
4269
- display: inline-block;
4784
+ display: inline-flex;
4785
+ align-items: center;
4786
+ gap: 4px;
4270
4787
  padding: 2px 8px;
4271
4788
  border-radius: var(--kds-radius-sm);
4272
4789
  font-size: var(--kds-font-size-xs);
@@ -4274,6 +4791,40 @@ dialog#surveyModal button.circle {
4274
4791
  line-height: 1.5;
4275
4792
  }
4276
4793
 
4794
+ /* Icon prefix inside chip — small inline icon */
4795
+ .kds-badge > i.material-symbols-outlined {
4796
+ font-size: 14px;
4797
+ line-height: 1;
4798
+ }
4799
+
4800
+ /* Deletable chip close button — discreto, sin kds-btn (eso lo agrandaba ridículo) */
4801
+ .kds-badge-close {
4802
+ display: inline-flex;
4803
+ align-items: center;
4804
+ justify-content: center;
4805
+ width: 16px;
4806
+ height: 16px;
4807
+ margin-right: -2px;
4808
+ padding: 0;
4809
+ background: transparent;
4810
+ border: 0;
4811
+ border-radius: 50%;
4812
+ color: inherit;
4813
+ cursor: pointer;
4814
+ opacity: 0.7;
4815
+ transition: opacity 0.15s, background-color 0.15s;
4816
+ }
4817
+
4818
+ .kds-badge-close:hover {
4819
+ opacity: 1;
4820
+ background: rgba(0, 0, 0, 0.1);
4821
+ }
4822
+
4823
+ .kds-badge-close i {
4824
+ font-size: 14px;
4825
+ line-height: 1;
4826
+ }
4827
+
4277
4828
  .kds-badge.success {
4278
4829
  background-color: var(--kds-color-success-container);
4279
4830
  color: var(--kds-color-success-dark);
@@ -4552,6 +5103,11 @@ dialog#surveyModal button.circle {
4552
5103
  color: var(--kds-color-text-primary);
4553
5104
  }
4554
5105
 
5106
+ /* Opt-in color modifier — switches the value to the LigoPay/khipu-blue tone */
5107
+ .kds-amount-value--info {
5108
+ color: var(--kds-color-info-blue); /* #5A5FE0 */
5109
+ }
5110
+
4555
5111
  .kds-amount-value small {
4556
5112
  font-size: 18px;
4557
5113
  font-weight: 500;
@@ -4909,7 +5465,7 @@ dialog#surveyModal button.circle {
4909
5465
  display: flex;
4910
5466
  align-items: center;
4911
5467
  justify-content: center;
4912
- gap: var(--kds-spacing-1);
5468
+ gap: var(--kds-spacing-0-5);
4913
5469
  color: var(--kds-color-gray-400);
4914
5470
  font-size: var(--kds-font-size-xs);
4915
5471
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -4921,6 +5477,10 @@ dialog#surveyModal button.circle {
4921
5477
  display: none;
4922
5478
  }
4923
5479
 
5480
+ .kds-screen > form {
5481
+ margin-block-start: 0 !important;
5482
+ }
5483
+
4924
5484
  @media (max-width: 767px) {
4925
5485
  .kds-card-elevated > .kds-secure-footer {
4926
5486
  display: flex;
@@ -4970,14 +5530,20 @@ dialog#surveyModal button.circle {
4970
5530
  cursor: pointer;
4971
5531
  display: inline-flex;
4972
5532
  align-items: center;
4973
- gap: var(--kds-spacing-0-75);
5533
+ gap: 0;
4974
5534
  }
4975
5535
 
4976
- .kds-expand-toggle:hover {
5536
+ .kds-expand-toggle:hover,
5537
+ .kds-expand-toggle:focus,
5538
+ .kds-expand-toggle:active {
4977
5539
  background: transparent;
5540
+ outline: none;
5541
+ box-shadow: none;
4978
5542
  }
4979
5543
 
4980
- .kds-expand-toggle:hover span {
5544
+ .kds-expand-toggle:hover span,
5545
+ .kds-expand-toggle:focus span,
5546
+ .kds-expand-toggle:active span {
4981
5547
  text-decoration: underline;
4982
5548
  }
4983
5549
 
@@ -5157,11 +5723,11 @@ dialog#surveyModal button.circle {
5157
5723
  color: var(--kds-color-success-main);
5158
5724
  }
5159
5725
 
5160
- /* Variant: pending (animated spinner) */
5726
+ /* Variant: pending (animated blue spinner, sin icono interno) */
5161
5727
  .kds-status-block[data-status="pending"] .kds-status-block-icon {
5162
5728
  background: transparent;
5163
5729
  border: 3px solid var(--kds-color-divider);
5164
- border-top-color: var(--kds-color-primary-main);
5730
+ border-top-color: var(--kds-color-info-main);
5165
5731
  animation: kds-spin 1s linear infinite;
5166
5732
  }
5167
5733
 
@@ -5179,12 +5745,21 @@ dialog#surveyModal button.circle {
5179
5745
  color: var(--kds-color-error-main);
5180
5746
  }
5181
5747
 
5748
+ /* Variant: info — usar SIEMPRE con icon "info_i" (i minúscula sin glyph circular)
5749
+ para que solo se vea nuestro círculo decorativo. Iconos como "info" tienen
5750
+ su propio círculo built-in → causarían doble círculo. */
5751
+ .kds-status-block[data-status="info"] .kds-status-block-icon {
5752
+ background: var(--kds-color-info-soft);
5753
+ border: var(--kds-border-width-md) solid var(--kds-color-info-main);
5754
+ color: var(--kds-color-info-main);
5755
+ }
5756
+
5182
5757
  /* Inline variant: icon left + text right */
5183
5758
  .kds-status-block.inline {
5184
5759
  text-align: left;
5185
5760
  display: flex;
5186
5761
  align-items: center;
5187
- gap: var(--kds-spacing-3);
5762
+ gap: var(--kds-spacing-2);
5188
5763
  padding: var(--kds-spacing-1) 0;
5189
5764
  }
5190
5765
 
@@ -5246,6 +5821,40 @@ dialog#surveyModal button.circle {
5246
5821
  background: var(--kds-color-divider);
5247
5822
  }
5248
5823
 
5824
+ /* Close button — top-right discreto, NO usa kds-btn (rompía el flex layout) */
5825
+ .kds-bottom-sheet-close {
5826
+ position: absolute;
5827
+ top: var(--kds-spacing-1);
5828
+ right: var(--kds-spacing-1);
5829
+ width: 32px;
5830
+ height: 32px;
5831
+ display: inline-flex;
5832
+ align-items: center;
5833
+ justify-content: center;
5834
+ padding: 0;
5835
+ background: transparent;
5836
+ border: 0;
5837
+ border-radius: 50%;
5838
+ color: var(--kds-color-text-secondary);
5839
+ cursor: pointer;
5840
+ transition: background-color 0.15s ease;
5841
+ }
5842
+
5843
+ .kds-bottom-sheet-close:hover {
5844
+ background: rgba(0, 0, 0, 0.06);
5845
+ }
5846
+
5847
+ .kds-bottom-sheet-close i {
5848
+ font-size: 20px;
5849
+ line-height: 1;
5850
+ }
5851
+
5852
+ /* Body container — separa el content del title/actions */
5853
+ .kds-bottom-sheet-body {
5854
+ text-align: left;
5855
+ margin-top: var(--kds-spacing-1);
5856
+ }
5857
+
5249
5858
  .kds-bottom-sheet-icon {
5250
5859
  font-size: var(--kds-font-size-4xl);
5251
5860
  }
@@ -5575,6 +6184,13 @@ div.kds-invoice-header,
5575
6184
  align-content: initial;
5576
6185
  }
5577
6186
 
6187
+ /* Mobile collapsed state: center-align so merchant tile aligns with the smaller amount */
6188
+ @media (max-width: 767px) {
6189
+ .kds-invoice-sticky.is-collapsed .kds-invoice-header {
6190
+ align-items: center;
6191
+ }
6192
+ }
6193
+
5578
6194
  /* Reset BeerCSS sibling margin on <p> inside invoice header — specificity (0,4,1) ties BeerCSS, wins by source order */
5579
6195
  .kds-card-elevated.kds-invoice-sticky .kds-invoice-header p.kds-invoice-amount,
5580
6196
  .kds-card-elevated.kds-invoice-sticky .kds-invoice-header p.kds-invoice-code {
@@ -5582,7 +6198,7 @@ div.kds-invoice-header,
5582
6198
  }
5583
6199
 
5584
6200
  .kds-invoice-amount {
5585
- font-weight: var(--kds-font-weight-bold);
6201
+ font-weight: var(--kds-font-weight-semibold);
5586
6202
  font-size: var(--kds-font-size-3xl);
5587
6203
  line-height: var(--kds-line-height-tight);
5588
6204
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -5603,10 +6219,16 @@ div.kds-invoice-header,
5603
6219
  color: var(--kds-color-gray-400);
5604
6220
  text-transform: uppercase;
5605
6221
  margin: 0;
5606
- margin-top: var(--kds-spacing-1);
6222
+ margin-block: unset;
6223
+ display: flex;
6224
+ gap: var(--kds-spacing-1-5);
5607
6225
  }
5608
6226
 
5609
6227
  .kds-invoice-code-value {
6228
+ color: var(--kds-color-gray-400);
6229
+ }
6230
+
6231
+ .kds-invoice-code-value--lowercase {
5610
6232
  text-transform: lowercase;
5611
6233
  }
5612
6234
 
@@ -5619,6 +6241,9 @@ div.kds-invoice-header,
5619
6241
  place-items: center;
5620
6242
  color: #fff;
5621
6243
  flex-shrink: 0;
6244
+ /* Clip the slightly-oversized logo (see `.kds-invoice-merchant img`) to the
6245
+ rounded square so it can fully cover the deep-purple background. */
6246
+ overflow: hidden;
5622
6247
  }
5623
6248
 
5624
6249
  .kds-invoice-merchant i {
@@ -5638,15 +6263,18 @@ div.kds-invoice-header,
5638
6263
  }
5639
6264
 
5640
6265
  .kds-invoice-merchant img {
5641
- width: 100%;
5642
- height: 100%;
6266
+ /* Slightly larger than the container (+2px, centered by the grid) so the
6267
+ logo overflows under the parent's rounded clip and the deep-purple
6268
+ background never peeks through at the corners when the logo shrinks. */
6269
+ width: calc(100% + 2px);
6270
+ height: calc(100% + 2px);
5643
6271
  object-fit: cover;
5644
6272
  border-radius: var(--kds-radius-md);
5645
6273
  }
5646
6274
 
5647
6275
  /* -- Card Title -- */
5648
6276
  .kds-card-title {
5649
- font-weight: 700;
6277
+ font-weight: var(--kds-font-weight-semibold);
5650
6278
  font-size: var(--kds-font-size-base);
5651
6279
  line-height: 1.5;
5652
6280
  letter-spacing: -0.31px;
@@ -5654,12 +6282,22 @@ div.kds-invoice-header,
5654
6282
  margin-bottom: var(--kds-spacing-2) !important;
5655
6283
  }
5656
6284
 
6285
+ /* Opt-in size modifiers (additive — do NOT change default 16/600) */
6286
+ .kds-card-title--lg {
6287
+ font-size: var(--kds-font-size-xl); /* 20px */
6288
+ font-weight: var(--kds-font-weight-semibold);
6289
+ }
6290
+
6291
+ .kds-card-title--xl {
6292
+ font-size: var(--kds-font-size-2xl); /* 24px */
6293
+ font-weight: var(--kds-font-weight-semibold);
6294
+ }
6295
+
5657
6296
  /* -- Key-Value Grid -- */
5658
6297
  .kds-kv {
5659
6298
  display: grid;
5660
6299
  grid-template-columns: auto 1fr;
5661
- row-gap: var(--kds-spacing-1);
5662
- column-gap: var(--kds-spacing-1-5);
6300
+ column-gap: var(--kds-spacing-1);
5663
6301
  align-items: baseline;
5664
6302
  }
5665
6303
 
@@ -5676,7 +6314,7 @@ div.kds-invoice-header,
5676
6314
  margin: 0;
5677
6315
  font-size: var(--kds-font-size-sm);
5678
6316
  line-height: var(--kds-line-height-relaxed);
5679
- font-weight: var(--kds-font-weight-bold);
6317
+ font-weight: var(--kds-font-weight-semibold);
5680
6318
  letter-spacing: normal;
5681
6319
  color: var(--kds-color-gray-800);
5682
6320
  min-width: 0;
@@ -5706,7 +6344,13 @@ div.kds-invoice-header,
5706
6344
  flex-direction: column;
5707
6345
  gap: var(--kds-spacing-1-5);
5708
6346
  margin: 0;
5709
- padding: 0 0 var(--kds-spacing-1);
6347
+ padding: 0;
6348
+ }
6349
+
6350
+ @media (max-width: 767px) {
6351
+ .kds-detail-list {
6352
+ padding-bottom: var(--kds-spacing-2);
6353
+ }
5710
6354
  }
5711
6355
 
5712
6356
  .kds-detail-group {
@@ -5722,7 +6366,6 @@ div.kds-invoice-header,
5722
6366
  letter-spacing: var(--kds-letter-spacing-wide);
5723
6367
  color: var(--kds-color-text-hint);
5724
6368
  text-transform: uppercase;
5725
- margin: 0 0 var(--kds-spacing-0-5);
5726
6369
  }
5727
6370
 
5728
6371
  .kds-detail-group dd {
@@ -5791,16 +6434,16 @@ div.kds-invoice-header,
5791
6434
  font-size: var(--kds-font-size-sm);
5792
6435
  }
5793
6436
 
5794
- .kds-recap-list .k {
6437
+ .kds-recap-list .kds-key {
5795
6438
  color: var(--kds-color-text-secondary);
5796
6439
  }
5797
6440
 
5798
- .kds-recap-list .v {
6441
+ .kds-recap-list .kds-value {
5799
6442
  color: var(--kds-color-text-primary);
5800
6443
  font-weight: 500;
5801
6444
  }
5802
6445
 
5803
- .kds-recap-list .v.placeholder {
6446
+ .kds-recap-list .kds-value.placeholder {
5804
6447
  color: var(--kds-color-text-hint);
5805
6448
  }
5806
6449
 
@@ -5827,6 +6470,72 @@ a.kds-btn-success:disabled {
5827
6470
  box-shadow: none;
5828
6471
  }
5829
6472
 
6473
+ /* -- Button Warning (amber CTA) -- */
6474
+ button.kds-btn-warning,
6475
+ a.kds-btn-warning {
6476
+ background: var(--kds-color-warning-main);
6477
+ color: var(--kds-color-warning-contrast);
6478
+ border: none;
6479
+ }
6480
+
6481
+ button.kds-btn-warning:hover:not(:disabled),
6482
+ a.kds-btn-warning:hover:not(:disabled) {
6483
+ background: var(--kds-color-warning-dark);
6484
+ }
6485
+
6486
+ button.kds-btn-warning:active:not(:disabled),
6487
+ button.kds-btn-warning:focus-visible:not(:disabled),
6488
+ a.kds-btn-warning:active:not(:disabled),
6489
+ a.kds-btn-warning:focus-visible:not(:disabled) {
6490
+ background: var(--kds-color-warning-dark);
6491
+ outline: 2px solid var(--kds-color-warning-main);
6492
+ outline-offset: 2px;
6493
+ }
6494
+
6495
+ button.kds-btn-warning:disabled,
6496
+ a.kds-btn-warning:disabled {
6497
+ background-color: var(--kds-color-action-disabled-bg);
6498
+ color: var(--kds-color-action-disabled);
6499
+ box-shadow: none;
6500
+ }
6501
+
6502
+ button.kds-btn-warning::after {
6503
+ display: none;
6504
+ }
6505
+
6506
+ /* -- Button Error (red / destructive CTA) -- */
6507
+ button.kds-btn-error,
6508
+ a.kds-btn-error {
6509
+ background: var(--kds-color-error-main);
6510
+ color: var(--kds-color-error-contrast);
6511
+ border: none;
6512
+ }
6513
+
6514
+ button.kds-btn-error:hover:not(:disabled),
6515
+ a.kds-btn-error:hover:not(:disabled) {
6516
+ background: var(--kds-color-error-dark);
6517
+ }
6518
+
6519
+ button.kds-btn-error:active:not(:disabled),
6520
+ button.kds-btn-error:focus-visible:not(:disabled),
6521
+ a.kds-btn-error:active:not(:disabled),
6522
+ a.kds-btn-error:focus-visible:not(:disabled) {
6523
+ background: var(--kds-color-error-dark);
6524
+ outline: 2px solid var(--kds-color-error-main);
6525
+ outline-offset: 2px;
6526
+ }
6527
+
6528
+ button.kds-btn-error:disabled,
6529
+ a.kds-btn-error:disabled {
6530
+ background-color: var(--kds-color-action-disabled-bg);
6531
+ color: var(--kds-color-action-disabled);
6532
+ box-shadow: none;
6533
+ }
6534
+
6535
+ button.kds-btn-error::after {
6536
+ display: none;
6537
+ }
6538
+
5830
6539
  /* -- Field Helper Text -- */
5831
6540
  .kds-field-helper {
5832
6541
  font-size: var(--kds-font-size-xs);
@@ -5869,6 +6578,8 @@ button.kds-btn-success::after {
5869
6578
  /* -- Alert inline (borderless, used inside cards) -- */
5870
6579
  .kds-alert-inline {
5871
6580
  border: none;
6581
+ padding: var(--kds-spacing-1) var(--kds-spacing-1-5);
6582
+ margin-bottom: var(--kds-spacing-1-5);
5872
6583
  }
5873
6584
 
5874
6585
  /* -- Card dimmed (behind overlays) -- */
@@ -5970,17 +6681,42 @@ button.kds-btn-success::after {
5970
6681
  }
5971
6682
 
5972
6683
  .kds-bill-description-picture {
5973
- width: 120px;
5974
- height: 120px;
6684
+ max-width: 100px;
5975
6685
  object-fit: contain;
5976
6686
  background: var(--kds-color-background-paper);
5977
- padding: var(--kds-spacing-1-25);
5978
- border-radius: var(--kds-radius-md);
5979
- margin-top: var(--kds-spacing-1);
6687
+ margin-top: var(--kds-spacing-1-25);
5980
6688
  display: block;
5981
6689
  box-sizing: content-box;
5982
6690
  }
5983
6691
 
6692
+ /* -- Bill Attachments -- */
6693
+ .kds-bill-attachments {
6694
+ display: flex;
6695
+ flex-direction: column;
6696
+ gap: var(--kds-spacing-0-75);
6697
+ }
6698
+
6699
+ .kds-bill-attachment {
6700
+ display: inline-flex;
6701
+ align-items: center;
6702
+ justify-content: flex-start;
6703
+ width: fit-content;
6704
+ color: var(--kds-color-info-main);
6705
+ font-size: var(--kds-font-size-sm);
6706
+ font-weight: var(--kds-font-weight-medium);
6707
+ text-decoration: none;
6708
+ }
6709
+
6710
+ .kds-bill-attachment:hover span {
6711
+ text-decoration: underline;
6712
+ }
6713
+
6714
+ .kds-bill-attachment i {
6715
+ font-size: var(--kds-font-size-lg);
6716
+ min-width: unset;
6717
+ justify-content: flex-start;
6718
+ }
6719
+
5984
6720
  /* -- Share Card (mustContinue) -- */
5985
6721
  .kds-share-card {
5986
6722
  margin-top: var(--kds-spacing-2);
@@ -6093,6 +6829,14 @@ button.kds-btn-success::after {
6093
6829
  padding-top: 0;
6094
6830
  padding-bottom: 0;
6095
6831
  }
6832
+
6833
+ /* Reset BeerCSS sibling margin on form/section inside payment cards.
6834
+ BeerCSS sets `:not(.grid,nav,.row) > … + form/section { margin-block-start:1rem }`
6835
+ which adds unwanted spacing inside cards that contain forms. */
6836
+ .kds-payment-flow .kds-card-elevated > form,
6837
+ .kds-payment-flow .kds-card-elevated > section {
6838
+ margin-block-start: 0;
6839
+ }
6096
6840
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6097
6841
  padding-top: var(--kds-spacing-1);
6098
6842
  padding-bottom: 0;
@@ -6142,10 +6886,17 @@ button.kds-btn-success::after {
6142
6886
  padding-bottom: var(--kds-spacing-2);
6143
6887
  }
6144
6888
 
6145
- /* Invoice sticky card: progressive padding-top (expanded 20px → collapsed 8px).
6146
- Overrides base rule at same specificity; source order wins here. */
6889
+ /* Invoice sticky card padding (mobile).
6890
+ Top: estático 12px. Bottom: progresivo 20px (expandido) 8px (colapsado).
6891
+ El padding-bottom animado da breathing room natural cuando expandido y se
6892
+ reduce convencionalmente al colapsar — sin depender de que el clip-path
6893
+ corte el padding abruptamente. */
6147
6894
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6148
6895
  padding-top: var(--kds-spacing-1-5);
6896
+ padding-bottom: calc(
6897
+ var(--kds-spacing-2-5)
6898
+ - var(--kds-spacing-1-5) * var(--collapse-progress, 0)
6899
+ );
6149
6900
  }
6150
6901
 
6151
6902
 
@@ -6184,7 +6935,8 @@ button.kds-btn-success::after {
6184
6935
  }
6185
6936
  .kds-brand-inner svg,
6186
6937
  .kds-brand-inner img {
6187
- height: 22px;
6938
+ width: calc(50px - 16px * var(--collapse-progress, 0));
6939
+ height: auto;
6188
6940
  display: block;
6189
6941
  }
6190
6942
 
@@ -6403,7 +7155,7 @@ button.kds-btn-success::after {
6403
7155
  inset: 0;
6404
7156
  background: var(--kds-modal-backdrop);
6405
7157
  display: none;
6406
- align-items: center;
7158
+ align-items: flex-start;
6407
7159
  justify-content: center;
6408
7160
  z-index: var(--kds-z-index-modal, 50);
6409
7161
  animation: kds-fade 0.2s ease both;
@@ -6431,7 +7183,7 @@ button.kds-btn-success::after {
6431
7183
  display: flex;
6432
7184
  align-items: center;
6433
7185
  justify-content: space-between;
6434
- padding: var(--kds-spacing-2) var(--kds-spacing-2) var(--kds-spacing-1);
7186
+ padding: var(--kds-spacing-1) var(--kds-spacing-2) var(--kds-spacing-1);
6435
7187
  }
6436
7188
 
6437
7189
  .kds-bank-modal-header h3 {
@@ -6578,7 +7330,7 @@ button.kds-btn-success::after {
6578
7330
  min-width: 0;
6579
7331
  }
6580
7332
 
6581
- .kds-qr-text .title {
7333
+ .kds-qr-text .kds-qr-title {
6582
7334
  font-family: var(--kds-font-family-primary);
6583
7335
  font-weight: 600;
6584
7336
  font-size: var(--kds-font-size-sm);
@@ -6586,10 +7338,15 @@ button.kds-btn-success::after {
6586
7338
  color: var(--kds-color-text-primary);
6587
7339
  }
6588
7340
 
6589
- .kds-qr-text .sub {
7341
+ .kds-qr-text .kds-qr-subtitle {
6590
7342
  font-family: var(--kds-font-family-primary);
6591
7343
  font-size: var(--kds-font-size-caption);
6592
7344
  color: var(--kds-color-text-secondary);
7345
+ /* Trunca con ellipsis en lugar de wrap a 2 líneas — evita apretar el row
7346
+ cuando el contenedor es angosto (mobile o decorator constrained). */
7347
+ overflow: hidden;
7348
+ text-overflow: ellipsis;
7349
+ white-space: nowrap;
6593
7350
  }
6594
7351
 
6595
7352
  /* QR Badge - "Rápido" indicator */
@@ -6612,46 +7369,26 @@ button.kds-btn-success::after {
6612
7369
  font-size: 20px;
6613
7370
  }
6614
7371
 
6615
- /* Mobile responsive: Ajustes para pantallas pequeñas */
7372
+ /* Mobile responsive (≤480px): respira más mantenemos padding/gap/avatar igual
7373
+ que desktop y solo agregamos truncation al subtitle y `flex-shrink: 0` en los
7374
+ ítems que deben mantener su tamaño (avatar, badge, chevron). */
6616
7375
  @media (max-width: 480px) {
6617
- .kds-qr-row {
6618
- gap: var(--kds-spacing-1-5);
6619
- padding: var(--kds-spacing-1-5);
6620
- }
6621
-
6622
7376
  .kds-qr-avatar {
6623
- width: var(--kds-spacing-4-5);
6624
- height: var(--kds-spacing-4-5);
6625
7377
  flex-shrink: 0;
6626
7378
  }
6627
7379
 
6628
- .kds-qr-avatar .material-symbols-outlined,
6629
- .kds-qr-avatar .material-icons-round {
6630
- font-size: var(--kds-font-size-lg);
6631
- }
6632
-
6633
- .kds-qr-text .title {
6634
- font-size: var(--kds-font-size-xs);
6635
- line-height: var(--kds-line-height-tight);
6636
- }
6637
-
6638
7380
  .kds-qr-text .sub {
6639
- font-size: var(--kds-font-size-caption);
6640
- line-height: var(--kds-line-height-tight);
6641
7381
  overflow: hidden;
6642
7382
  text-overflow: ellipsis;
6643
7383
  white-space: nowrap;
6644
7384
  }
6645
7385
 
6646
7386
  .kds-qr-badge {
6647
- font-size: var(--kds-font-size-caption);
6648
- padding: var(--kds-spacing-0-25) var(--kds-spacing-0-75);
6649
7387
  flex-shrink: 0;
6650
7388
  }
6651
7389
 
6652
7390
  .kds-qr-row .material-symbols-outlined:last-child,
6653
7391
  .kds-qr-row .material-icons-round:last-child {
6654
- font-size: var(--kds-font-size-base);
6655
7392
  flex-shrink: 0;
6656
7393
  }
6657
7394
  }
@@ -6680,7 +7417,11 @@ button.kds-btn-success::after {
6680
7417
  border-radius: var(--kds-spacing-0-75);
6681
7418
  font-size: var(--kds-font-size-sm);
6682
7419
  cursor: pointer;
6683
- transition: background 0.12s ease;
7420
+ /* Transición más amplia y suave: bg + color + border ease-out */
7421
+ transition:
7422
+ background-color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7423
+ color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7424
+ border-top-color 280ms ease-out;
6684
7425
  position: relative;
6685
7426
  user-select: none;
6686
7427
  }
@@ -6689,19 +7430,21 @@ button.kds-btn-success::after {
6689
7430
  border-top: 0;
6690
7431
  }
6691
7432
 
6692
- .kds-copyable-table-row:hover {
7433
+ /* Hover NO aplica mientras la row esté en `.copied` o `.settling`
7434
+ (evita el flicker del hover state al desaparecer el verde de "copiado") */
7435
+ .kds-copyable-table-row:not(.copied):not(.settling):hover {
6693
7436
  background: var(--kds-color-primary-faint);
6694
7437
  }
6695
7438
 
6696
- .kds-copyable-table-row:hover + .kds-copyable-table-row {
7439
+ .kds-copyable-table-row:not(.copied):not(.settling):hover + .kds-copyable-table-row {
6697
7440
  border-top-color: transparent;
6698
7441
  }
6699
7442
 
6700
- .kds-copyable-table-row:active {
7443
+ .kds-copyable-table-row:not(.copied):not(.settling):active {
6701
7444
  background: var(--kds-color-primary-selected);
6702
7445
  }
6703
7446
 
6704
- .kds-copyable-table-row .k {
7447
+ .kds-copyable-table-row .kds-key {
6705
7448
  color: var(--kds-color-text-secondary);
6706
7449
  font-size: var(--kds-font-size-caption);
6707
7450
  letter-spacing: 0.3px;
@@ -6710,7 +7453,7 @@ button.kds-btn-success::after {
6710
7453
  flex: 0 0 auto;
6711
7454
  }
6712
7455
 
6713
- .kds-copyable-table-row .v {
7456
+ .kds-copyable-table-row .kds-value {
6714
7457
  color: var(--kds-color-text-primary);
6715
7458
  font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace;
6716
7459
  font-weight: var(--kds-font-weight-medium);
@@ -6726,17 +7469,18 @@ button.kds-btn-success::after {
6726
7469
  flex: 1 1 auto;
6727
7470
  }
6728
7471
 
6729
- .kds-copyable-table-row .v::after {
7472
+ .kds-copyable-table-row .kds-value::after {
6730
7473
  content: 'content_copy';
6731
7474
  font-family: 'Material Symbols Outlined';
6732
7475
  font-size: var(--kds-font-size-sm);
6733
7476
  color: var(--kds-color-primary-main);
6734
7477
  opacity: 0;
6735
- transition: opacity 0.12s ease;
7478
+ /* Transición coordinada con la row */
7479
+ transition: opacity 280ms cubic-bezier(0.2, 0.8, 0.2, 1);
6736
7480
  flex: 0 0 auto;
6737
7481
  }
6738
7482
 
6739
- .kds-copyable-table-row:hover .v::after {
7483
+ .kds-copyable-table-row:not(.copied):not(.settling):hover .kds-value::after {
6740
7484
  opacity: 0.7;
6741
7485
  }
6742
7486
 
@@ -6744,17 +7488,25 @@ button.kds-btn-success::after {
6744
7488
  background: var(--kds-color-success-soft);
6745
7489
  }
6746
7490
 
6747
- .kds-copyable-table-row.copied .v {
7491
+ .kds-copyable-table-row.copied .kds-value {
6748
7492
  color: var(--kds-color-success-dark);
6749
7493
  }
6750
7494
 
6751
- .kds-copyable-table-row.copied .v::after {
7495
+ .kds-copyable-table-row.copied .kds-value::after {
6752
7496
  content: 'check';
6753
7497
  font-family: 'Material Symbols Outlined';
6754
7498
  color: var(--kds-color-success-dark);
6755
7499
  opacity: 1;
6756
7500
  }
6757
7501
 
7502
+ /* `.settling`: estado de "recién copiado" — la row vuelve al normal sin
7503
+ activar hover. Dura lo mismo que la transición (~300ms) y se aplica
7504
+ desde React tras quitar `.copied`. */
7505
+ .kds-copyable-table-row.settling .kds-value::after {
7506
+ /* Mantén el check con opacity 0 mientras settling, fade out suave */
7507
+ opacity: 0;
7508
+ }
7509
+
6758
7510
  /* Disable BeerCSS ripple on copyable table rows */
6759
7511
  .kds-copyable-table-row::after {
6760
7512
  display: none;
@@ -6817,6 +7569,14 @@ a.kds-copy-all-btn.copied:hover {
6817
7569
  min-height: unset;
6818
7570
  }
6819
7571
 
7572
+ /* Severity variants — default stays warning (backward-compatible) */
7573
+ .kds-section-note.kds-info { color: var(--kds-color-info-dark); }
7574
+ .kds-section-note.kds-info > i { color: var(--kds-color-info-dark); }
7575
+ .kds-section-note.kds-success { color: var(--kds-color-success-dark); }
7576
+ .kds-section-note.kds-success > i { color: var(--kds-color-success-dark); }
7577
+ .kds-section-note.kds-error { color: var(--kds-color-error-dark); }
7578
+ .kds-section-note.kds-error > i { color: var(--kds-color-error-dark); }
7579
+
6820
7580
  /* ========================================
6821
7581
  INFO TOOLTIP (.kds-info-tip)
6822
7582
  Inline info button with hover/click tooltip bubble.
@@ -6912,7 +7672,7 @@ a.kds-copy-all-btn.copied:hover {
6912
7672
  .kds-monto-row {
6913
7673
  display: flex;
6914
7674
  justify-content: space-between;
6915
- align-items: flex-end;
7675
+ align-items: flex-start;
6916
7676
  padding: var(--kds-spacing-1-75) 0 var(--kds-spacing-1);
6917
7677
  border-top: 1px dashed var(--kds-color-divider);
6918
7678
  margin-top: var(--kds-spacing-1-75);
@@ -6936,3 +7696,191 @@ a.kds-copy-all-btn.copied:hover {
6936
7696
  color: var(--kds-color-text-primary);
6937
7697
  }
6938
7698
 
7699
+ /* ========================================
7700
+ PAYMENT TOTAL (.kds-payment-total)
7701
+ Bloque "monto a pagar" para QR view y email templates.
7702
+ Portado desde paylink-ligopay → <kh:paymentTotal> + materialize-config.css.
7703
+ Variantes:
7704
+ - default: amount grande (3rem) en color primario Khipu.
7705
+ - email: amount compacto (1.5rem) en color texto primario.
7706
+ Responsive (default): mobile (≤ 1024px) centra y oculta titleMobile.
7707
+ ======================================== */
7708
+
7709
+ .kds-payment-total {
7710
+ /* Component-scoped tokens — overrideables sin tocar el CSS global. */
7711
+ --kds-payment-total-title-size: var(--kds-font-size-2xl); /* 24px */
7712
+ --kds-payment-total-label-size: var(--kds-font-size-xl); /* 20px */
7713
+ --kds-payment-amount-size: 3rem; /* 48px — destacado */
7714
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
7715
+ --kds-payment-amount-color: var(--kds-color-primary-main);
7716
+ --kds-payment-amount-weight: var(--kds-font-weight-medium);
7717
+
7718
+ text-align: left;
7719
+ }
7720
+
7721
+ .kds-payment-total-title,
7722
+ .kds-payment-total-title-mobile {
7723
+ font-size: var(--kds-payment-total-title-size);
7724
+ font-weight: var(--kds-font-weight-semibold);
7725
+ color: var(--kds-color-text-primary);
7726
+ margin-bottom: var(--kds-spacing-4);
7727
+ }
7728
+
7729
+ .kds-payment-total-title-mobile {
7730
+ display: none;
7731
+ }
7732
+
7733
+ .kds-payment-total .kds-payment-label {
7734
+ font-size: var(--kds-payment-total-label-size);
7735
+ font-weight: var(--kds-font-weight-semibold);
7736
+ color: var(--kds-color-text-primary);
7737
+ margin-bottom: var(--kds-spacing-1);
7738
+ padding-top: 0;
7739
+ }
7740
+
7741
+ .kds-payment-total .kds-payment-amount {
7742
+ font-size: var(--kds-payment-amount-size);
7743
+ font-weight: var(--kds-payment-amount-weight);
7744
+ line-height: var(--kds-payment-amount-line-height);
7745
+ color: var(--kds-payment-amount-color);
7746
+ margin-bottom: var(--kds-spacing-4);
7747
+ }
7748
+
7749
+ .kds-payment-total .kds-payment-amount .kds-payment-total-decimal-sup,
7750
+ .kds-invoice-amount .kds-payment-total-decimal-sup {
7751
+ font-size: var(--kds-font-size-decimal-sup);
7752
+ font-weight: var(--kds-font-weight-semibold);
7753
+ position: relative;
7754
+ top: 0;
7755
+ }
7756
+
7757
+ /* Variante email: amount compacto en color texto primario, alineación izquierda fija */
7758
+ .kds-payment-total--email {
7759
+ --kds-payment-amount-size: var(--kds-font-size-2xl); /* 24px */
7760
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
7761
+ --kds-payment-amount-color: var(--kds-color-text-primary);
7762
+ --kds-payment-amount-weight: var(--kds-font-weight-semibold);
7763
+ }
7764
+
7765
+ /* Tone modifier: swaps the amount color to the khipu-blue / LigoPay info blue.
7766
+ Combinable with --email or with the default variant. */
7767
+ .kds-payment-total--tone-info {
7768
+ --kds-payment-amount-color: var(--kds-color-info-blue); /* #5A5FE0 */
7769
+ }
7770
+
7771
+ /* Centered modifier: removes the asymmetric desktop padding (which exists for
7772
+ LigoPay QR view) and centers all internal text. Composable with --email and
7773
+ --tone-info. */
7774
+ .kds-payment-total--centered {
7775
+ padding-left: 0;
7776
+ padding-top: 0;
7777
+ text-align: center;
7778
+ }
7779
+ .kds-payment-total--centered .kds-payment-total-title,
7780
+ .kds-payment-total--centered .kds-payment-total-title-mobile,
7781
+ .kds-payment-total--centered .kds-payment-label,
7782
+ .kds-payment-total--centered .kds-payment-amount {
7783
+ text-align: center;
7784
+ }
7785
+
7786
+ /* Responsive: mobile ≤ 1024px — centra y conmuta los títulos (sólo variante default) */
7787
+ @media (max-width: 1024px) {
7788
+ .kds-payment-total {
7789
+ text-align: center;
7790
+ }
7791
+
7792
+ .kds-payment-total .kds-payment-total-title {
7793
+ display: none;
7794
+ }
7795
+
7796
+ .kds-payment-total .kds-payment-total-title-mobile {
7797
+ display: block;
7798
+ text-align: center;
7799
+ }
7800
+
7801
+ .kds-payment-total .kds-payment-label,
7802
+ .kds-payment-total .kds-payment-amount {
7803
+ text-align: center;
7804
+ }
7805
+
7806
+ /* Email mantiene alineación izquierda incluso en mobile (matchea email clients) */
7807
+ .kds-payment-total--email,
7808
+ .kds-payment-total--email .kds-payment-label,
7809
+ .kds-payment-total--email .kds-payment-amount {
7810
+ text-align: left;
7811
+ }
7812
+ }
7813
+
7814
+ /* ==========================================================================
7815
+ GRID UTILITIES — semantic aliases for BeerCSS .grid / .s* / .m* / .l*
7816
+
7817
+ Estas utilidades son ALIAS de las clases cortas de BeerCSS para que
7818
+ consumers (payment, LigoPay, Grails legacy) puedan escribir markup con
7819
+ nombres descriptivos sin renunciar al grid de 12 columnas de BeerCSS.
7820
+
7821
+ Convención (estilo Bootstrap responsive):
7822
+ - kds-grid → .grid (12-col CSS grid + 1rem gap)
7823
+ - kds-col-sm-{1..12} → .s{1..12} (mobile, siempre aplica)
7824
+ - kds-col-md-{1..12} → .m{1..12} (>=601px)
7825
+ - kds-col-lg-{1..12} → .l{1..12} (>=993px)
7826
+
7827
+ Las definiciones originales de BeerCSS NO se tocan; estas son aditivas.
7828
+ ========================================================================== */
7829
+
7830
+ .kds-grid {
7831
+ --_gap: 1rem;
7832
+ display: grid;
7833
+ grid-template-columns: repeat(12, 1fr);
7834
+ gap: var(--_gap);
7835
+ block-size: auto;
7836
+ }
7837
+
7838
+ .kds-grid.kds-grid-no-space { --_gap: 0rem; }
7839
+ .kds-grid.kds-grid-medium-space { --_gap: 1.5rem; }
7840
+ .kds-grid.kds-grid-large-space { --_gap: 2rem; }
7841
+
7842
+ .kds-grid > * { margin: 0; }
7843
+
7844
+ .kds-col-sm-1 { grid-area: auto/span 1; }
7845
+ .kds-col-sm-2 { grid-area: auto/span 2; }
7846
+ .kds-col-sm-3 { grid-area: auto/span 3; }
7847
+ .kds-col-sm-4 { grid-area: auto/span 4; }
7848
+ .kds-col-sm-5 { grid-area: auto/span 5; }
7849
+ .kds-col-sm-6 { grid-area: auto/span 6; }
7850
+ .kds-col-sm-7 { grid-area: auto/span 7; }
7851
+ .kds-col-sm-8 { grid-area: auto/span 8; }
7852
+ .kds-col-sm-9 { grid-area: auto/span 9; }
7853
+ .kds-col-sm-10 { grid-area: auto/span 10; }
7854
+ .kds-col-sm-11 { grid-area: auto/span 11; }
7855
+ .kds-col-sm-12 { grid-area: auto/span 12; }
7856
+
7857
+ @media only screen and (min-width: 601px) {
7858
+ .kds-col-md-1 { grid-area: auto/span 1; }
7859
+ .kds-col-md-2 { grid-area: auto/span 2; }
7860
+ .kds-col-md-3 { grid-area: auto/span 3; }
7861
+ .kds-col-md-4 { grid-area: auto/span 4; }
7862
+ .kds-col-md-5 { grid-area: auto/span 5; }
7863
+ .kds-col-md-6 { grid-area: auto/span 6; }
7864
+ .kds-col-md-7 { grid-area: auto/span 7; }
7865
+ .kds-col-md-8 { grid-area: auto/span 8; }
7866
+ .kds-col-md-9 { grid-area: auto/span 9; }
7867
+ .kds-col-md-10 { grid-area: auto/span 10; }
7868
+ .kds-col-md-11 { grid-area: auto/span 11; }
7869
+ .kds-col-md-12 { grid-area: auto/span 12; }
7870
+ }
7871
+
7872
+ @media only screen and (min-width: 993px) {
7873
+ .kds-col-lg-1 { grid-area: auto/span 1; }
7874
+ .kds-col-lg-2 { grid-area: auto/span 2; }
7875
+ .kds-col-lg-3 { grid-area: auto/span 3; }
7876
+ .kds-col-lg-4 { grid-area: auto/span 4; }
7877
+ .kds-col-lg-5 { grid-area: auto/span 5; }
7878
+ .kds-col-lg-6 { grid-area: auto/span 6; }
7879
+ .kds-col-lg-7 { grid-area: auto/span 7; }
7880
+ .kds-col-lg-8 { grid-area: auto/span 8; }
7881
+ .kds-col-lg-9 { grid-area: auto/span 9; }
7882
+ .kds-col-lg-10 { grid-area: auto/span 10; }
7883
+ .kds-col-lg-11 { grid-area: auto/span 11; }
7884
+ .kds-col-lg-12 { grid-area: auto/span 12; }
7885
+ }
7886
+