@khipu/design-system 0.2.0-alpha.4 → 0.2.0-alpha.41

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-14T19:34:35.577Z
14
+ * Generated: 2026-06-11T18:38:45.718Z
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;
@@ -756,7 +764,7 @@ footer {
756
764
  ======================================== */
757
765
  :root {
758
766
  /* Scroll-linked collapse range (mobile sticky invoice) */
759
- --kds-scroll-collapse-end: 150px;
767
+ --kds-scroll-collapse-end: 60px;
760
768
 
761
769
  /* Merchant tile: normal and collapsed sizes (from source prototype) */
762
770
  --kds-merchant-size: 64px;
@@ -778,6 +786,10 @@ footer {
778
786
  * Source: design.khipu.com and Material Design 3 specifications
779
787
  */
780
788
 
789
+ * {
790
+ border-radius: 0;
791
+ }
792
+
781
793
 
782
794
  :has(>main) {
783
795
  background-color: transparent !important;
@@ -842,7 +854,10 @@ a.kds-btn {
842
854
 
843
855
  /* Interaction */
844
856
  cursor: pointer;
845
- 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);
846
861
  box-sizing: border-box;
847
862
  vertical-align: middle;
848
863
  }
@@ -974,7 +989,7 @@ a.kds-btn-text {
974
989
 
975
990
  button.kds-btn-text:hover:not(:disabled),
976
991
  a.kds-btn-text:hover:not(:disabled) {
977
- background: var(--kds-color-primary-hover); /* rgba(131, 71, 173, 0.04) */
992
+ color: var(--kds-color-primary-dark);
978
993
  }
979
994
 
980
995
  button.kds-btn-text:disabled,
@@ -984,6 +999,30 @@ a.kds-btn-text:disabled {
984
999
  box-shadow: none;
985
1000
  }
986
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
+
987
1026
  /* Icon wrapper - control size via span container */
988
1027
  button.kds-btn > .kds-icon,
989
1028
  a.kds-btn > .kds-icon {
@@ -1046,6 +1085,7 @@ a.kds-btn.kds-btn-md {
1046
1085
  padding: var(--kds-spacing-2);
1047
1086
  box-shadow: var(--kds-shadow-card);
1048
1087
  transition: box-shadow 0.3s ease;
1088
+ margin-block-start: 0 !important;
1049
1089
  }
1050
1090
 
1051
1091
  .kds-card-elevated:hover,
@@ -1068,63 +1108,90 @@ a.kds-btn.kds-btn-md {
1068
1108
  }
1069
1109
  }
1070
1110
 
1071
- /* 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. */
1072
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 */
1073
1132
  padding: var(--kds-spacing-3);
1133
+ gap: var(--kds-spacing-1-5);
1074
1134
  border-radius: var(--kds-radius-md);
1075
- border: 2px solid var(--kds-border-light);
1135
+ border: var(--kds-border-width-md) solid var(--kds-border-light);
1076
1136
  background: var(--kds-color-background-paper);
1077
1137
  transition: all 0.3s ease;
1078
- text-align: left;
1079
1138
  cursor: pointer;
1080
- display: flex;
1081
- flex-direction: column;
1082
1139
  }
1083
1140
 
1084
- .kds-card-selector:hover {
1085
- 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;
1086
1154
  }
1087
1155
 
1088
1156
  .kds-card-selector.selected {
1089
- border-color: #3B82F6; /* blue-600 */
1090
- background: #EFF6FF; /* blue-50 */
1157
+ border-color: var(--kds-color-primary-main);
1158
+ background: var(--kds-color-primary-faint);
1091
1159
  box-shadow: var(--kds-shadow-md);
1092
1160
  }
1093
1161
 
1094
- /* Icon container */
1162
+ /* Icon container — spacing manejado por gap del padre, no margin */
1095
1163
  .kds-card-selector-icon {
1096
- width: 48px;
1097
- height: 48px;
1098
- background: #DBEAFE; /* blue-100 */
1099
- 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);
1100
1168
  display: flex;
1101
1169
  align-items: center;
1102
1170
  justify-content: center;
1103
- margin-bottom: 16px;
1104
1171
  }
1105
1172
 
1106
1173
  .kds-card-selector-icon i,
1107
1174
  .kds-card-selector-icon svg {
1108
- width: 24px;
1109
- height: 24px;
1110
- min-width: 24px;
1111
- min-height: 24px;
1112
- 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);
1113
1181
  }
1114
1182
 
1115
- /* Title */
1183
+ /* Title — spacing manejado por gap del padre, no margin */
1116
1184
  .kds-card-selector-title {
1117
- font-weight: 600;
1185
+ font-weight: var(--kds-font-weight-semibold);
1118
1186
  color: var(--kds-color-text-primary);
1119
- margin-bottom: 8px;
1120
- font-size: 16px;
1187
+ font-size: var(--kds-font-size-lg);
1121
1188
  }
1122
1189
 
1123
1190
  /* Description */
1124
1191
  .kds-card-selector-description {
1125
- font-size: 14px;
1126
- color: #4B5563; /* gray-600 */
1127
- 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);
1128
1195
  }
1129
1196
 
1130
1197
  /* Selected state - visual feedback via border only */
@@ -1136,14 +1203,22 @@ a.kds-btn.kds-btn-md {
1136
1203
  display: flex;
1137
1204
  flex-direction: column;
1138
1205
  gap: var(--kds-spacing-2);
1139
- padding: var(--kds-spacing-4);
1206
+ padding: var(--kds-spacing-2);
1140
1207
  border-radius: var(--kds-radius-lg);
1141
1208
  border: 2px solid var(--kds-border-medium);
1142
- 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;
1143
1214
  background: var(--kds-surface-base);
1144
1215
  transition: all 0.3s ease;
1145
1216
  cursor: pointer;
1146
- 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;
1147
1222
  }
1148
1223
 
1149
1224
  .kds-card-plan:hover {
@@ -1163,18 +1238,19 @@ a.kds-btn.kds-btn-md {
1163
1238
  box-shadow: var(--kds-shadow-elevation-4);
1164
1239
  }
1165
1240
 
1166
- /* 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. */
1167
1244
  .kds-card-plan-badge {
1168
- position: absolute;
1169
- top: -12px;
1170
- right: var(--kds-spacing-6);
1171
- 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);
1172
1247
  background: var(--primary);
1173
1248
  color: white;
1174
- font-size: var(--kds-font-size-sm);
1249
+ font-size: var(--kds-font-size-xs);
1175
1250
  font-weight: var(--kds-font-weight-semibold);
1251
+ line-height: 1;
1176
1252
  border-radius: var(--kds-radius-full);
1177
- box-shadow: var(--kds-shadow-elevation-1);
1253
+ white-space: nowrap;
1178
1254
  }
1179
1255
 
1180
1256
  /* Plan Header */
@@ -1202,13 +1278,11 @@ a.kds-btn.kds-btn-md {
1202
1278
  display: flex;
1203
1279
  align-items: baseline;
1204
1280
  gap: var(--kds-spacing-2);
1205
- padding: var(--kds-spacing-4) 0;
1206
1281
  border-bottom: 1px solid var(--kds-border-light);
1207
- min-height: 88px; /* Standardize price area height */
1208
1282
  }
1209
1283
 
1210
1284
  .kds-price {
1211
- font-size: 42px;
1285
+ font-size: var(--kds-font-size-4xl);
1212
1286
  font-weight: var(--kds-font-weight-bold);
1213
1287
  color: var(--primary);
1214
1288
  line-height: 1.1;
@@ -1722,53 +1796,108 @@ a.kds-btn.kds-btn-md {
1722
1796
  }
1723
1797
 
1724
1798
  /* ========================================
1725
- Snackbar Positioning
1799
+ Snackbar Positioning & Styling
1726
1800
  ======================================== */
1727
1801
 
1728
1802
  .snackbar {
1729
1803
  position: fixed;
1730
- bottom: var(--kds-spacing-3);
1731
- left: 50%;
1732
- transform: translateX(-50%);
1733
1804
  z-index: var(--kds-z-index-snackbar);
1734
1805
  min-width: 344px;
1735
1806
  max-width: var(--kds-snackbar-max-width);
1736
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;
1737
1817
  }
1738
1818
 
1739
1819
  /* Snackbar active state - ensure visibility when toggled via JS */
1740
1820
  .snackbar.active {
1741
1821
  visibility: visible !important;
1742
1822
  opacity: 1 !important;
1743
- transform: translateX(-50%) !important;
1744
1823
  }
1745
1824
 
1746
- /* Snackbar semantic variants - background + text/icon color */
1825
+ /* Snackbar semantic variants
1826
+ All use white text (--kds-color-primary-contrast) on solid semantic backgrounds */
1747
1827
  .snackbar.error {
1748
1828
  background-color: var(--kds-color-error-main) !important;
1749
- color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1829
+ color: var(--kds-color-primary-contrast) !important;
1750
1830
  }
1751
1831
 
1752
1832
  .snackbar.error i {
1753
- color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1833
+ color: var(--kds-color-primary-contrast) !important;
1754
1834
  }
1755
1835
 
1756
1836
  .snackbar.info {
1757
1837
  background-color: var(--kds-color-info-main) !important;
1758
- color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1838
+ color: var(--kds-color-primary-contrast) !important;
1759
1839
  }
1760
1840
 
1761
1841
  .snackbar.info i {
1762
- color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1842
+ color: var(--kds-color-primary-contrast) !important;
1763
1843
  }
1764
1844
 
1765
1845
  .snackbar.success {
1766
1846
  background-color: var(--kds-color-success-main) !important;
1767
- color: var(--on-success, var(--kds-color-primary-contrast)) !important;
1847
+ color: var(--kds-color-primary-contrast) !important;
1768
1848
  }
1769
1849
 
1770
1850
  .snackbar.success i {
1771
- 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;
1772
1901
  }
1773
1902
 
1774
1903
  /* ========================================
@@ -1969,6 +2098,106 @@ a.kds-btn-google:disabled {
1969
2098
  height: var(--kds-spacing-button-icon-size);
1970
2099
  }
1971
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
+ }
2137
+
2138
+ .kds-secure-loader-text {
2139
+ display: flex;
2140
+ flex-direction: column;
2141
+ gap: var(--kds-spacing-1);
2142
+ }
2143
+
2144
+ .kds-secure-loader-title {
2145
+ margin: 0;
2146
+ font-family: var(--kds-font-family-primary);
2147
+ font-size: var(--kds-font-size-h6);
2148
+ font-weight: var(--kds-font-weight-semibold);
2149
+ line-height: var(--kds-line-height-snug);
2150
+ color: var(--kds-color-text-primary);
2151
+ }
2152
+
2153
+ .kds-secure-loader-message {
2154
+ margin: 0;
2155
+ font-family: var(--kds-font-family-secondary);
2156
+ font-size: var(--kds-font-size-body1);
2157
+ line-height: var(--kds-line-height-normal);
2158
+ color: var(--kds-color-primary-main);
2159
+ }
2160
+
2161
+ /* Caja del spinner con tamaño fijo: la animación no altera el layout */
2162
+ .kds-secure-loader-spinner {
2163
+ position: relative;
2164
+ display: inline-grid;
2165
+ place-items: center;
2166
+ inline-size: var(--kds-secure-loader-size, 7rem);
2167
+ block-size: var(--kds-secure-loader-size, 7rem);
2168
+ }
2169
+
2170
+ /* Anillo: SVG nativo con arco vía stroke-dasharray, rotando. Replica el
2171
+ CircularProgress original (viewBox 44u, thickness 2, arco ~63%, disableShrink). */
2172
+ .kds-secure-loader-ring {
2173
+ inline-size: var(--kds-secure-loader-size, 6.5rem);
2174
+ block-size: var(--kds-secure-loader-size, 6.5rem);
2175
+ animation: kds-secure-loader-spin 1.2s linear infinite;
2176
+ }
2177
+
2178
+ .kds-secure-loader-ring circle {
2179
+ fill: none;
2180
+ stroke: var(--kds-color-primary-main);
2181
+ stroke-width: 2;
2182
+ stroke-linecap: round;
2183
+ /* circunferencia ≈ 2π·20.2 ≈ 127; arco visible ≈ 80 (~63%) */
2184
+ stroke-dasharray: 80 127;
2185
+ }
2186
+
2187
+ @keyframes kds-secure-loader-spin {
2188
+ to {
2189
+ transform: rotate(360deg);
2190
+ }
2191
+ }
2192
+
2193
+ /* Candado centrado sobre el anillo */
2194
+ .kds-secure-loader-lock {
2195
+ position: absolute;
2196
+ color: var(--kds-color-text-secondary);
2197
+ font-size: calc(var(--kds-secure-loader-size, 7rem) * 0.4);
2198
+ pointer-events: none;
2199
+ }
2200
+
1972
2201
  /* ========================================
1973
2202
  Link Styles
1974
2203
  ======================================== */
@@ -2101,6 +2330,17 @@ body.dark {
2101
2330
  transition: border-color 0.2s, box-shadow 0.2s, outline-color 0.2s;
2102
2331
  }
2103
2332
 
2333
+ /* === TEXTAREA FIX === */
2334
+ /* BeerCSS base sets minimal block padding; add breathing room for textarea */
2335
+ .field > textarea {
2336
+ padding-block: 0.75rem;
2337
+ resize: vertical;
2338
+ }
2339
+
2340
+ .field.label > textarea {
2341
+ padding-block-start: 1.5rem;
2342
+ }
2343
+
2104
2344
  /* ==========================================
2105
2345
  NOTCH VISIBILITY (opacity)
2106
2346
  ========================================== */
@@ -2188,12 +2428,16 @@ body.dark {
2188
2428
  Asegurar que el dropdown arrow sea visible
2189
2429
  ========================================== */
2190
2430
 
2191
- /* Select: mantener appearance nativa para mostrar el dropdown arrow */
2431
+ /* Select: reset nativo + arrow custom via SVG (iOS Safari ignora estilos con appearance:auto) */
2192
2432
  .field select {
2193
- /* BeerCSS puede estar ocultando el arrow, aseguramos que sea visible */
2194
- appearance: auto;
2195
- -webkit-appearance: auto;
2196
- -moz-appearance: auto;
2433
+ -webkit-appearance: none;
2434
+ -moz-appearance: none;
2435
+ appearance: none;
2436
+ 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");
2437
+ background-repeat: no-repeat;
2438
+ background-position: right var(--kds-spacing-1) center;
2439
+ background-size: 20px;
2440
+ padding-right: var(--kds-spacing-4) !important;
2197
2441
  }
2198
2442
 
2199
2443
  /* ==========================================
@@ -2325,6 +2569,71 @@ body.dark {
2325
2569
  display: inline-flex;
2326
2570
  }
2327
2571
 
2572
+ /* ========================================
2573
+ Radix Tooltip (.kds-tooltip)
2574
+ Espejo de `.tooltip` pero para popovers de Radix:
2575
+ bg oscuro, texto blanco, sombra + animación fade/slide direccional.
2576
+ ======================================== */
2577
+
2578
+ .kds-tooltip {
2579
+ background-color: var(--kds-color-text-primary);
2580
+ color: var(--kds-color-background-paper);
2581
+ font-family: var(--kds-font-family-primary);
2582
+ font-size: var(--kds-font-size-xs);
2583
+ font-weight: var(--kds-font-weight-medium);
2584
+ line-height: var(--kds-line-height-normal);
2585
+ border-radius: var(--kds-radius-sm);
2586
+ padding: var(--kds-spacing-0-75) var(--kds-spacing-1-5);
2587
+ box-shadow: var(--kds-shadow-4);
2588
+ max-width: 280px;
2589
+ z-index: var(--kds-z-index-tooltip, 1500);
2590
+ user-select: none;
2591
+ /* Animación direccional según Radix data-side — coordinada con copy-row
2592
+ (cubic-bezier 0.2, 0.8, 0.2, 1) para un feel consistente del DS. */
2593
+ animation-duration: 240ms;
2594
+ animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
2595
+ will-change: transform, opacity;
2596
+ }
2597
+
2598
+ .kds-tooltip[data-state='closed'] {
2599
+ animation-duration: 140ms;
2600
+ animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);
2601
+ }
2602
+
2603
+ /* Direccional según data-side (Radix añade el attr en runtime).
2604
+ Cada lado entra desde su dirección con ~8px de offset (más visible que 4px). */
2605
+ .kds-tooltip[data-side='top'][data-state='delayed-open'],
2606
+ .kds-tooltip[data-side='top'][data-state='instant-open'] { animation-name: kds-tooltip-in-top; }
2607
+ .kds-tooltip[data-side='bottom'][data-state='delayed-open'],
2608
+ .kds-tooltip[data-side='bottom'][data-state='instant-open'] { animation-name: kds-tooltip-in-bottom; }
2609
+ .kds-tooltip[data-side='left'][data-state='delayed-open'],
2610
+ .kds-tooltip[data-side='left'][data-state='instant-open'] { animation-name: kds-tooltip-in-left; }
2611
+ .kds-tooltip[data-side='right'][data-state='delayed-open'],
2612
+ .kds-tooltip[data-side='right'][data-state='instant-open'] { animation-name: kds-tooltip-in-right; }
2613
+
2614
+ /* Fallback cuando no hay data-side resuelto aún */
2615
+ .kds-tooltip[data-state='delayed-open']:not([data-side]),
2616
+ .kds-tooltip[data-state='instant-open']:not([data-side]) {
2617
+ animation-name: kds-tooltip-in-top;
2618
+ }
2619
+
2620
+ .kds-tooltip[data-state='closed'] { animation-name: kds-tooltip-out; }
2621
+
2622
+ @keyframes kds-tooltip-in-top { from { opacity: 0; transform: translateY(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2623
+ @keyframes kds-tooltip-in-bottom { from { opacity: 0; transform: translateY(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2624
+ @keyframes kds-tooltip-in-left { from { opacity: 0; transform: translateX(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2625
+ @keyframes kds-tooltip-in-right { from { opacity: 0; transform: translateX(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2626
+
2627
+ @keyframes kds-tooltip-out {
2628
+ from { opacity: 1; transform: none; }
2629
+ to { opacity: 0; transform: scale(0.96); }
2630
+ }
2631
+
2632
+ /* Arrow (SVG path generado por Radix) */
2633
+ .kds-tooltip-arrow {
2634
+ fill: var(--kds-color-text-primary);
2635
+ }
2636
+
2328
2637
  /* ========================================
2329
2638
  Material Symbols Icon Sizing
2330
2639
  ======================================== */
@@ -2741,7 +3050,8 @@ dialog.modal .field.border:focus-within {
2741
3050
  padding: var(--kds-spacing-2);
2742
3051
  }
2743
3052
 
2744
- .snackbar {
3053
+ .snackbar,
3054
+ .snackbar.active {
2745
3055
  min-width: calc(100% - 32px);
2746
3056
  left: 16px;
2747
3057
  right: 16px;
@@ -3040,6 +3350,32 @@ footer > .kds-container-center {
3040
3350
  color: var(--kds-color-error-dark);
3041
3351
  }
3042
3352
 
3353
+ /* Close button — icon-only, discreto, no usa kds-btn para no romper el flex layout del alert */
3354
+ .kds-alert-close {
3355
+ flex-shrink: 0;
3356
+ display: inline-flex;
3357
+ align-items: center;
3358
+ justify-content: center;
3359
+ width: 28px;
3360
+ height: 28px;
3361
+ padding: 0;
3362
+ background: transparent;
3363
+ border: 0;
3364
+ border-radius: 50%;
3365
+ color: inherit;
3366
+ cursor: pointer;
3367
+ transition: background-color 0.15s ease;
3368
+ }
3369
+
3370
+ .kds-alert-close:hover {
3371
+ background: rgba(0, 0, 0, 0.06);
3372
+ }
3373
+
3374
+ .kds-alert-close i {
3375
+ font-size: 18px;
3376
+ line-height: 1;
3377
+ }
3378
+
3043
3379
  /* Lists inside alerts */
3044
3380
  .kds-alert ul {
3045
3381
  padding-left: var(--kds-spacing-2);
@@ -4036,6 +4372,14 @@ dialog#surveyModal button.circle {
4036
4372
  text-align: center;
4037
4373
  }
4038
4374
 
4375
+ .kds-text-left {
4376
+ text-align: left;
4377
+ }
4378
+
4379
+ .kds-text-right {
4380
+ text-align: right;
4381
+ }
4382
+
4039
4383
  .kds-text-underline {
4040
4384
  text-decoration: underline;
4041
4385
  }
@@ -4052,6 +4396,54 @@ dialog#surveyModal button.circle {
4052
4396
  font-size: var(--kds-font-size-sm);
4053
4397
  }
4054
4398
 
4399
+ /* ── Font-size scale utilities (additive — opt-in companions to .kds-text-sm) ── */
4400
+ .kds-text-base {
4401
+ font-size: var(--kds-font-size-base);
4402
+ }
4403
+
4404
+ .kds-text-lg {
4405
+ font-size: var(--kds-font-size-lg);
4406
+ }
4407
+
4408
+ .kds-text-xl {
4409
+ font-size: var(--kds-font-size-xl);
4410
+ }
4411
+
4412
+ .kds-text-2xl {
4413
+ font-size: var(--kds-font-size-2xl);
4414
+ }
4415
+
4416
+ /* ── Font-weight utilities ── */
4417
+ .kds-fw-regular {
4418
+ font-weight: var(--kds-font-weight-regular);
4419
+ }
4420
+
4421
+ .kds-fw-medium {
4422
+ font-weight: var(--kds-font-weight-medium);
4423
+ }
4424
+
4425
+ .kds-fw-semibold {
4426
+ font-weight: var(--kds-font-weight-semibold);
4427
+ }
4428
+
4429
+ .kds-fw-bold {
4430
+ font-weight: var(--kds-font-weight-bold);
4431
+ }
4432
+
4433
+ /* ── Text-transform utilities ── */
4434
+ .kds-text-transform-none {
4435
+ text-transform: none;
4436
+ }
4437
+
4438
+ /* ── Soft background utilities (semantic muted backgrounds for callouts) ── */
4439
+ .kds-bg-warning-soft {
4440
+ background-color: var(--kds-color-warning-soft);
4441
+ }
4442
+
4443
+ .kds-bg-info-soft {
4444
+ background-color: var(--kds-color-info-soft);
4445
+ }
4446
+
4055
4447
  /* ── Typography variants ── */
4056
4448
  .kds-text-display1 {
4057
4449
  font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
@@ -4262,7 +4654,9 @@ dialog#surveyModal button.circle {
4262
4654
  ======================================== */
4263
4655
 
4264
4656
  .kds-badge {
4265
- display: inline-block;
4657
+ display: inline-flex;
4658
+ align-items: center;
4659
+ gap: 4px;
4266
4660
  padding: 2px 8px;
4267
4661
  border-radius: var(--kds-radius-sm);
4268
4662
  font-size: var(--kds-font-size-xs);
@@ -4270,6 +4664,40 @@ dialog#surveyModal button.circle {
4270
4664
  line-height: 1.5;
4271
4665
  }
4272
4666
 
4667
+ /* Icon prefix inside chip — small inline icon */
4668
+ .kds-badge > i.material-symbols-outlined {
4669
+ font-size: 14px;
4670
+ line-height: 1;
4671
+ }
4672
+
4673
+ /* Deletable chip close button — discreto, sin kds-btn (eso lo agrandaba ridículo) */
4674
+ .kds-badge-close {
4675
+ display: inline-flex;
4676
+ align-items: center;
4677
+ justify-content: center;
4678
+ width: 16px;
4679
+ height: 16px;
4680
+ margin-right: -2px;
4681
+ padding: 0;
4682
+ background: transparent;
4683
+ border: 0;
4684
+ border-radius: 50%;
4685
+ color: inherit;
4686
+ cursor: pointer;
4687
+ opacity: 0.7;
4688
+ transition: opacity 0.15s, background-color 0.15s;
4689
+ }
4690
+
4691
+ .kds-badge-close:hover {
4692
+ opacity: 1;
4693
+ background: rgba(0, 0, 0, 0.1);
4694
+ }
4695
+
4696
+ .kds-badge-close i {
4697
+ font-size: 14px;
4698
+ line-height: 1;
4699
+ }
4700
+
4273
4701
  .kds-badge.success {
4274
4702
  background-color: var(--kds-color-success-container);
4275
4703
  color: var(--kds-color-success-dark);
@@ -4548,6 +4976,11 @@ dialog#surveyModal button.circle {
4548
4976
  color: var(--kds-color-text-primary);
4549
4977
  }
4550
4978
 
4979
+ /* Opt-in color modifier — switches the value to the LigoPay/khipu-blue tone */
4980
+ .kds-amount-value--info {
4981
+ color: var(--kds-color-info-blue); /* #5A5FE0 */
4982
+ }
4983
+
4551
4984
  .kds-amount-value small {
4552
4985
  font-size: 18px;
4553
4986
  font-weight: 500;
@@ -4905,7 +5338,7 @@ dialog#surveyModal button.circle {
4905
5338
  display: flex;
4906
5339
  align-items: center;
4907
5340
  justify-content: center;
4908
- gap: var(--kds-spacing-1);
5341
+ gap: var(--kds-spacing-0-5);
4909
5342
  color: var(--kds-color-gray-400);
4910
5343
  font-size: var(--kds-font-size-xs);
4911
5344
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -4917,6 +5350,10 @@ dialog#surveyModal button.circle {
4917
5350
  display: none;
4918
5351
  }
4919
5352
 
5353
+ .kds-screen > form {
5354
+ margin-block-start: 0 !important;
5355
+ }
5356
+
4920
5357
  @media (max-width: 767px) {
4921
5358
  .kds-card-elevated > .kds-secure-footer {
4922
5359
  display: flex;
@@ -4966,14 +5403,20 @@ dialog#surveyModal button.circle {
4966
5403
  cursor: pointer;
4967
5404
  display: inline-flex;
4968
5405
  align-items: center;
4969
- gap: var(--kds-spacing-0-75);
5406
+ gap: 0;
4970
5407
  }
4971
5408
 
4972
- .kds-expand-toggle:hover {
5409
+ .kds-expand-toggle:hover,
5410
+ .kds-expand-toggle:focus,
5411
+ .kds-expand-toggle:active {
4973
5412
  background: transparent;
5413
+ outline: none;
5414
+ box-shadow: none;
4974
5415
  }
4975
5416
 
4976
- .kds-expand-toggle:hover span {
5417
+ .kds-expand-toggle:hover span,
5418
+ .kds-expand-toggle:focus span,
5419
+ .kds-expand-toggle:active span {
4977
5420
  text-decoration: underline;
4978
5421
  }
4979
5422
 
@@ -5153,11 +5596,11 @@ dialog#surveyModal button.circle {
5153
5596
  color: var(--kds-color-success-main);
5154
5597
  }
5155
5598
 
5156
- /* Variant: pending (animated spinner) */
5599
+ /* Variant: pending (animated blue spinner, sin icono interno) */
5157
5600
  .kds-status-block[data-status="pending"] .kds-status-block-icon {
5158
5601
  background: transparent;
5159
5602
  border: 3px solid var(--kds-color-divider);
5160
- border-top-color: var(--kds-color-primary-main);
5603
+ border-top-color: var(--kds-color-info-main);
5161
5604
  animation: kds-spin 1s linear infinite;
5162
5605
  }
5163
5606
 
@@ -5175,12 +5618,21 @@ dialog#surveyModal button.circle {
5175
5618
  color: var(--kds-color-error-main);
5176
5619
  }
5177
5620
 
5621
+ /* Variant: info — usar SIEMPRE con icon "info_i" (i minúscula sin glyph circular)
5622
+ para que solo se vea nuestro círculo decorativo. Iconos como "info" tienen
5623
+ su propio círculo built-in → causarían doble círculo. */
5624
+ .kds-status-block[data-status="info"] .kds-status-block-icon {
5625
+ background: var(--kds-color-info-soft);
5626
+ border: var(--kds-border-width-md) solid var(--kds-color-info-main);
5627
+ color: var(--kds-color-info-main);
5628
+ }
5629
+
5178
5630
  /* Inline variant: icon left + text right */
5179
5631
  .kds-status-block.inline {
5180
5632
  text-align: left;
5181
5633
  display: flex;
5182
5634
  align-items: center;
5183
- gap: var(--kds-spacing-3);
5635
+ gap: var(--kds-spacing-2);
5184
5636
  padding: var(--kds-spacing-1) 0;
5185
5637
  }
5186
5638
 
@@ -5242,6 +5694,40 @@ dialog#surveyModal button.circle {
5242
5694
  background: var(--kds-color-divider);
5243
5695
  }
5244
5696
 
5697
+ /* Close button — top-right discreto, NO usa kds-btn (rompía el flex layout) */
5698
+ .kds-bottom-sheet-close {
5699
+ position: absolute;
5700
+ top: var(--kds-spacing-1);
5701
+ right: var(--kds-spacing-1);
5702
+ width: 32px;
5703
+ height: 32px;
5704
+ display: inline-flex;
5705
+ align-items: center;
5706
+ justify-content: center;
5707
+ padding: 0;
5708
+ background: transparent;
5709
+ border: 0;
5710
+ border-radius: 50%;
5711
+ color: var(--kds-color-text-secondary);
5712
+ cursor: pointer;
5713
+ transition: background-color 0.15s ease;
5714
+ }
5715
+
5716
+ .kds-bottom-sheet-close:hover {
5717
+ background: rgba(0, 0, 0, 0.06);
5718
+ }
5719
+
5720
+ .kds-bottom-sheet-close i {
5721
+ font-size: 20px;
5722
+ line-height: 1;
5723
+ }
5724
+
5725
+ /* Body container — separa el content del title/actions */
5726
+ .kds-bottom-sheet-body {
5727
+ text-align: left;
5728
+ margin-top: var(--kds-spacing-1);
5729
+ }
5730
+
5245
5731
  .kds-bottom-sheet-icon {
5246
5732
  font-size: var(--kds-font-size-4xl);
5247
5733
  }
@@ -5571,6 +6057,13 @@ div.kds-invoice-header,
5571
6057
  align-content: initial;
5572
6058
  }
5573
6059
 
6060
+ /* Mobile collapsed state: center-align so merchant tile aligns with the smaller amount */
6061
+ @media (max-width: 767px) {
6062
+ .kds-invoice-sticky.is-collapsed .kds-invoice-header {
6063
+ align-items: center;
6064
+ }
6065
+ }
6066
+
5574
6067
  /* Reset BeerCSS sibling margin on <p> inside invoice header — specificity (0,4,1) ties BeerCSS, wins by source order */
5575
6068
  .kds-card-elevated.kds-invoice-sticky .kds-invoice-header p.kds-invoice-amount,
5576
6069
  .kds-card-elevated.kds-invoice-sticky .kds-invoice-header p.kds-invoice-code {
@@ -5578,7 +6071,7 @@ div.kds-invoice-header,
5578
6071
  }
5579
6072
 
5580
6073
  .kds-invoice-amount {
5581
- font-weight: var(--kds-font-weight-bold);
6074
+ font-weight: var(--kds-font-weight-semibold);
5582
6075
  font-size: var(--kds-font-size-3xl);
5583
6076
  line-height: var(--kds-line-height-tight);
5584
6077
  letter-spacing: var(--kds-letter-spacing-wide);
@@ -5599,10 +6092,16 @@ div.kds-invoice-header,
5599
6092
  color: var(--kds-color-gray-400);
5600
6093
  text-transform: uppercase;
5601
6094
  margin: 0;
5602
- margin-top: var(--kds-spacing-1);
6095
+ margin-block: unset;
6096
+ display: flex;
6097
+ gap: var(--kds-spacing-1-5);
5603
6098
  }
5604
6099
 
5605
6100
  .kds-invoice-code-value {
6101
+ color: var(--kds-color-gray-400);
6102
+ }
6103
+
6104
+ .kds-invoice-code-value--lowercase {
5606
6105
  text-transform: lowercase;
5607
6106
  }
5608
6107
 
@@ -5615,6 +6114,9 @@ div.kds-invoice-header,
5615
6114
  place-items: center;
5616
6115
  color: #fff;
5617
6116
  flex-shrink: 0;
6117
+ /* Clip the slightly-oversized logo (see `.kds-invoice-merchant img`) to the
6118
+ rounded square so it can fully cover the deep-purple background. */
6119
+ overflow: hidden;
5618
6120
  }
5619
6121
 
5620
6122
  .kds-invoice-merchant i {
@@ -5634,15 +6136,18 @@ div.kds-invoice-header,
5634
6136
  }
5635
6137
 
5636
6138
  .kds-invoice-merchant img {
5637
- width: 100%;
5638
- height: 100%;
6139
+ /* Slightly larger than the container (+2px, centered by the grid) so the
6140
+ logo overflows under the parent's rounded clip and the deep-purple
6141
+ background never peeks through at the corners when the logo shrinks. */
6142
+ width: calc(100% + 2px);
6143
+ height: calc(100% + 2px);
5639
6144
  object-fit: cover;
5640
6145
  border-radius: var(--kds-radius-md);
5641
6146
  }
5642
6147
 
5643
6148
  /* -- Card Title -- */
5644
6149
  .kds-card-title {
5645
- font-weight: 700;
6150
+ font-weight: var(--kds-font-weight-semibold);
5646
6151
  font-size: var(--kds-font-size-base);
5647
6152
  line-height: 1.5;
5648
6153
  letter-spacing: -0.31px;
@@ -5650,12 +6155,22 @@ div.kds-invoice-header,
5650
6155
  margin-bottom: var(--kds-spacing-2) !important;
5651
6156
  }
5652
6157
 
6158
+ /* Opt-in size modifiers (additive — do NOT change default 16/600) */
6159
+ .kds-card-title--lg {
6160
+ font-size: var(--kds-font-size-xl); /* 20px */
6161
+ font-weight: var(--kds-font-weight-semibold);
6162
+ }
6163
+
6164
+ .kds-card-title--xl {
6165
+ font-size: var(--kds-font-size-2xl); /* 24px */
6166
+ font-weight: var(--kds-font-weight-semibold);
6167
+ }
6168
+
5653
6169
  /* -- Key-Value Grid -- */
5654
6170
  .kds-kv {
5655
6171
  display: grid;
5656
6172
  grid-template-columns: auto 1fr;
5657
- row-gap: var(--kds-spacing-1);
5658
- column-gap: var(--kds-spacing-1-5);
6173
+ column-gap: var(--kds-spacing-1);
5659
6174
  align-items: baseline;
5660
6175
  }
5661
6176
 
@@ -5672,7 +6187,7 @@ div.kds-invoice-header,
5672
6187
  margin: 0;
5673
6188
  font-size: var(--kds-font-size-sm);
5674
6189
  line-height: var(--kds-line-height-relaxed);
5675
- font-weight: var(--kds-font-weight-bold);
6190
+ font-weight: var(--kds-font-weight-semibold);
5676
6191
  letter-spacing: normal;
5677
6192
  color: var(--kds-color-gray-800);
5678
6193
  min-width: 0;
@@ -5702,7 +6217,13 @@ div.kds-invoice-header,
5702
6217
  flex-direction: column;
5703
6218
  gap: var(--kds-spacing-1-5);
5704
6219
  margin: 0;
5705
- padding: 0 0 var(--kds-spacing-1);
6220
+ padding: 0;
6221
+ }
6222
+
6223
+ @media (max-width: 767px) {
6224
+ .kds-detail-list {
6225
+ padding-bottom: var(--kds-spacing-2);
6226
+ }
5706
6227
  }
5707
6228
 
5708
6229
  .kds-detail-group {
@@ -5718,7 +6239,6 @@ div.kds-invoice-header,
5718
6239
  letter-spacing: var(--kds-letter-spacing-wide);
5719
6240
  color: var(--kds-color-text-hint);
5720
6241
  text-transform: uppercase;
5721
- margin: 0 0 var(--kds-spacing-0-5);
5722
6242
  }
5723
6243
 
5724
6244
  .kds-detail-group dd {
@@ -5787,16 +6307,16 @@ div.kds-invoice-header,
5787
6307
  font-size: var(--kds-font-size-sm);
5788
6308
  }
5789
6309
 
5790
- .kds-recap-list .k {
6310
+ .kds-recap-list .kds-key {
5791
6311
  color: var(--kds-color-text-secondary);
5792
6312
  }
5793
6313
 
5794
- .kds-recap-list .v {
6314
+ .kds-recap-list .kds-value {
5795
6315
  color: var(--kds-color-text-primary);
5796
6316
  font-weight: 500;
5797
6317
  }
5798
6318
 
5799
- .kds-recap-list .v.placeholder {
6319
+ .kds-recap-list .kds-value.placeholder {
5800
6320
  color: var(--kds-color-text-hint);
5801
6321
  }
5802
6322
 
@@ -5823,6 +6343,72 @@ a.kds-btn-success:disabled {
5823
6343
  box-shadow: none;
5824
6344
  }
5825
6345
 
6346
+ /* -- Button Warning (amber CTA) -- */
6347
+ button.kds-btn-warning,
6348
+ a.kds-btn-warning {
6349
+ background: var(--kds-color-warning-main);
6350
+ color: var(--kds-color-warning-contrast);
6351
+ border: none;
6352
+ }
6353
+
6354
+ button.kds-btn-warning:hover:not(:disabled),
6355
+ a.kds-btn-warning:hover:not(:disabled) {
6356
+ background: var(--kds-color-warning-dark);
6357
+ }
6358
+
6359
+ button.kds-btn-warning:active:not(:disabled),
6360
+ button.kds-btn-warning:focus-visible:not(:disabled),
6361
+ a.kds-btn-warning:active:not(:disabled),
6362
+ a.kds-btn-warning:focus-visible:not(:disabled) {
6363
+ background: var(--kds-color-warning-dark);
6364
+ outline: 2px solid var(--kds-color-warning-main);
6365
+ outline-offset: 2px;
6366
+ }
6367
+
6368
+ button.kds-btn-warning:disabled,
6369
+ a.kds-btn-warning:disabled {
6370
+ background-color: var(--kds-color-action-disabled-bg);
6371
+ color: var(--kds-color-action-disabled);
6372
+ box-shadow: none;
6373
+ }
6374
+
6375
+ button.kds-btn-warning::after {
6376
+ display: none;
6377
+ }
6378
+
6379
+ /* -- Button Error (red / destructive CTA) -- */
6380
+ button.kds-btn-error,
6381
+ a.kds-btn-error {
6382
+ background: var(--kds-color-error-main);
6383
+ color: var(--kds-color-error-contrast);
6384
+ border: none;
6385
+ }
6386
+
6387
+ button.kds-btn-error:hover:not(:disabled),
6388
+ a.kds-btn-error:hover:not(:disabled) {
6389
+ background: var(--kds-color-error-dark);
6390
+ }
6391
+
6392
+ button.kds-btn-error:active:not(:disabled),
6393
+ button.kds-btn-error:focus-visible:not(:disabled),
6394
+ a.kds-btn-error:active:not(:disabled),
6395
+ a.kds-btn-error:focus-visible:not(:disabled) {
6396
+ background: var(--kds-color-error-dark);
6397
+ outline: 2px solid var(--kds-color-error-main);
6398
+ outline-offset: 2px;
6399
+ }
6400
+
6401
+ button.kds-btn-error:disabled,
6402
+ a.kds-btn-error:disabled {
6403
+ background-color: var(--kds-color-action-disabled-bg);
6404
+ color: var(--kds-color-action-disabled);
6405
+ box-shadow: none;
6406
+ }
6407
+
6408
+ button.kds-btn-error::after {
6409
+ display: none;
6410
+ }
6411
+
5826
6412
  /* -- Field Helper Text -- */
5827
6413
  .kds-field-helper {
5828
6414
  font-size: var(--kds-font-size-xs);
@@ -5865,6 +6451,8 @@ button.kds-btn-success::after {
5865
6451
  /* -- Alert inline (borderless, used inside cards) -- */
5866
6452
  .kds-alert-inline {
5867
6453
  border: none;
6454
+ padding: var(--kds-spacing-1) var(--kds-spacing-1-5);
6455
+ margin-bottom: var(--kds-spacing-1-5);
5868
6456
  }
5869
6457
 
5870
6458
  /* -- Card dimmed (behind overlays) -- */
@@ -5966,17 +6554,42 @@ button.kds-btn-success::after {
5966
6554
  }
5967
6555
 
5968
6556
  .kds-bill-description-picture {
5969
- width: 120px;
5970
- height: 120px;
6557
+ max-width: 100px;
5971
6558
  object-fit: contain;
5972
6559
  background: var(--kds-color-background-paper);
5973
- padding: var(--kds-spacing-1-25);
5974
- border-radius: var(--kds-radius-md);
5975
- margin-top: var(--kds-spacing-1);
6560
+ margin-top: var(--kds-spacing-1-25);
5976
6561
  display: block;
5977
6562
  box-sizing: content-box;
5978
6563
  }
5979
6564
 
6565
+ /* -- Bill Attachments -- */
6566
+ .kds-bill-attachments {
6567
+ display: flex;
6568
+ flex-direction: column;
6569
+ gap: var(--kds-spacing-0-75);
6570
+ }
6571
+
6572
+ .kds-bill-attachment {
6573
+ display: inline-flex;
6574
+ align-items: center;
6575
+ justify-content: flex-start;
6576
+ width: fit-content;
6577
+ color: var(--kds-color-info-main);
6578
+ font-size: var(--kds-font-size-sm);
6579
+ font-weight: var(--kds-font-weight-medium);
6580
+ text-decoration: none;
6581
+ }
6582
+
6583
+ .kds-bill-attachment:hover span {
6584
+ text-decoration: underline;
6585
+ }
6586
+
6587
+ .kds-bill-attachment i {
6588
+ font-size: var(--kds-font-size-lg);
6589
+ min-width: unset;
6590
+ justify-content: flex-start;
6591
+ }
6592
+
5980
6593
  /* -- Share Card (mustContinue) -- */
5981
6594
  .kds-share-card {
5982
6595
  margin-top: var(--kds-spacing-2);
@@ -6089,6 +6702,14 @@ button.kds-btn-success::after {
6089
6702
  padding-top: 0;
6090
6703
  padding-bottom: 0;
6091
6704
  }
6705
+
6706
+ /* Reset BeerCSS sibling margin on form/section inside payment cards.
6707
+ BeerCSS sets `:not(.grid,nav,.row) > … + form/section { margin-block-start:1rem }`
6708
+ which adds unwanted spacing inside cards that contain forms. */
6709
+ .kds-payment-flow .kds-card-elevated > form,
6710
+ .kds-payment-flow .kds-card-elevated > section {
6711
+ margin-block-start: 0;
6712
+ }
6092
6713
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6093
6714
  padding-top: var(--kds-spacing-1);
6094
6715
  padding-bottom: 0;
@@ -6138,10 +6759,17 @@ button.kds-btn-success::after {
6138
6759
  padding-bottom: var(--kds-spacing-2);
6139
6760
  }
6140
6761
 
6141
- /* Invoice sticky card: progressive padding-top (expanded 20px → collapsed 8px).
6142
- Overrides base rule at same specificity; source order wins here. */
6762
+ /* Invoice sticky card padding (mobile).
6763
+ Top: estático 12px. Bottom: progresivo 20px (expandido) 8px (colapsado).
6764
+ El padding-bottom animado da breathing room natural cuando expandido y se
6765
+ reduce convencionalmente al colapsar — sin depender de que el clip-path
6766
+ corte el padding abruptamente. */
6143
6767
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6144
6768
  padding-top: var(--kds-spacing-1-5);
6769
+ padding-bottom: calc(
6770
+ var(--kds-spacing-2-5)
6771
+ - var(--kds-spacing-1-5) * var(--collapse-progress, 0)
6772
+ );
6145
6773
  }
6146
6774
 
6147
6775
 
@@ -6180,7 +6808,8 @@ button.kds-btn-success::after {
6180
6808
  }
6181
6809
  .kds-brand-inner svg,
6182
6810
  .kds-brand-inner img {
6183
- height: 22px;
6811
+ width: calc(50px - 16px * var(--collapse-progress, 0));
6812
+ height: auto;
6184
6813
  display: block;
6185
6814
  }
6186
6815
 
@@ -6399,7 +7028,7 @@ button.kds-btn-success::after {
6399
7028
  inset: 0;
6400
7029
  background: var(--kds-modal-backdrop);
6401
7030
  display: none;
6402
- align-items: center;
7031
+ align-items: flex-start;
6403
7032
  justify-content: center;
6404
7033
  z-index: var(--kds-z-index-modal, 50);
6405
7034
  animation: kds-fade 0.2s ease both;
@@ -6427,7 +7056,7 @@ button.kds-btn-success::after {
6427
7056
  display: flex;
6428
7057
  align-items: center;
6429
7058
  justify-content: space-between;
6430
- padding: var(--kds-spacing-2) var(--kds-spacing-2) var(--kds-spacing-1);
7059
+ padding: var(--kds-spacing-1) var(--kds-spacing-2) var(--kds-spacing-1);
6431
7060
  }
6432
7061
 
6433
7062
  .kds-bank-modal-header h3 {
@@ -6574,7 +7203,7 @@ button.kds-btn-success::after {
6574
7203
  min-width: 0;
6575
7204
  }
6576
7205
 
6577
- .kds-qr-text .title {
7206
+ .kds-qr-text .kds-qr-title {
6578
7207
  font-family: var(--kds-font-family-primary);
6579
7208
  font-weight: 600;
6580
7209
  font-size: var(--kds-font-size-sm);
@@ -6582,10 +7211,15 @@ button.kds-btn-success::after {
6582
7211
  color: var(--kds-color-text-primary);
6583
7212
  }
6584
7213
 
6585
- .kds-qr-text .sub {
7214
+ .kds-qr-text .kds-qr-subtitle {
6586
7215
  font-family: var(--kds-font-family-primary);
6587
7216
  font-size: var(--kds-font-size-caption);
6588
7217
  color: var(--kds-color-text-secondary);
7218
+ /* Trunca con ellipsis en lugar de wrap a 2 líneas — evita apretar el row
7219
+ cuando el contenedor es angosto (mobile o decorator constrained). */
7220
+ overflow: hidden;
7221
+ text-overflow: ellipsis;
7222
+ white-space: nowrap;
6589
7223
  }
6590
7224
 
6591
7225
  /* QR Badge - "Rápido" indicator */
@@ -6608,46 +7242,26 @@ button.kds-btn-success::after {
6608
7242
  font-size: 20px;
6609
7243
  }
6610
7244
 
6611
- /* Mobile responsive: Ajustes para pantallas pequeñas */
7245
+ /* Mobile responsive (≤480px): respira más mantenemos padding/gap/avatar igual
7246
+ que desktop y solo agregamos truncation al subtitle y `flex-shrink: 0` en los
7247
+ ítems que deben mantener su tamaño (avatar, badge, chevron). */
6612
7248
  @media (max-width: 480px) {
6613
- .kds-qr-row {
6614
- gap: var(--kds-spacing-1-5);
6615
- padding: var(--kds-spacing-1-5);
6616
- }
6617
-
6618
7249
  .kds-qr-avatar {
6619
- width: var(--kds-spacing-4-5);
6620
- height: var(--kds-spacing-4-5);
6621
7250
  flex-shrink: 0;
6622
7251
  }
6623
7252
 
6624
- .kds-qr-avatar .material-symbols-outlined,
6625
- .kds-qr-avatar .material-icons-round {
6626
- font-size: var(--kds-font-size-lg);
6627
- }
6628
-
6629
- .kds-qr-text .title {
6630
- font-size: var(--kds-font-size-xs);
6631
- line-height: var(--kds-line-height-tight);
6632
- }
6633
-
6634
7253
  .kds-qr-text .sub {
6635
- font-size: var(--kds-font-size-caption);
6636
- line-height: var(--kds-line-height-tight);
6637
7254
  overflow: hidden;
6638
7255
  text-overflow: ellipsis;
6639
7256
  white-space: nowrap;
6640
7257
  }
6641
7258
 
6642
7259
  .kds-qr-badge {
6643
- font-size: var(--kds-font-size-caption);
6644
- padding: var(--kds-spacing-0-25) var(--kds-spacing-0-75);
6645
7260
  flex-shrink: 0;
6646
7261
  }
6647
7262
 
6648
7263
  .kds-qr-row .material-symbols-outlined:last-child,
6649
7264
  .kds-qr-row .material-icons-round:last-child {
6650
- font-size: var(--kds-font-size-base);
6651
7265
  flex-shrink: 0;
6652
7266
  }
6653
7267
  }
@@ -6676,7 +7290,11 @@ button.kds-btn-success::after {
6676
7290
  border-radius: var(--kds-spacing-0-75);
6677
7291
  font-size: var(--kds-font-size-sm);
6678
7292
  cursor: pointer;
6679
- transition: background 0.12s ease;
7293
+ /* Transición más amplia y suave: bg + color + border ease-out */
7294
+ transition:
7295
+ background-color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7296
+ color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7297
+ border-top-color 280ms ease-out;
6680
7298
  position: relative;
6681
7299
  user-select: none;
6682
7300
  }
@@ -6685,19 +7303,21 @@ button.kds-btn-success::after {
6685
7303
  border-top: 0;
6686
7304
  }
6687
7305
 
6688
- .kds-copyable-table-row:hover {
7306
+ /* Hover NO aplica mientras la row esté en `.copied` o `.settling`
7307
+ (evita el flicker del hover state al desaparecer el verde de "copiado") */
7308
+ .kds-copyable-table-row:not(.copied):not(.settling):hover {
6689
7309
  background: var(--kds-color-primary-faint);
6690
7310
  }
6691
7311
 
6692
- .kds-copyable-table-row:hover + .kds-copyable-table-row {
7312
+ .kds-copyable-table-row:not(.copied):not(.settling):hover + .kds-copyable-table-row {
6693
7313
  border-top-color: transparent;
6694
7314
  }
6695
7315
 
6696
- .kds-copyable-table-row:active {
7316
+ .kds-copyable-table-row:not(.copied):not(.settling):active {
6697
7317
  background: var(--kds-color-primary-selected);
6698
7318
  }
6699
7319
 
6700
- .kds-copyable-table-row .k {
7320
+ .kds-copyable-table-row .kds-key {
6701
7321
  color: var(--kds-color-text-secondary);
6702
7322
  font-size: var(--kds-font-size-caption);
6703
7323
  letter-spacing: 0.3px;
@@ -6706,7 +7326,7 @@ button.kds-btn-success::after {
6706
7326
  flex: 0 0 auto;
6707
7327
  }
6708
7328
 
6709
- .kds-copyable-table-row .v {
7329
+ .kds-copyable-table-row .kds-value {
6710
7330
  color: var(--kds-color-text-primary);
6711
7331
  font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace;
6712
7332
  font-weight: var(--kds-font-weight-medium);
@@ -6722,17 +7342,18 @@ button.kds-btn-success::after {
6722
7342
  flex: 1 1 auto;
6723
7343
  }
6724
7344
 
6725
- .kds-copyable-table-row .v::after {
7345
+ .kds-copyable-table-row .kds-value::after {
6726
7346
  content: 'content_copy';
6727
7347
  font-family: 'Material Symbols Outlined';
6728
7348
  font-size: var(--kds-font-size-sm);
6729
7349
  color: var(--kds-color-primary-main);
6730
7350
  opacity: 0;
6731
- transition: opacity 0.12s ease;
7351
+ /* Transición coordinada con la row */
7352
+ transition: opacity 280ms cubic-bezier(0.2, 0.8, 0.2, 1);
6732
7353
  flex: 0 0 auto;
6733
7354
  }
6734
7355
 
6735
- .kds-copyable-table-row:hover .v::after {
7356
+ .kds-copyable-table-row:not(.copied):not(.settling):hover .kds-value::after {
6736
7357
  opacity: 0.7;
6737
7358
  }
6738
7359
 
@@ -6740,17 +7361,25 @@ button.kds-btn-success::after {
6740
7361
  background: var(--kds-color-success-soft);
6741
7362
  }
6742
7363
 
6743
- .kds-copyable-table-row.copied .v {
7364
+ .kds-copyable-table-row.copied .kds-value {
6744
7365
  color: var(--kds-color-success-dark);
6745
7366
  }
6746
7367
 
6747
- .kds-copyable-table-row.copied .v::after {
7368
+ .kds-copyable-table-row.copied .kds-value::after {
6748
7369
  content: 'check';
6749
7370
  font-family: 'Material Symbols Outlined';
6750
7371
  color: var(--kds-color-success-dark);
6751
7372
  opacity: 1;
6752
7373
  }
6753
7374
 
7375
+ /* `.settling`: estado de "recién copiado" — la row vuelve al normal sin
7376
+ activar hover. Dura lo mismo que la transición (~300ms) y se aplica
7377
+ desde React tras quitar `.copied`. */
7378
+ .kds-copyable-table-row.settling .kds-value::after {
7379
+ /* Mantén el check con opacity 0 mientras settling, fade out suave */
7380
+ opacity: 0;
7381
+ }
7382
+
6754
7383
  /* Disable BeerCSS ripple on copyable table rows */
6755
7384
  .kds-copyable-table-row::after {
6756
7385
  display: none;
@@ -6813,6 +7442,14 @@ a.kds-copy-all-btn.copied:hover {
6813
7442
  min-height: unset;
6814
7443
  }
6815
7444
 
7445
+ /* Severity variants — default stays warning (backward-compatible) */
7446
+ .kds-section-note.kds-info { color: var(--kds-color-info-dark); }
7447
+ .kds-section-note.kds-info > i { color: var(--kds-color-info-dark); }
7448
+ .kds-section-note.kds-success { color: var(--kds-color-success-dark); }
7449
+ .kds-section-note.kds-success > i { color: var(--kds-color-success-dark); }
7450
+ .kds-section-note.kds-error { color: var(--kds-color-error-dark); }
7451
+ .kds-section-note.kds-error > i { color: var(--kds-color-error-dark); }
7452
+
6816
7453
  /* ========================================
6817
7454
  INFO TOOLTIP (.kds-info-tip)
6818
7455
  Inline info button with hover/click tooltip bubble.
@@ -6908,7 +7545,7 @@ a.kds-copy-all-btn.copied:hover {
6908
7545
  .kds-monto-row {
6909
7546
  display: flex;
6910
7547
  justify-content: space-between;
6911
- align-items: flex-end;
7548
+ align-items: flex-start;
6912
7549
  padding: var(--kds-spacing-1-75) 0 var(--kds-spacing-1);
6913
7550
  border-top: 1px dashed var(--kds-color-divider);
6914
7551
  margin-top: var(--kds-spacing-1-75);
@@ -6932,3 +7569,191 @@ a.kds-copy-all-btn.copied:hover {
6932
7569
  color: var(--kds-color-text-primary);
6933
7570
  }
6934
7571
 
7572
+ /* ========================================
7573
+ PAYMENT TOTAL (.kds-payment-total)
7574
+ Bloque "monto a pagar" para QR view y email templates.
7575
+ Portado desde paylink-ligopay → <kh:paymentTotal> + materialize-config.css.
7576
+ Variantes:
7577
+ - default: amount grande (3rem) en color primario Khipu.
7578
+ - email: amount compacto (1.5rem) en color texto primario.
7579
+ Responsive (default): mobile (≤ 1024px) centra y oculta titleMobile.
7580
+ ======================================== */
7581
+
7582
+ .kds-payment-total {
7583
+ /* Component-scoped tokens — overrideables sin tocar el CSS global. */
7584
+ --kds-payment-total-title-size: var(--kds-font-size-2xl); /* 24px */
7585
+ --kds-payment-total-label-size: var(--kds-font-size-xl); /* 20px */
7586
+ --kds-payment-amount-size: 3rem; /* 48px — destacado */
7587
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
7588
+ --kds-payment-amount-color: var(--kds-color-primary-main);
7589
+ --kds-payment-amount-weight: var(--kds-font-weight-medium);
7590
+
7591
+ text-align: left;
7592
+ }
7593
+
7594
+ .kds-payment-total-title,
7595
+ .kds-payment-total-title-mobile {
7596
+ font-size: var(--kds-payment-total-title-size);
7597
+ font-weight: var(--kds-font-weight-semibold);
7598
+ color: var(--kds-color-text-primary);
7599
+ margin-bottom: var(--kds-spacing-4);
7600
+ }
7601
+
7602
+ .kds-payment-total-title-mobile {
7603
+ display: none;
7604
+ }
7605
+
7606
+ .kds-payment-total .kds-payment-label {
7607
+ font-size: var(--kds-payment-total-label-size);
7608
+ font-weight: var(--kds-font-weight-semibold);
7609
+ color: var(--kds-color-text-primary);
7610
+ margin-bottom: var(--kds-spacing-1);
7611
+ padding-top: 0;
7612
+ }
7613
+
7614
+ .kds-payment-total .kds-payment-amount {
7615
+ font-size: var(--kds-payment-amount-size);
7616
+ font-weight: var(--kds-payment-amount-weight);
7617
+ line-height: var(--kds-payment-amount-line-height);
7618
+ color: var(--kds-payment-amount-color);
7619
+ margin-bottom: var(--kds-spacing-4);
7620
+ }
7621
+
7622
+ .kds-payment-total .kds-payment-amount .kds-payment-total-decimal-sup,
7623
+ .kds-invoice-amount .kds-payment-total-decimal-sup {
7624
+ font-size: var(--kds-font-size-decimal-sup);
7625
+ font-weight: var(--kds-font-weight-semibold);
7626
+ position: relative;
7627
+ top: 0;
7628
+ }
7629
+
7630
+ /* Variante email: amount compacto en color texto primario, alineación izquierda fija */
7631
+ .kds-payment-total--email {
7632
+ --kds-payment-amount-size: var(--kds-font-size-2xl); /* 24px */
7633
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
7634
+ --kds-payment-amount-color: var(--kds-color-text-primary);
7635
+ --kds-payment-amount-weight: var(--kds-font-weight-semibold);
7636
+ }
7637
+
7638
+ /* Tone modifier: swaps the amount color to the khipu-blue / LigoPay info blue.
7639
+ Combinable with --email or with the default variant. */
7640
+ .kds-payment-total--tone-info {
7641
+ --kds-payment-amount-color: var(--kds-color-info-blue); /* #5A5FE0 */
7642
+ }
7643
+
7644
+ /* Centered modifier: removes the asymmetric desktop padding (which exists for
7645
+ LigoPay QR view) and centers all internal text. Composable with --email and
7646
+ --tone-info. */
7647
+ .kds-payment-total--centered {
7648
+ padding-left: 0;
7649
+ padding-top: 0;
7650
+ text-align: center;
7651
+ }
7652
+ .kds-payment-total--centered .kds-payment-total-title,
7653
+ .kds-payment-total--centered .kds-payment-total-title-mobile,
7654
+ .kds-payment-total--centered .kds-payment-label,
7655
+ .kds-payment-total--centered .kds-payment-amount {
7656
+ text-align: center;
7657
+ }
7658
+
7659
+ /* Responsive: mobile ≤ 1024px — centra y conmuta los títulos (sólo variante default) */
7660
+ @media (max-width: 1024px) {
7661
+ .kds-payment-total {
7662
+ text-align: center;
7663
+ }
7664
+
7665
+ .kds-payment-total .kds-payment-total-title {
7666
+ display: none;
7667
+ }
7668
+
7669
+ .kds-payment-total .kds-payment-total-title-mobile {
7670
+ display: block;
7671
+ text-align: center;
7672
+ }
7673
+
7674
+ .kds-payment-total .kds-payment-label,
7675
+ .kds-payment-total .kds-payment-amount {
7676
+ text-align: center;
7677
+ }
7678
+
7679
+ /* Email mantiene alineación izquierda incluso en mobile (matchea email clients) */
7680
+ .kds-payment-total--email,
7681
+ .kds-payment-total--email .kds-payment-label,
7682
+ .kds-payment-total--email .kds-payment-amount {
7683
+ text-align: left;
7684
+ }
7685
+ }
7686
+
7687
+ /* ==========================================================================
7688
+ GRID UTILITIES — semantic aliases for BeerCSS .grid / .s* / .m* / .l*
7689
+
7690
+ Estas utilidades son ALIAS de las clases cortas de BeerCSS para que
7691
+ consumers (payment, LigoPay, Grails legacy) puedan escribir markup con
7692
+ nombres descriptivos sin renunciar al grid de 12 columnas de BeerCSS.
7693
+
7694
+ Convención (estilo Bootstrap responsive):
7695
+ - kds-grid → .grid (12-col CSS grid + 1rem gap)
7696
+ - kds-col-sm-{1..12} → .s{1..12} (mobile, siempre aplica)
7697
+ - kds-col-md-{1..12} → .m{1..12} (>=601px)
7698
+ - kds-col-lg-{1..12} → .l{1..12} (>=993px)
7699
+
7700
+ Las definiciones originales de BeerCSS NO se tocan; estas son aditivas.
7701
+ ========================================================================== */
7702
+
7703
+ .kds-grid {
7704
+ --_gap: 1rem;
7705
+ display: grid;
7706
+ grid-template-columns: repeat(12, 1fr);
7707
+ gap: var(--_gap);
7708
+ block-size: auto;
7709
+ }
7710
+
7711
+ .kds-grid.kds-grid-no-space { --_gap: 0rem; }
7712
+ .kds-grid.kds-grid-medium-space { --_gap: 1.5rem; }
7713
+ .kds-grid.kds-grid-large-space { --_gap: 2rem; }
7714
+
7715
+ .kds-grid > * { margin: 0; }
7716
+
7717
+ .kds-col-sm-1 { grid-area: auto/span 1; }
7718
+ .kds-col-sm-2 { grid-area: auto/span 2; }
7719
+ .kds-col-sm-3 { grid-area: auto/span 3; }
7720
+ .kds-col-sm-4 { grid-area: auto/span 4; }
7721
+ .kds-col-sm-5 { grid-area: auto/span 5; }
7722
+ .kds-col-sm-6 { grid-area: auto/span 6; }
7723
+ .kds-col-sm-7 { grid-area: auto/span 7; }
7724
+ .kds-col-sm-8 { grid-area: auto/span 8; }
7725
+ .kds-col-sm-9 { grid-area: auto/span 9; }
7726
+ .kds-col-sm-10 { grid-area: auto/span 10; }
7727
+ .kds-col-sm-11 { grid-area: auto/span 11; }
7728
+ .kds-col-sm-12 { grid-area: auto/span 12; }
7729
+
7730
+ @media only screen and (min-width: 601px) {
7731
+ .kds-col-md-1 { grid-area: auto/span 1; }
7732
+ .kds-col-md-2 { grid-area: auto/span 2; }
7733
+ .kds-col-md-3 { grid-area: auto/span 3; }
7734
+ .kds-col-md-4 { grid-area: auto/span 4; }
7735
+ .kds-col-md-5 { grid-area: auto/span 5; }
7736
+ .kds-col-md-6 { grid-area: auto/span 6; }
7737
+ .kds-col-md-7 { grid-area: auto/span 7; }
7738
+ .kds-col-md-8 { grid-area: auto/span 8; }
7739
+ .kds-col-md-9 { grid-area: auto/span 9; }
7740
+ .kds-col-md-10 { grid-area: auto/span 10; }
7741
+ .kds-col-md-11 { grid-area: auto/span 11; }
7742
+ .kds-col-md-12 { grid-area: auto/span 12; }
7743
+ }
7744
+
7745
+ @media only screen and (min-width: 993px) {
7746
+ .kds-col-lg-1 { grid-area: auto/span 1; }
7747
+ .kds-col-lg-2 { grid-area: auto/span 2; }
7748
+ .kds-col-lg-3 { grid-area: auto/span 3; }
7749
+ .kds-col-lg-4 { grid-area: auto/span 4; }
7750
+ .kds-col-lg-5 { grid-area: auto/span 5; }
7751
+ .kds-col-lg-6 { grid-area: auto/span 6; }
7752
+ .kds-col-lg-7 { grid-area: auto/span 7; }
7753
+ .kds-col-lg-8 { grid-area: auto/span 8; }
7754
+ .kds-col-lg-9 { grid-area: auto/span 9; }
7755
+ .kds-col-lg-10 { grid-area: auto/span 10; }
7756
+ .kds-col-lg-11 { grid-area: auto/span 11; }
7757
+ .kds-col-lg-12 { grid-area: auto/span 12; }
7758
+ }
7759
+