@khipu/design-system 0.2.0-alpha.22 → 0.2.0-alpha.25

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-25T18:59:02.134Z
14
+ * Generated: 2026-05-28T16:39:54.994Z
15
15
  *
16
16
  * To regenerate:
17
17
  * cd design-system && npm run tokens:generate
@@ -51,12 +51,14 @@
51
51
  --kds-color-warning-main: #EF6C00;
52
52
  --kds-color-warning-light: #FF9800;
53
53
  --kds-color-warning-dark: #E65100;
54
+ --kds-color-warning-warm: #8A6D1A;
54
55
  --kds-color-error-main: #D32F2F;
55
56
  --kds-color-error-light: #EF5350;
56
57
  --kds-color-error-dark: #C62828;
57
58
  --kds-color-info-main: #0288D1;
58
59
  --kds-color-info-light: #03A9F4;
59
60
  --kds-color-info-dark: #01579B;
61
+ --kds-color-info-blue: #5A5FE0;
60
62
 
61
63
  /* Text colors */
62
64
  --kds-color-text-primary: #333333;
@@ -134,6 +136,8 @@
134
136
  --kds-font-weight-bold: 700;
135
137
 
136
138
  /* Font sizes (base scale xs–4xl: see responsive section below) */
139
+ --kds-font-size-decimal-sup: 0.5em;
140
+
137
141
  /* Line heights */
138
142
  --kds-line-height-tight: 1.2;
139
143
  --kds-line-height-snug: 1.375;
@@ -1073,63 +1077,90 @@ a.kds-btn.kds-btn-md {
1073
1077
  }
1074
1078
  }
1075
1079
 
1076
- /* Selection card */
1080
+ /* Selection card.
1081
+ IMPORTANTE: este componente se renderiza como `<button>`. BeerCSS aplica al
1082
+ `button` base: `display: inline-flex; align-items: center; justify-content: center;
1083
+ block-size: 2.5rem; padding: 0 1rem; background: var(--primary); color: on-primary`.
1084
+ Todas esas reglas hay que sobreescribirlas para que el card-selector funcione como
1085
+ un contenedor flex column de altura variable y alineado a la izquierda.
1086
+
1087
+ Convención del DS: spacing entre hijos via `gap` del flex padre + padding.
1088
+ Los elementos internos (.kds-card-selector-icon/-title/-description) NO usan margin. */
1077
1089
  .kds-card-selector {
1090
+ /* Reset BeerCSS button */
1091
+ display: flex;
1092
+ flex-direction: column;
1093
+ align-items: stretch;
1094
+ justify-content: flex-start;
1095
+ block-size: auto;
1096
+ inline-size: 100%;
1097
+ text-align: left;
1098
+ line-height: 1.5;
1099
+ color: var(--kds-color-text-primary);
1100
+ /* Estilos propios del card-selector */
1078
1101
  padding: var(--kds-spacing-3);
1102
+ gap: var(--kds-spacing-1-5);
1079
1103
  border-radius: var(--kds-radius-md);
1080
- border: 2px solid var(--kds-border-light);
1104
+ border: var(--kds-border-width-md) solid var(--kds-border-light);
1081
1105
  background: var(--kds-color-background-paper);
1082
1106
  transition: all 0.3s ease;
1083
- text-align: left;
1084
1107
  cursor: pointer;
1085
- display: flex;
1086
- flex-direction: column;
1087
1108
  }
1088
1109
 
1089
- .kds-card-selector:hover {
1090
- border-color: #D1D5DB; /* gray-300 */
1110
+ .kds-card-selector:hover:not(.selected) {
1111
+ border-color: var(--kds-color-primary-light);
1112
+ background: var(--kds-color-primary-hover);
1113
+ }
1114
+
1115
+ /* Override del ripple/overlay default de BeerCSS:
1116
+ `:is(.wave,.chip,.button,button,nav.tabbed>a,...):not([class*=ripple])::after`
1117
+ tiene specificity (0,2,4) según DevTools (Chrome cuenta cada selector dentro
1118
+ de :is() individualmente para algunos motores). Usamos !important — consistente
1119
+ con cómo se overridean otros estilos de BeerCSS en este archivo (67 usos previos).
1120
+ Antes pintaba negro porque `currentColor` resolvía a text-primary del card. */
1121
+ .kds-card-selector::after {
1122
+ background-image: radial-gradient(circle, var(--kds-color-primary-main) 1%, transparent 1%) !important;
1091
1123
  }
1092
1124
 
1093
1125
  .kds-card-selector.selected {
1094
- border-color: #3B82F6; /* blue-600 */
1095
- background: #EFF6FF; /* blue-50 */
1126
+ border-color: var(--kds-color-primary-main);
1127
+ background: var(--kds-color-primary-faint);
1096
1128
  box-shadow: var(--kds-shadow-md);
1097
1129
  }
1098
1130
 
1099
- /* Icon container */
1131
+ /* Icon container — spacing manejado por gap del padre, no margin */
1100
1132
  .kds-card-selector-icon {
1101
- width: 48px;
1102
- height: 48px;
1103
- background: #DBEAFE; /* blue-100 */
1104
- border-radius: 8px;
1133
+ width: var(--kds-spacing-6);
1134
+ height: var(--kds-spacing-6);
1135
+ background: var(--kds-color-primary-focus);
1136
+ border-radius: var(--kds-radius-sm);
1105
1137
  display: flex;
1106
1138
  align-items: center;
1107
1139
  justify-content: center;
1108
- margin-bottom: 16px;
1109
1140
  }
1110
1141
 
1111
1142
  .kds-card-selector-icon i,
1112
1143
  .kds-card-selector-icon svg {
1113
- width: 24px;
1114
- height: 24px;
1115
- min-width: 24px;
1116
- min-height: 24px;
1117
- color: #3B82F6; /* blue-600 */
1144
+ width: var(--kds-spacing-3);
1145
+ height: var(--kds-spacing-3);
1146
+ min-width: var(--kds-spacing-3);
1147
+ min-height: var(--kds-spacing-3);
1148
+ font-size: var(--kds-spacing-3);
1149
+ color: var(--kds-color-primary-main);
1118
1150
  }
1119
1151
 
1120
- /* Title */
1152
+ /* Title — spacing manejado por gap del padre, no margin */
1121
1153
  .kds-card-selector-title {
1122
- font-weight: 600;
1154
+ font-weight: var(--kds-font-weight-semibold);
1123
1155
  color: var(--kds-color-text-primary);
1124
- margin-bottom: 8px;
1125
- font-size: 16px;
1156
+ font-size: var(--kds-font-size-lg);
1126
1157
  }
1127
1158
 
1128
1159
  /* Description */
1129
1160
  .kds-card-selector-description {
1130
- font-size: 14px;
1131
- color: #4B5563; /* gray-600 */
1132
- line-height: 1.5;
1161
+ font-size: var(--kds-font-size-sm);
1162
+ color: var(--kds-color-text-secondary);
1163
+ line-height: var(--kds-line-height-normal);
1133
1164
  }
1134
1165
 
1135
1166
  /* Selected state - visual feedback via border only */
@@ -1141,14 +1172,22 @@ a.kds-btn.kds-btn-md {
1141
1172
  display: flex;
1142
1173
  flex-direction: column;
1143
1174
  gap: var(--kds-spacing-2);
1144
- padding: var(--kds-spacing-4);
1175
+ padding: var(--kds-spacing-2);
1145
1176
  border-radius: var(--kds-radius-lg);
1146
1177
  border: 2px solid var(--kds-border-medium);
1147
- max-width: 400px; /* Increased from 365px for better text spacing */
1178
+ /* Ancho mínimo aplicado a TODOS los planes así un plan sin badge en una
1179
+ grilla con un plan recomendado mantiene la misma anchura, y el badge nunca
1180
+ se superpone al título por estrechez del card. */
1181
+ min-width: 260px;
1182
+ max-width: 400px;
1148
1183
  background: var(--kds-surface-base);
1149
1184
  transition: all 0.3s ease;
1150
1185
  cursor: pointer;
1151
- height: 100%; /* Ensure cards fill grid height */
1186
+ /* Alto fijo: el card se estira al alto de su row del grid (align-items stretch
1187
+ es el default) — todas las cards de la misma fila quedan a la misma altura
1188
+ sin importar el contenido. `align-self: stretch` lo hace explícito. */
1189
+ height: 100%;
1190
+ align-self: stretch;
1152
1191
  }
1153
1192
 
1154
1193
  .kds-card-plan:hover {
@@ -1168,18 +1207,19 @@ a.kds-btn.kds-btn-md {
1168
1207
  box-shadow: var(--kds-shadow-elevation-4);
1169
1208
  }
1170
1209
 
1171
- /* Recommended Badge */
1210
+ /* Recommended Badge — inline dentro del card (no flotante).
1211
+ Es el primer hijo del .kds-card-plan, así que aparece arriba de todo
1212
+ el contenido, alineado a la izquierda. */
1172
1213
  .kds-card-plan-badge {
1173
- position: absolute;
1174
- top: -12px;
1175
- right: var(--kds-spacing-6);
1176
- padding: var(--kds-spacing-1) var(--kds-spacing-4);
1214
+ align-self: flex-start;
1215
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-1-5);
1177
1216
  background: var(--primary);
1178
1217
  color: white;
1179
- font-size: var(--kds-font-size-sm);
1218
+ font-size: var(--kds-font-size-xs);
1180
1219
  font-weight: var(--kds-font-weight-semibold);
1220
+ line-height: 1;
1181
1221
  border-radius: var(--kds-radius-full);
1182
- box-shadow: var(--kds-shadow-elevation-1);
1222
+ white-space: nowrap;
1183
1223
  }
1184
1224
 
1185
1225
  /* Plan Header */
@@ -1207,13 +1247,11 @@ a.kds-btn.kds-btn-md {
1207
1247
  display: flex;
1208
1248
  align-items: baseline;
1209
1249
  gap: var(--kds-spacing-2);
1210
- padding: var(--kds-spacing-4) 0;
1211
1250
  border-bottom: 1px solid var(--kds-border-light);
1212
- min-height: 88px; /* Standardize price area height */
1213
1251
  }
1214
1252
 
1215
1253
  .kds-price {
1216
- font-size: 42px;
1254
+ font-size: var(--kds-font-size-4xl);
1217
1255
  font-weight: var(--kds-font-weight-bold);
1218
1256
  color: var(--primary);
1219
1257
  line-height: 1.1;
@@ -2400,6 +2438,71 @@ body.dark {
2400
2438
  display: inline-flex;
2401
2439
  }
2402
2440
 
2441
+ /* ========================================
2442
+ Radix Tooltip (.kds-tooltip)
2443
+ Espejo de `.tooltip` pero para popovers de Radix:
2444
+ bg oscuro, texto blanco, sombra + animación fade/slide direccional.
2445
+ ======================================== */
2446
+
2447
+ .kds-tooltip {
2448
+ background-color: var(--kds-color-text-primary);
2449
+ color: var(--kds-color-background-paper);
2450
+ font-family: var(--kds-font-family-primary);
2451
+ font-size: var(--kds-font-size-xs);
2452
+ font-weight: var(--kds-font-weight-medium);
2453
+ line-height: var(--kds-line-height-normal);
2454
+ border-radius: var(--kds-radius-sm);
2455
+ padding: var(--kds-spacing-0-75) var(--kds-spacing-1-5);
2456
+ box-shadow: var(--kds-shadow-4);
2457
+ max-width: 280px;
2458
+ z-index: var(--kds-z-index-tooltip, 1500);
2459
+ user-select: none;
2460
+ /* Animación direccional según Radix data-side — coordinada con copy-row
2461
+ (cubic-bezier 0.2, 0.8, 0.2, 1) para un feel consistente del DS. */
2462
+ animation-duration: 240ms;
2463
+ animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
2464
+ will-change: transform, opacity;
2465
+ }
2466
+
2467
+ .kds-tooltip[data-state='closed'] {
2468
+ animation-duration: 140ms;
2469
+ animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);
2470
+ }
2471
+
2472
+ /* Direccional según data-side (Radix añade el attr en runtime).
2473
+ Cada lado entra desde su dirección con ~8px de offset (más visible que 4px). */
2474
+ .kds-tooltip[data-side='top'][data-state='delayed-open'],
2475
+ .kds-tooltip[data-side='top'][data-state='instant-open'] { animation-name: kds-tooltip-in-top; }
2476
+ .kds-tooltip[data-side='bottom'][data-state='delayed-open'],
2477
+ .kds-tooltip[data-side='bottom'][data-state='instant-open'] { animation-name: kds-tooltip-in-bottom; }
2478
+ .kds-tooltip[data-side='left'][data-state='delayed-open'],
2479
+ .kds-tooltip[data-side='left'][data-state='instant-open'] { animation-name: kds-tooltip-in-left; }
2480
+ .kds-tooltip[data-side='right'][data-state='delayed-open'],
2481
+ .kds-tooltip[data-side='right'][data-state='instant-open'] { animation-name: kds-tooltip-in-right; }
2482
+
2483
+ /* Fallback cuando no hay data-side resuelto aún */
2484
+ .kds-tooltip[data-state='delayed-open']:not([data-side]),
2485
+ .kds-tooltip[data-state='instant-open']:not([data-side]) {
2486
+ animation-name: kds-tooltip-in-top;
2487
+ }
2488
+
2489
+ .kds-tooltip[data-state='closed'] { animation-name: kds-tooltip-out; }
2490
+
2491
+ @keyframes kds-tooltip-in-top { from { opacity: 0; transform: translateY(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2492
+ @keyframes kds-tooltip-in-bottom { from { opacity: 0; transform: translateY(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2493
+ @keyframes kds-tooltip-in-left { from { opacity: 0; transform: translateX(8px) scale(0.96); } to { opacity: 1; transform: none; } }
2494
+ @keyframes kds-tooltip-in-right { from { opacity: 0; transform: translateX(-8px) scale(0.96); } to { opacity: 1; transform: none; } }
2495
+
2496
+ @keyframes kds-tooltip-out {
2497
+ from { opacity: 1; transform: none; }
2498
+ to { opacity: 0; transform: scale(0.96); }
2499
+ }
2500
+
2501
+ /* Arrow (SVG path generado por Radix) */
2502
+ .kds-tooltip-arrow {
2503
+ fill: var(--kds-color-text-primary);
2504
+ }
2505
+
2403
2506
  /* ========================================
2404
2507
  Material Symbols Icon Sizing
2405
2508
  ======================================== */
@@ -3116,6 +3219,32 @@ footer > .kds-container-center {
3116
3219
  color: var(--kds-color-error-dark);
3117
3220
  }
3118
3221
 
3222
+ /* Close button — icon-only, discreto, no usa kds-btn para no romper el flex layout del alert */
3223
+ .kds-alert-close {
3224
+ flex-shrink: 0;
3225
+ display: inline-flex;
3226
+ align-items: center;
3227
+ justify-content: center;
3228
+ width: 28px;
3229
+ height: 28px;
3230
+ padding: 0;
3231
+ background: transparent;
3232
+ border: 0;
3233
+ border-radius: 50%;
3234
+ color: inherit;
3235
+ cursor: pointer;
3236
+ transition: background-color 0.15s ease;
3237
+ }
3238
+
3239
+ .kds-alert-close:hover {
3240
+ background: rgba(0, 0, 0, 0.06);
3241
+ }
3242
+
3243
+ .kds-alert-close i {
3244
+ font-size: 18px;
3245
+ line-height: 1;
3246
+ }
3247
+
3119
3248
  /* Lists inside alerts */
3120
3249
  .kds-alert ul {
3121
3250
  padding-left: var(--kds-spacing-2);
@@ -4128,6 +4257,54 @@ dialog#surveyModal button.circle {
4128
4257
  font-size: var(--kds-font-size-sm);
4129
4258
  }
4130
4259
 
4260
+ /* ── Font-size scale utilities (additive — opt-in companions to .kds-text-sm) ── */
4261
+ .kds-text-base {
4262
+ font-size: var(--kds-font-size-base);
4263
+ }
4264
+
4265
+ .kds-text-lg {
4266
+ font-size: var(--kds-font-size-lg);
4267
+ }
4268
+
4269
+ .kds-text-xl {
4270
+ font-size: var(--kds-font-size-xl);
4271
+ }
4272
+
4273
+ .kds-text-2xl {
4274
+ font-size: var(--kds-font-size-2xl);
4275
+ }
4276
+
4277
+ /* ── Font-weight utilities ── */
4278
+ .kds-fw-regular {
4279
+ font-weight: var(--kds-font-weight-regular);
4280
+ }
4281
+
4282
+ .kds-fw-medium {
4283
+ font-weight: var(--kds-font-weight-medium);
4284
+ }
4285
+
4286
+ .kds-fw-semibold {
4287
+ font-weight: var(--kds-font-weight-semibold);
4288
+ }
4289
+
4290
+ .kds-fw-bold {
4291
+ font-weight: var(--kds-font-weight-bold);
4292
+ }
4293
+
4294
+ /* ── Text-transform utilities ── */
4295
+ .kds-text-transform-none {
4296
+ text-transform: none;
4297
+ }
4298
+
4299
+ /* ── Soft background utilities (semantic muted backgrounds for callouts) ── */
4300
+ .kds-bg-warning-soft {
4301
+ background-color: var(--kds-color-warning-soft);
4302
+ }
4303
+
4304
+ .kds-bg-info-soft {
4305
+ background-color: var(--kds-color-info-soft);
4306
+ }
4307
+
4131
4308
  /* ── Typography variants ── */
4132
4309
  .kds-text-display1 {
4133
4310
  font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
@@ -4338,7 +4515,9 @@ dialog#surveyModal button.circle {
4338
4515
  ======================================== */
4339
4516
 
4340
4517
  .kds-badge {
4341
- display: inline-block;
4518
+ display: inline-flex;
4519
+ align-items: center;
4520
+ gap: 4px;
4342
4521
  padding: 2px 8px;
4343
4522
  border-radius: var(--kds-radius-sm);
4344
4523
  font-size: var(--kds-font-size-xs);
@@ -4346,6 +4525,40 @@ dialog#surveyModal button.circle {
4346
4525
  line-height: 1.5;
4347
4526
  }
4348
4527
 
4528
+ /* Icon prefix inside chip — small inline icon */
4529
+ .kds-badge > i.material-symbols-outlined {
4530
+ font-size: 14px;
4531
+ line-height: 1;
4532
+ }
4533
+
4534
+ /* Deletable chip close button — discreto, sin kds-btn (eso lo agrandaba ridículo) */
4535
+ .kds-badge-close {
4536
+ display: inline-flex;
4537
+ align-items: center;
4538
+ justify-content: center;
4539
+ width: 16px;
4540
+ height: 16px;
4541
+ margin-right: -2px;
4542
+ padding: 0;
4543
+ background: transparent;
4544
+ border: 0;
4545
+ border-radius: 50%;
4546
+ color: inherit;
4547
+ cursor: pointer;
4548
+ opacity: 0.7;
4549
+ transition: opacity 0.15s, background-color 0.15s;
4550
+ }
4551
+
4552
+ .kds-badge-close:hover {
4553
+ opacity: 1;
4554
+ background: rgba(0, 0, 0, 0.1);
4555
+ }
4556
+
4557
+ .kds-badge-close i {
4558
+ font-size: 14px;
4559
+ line-height: 1;
4560
+ }
4561
+
4349
4562
  .kds-badge.success {
4350
4563
  background-color: var(--kds-color-success-container);
4351
4564
  color: var(--kds-color-success-dark);
@@ -4624,6 +4837,11 @@ dialog#surveyModal button.circle {
4624
4837
  color: var(--kds-color-text-primary);
4625
4838
  }
4626
4839
 
4840
+ /* Opt-in color modifier — switches the value to the LigoPay/khipu-blue tone */
4841
+ .kds-amount-value--info {
4842
+ color: var(--kds-color-info-blue); /* #5A5FE0 */
4843
+ }
4844
+
4627
4845
  .kds-amount-value small {
4628
4846
  font-size: 18px;
4629
4847
  font-weight: 500;
@@ -5239,11 +5457,11 @@ dialog#surveyModal button.circle {
5239
5457
  color: var(--kds-color-success-main);
5240
5458
  }
5241
5459
 
5242
- /* Variant: pending (animated spinner) */
5460
+ /* Variant: pending (animated blue spinner, sin icono interno) */
5243
5461
  .kds-status-block[data-status="pending"] .kds-status-block-icon {
5244
5462
  background: transparent;
5245
5463
  border: 3px solid var(--kds-color-divider);
5246
- border-top-color: var(--kds-color-primary-main);
5464
+ border-top-color: var(--kds-color-info-main);
5247
5465
  animation: kds-spin 1s linear infinite;
5248
5466
  }
5249
5467
 
@@ -5261,7 +5479,9 @@ dialog#surveyModal button.circle {
5261
5479
  color: var(--kds-color-error-main);
5262
5480
  }
5263
5481
 
5264
- /* Variant: info */
5482
+ /* Variant: info — usar SIEMPRE con icon "info_i" (i minúscula sin glyph circular)
5483
+ para que solo se vea nuestro círculo decorativo. Iconos como "info" tienen
5484
+ su propio círculo built-in → causarían doble círculo. */
5265
5485
  .kds-status-block[data-status="info"] .kds-status-block-icon {
5266
5486
  background: var(--kds-color-info-soft);
5267
5487
  border: var(--kds-border-width-md) solid var(--kds-color-info-main);
@@ -5335,6 +5555,40 @@ dialog#surveyModal button.circle {
5335
5555
  background: var(--kds-color-divider);
5336
5556
  }
5337
5557
 
5558
+ /* Close button — top-right discreto, NO usa kds-btn (rompía el flex layout) */
5559
+ .kds-bottom-sheet-close {
5560
+ position: absolute;
5561
+ top: var(--kds-spacing-1);
5562
+ right: var(--kds-spacing-1);
5563
+ width: 32px;
5564
+ height: 32px;
5565
+ display: inline-flex;
5566
+ align-items: center;
5567
+ justify-content: center;
5568
+ padding: 0;
5569
+ background: transparent;
5570
+ border: 0;
5571
+ border-radius: 50%;
5572
+ color: var(--kds-color-text-secondary);
5573
+ cursor: pointer;
5574
+ transition: background-color 0.15s ease;
5575
+ }
5576
+
5577
+ .kds-bottom-sheet-close:hover {
5578
+ background: rgba(0, 0, 0, 0.06);
5579
+ }
5580
+
5581
+ .kds-bottom-sheet-close i {
5582
+ font-size: 20px;
5583
+ line-height: 1;
5584
+ }
5585
+
5586
+ /* Body container — separa el content del title/actions */
5587
+ .kds-bottom-sheet-body {
5588
+ text-align: left;
5589
+ margin-top: var(--kds-spacing-1);
5590
+ }
5591
+
5338
5592
  .kds-bottom-sheet-icon {
5339
5593
  font-size: var(--kds-font-size-4xl);
5340
5594
  }
@@ -5756,6 +6010,17 @@ div.kds-invoice-header,
5756
6010
  margin-bottom: var(--kds-spacing-2) !important;
5757
6011
  }
5758
6012
 
6013
+ /* Opt-in size modifiers (additive — do NOT change default 16/600) */
6014
+ .kds-card-title--lg {
6015
+ font-size: var(--kds-font-size-xl); /* 20px */
6016
+ font-weight: var(--kds-font-weight-bold); /* 700 */
6017
+ }
6018
+
6019
+ .kds-card-title--xl {
6020
+ font-size: var(--kds-font-size-2xl); /* 24px */
6021
+ font-weight: var(--kds-font-weight-bold); /* 700 */
6022
+ }
6023
+
5759
6024
  /* -- Key-Value Grid -- */
5760
6025
  .kds-kv {
5761
6026
  display: grid;
@@ -6283,10 +6548,17 @@ button.kds-btn-success::after {
6283
6548
  padding-bottom: var(--kds-spacing-2);
6284
6549
  }
6285
6550
 
6286
- /* Invoice sticky card: progressive padding-top (expanded 20px → collapsed 8px).
6287
- Overrides base rule at same specificity; source order wins here. */
6551
+ /* Invoice sticky card padding (mobile).
6552
+ Top: estático 12px. Bottom: progresivo 20px (expandido) 8px (colapsado).
6553
+ El padding-bottom animado da breathing room natural cuando expandido y se
6554
+ reduce convencionalmente al colapsar — sin depender de que el clip-path
6555
+ corte el padding abruptamente. */
6288
6556
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6289
6557
  padding-top: var(--kds-spacing-1-5);
6558
+ padding-bottom: calc(
6559
+ var(--kds-spacing-2-5)
6560
+ - var(--kds-spacing-1-5) * var(--collapse-progress, 0)
6561
+ );
6290
6562
  }
6291
6563
 
6292
6564
 
@@ -6732,6 +7004,11 @@ button.kds-btn-success::after {
6732
7004
  font-family: var(--kds-font-family-primary);
6733
7005
  font-size: var(--kds-font-size-caption);
6734
7006
  color: var(--kds-color-text-secondary);
7007
+ /* Trunca con ellipsis en lugar de wrap a 2 líneas — evita apretar el row
7008
+ cuando el contenedor es angosto (mobile o decorator constrained). */
7009
+ overflow: hidden;
7010
+ text-overflow: ellipsis;
7011
+ white-space: nowrap;
6735
7012
  }
6736
7013
 
6737
7014
  /* QR Badge - "Rápido" indicator */
@@ -6754,46 +7031,26 @@ button.kds-btn-success::after {
6754
7031
  font-size: 20px;
6755
7032
  }
6756
7033
 
6757
- /* Mobile responsive: Ajustes para pantallas pequeñas */
7034
+ /* Mobile responsive (≤480px): respira más mantenemos padding/gap/avatar igual
7035
+ que desktop y solo agregamos truncation al subtitle y `flex-shrink: 0` en los
7036
+ ítems que deben mantener su tamaño (avatar, badge, chevron). */
6758
7037
  @media (max-width: 480px) {
6759
- .kds-qr-row {
6760
- gap: var(--kds-spacing-1-5);
6761
- padding: var(--kds-spacing-1-5);
6762
- }
6763
-
6764
7038
  .kds-qr-avatar {
6765
- width: var(--kds-spacing-4-5);
6766
- height: var(--kds-spacing-4-5);
6767
7039
  flex-shrink: 0;
6768
7040
  }
6769
7041
 
6770
- .kds-qr-avatar .material-symbols-outlined,
6771
- .kds-qr-avatar .material-icons-round {
6772
- font-size: var(--kds-font-size-lg);
6773
- }
6774
-
6775
- .kds-qr-text .title {
6776
- font-size: var(--kds-font-size-xs);
6777
- line-height: var(--kds-line-height-tight);
6778
- }
6779
-
6780
7042
  .kds-qr-text .sub {
6781
- font-size: var(--kds-font-size-caption);
6782
- line-height: var(--kds-line-height-tight);
6783
7043
  overflow: hidden;
6784
7044
  text-overflow: ellipsis;
6785
7045
  white-space: nowrap;
6786
7046
  }
6787
7047
 
6788
7048
  .kds-qr-badge {
6789
- font-size: var(--kds-font-size-caption);
6790
- padding: var(--kds-spacing-0-25) var(--kds-spacing-0-75);
6791
7049
  flex-shrink: 0;
6792
7050
  }
6793
7051
 
6794
7052
  .kds-qr-row .material-symbols-outlined:last-child,
6795
7053
  .kds-qr-row .material-icons-round:last-child {
6796
- font-size: var(--kds-font-size-base);
6797
7054
  flex-shrink: 0;
6798
7055
  }
6799
7056
  }
@@ -6822,7 +7079,11 @@ button.kds-btn-success::after {
6822
7079
  border-radius: var(--kds-spacing-0-75);
6823
7080
  font-size: var(--kds-font-size-sm);
6824
7081
  cursor: pointer;
6825
- transition: background 0.12s ease;
7082
+ /* Transición más amplia y suave: bg + color + border ease-out */
7083
+ transition:
7084
+ background-color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7085
+ color 280ms cubic-bezier(0.2, 0.8, 0.2, 1),
7086
+ border-top-color 280ms ease-out;
6826
7087
  position: relative;
6827
7088
  user-select: none;
6828
7089
  }
@@ -6831,15 +7092,17 @@ button.kds-btn-success::after {
6831
7092
  border-top: 0;
6832
7093
  }
6833
7094
 
6834
- .kds-copyable-table-row:hover {
7095
+ /* Hover NO aplica mientras la row esté en `.copied` o `.settling`
7096
+ (evita el flicker del hover state al desaparecer el verde de "copiado") */
7097
+ .kds-copyable-table-row:not(.copied):not(.settling):hover {
6835
7098
  background: var(--kds-color-primary-faint);
6836
7099
  }
6837
7100
 
6838
- .kds-copyable-table-row:hover + .kds-copyable-table-row {
7101
+ .kds-copyable-table-row:not(.copied):not(.settling):hover + .kds-copyable-table-row {
6839
7102
  border-top-color: transparent;
6840
7103
  }
6841
7104
 
6842
- .kds-copyable-table-row:active {
7105
+ .kds-copyable-table-row:not(.copied):not(.settling):active {
6843
7106
  background: var(--kds-color-primary-selected);
6844
7107
  }
6845
7108
 
@@ -6874,11 +7137,12 @@ button.kds-btn-success::after {
6874
7137
  font-size: var(--kds-font-size-sm);
6875
7138
  color: var(--kds-color-primary-main);
6876
7139
  opacity: 0;
6877
- transition: opacity 0.12s ease;
7140
+ /* Transición coordinada con la row */
7141
+ transition: opacity 280ms cubic-bezier(0.2, 0.8, 0.2, 1);
6878
7142
  flex: 0 0 auto;
6879
7143
  }
6880
7144
 
6881
- .kds-copyable-table-row:hover .v::after {
7145
+ .kds-copyable-table-row:not(.copied):not(.settling):hover .v::after {
6882
7146
  opacity: 0.7;
6883
7147
  }
6884
7148
 
@@ -6897,6 +7161,14 @@ button.kds-btn-success::after {
6897
7161
  opacity: 1;
6898
7162
  }
6899
7163
 
7164
+ /* `.settling`: estado de "recién copiado" — la row vuelve al normal sin
7165
+ activar hover. Dura lo mismo que la transición (~300ms) y se aplica
7166
+ desde React tras quitar `.copied`. */
7167
+ .kds-copyable-table-row.settling .v::after {
7168
+ /* Mantén el check con opacity 0 mientras settling, fade out suave */
7169
+ opacity: 0;
7170
+ }
7171
+
6900
7172
  /* Disable BeerCSS ripple on copyable table rows */
6901
7173
  .kds-copyable-table-row::after {
6902
7174
  display: none;
@@ -7086,3 +7358,105 @@ a.kds-copy-all-btn.copied:hover {
7086
7358
  color: var(--kds-color-text-primary);
7087
7359
  }
7088
7360
 
7361
+ /* ========================================
7362
+ PAYMENT TOTAL (.kds-payment-total)
7363
+ Bloque "monto a pagar" para QR view y email templates.
7364
+ Portado desde paylink-ligopay → <kh:paymentTotal> + materialize-config.css.
7365
+ Variantes:
7366
+ - default: amount grande (3rem) en color primario Khipu.
7367
+ - email: amount compacto (1.5rem) en color texto primario.
7368
+ Responsive (default): mobile (≤ 1024px) centra y oculta titleMobile.
7369
+ ======================================== */
7370
+
7371
+ .kds-payment-total {
7372
+ /* Component-scoped tokens — overrideables sin tocar el CSS global. */
7373
+ --kds-payment-total-title-size: var(--kds-font-size-2xl); /* 24px */
7374
+ --kds-payment-total-label-size: var(--kds-font-size-xl); /* 20px */
7375
+ --kds-payment-amount-size: 3rem; /* 48px — destacado */
7376
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
7377
+ --kds-payment-amount-color: var(--kds-color-primary-main);
7378
+ --kds-payment-amount-weight: var(--kds-font-weight-medium);
7379
+
7380
+ padding-left: var(--kds-spacing-10);
7381
+ padding-top: var(--kds-spacing-4);
7382
+ text-align: left;
7383
+ }
7384
+
7385
+ .kds-payment-total-title,
7386
+ .kds-payment-total-title-mobile {
7387
+ font-size: var(--kds-payment-total-title-size);
7388
+ font-weight: var(--kds-font-weight-semibold);
7389
+ color: var(--kds-color-text-primary);
7390
+ margin-bottom: var(--kds-spacing-4);
7391
+ }
7392
+
7393
+ .kds-payment-total-title-mobile {
7394
+ display: none;
7395
+ }
7396
+
7397
+ .kds-payment-total .kds-payment-label {
7398
+ font-size: var(--kds-payment-total-label-size);
7399
+ font-weight: var(--kds-font-weight-semibold);
7400
+ color: var(--kds-color-text-primary);
7401
+ margin-bottom: var(--kds-spacing-1);
7402
+ padding-top: 0;
7403
+ }
7404
+
7405
+ .kds-payment-total .kds-payment-amount {
7406
+ font-size: var(--kds-payment-amount-size);
7407
+ font-weight: var(--kds-payment-amount-weight);
7408
+ line-height: var(--kds-payment-amount-line-height);
7409
+ color: var(--kds-payment-amount-color);
7410
+ margin-bottom: var(--kds-spacing-4);
7411
+ }
7412
+
7413
+ .kds-payment-total .kds-payment-amount .kds-payment-total-decimal-sup {
7414
+ font-size: var(--kds-font-size-decimal-sup);
7415
+ font-weight: var(--kds-font-weight-semibold);
7416
+ position: relative;
7417
+ top: 0;
7418
+ }
7419
+
7420
+ /* Variante email: amount compacto en color texto primario, alineación izquierda fija */
7421
+ .kds-payment-total--email {
7422
+ --kds-payment-amount-size: var(--kds-font-size-2xl); /* 24px */
7423
+ --kds-payment-amount-line-height: var(--kds-line-height-snug);
7424
+ --kds-payment-amount-color: var(--kds-color-text-primary);
7425
+ --kds-payment-amount-weight: var(--kds-font-weight-semibold);
7426
+ }
7427
+
7428
+ /* Tone modifier: swaps the amount color to the khipu-blue / LigoPay info blue.
7429
+ Combinable with --email or with the default variant. */
7430
+ .kds-payment-total--tone-info {
7431
+ --kds-payment-amount-color: var(--kds-color-info-blue); /* #5A5FE0 */
7432
+ }
7433
+
7434
+ /* Responsive: mobile ≤ 1024px — centra y conmuta los títulos (sólo variante default) */
7435
+ @media (max-width: 1024px) {
7436
+ .kds-payment-total {
7437
+ padding-left: 0;
7438
+ text-align: center;
7439
+ }
7440
+
7441
+ .kds-payment-total .kds-payment-total-title {
7442
+ display: none;
7443
+ }
7444
+
7445
+ .kds-payment-total .kds-payment-total-title-mobile {
7446
+ display: block;
7447
+ text-align: center;
7448
+ }
7449
+
7450
+ .kds-payment-total .kds-payment-label,
7451
+ .kds-payment-total .kds-payment-amount {
7452
+ text-align: center;
7453
+ }
7454
+
7455
+ /* Email mantiene alineación izquierda incluso en mobile (matchea email clients) */
7456
+ .kds-payment-total--email,
7457
+ .kds-payment-total--email .kds-payment-label,
7458
+ .kds-payment-total--email .kds-payment-amount {
7459
+ text-align: left;
7460
+ }
7461
+ }
7462
+