@khipu/design-system 0.3.5-alpha.3 → 0.3.5-alpha.30
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.
- package/dist/beercss/khipu-beercss.css +386 -43
- package/dist/beercss/khipu-beercss.js +5 -61
- package/dist/beercss/khipu-beercss.min.css +1 -1
- package/dist/beercss/khipu-beercss.min.js +1 -1
- package/dist/beercss/khipu-beercss.scoped.css +385 -43
- package/dist/beercss/khipu-beercss.scoped.min.css +1 -1
- package/dist/beercss/metadata.json +5 -5
- package/dist/index.d.mts +55 -1
- package/dist/index.d.ts +55 -1
- package/dist/index.js +333 -321
- package/dist/index.mjs +279 -270
- package/package.json +2 -2
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* AUTO-GENERATED FILE - DO NOT EDIT MANUALLY
|
|
15
15
|
* Source: design-system/src/tokens/tokens.json
|
|
16
|
-
* Generated: 2026-
|
|
16
|
+
* Generated: 2026-10-06T20:11:26.407Z
|
|
17
17
|
*
|
|
18
18
|
* To regenerate:
|
|
19
19
|
* cd design-system && npm run tokens:generate
|
|
@@ -397,13 +397,13 @@
|
|
|
397
397
|
/* ============================================================================
|
|
398
398
|
DARK MODE COLOR TOKENS
|
|
399
399
|
Override only color variables; everything else inherits from :root.
|
|
400
|
-
Activated via [data-theme="dark"] on <html>, <body>, or a wrapper
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
400
|
+
Activated ONLY via [data-theme="dark"] on <html>, <body>, or a wrapper.
|
|
401
|
+
body.dark is deliberately NOT a trigger: BeerCSS adds that class on its
|
|
402
|
+
own when the OS reports a dark preference, so honouring it turns dark on
|
|
403
|
+
for consumers that never opted in. Dark stays opt-in until an app sets
|
|
404
|
+
data-theme explicitly.
|
|
404
405
|
============================================================================ */
|
|
405
406
|
|
|
406
|
-
body.dark,
|
|
407
407
|
[data-theme="dark"] {
|
|
408
408
|
|
|
409
409
|
/* Primary palette - Khipu brand */
|
|
@@ -879,11 +879,10 @@ body.dark,
|
|
|
879
879
|
values so selected states / rows / hovers adapt. Additive: the light
|
|
880
880
|
:root / body.light values above are unchanged. Tokens already defined as
|
|
881
881
|
var() refs (warning-soft, danger-soft) adapt on their own and are omitted.
|
|
882
|
-
body.dark is
|
|
883
|
-
|
|
884
|
-
|
|
882
|
+
body.dark is deliberately NOT a trigger: BeerCSS adds that class on its own
|
|
883
|
+
when the OS reports a dark preference, so honouring it turns dark on for
|
|
884
|
+
consumers that never opted in. Dark stays opt-in via data-theme.
|
|
885
885
|
======================================== */
|
|
886
|
-
body.dark,
|
|
887
886
|
[data-theme="dark"] {
|
|
888
887
|
--kds-color-primary-faint: #1E1030; /* dark brand-tinted subtle surface (selected rows/cards) */
|
|
889
888
|
--kds-color-info-soft: var(--kds-alert-info-bg); /* dark translucent blue */
|
|
@@ -917,7 +916,7 @@ body.dark,
|
|
|
917
916
|
opt-out for Chrome/WebView "Auto Dark Theme" on Android: without it, an
|
|
918
917
|
OS-dark device heuristically darkens SOME elements of a light page (mixed
|
|
919
918
|
light/dark rendering in production apps). Dark is reached only by an
|
|
920
|
-
explicit [data-theme="dark"]
|
|
919
|
+
explicit [data-theme="dark"] opt-in. */
|
|
921
920
|
:root,
|
|
922
921
|
html,
|
|
923
922
|
body {
|
|
@@ -936,8 +935,7 @@ body {
|
|
|
936
935
|
}
|
|
937
936
|
|
|
938
937
|
/* Explicit dark theme: let native UI (form controls, scrollbars) render dark. */
|
|
939
|
-
[data-theme="dark"]
|
|
940
|
-
body.dark {
|
|
938
|
+
[data-theme="dark"] {
|
|
941
939
|
color-scheme: dark;
|
|
942
940
|
}
|
|
943
941
|
|
|
@@ -999,6 +997,20 @@ footer {
|
|
|
999
997
|
background-color: transparent !important;
|
|
1000
998
|
}
|
|
1001
999
|
|
|
1000
|
+
/* Familia base del arbol del DS.
|
|
1001
|
+
BeerCSS la pone en `body { font-family: var(--font) }`, y `--font` es un alias
|
|
1002
|
+
declarado en :root. Una custom property se sustituye en el elemento que la declara,
|
|
1003
|
+
asi que ese alias se congela con la familia de :root: una marca que define
|
|
1004
|
+
--kds-font-family-primary mas abajo en el arbol no lo mueve, y el texto que solo
|
|
1005
|
+
hereda de body se queda con la familia por defecto.
|
|
1006
|
+
|
|
1007
|
+
Resolviendo el token aca, en la raiz del arbol del DS, hereda todo lo de adentro con
|
|
1008
|
+
la familia vigente en ese punto. Sin marca definida el valor es el mismo de siempre,
|
|
1009
|
+
asi que no cambia nada para quien no la configura. */
|
|
1010
|
+
.kds-theme-root {
|
|
1011
|
+
font-family: var(--kds-font-family-primary);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1002
1014
|
/* ========================================
|
|
1003
1015
|
TEXT UTILITIES OVERRIDE
|
|
1004
1016
|
Fix BeerCSS classes that use wrong color tokens
|
|
@@ -1210,6 +1222,29 @@ a.kds-btn-outlined-white:hover:not(:disabled) {
|
|
|
1210
1222
|
opacity: 0.9;
|
|
1211
1223
|
}
|
|
1212
1224
|
|
|
1225
|
+
/* Outlined success — compone con .kds-btn-outlined, igual que .kds-btn-outlined-white:
|
|
1226
|
+
solo cambia superficie y color, la caja la aporta la variante base. */
|
|
1227
|
+
button.kds-btn-outlined-success,
|
|
1228
|
+
a.kds-btn-outlined-success {
|
|
1229
|
+
background: transparent;
|
|
1230
|
+
color: var(--kds-color-success-main);
|
|
1231
|
+
border-color: var(--kds-color-success-main);
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
button.kds-btn-outlined-success:hover:not(:disabled),
|
|
1235
|
+
a.kds-btn-outlined-success:hover:not(:disabled) {
|
|
1236
|
+
background: var(--kds-color-success-soft);
|
|
1237
|
+
border-color: var(--kds-color-success-dark);
|
|
1238
|
+
color: var(--kds-color-success-dark);
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
button.kds-btn-outlined-success:disabled,
|
|
1242
|
+
a.kds-btn-outlined-success:disabled {
|
|
1243
|
+
background: transparent;
|
|
1244
|
+
color: var(--kds-color-action-disabled);
|
|
1245
|
+
border-color: var(--kds-color-action-disabled);
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1213
1248
|
/* Text button — mismo tamaño que el resto de variantes (hereda min-height/padding
|
|
1214
1249
|
del base): solo cambia la superficie, no la caja. */
|
|
1215
1250
|
button.kds-btn-text,
|
|
@@ -1901,6 +1936,9 @@ a.kds-btn.kds-btn-md {
|
|
|
1901
1936
|
.kds-mt-4 { margin-top: var(--kds-spacing-4); }
|
|
1902
1937
|
.kds-mt-6 { margin-top: var(--kds-spacing-6); }
|
|
1903
1938
|
.kds-mt-8 { margin-top: var(--kds-spacing-8); }
|
|
1939
|
+
/* Absorbe el espacio libre de un contenedor flex-column: ancla el elemento al fondo
|
|
1940
|
+
(p.ej. las acciones de un form dentro de .kds-card-elevated--action). */
|
|
1941
|
+
.kds-mt-auto { margin-top: auto; }
|
|
1904
1942
|
|
|
1905
1943
|
.kds-mb-0 { margin-bottom: 0; }
|
|
1906
1944
|
.kds-mb-0-5 { margin-bottom: var(--kds-spacing-0-5); }
|
|
@@ -2354,28 +2392,35 @@ button.kds-locale-switcher-toggle:hover,
|
|
|
2354
2392
|
}
|
|
2355
2393
|
|
|
2356
2394
|
/* ========================================
|
|
2357
|
-
|
|
2358
|
-
|
|
2395
|
+
SSO Button (federated sign-in: Google, Microsoft, ...)
|
|
2396
|
+
Neutral white button shared by every identity provider, styled per
|
|
2397
|
+
Google Identity branding guidelines, which Microsoft's also satisfy:
|
|
2359
2398
|
https://developers.google.com/identity/branding-guidelines
|
|
2399
|
+
`.kds-btn-google` / `.kds-google-icon` are kept as aliases for
|
|
2400
|
+
consumers pinned to earlier versions.
|
|
2401
|
+
Colors go through --kds-btn-sso-* so the dark theme swaps all of them
|
|
2402
|
+
together (background alone flipping left the label unreadable).
|
|
2360
2403
|
======================================== */
|
|
2361
2404
|
|
|
2405
|
+
button.kds-btn-sso,
|
|
2406
|
+
a.kds-btn-sso,
|
|
2362
2407
|
button.kds-btn-google,
|
|
2363
2408
|
a.kds-btn-google {
|
|
2364
2409
|
display: inline-flex;
|
|
2365
2410
|
align-items: center;
|
|
2366
2411
|
justify-content: center;
|
|
2367
|
-
gap: var(--kds-spacing-1-
|
|
2412
|
+
gap: var(--kds-spacing-1-25);
|
|
2368
2413
|
width: 100%;
|
|
2369
|
-
background: var(--kds-
|
|
2370
|
-
color: #1F1F1F;
|
|
2371
|
-
border: 1px solid #747775;
|
|
2414
|
+
background: var(--kds-btn-sso-bg, #FFFFFF);
|
|
2415
|
+
color: var(--kds-btn-sso-color, #1F1F1F);
|
|
2416
|
+
border: 1px solid var(--kds-btn-sso-border, #747775);
|
|
2372
2417
|
border-radius: var(--kds-radius-button);
|
|
2373
2418
|
padding: var(--kds-spacing-1) var(--kds-spacing-1-5);
|
|
2374
2419
|
min-height: var(--kds-spacing-button-min-height);
|
|
2375
|
-
font-family:
|
|
2420
|
+
font-family: var(--kds-font-family-secondary);
|
|
2376
2421
|
font-weight: var(--kds-font-weight-medium);
|
|
2377
2422
|
font-size: var(--kds-font-size-sm);
|
|
2378
|
-
line-height:
|
|
2423
|
+
line-height: 20px; /* Google 14/20; no line-height token matches */
|
|
2379
2424
|
letter-spacing: var(--kds-letter-spacing-normal);
|
|
2380
2425
|
text-transform: none;
|
|
2381
2426
|
cursor: pointer;
|
|
@@ -2385,17 +2430,34 @@ a.kds-btn-google {
|
|
|
2385
2430
|
box-shadow: none;
|
|
2386
2431
|
}
|
|
2387
2432
|
|
|
2433
|
+
button.kds-btn-sso:hover,
|
|
2434
|
+
a.kds-btn-sso:hover,
|
|
2388
2435
|
button.kds-btn-google:hover,
|
|
2389
2436
|
a.kds-btn-google:hover {
|
|
2390
|
-
background: #F2F2F2;
|
|
2437
|
+
background: var(--kds-btn-sso-bg-hover, #F2F2F2);
|
|
2391
2438
|
box-shadow: var(--kds-shadow-1);
|
|
2392
2439
|
}
|
|
2393
2440
|
|
|
2441
|
+
button.kds-btn-sso:active,
|
|
2442
|
+
a.kds-btn-sso:active,
|
|
2394
2443
|
button.kds-btn-google:active,
|
|
2395
2444
|
a.kds-btn-google:active {
|
|
2396
|
-
background: #E8E8E8;
|
|
2445
|
+
background: var(--kds-btn-sso-bg-active, #E8E8E8);
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2448
|
+
/* Dark theme per Google Identity guidelines; hover/active are 8% / 12%
|
|
2449
|
+
state layers of the label color over the fill. */
|
|
2450
|
+
[data-theme="dark"] .kds-btn-sso,
|
|
2451
|
+
[data-theme="dark"] .kds-btn-google {
|
|
2452
|
+
--kds-btn-sso-bg: #131314;
|
|
2453
|
+
--kds-btn-sso-color: #E3E3E3;
|
|
2454
|
+
--kds-btn-sso-border: #8E918F;
|
|
2455
|
+
--kds-btn-sso-bg-hover: #242425;
|
|
2456
|
+
--kds-btn-sso-bg-active: #2C2C2D;
|
|
2397
2457
|
}
|
|
2398
2458
|
|
|
2459
|
+
button.kds-btn-sso:disabled,
|
|
2460
|
+
a.kds-btn-sso:disabled,
|
|
2399
2461
|
button.kds-btn-google:disabled,
|
|
2400
2462
|
a.kds-btn-google:disabled {
|
|
2401
2463
|
background: var(--kds-color-action-disabled-bg);
|
|
@@ -2405,7 +2467,8 @@ a.kds-btn-google:disabled {
|
|
|
2405
2467
|
box-shadow: none;
|
|
2406
2468
|
}
|
|
2407
2469
|
|
|
2408
|
-
/*
|
|
2470
|
+
/* Provider logo container */
|
|
2471
|
+
.kds-btn-sso .kds-sso-icon,
|
|
2409
2472
|
.kds-btn-google .kds-google-icon {
|
|
2410
2473
|
display: flex;
|
|
2411
2474
|
align-items: center;
|
|
@@ -2413,6 +2476,7 @@ a.kds-btn-google:disabled {
|
|
|
2413
2476
|
flex-shrink: 0;
|
|
2414
2477
|
}
|
|
2415
2478
|
|
|
2479
|
+
.kds-btn-sso .kds-sso-icon svg,
|
|
2416
2480
|
.kds-btn-google .kds-google-icon svg {
|
|
2417
2481
|
width: var(--kds-spacing-button-icon-size);
|
|
2418
2482
|
height: var(--kds-spacing-button-icon-size);
|
|
@@ -2456,12 +2520,21 @@ a.kds-btn-google:disabled {
|
|
|
2456
2520
|
/* Llena y centra dentro de contenedores flex (pantalla de carga); en flujo
|
|
2457
2521
|
normal (contenedor no-flex) se reduce a su contenido. */
|
|
2458
2522
|
flex: 1 1 auto;
|
|
2459
|
-
/* Alto propio: el loader es contenido minimo por definicion, asi que sin esto la
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2523
|
+
/* Alto propio: el loader es contenido minimo por definicion, asi que sin esto la card
|
|
2524
|
+
queda del alto del spinner y se lee como un recorte. Va aca y no en la card para que
|
|
2525
|
+
el minimo aplique solo a la carga: el resto de las pantallas crece con su contenido.
|
|
2526
|
+
El valor de escritorio es moderado a proposito: el minimo de telefono (36rem) dejaba
|
|
2527
|
+
la card de la carga mucho mas alta que cualquier otra pantalla, y al entrar y salir
|
|
2528
|
+
del loader el widget crecia y volvia a encoger. */
|
|
2529
|
+
min-height: 18rem;
|
|
2530
|
+
}
|
|
2531
|
+
|
|
2532
|
+
/* En telefono la carga si ocupa el alto util de la pantalla: ahi la card va a ancho
|
|
2533
|
+
completo y un loader corto se lee como una franja perdida en el medio. */
|
|
2534
|
+
@media (max-width: 767px) {
|
|
2535
|
+
.kds-secure-loader {
|
|
2536
|
+
min-height: 36rem;
|
|
2537
|
+
}
|
|
2465
2538
|
}
|
|
2466
2539
|
|
|
2467
2540
|
.kds-secure-loader-text {
|
|
@@ -3271,12 +3344,33 @@ label.radio span {
|
|
|
3271
3344
|
cursor: pointer;
|
|
3272
3345
|
}
|
|
3273
3346
|
|
|
3274
|
-
/* Checked state
|
|
3347
|
+
/* Checked state.
|
|
3348
|
+
accent-color aplica al input nativo, que BeerCSS deja con opacity 0: no se ve.
|
|
3349
|
+
Se mantiene igual por si algun consumidor no usa el markup de BeerCSS. */
|
|
3275
3350
|
label.checkbox input[type="checkbox"]:checked,
|
|
3276
3351
|
label.radio input[type="radio"]:checked {
|
|
3277
3352
|
accent-color: var(--kds-color-accent, var(--primary));
|
|
3278
3353
|
}
|
|
3279
3354
|
|
|
3355
|
+
/* El control que SI se ve lo dibuja BeerCSS como una ligadura de Material Symbols en
|
|
3356
|
+
`> span::before`, coloreada con var(--primary). Estas dos reglas reproducen sus
|
|
3357
|
+
selectores para que ese pseudo-elemento siga al rol accent.
|
|
3358
|
+
|
|
3359
|
+
Misma especificidad que el original y sin !important: este archivo va ultimo en el
|
|
3360
|
+
bundle, asi que gana por orden. El fallback deja el valor anterior intacto cuando la
|
|
3361
|
+
marca no define accent, que es el caso de todo consumidor actual.
|
|
3362
|
+
|
|
3363
|
+
No se toca `.switch`: es un control de encendido/apagado, no de seleccion, y el
|
|
3364
|
+
contrato de marca no lo incluye. */
|
|
3365
|
+
:is(.checkbox, .radio) > span::before {
|
|
3366
|
+
color: var(--kds-color-accent, var(--primary));
|
|
3367
|
+
}
|
|
3368
|
+
|
|
3369
|
+
:is(.checkbox, .radio) > input:checked + span::before,
|
|
3370
|
+
:is(.checkbox, .radio).icon > input:checked + span > i {
|
|
3371
|
+
color: var(--kds-color-accent, var(--primary));
|
|
3372
|
+
}
|
|
3373
|
+
|
|
3280
3374
|
/* Disabled state */
|
|
3281
3375
|
label.checkbox input[type="checkbox"]:disabled,
|
|
3282
3376
|
label.radio input[type="radio"]:disabled {
|
|
@@ -4330,14 +4424,16 @@ footer > .kds-container-center {
|
|
|
4330
4424
|
|
|
4331
4425
|
/* Code block for displaying code snippets */
|
|
4332
4426
|
.kds-code-block {
|
|
4333
|
-
background: var(--kds-color-background-
|
|
4334
|
-
|
|
4427
|
+
background: var(--kds-color-background-muted);
|
|
4428
|
+
border: 1px solid var(--kds-color-divider);
|
|
4429
|
+
padding: var(--kds-spacing-2);
|
|
4335
4430
|
border-radius: var(--kds-radius-md);
|
|
4336
4431
|
overflow-x: auto;
|
|
4337
|
-
font-family:
|
|
4432
|
+
font-family: var(--kds-font-family-mono);
|
|
4338
4433
|
font-size: var(--kds-font-size-sm);
|
|
4339
4434
|
line-height: var(--kds-line-height-relaxed);
|
|
4340
4435
|
color: var(--kds-color-text-primary);
|
|
4436
|
+
tab-size: 4;
|
|
4341
4437
|
}
|
|
4342
4438
|
|
|
4343
4439
|
/* ============================================
|
|
@@ -6279,13 +6375,39 @@ button.kds-fab:active:not(:disabled) {
|
|
|
6279
6375
|
alto que el mark de Khipu. Sirve para <img> o un elemento con .kds-psp-mark. */
|
|
6280
6376
|
.kds-secure-footer img,
|
|
6281
6377
|
.kds-secure-footer .kds-psp-mark {
|
|
6282
|
-
height: 11px;
|
|
6283
6378
|
width: auto;
|
|
6284
6379
|
flex: 0 0 auto;
|
|
6285
6380
|
display: block;
|
|
6286
6381
|
object-fit: contain;
|
|
6287
6382
|
}
|
|
6288
6383
|
|
|
6384
|
+
/* Logo del PSP: dos perillas, las dos calibradas contra el asset real que sube un PSP
|
|
6385
|
+
hoy (klap.png, 60x30, con 2px de aire transparente arriba y abajo).
|
|
6386
|
+
|
|
6387
|
+
Se nivela por LINEA DE BASE, no por caja ni por borde inferior de la tinta: los dos
|
|
6388
|
+
wordmarks tienen descendente -la "p" de Khipu baja un 20% de su caja- asi que igualar
|
|
6389
|
+
los bordes de abajo deja al logo del PSP flotando sobre la linea de Khipu.
|
|
6390
|
+
|
|
6391
|
+
- --kds-psp-mark-height: el alto de la caja. El ojo lee la tinta, no la caja, y el
|
|
6392
|
+
aire del PNG se come parte del alto: a 11px la tinta de klap medía 9.5px contra los
|
|
6393
|
+
11px de Khipu y se veia mas chico. A 15px la tinta llega a 13px y se leen iguales.
|
|
6394
|
+
- --kds-psp-mark-top: cuanto baja para que su linea de base calce con la de Khipu.
|
|
6395
|
+
Va como valor y no como formula a proposito: depende del aire y de la anatomia del
|
|
6396
|
+
asset de cada PSP, y se termina de ajustar mirando la pantalla. */
|
|
6397
|
+
.kds-secure-footer {
|
|
6398
|
+
--kds-psp-mark-height: 15px;
|
|
6399
|
+
--kds-psp-mark-top: 1px;
|
|
6400
|
+
}
|
|
6401
|
+
|
|
6402
|
+
.kds-secure-footer img,
|
|
6403
|
+
.kds-secure-footer .kds-psp-mark {
|
|
6404
|
+
height: var(--kds-psp-mark-height);
|
|
6405
|
+
position: relative;
|
|
6406
|
+
top: var(--kds-psp-mark-top);
|
|
6407
|
+
}
|
|
6408
|
+
|
|
6409
|
+
|
|
6410
|
+
|
|
6289
6411
|
.kds-secure-footer-code {
|
|
6290
6412
|
color: var(--kds-color-text-hint);
|
|
6291
6413
|
}
|
|
@@ -6541,14 +6663,37 @@ button.kds-fab:active:not(:disabled) {
|
|
|
6541
6663
|
color: var(--kds-color-success-main);
|
|
6542
6664
|
}
|
|
6543
6665
|
|
|
6544
|
-
/* Variant: pending (animated
|
|
6666
|
+
/* Variant: pending (animated spinner, sin icono interno).
|
|
6667
|
+
El acento sale de --kds-status-pending-accent, con el azul de info como
|
|
6668
|
+
fallback: el valor por defecto no cambia, y una pantalla puede pedir otro
|
|
6669
|
+
acento sin redefinir la regla ni recurrir a estilos inline. */
|
|
6545
6670
|
.kds-status-block[data-status="pending"] .kds-status-block-icon {
|
|
6546
6671
|
background: transparent;
|
|
6547
6672
|
border: 3px solid var(--kds-color-divider);
|
|
6548
|
-
border-top-color: var(--kds-color-info-main);
|
|
6673
|
+
border-top-color: var(--kds-status-pending-accent, var(--kds-color-info-main));
|
|
6549
6674
|
animation: kds-spin 1s linear infinite;
|
|
6550
6675
|
}
|
|
6551
6676
|
|
|
6677
|
+
/* Spinner neutro, para esperas que acompañan al contenido sin reclamar
|
|
6678
|
+
atención: el azul de info lee como un aviso y compite con la información
|
|
6679
|
+
de la pantalla. */
|
|
6680
|
+
.kds-status-block.kds-accent-neutral {
|
|
6681
|
+
--kds-status-pending-accent: var(--kds-color-text-primary);
|
|
6682
|
+
}
|
|
6683
|
+
|
|
6684
|
+
/* Spinner fino, para bandas de una línea donde el trazo de 3px pesa demasiado.
|
|
6685
|
+
El tamaño se pide por token y no por regla sobre el icono: así no compite en
|
|
6686
|
+
especificidad con `.kds-status-block.inline .kds-status-block-icon`, que
|
|
6687
|
+
marca igual y viene después. */
|
|
6688
|
+
.kds-status-block.kds-spinner-sm {
|
|
6689
|
+
--kds-status-icon-size: var(--kds-spacing-3);
|
|
6690
|
+
--kds-status-icon-size-sm: var(--kds-spacing-3);
|
|
6691
|
+
}
|
|
6692
|
+
|
|
6693
|
+
.kds-status-block.kds-spinner-sm .kds-status-block-icon {
|
|
6694
|
+
border-width: 2px;
|
|
6695
|
+
}
|
|
6696
|
+
|
|
6552
6697
|
/* Variant: warn */
|
|
6553
6698
|
.kds-status-block[data-status="warn"] .kds-status-block-icon {
|
|
6554
6699
|
background: var(--kds-color-warning-soft);
|
|
@@ -6592,6 +6737,60 @@ button.kds-fab:active:not(:disabled) {
|
|
|
6592
6737
|
font-size: var(--kds-font-size-xl);
|
|
6593
6738
|
}
|
|
6594
6739
|
|
|
6740
|
+
/* Inline without description: the title is the only thing next to the icon. Its
|
|
6741
|
+
margin-bottom (spacing-1, which separates it from the description in the centered
|
|
6742
|
+
variant) made the column taller, so align-items:center left the text ~4px above the
|
|
6743
|
+
icon's center. */
|
|
6744
|
+
.kds-status-block.inline .kds-status-block-title:last-child {
|
|
6745
|
+
margin-bottom: 0;
|
|
6746
|
+
--kds-typography-h2-margin-block-end: 0;
|
|
6747
|
+
}
|
|
6748
|
+
|
|
6749
|
+
/* Inline with description (KdsStatusBlock inline + description): the description is a
|
|
6750
|
+
full-width paragraph below the icon+title row, spacing-1 under it. The block drops its
|
|
6751
|
+
bottom padding and owns the gap to what follows (spacing-2), so consumers never add
|
|
6752
|
+
margins around the description. kds-btn-stack and kds-share-card already carry that
|
|
6753
|
+
top margin themselves. */
|
|
6754
|
+
.kds-status-block.inline.kds-status-block--described {
|
|
6755
|
+
flex-wrap: wrap;
|
|
6756
|
+
row-gap: var(--kds-spacing-1);
|
|
6757
|
+
padding-bottom: 0;
|
|
6758
|
+
}
|
|
6759
|
+
|
|
6760
|
+
.kds-status-block--described > .kds-status-block-description {
|
|
6761
|
+
flex-basis: 100%;
|
|
6762
|
+
}
|
|
6763
|
+
|
|
6764
|
+
.kds-status-block--described + .kds-alert,
|
|
6765
|
+
.kds-status-block--described + .kds-copy-row {
|
|
6766
|
+
margin-top: var(--kds-spacing-2);
|
|
6767
|
+
}
|
|
6768
|
+
|
|
6769
|
+
/* Banda: el bloque de estado sobre una superficie sutil, para cuando acompaña
|
|
6770
|
+
al contenido en lugar de encabezar la pantalla. Va después de `.inline`
|
|
6771
|
+
porque marca igual en especificidad y necesita ganarle el padding. */
|
|
6772
|
+
.kds-status-block.kds-banded {
|
|
6773
|
+
/* 0.75rem = 12px, el valor que --kds-font-size-xs toma desde tablet. Va plano y no
|
|
6774
|
+
sigue la escala responsiva a proposito: a 11px el mensaje de espera se parte en dos
|
|
6775
|
+
lineas y el diseno lo quiere en una. Como custom property de la variante, siguiendo
|
|
6776
|
+
el patron de kds-spinner-sm con --kds-status-icon-size. */
|
|
6777
|
+
--kds-status-band-font-size: 0.75rem;
|
|
6778
|
+
background: var(--kds-color-background-muted);
|
|
6779
|
+
border-radius: var(--kds-radius-md);
|
|
6780
|
+
padding: var(--kds-spacing-1-5) var(--kds-spacing-2);
|
|
6781
|
+
}
|
|
6782
|
+
|
|
6783
|
+
/* La banda de espera lleva su propia tipografia, por spec de Figma: 11px en bold.
|
|
6784
|
+
Va scopeada a la variante y no a .kds-status-block-description, que la comparten
|
|
6785
|
+
los bloques de resultado, donde 11px seria ilegible. El color se deja en el token
|
|
6786
|
+
heredado: un #000 fijo se volveria invisible bajo modo oscuro, donde text-primary
|
|
6787
|
+
pasa a blanco. */
|
|
6788
|
+
.kds-status-block.kds-banded .kds-status-block-description {
|
|
6789
|
+
font-size: var(--kds-status-band-font-size);
|
|
6790
|
+
font-weight: var(--kds-font-weight-bold);
|
|
6791
|
+
line-height: normal;
|
|
6792
|
+
}
|
|
6793
|
+
|
|
6595
6794
|
@keyframes kds-spin {
|
|
6596
6795
|
to { transform: rotate(360deg); }
|
|
6597
6796
|
}
|
|
@@ -6678,6 +6877,48 @@ button.kds-fab:active:not(:disabled) {
|
|
|
6678
6877
|
min-height: 0;
|
|
6679
6878
|
}
|
|
6680
6879
|
|
|
6880
|
+
/* Variante alta (size="full"): contenido largo (documentos, textos legales) usa todo el alto
|
|
6881
|
+
máximo del sheet y el body se estira para que un hijo lo llene. Los .kds-theme-root son
|
|
6882
|
+
envoltorios transparentes que el consumidor puede meter entre el body y el contenido (p. ej.
|
|
6883
|
+
un KdsRoot dentro de un div display:contents), así que se estiran a cualquier profundidad. */
|
|
6884
|
+
.kds-bottom-sheet-full {
|
|
6885
|
+
height: 90vh;
|
|
6886
|
+
height: 90dvh;
|
|
6887
|
+
}
|
|
6888
|
+
|
|
6889
|
+
.kds-bottom-sheet-full .kds-bottom-sheet-body,
|
|
6890
|
+
.kds-bottom-sheet-full .kds-bottom-sheet-body .kds-theme-root {
|
|
6891
|
+
display: flex;
|
|
6892
|
+
flex: 1;
|
|
6893
|
+
flex-direction: column;
|
|
6894
|
+
}
|
|
6895
|
+
|
|
6896
|
+
/* ========================================
|
|
6897
|
+
DOCUMENT FRAME (.kds-document-frame)
|
|
6898
|
+
Documento embebido (iframe) que llena su contenedor. --kds-document-frame-scale achica
|
|
6899
|
+
documentos pensados para un viewport de escritorio: el iframe se arma más ancho y se
|
|
6900
|
+
escala, así letra, títulos y márgenes bajan juntos.
|
|
6901
|
+
======================================== */
|
|
6902
|
+
|
|
6903
|
+
.kds-document-frame {
|
|
6904
|
+
--kds-document-frame-scale: 1;
|
|
6905
|
+
position: relative;
|
|
6906
|
+
flex: 1;
|
|
6907
|
+
min-height: var(--kds-document-frame-min-height, 12rem);
|
|
6908
|
+
overflow: hidden;
|
|
6909
|
+
}
|
|
6910
|
+
|
|
6911
|
+
.kds-document-frame > iframe {
|
|
6912
|
+
position: absolute;
|
|
6913
|
+
top: 0;
|
|
6914
|
+
left: 0;
|
|
6915
|
+
width: calc(100% / var(--kds-document-frame-scale));
|
|
6916
|
+
height: calc(100% / var(--kds-document-frame-scale));
|
|
6917
|
+
border: 0;
|
|
6918
|
+
transform: scale(var(--kds-document-frame-scale));
|
|
6919
|
+
transform-origin: 0 0;
|
|
6920
|
+
}
|
|
6921
|
+
|
|
6681
6922
|
.kds-bottom-sheet-icon {
|
|
6682
6923
|
font-size: var(--kds-font-size-4xl);
|
|
6683
6924
|
}
|
|
@@ -6713,6 +6954,14 @@ button.kds-fab:active:not(:disabled) {
|
|
|
6713
6954
|
color: var(--kds-color-primary-contrast);
|
|
6714
6955
|
}
|
|
6715
6956
|
|
|
6957
|
+
/* El reset `.kds-bottom-sheet-actions button { border: 0 }` borra la caja de las
|
|
6958
|
+
variantes outlined. Se restituye solo grosor y estilo: el color queda en
|
|
6959
|
+
currentColor, que ya es el de cada variante (primary, success, etc.). */
|
|
6960
|
+
.kds-bottom-sheet-actions button.kds-btn-outlined {
|
|
6961
|
+
border-style: solid;
|
|
6962
|
+
border-width: var(--kds-border-width-sm, 1px);
|
|
6963
|
+
}
|
|
6964
|
+
|
|
6716
6965
|
.kds-bottom-sheet-actions .kds-btn-ghost {
|
|
6717
6966
|
background: transparent;
|
|
6718
6967
|
color: var(--kds-color-text-secondary);
|
|
@@ -6833,6 +7082,15 @@ button.kds-fab:active:not(:disabled) {
|
|
|
6833
7082
|
}
|
|
6834
7083
|
|
|
6835
7084
|
/* Auto-managed tab panels: hidden attribute must win over any display rule */
|
|
7085
|
+
/* `hidden` es semantica de plataforma: si el atributo esta, el elemento no se
|
|
7086
|
+
renderiza. El UA lo aplica con display:none, pero cualquier regla de autor con
|
|
7087
|
+
display lo pisa — .kds-btn y .kds-btn-stack son flex, asi que un boton con
|
|
7088
|
+
hidden seguia ocupando lugar. El !important es deliberado: ninguna regla de
|
|
7089
|
+
componente deberia poder anular el atributo. */
|
|
7090
|
+
[hidden] {
|
|
7091
|
+
display: none !important;
|
|
7092
|
+
}
|
|
7093
|
+
|
|
6836
7094
|
[data-kds-tab-panel][hidden] {
|
|
6837
7095
|
display: none;
|
|
6838
7096
|
}
|
|
@@ -7223,6 +7481,48 @@ div.kds-invoice-header,
|
|
|
7223
7481
|
padding: var(--kds-spacing-0-5);
|
|
7224
7482
|
}
|
|
7225
7483
|
|
|
7484
|
+
/* -- Skeleton (KTUF-388) --
|
|
7485
|
+
Gris pulsante que reserva el lugar de un contenido que aún no llega. La base solo pinta:
|
|
7486
|
+
sobre un elemento que ya tiene tamaño (p.ej. .kds-invoice-merchant) conserva sus medidas,
|
|
7487
|
+
radio y colapso, y solo cambia el fondo. */
|
|
7488
|
+
.kds-skeleton {
|
|
7489
|
+
background: var(--kds-color-gray-200);
|
|
7490
|
+
animation: kds-skeleton-pulse 1.4s ease-in-out infinite;
|
|
7491
|
+
}
|
|
7492
|
+
|
|
7493
|
+
/* Línea de texto: inline-block de 1em puesto DENTRO del elemento real (p.kds-invoice-amount,
|
|
7494
|
+
dd, ...), hereda su font-size y line-height, así la caja mide lo mismo que con texto y el
|
|
7495
|
+
reemplazo no desplaza el layout. */
|
|
7496
|
+
.kds-skeleton--text {
|
|
7497
|
+
display: inline-block;
|
|
7498
|
+
width: 100%;
|
|
7499
|
+
height: 1em;
|
|
7500
|
+
vertical-align: middle;
|
|
7501
|
+
border-radius: var(--kds-radius-sm);
|
|
7502
|
+
}
|
|
7503
|
+
|
|
7504
|
+
[data-theme="dark"] .kds-skeleton {
|
|
7505
|
+
background: var(--kds-color-gray-700);
|
|
7506
|
+
}
|
|
7507
|
+
|
|
7508
|
+
@keyframes kds-skeleton-pulse {
|
|
7509
|
+
0%, 100% { opacity: 1; }
|
|
7510
|
+
50% { opacity: 0.45; }
|
|
7511
|
+
}
|
|
7512
|
+
|
|
7513
|
+
@media (prefers-reduced-motion: reduce) {
|
|
7514
|
+
.kds-skeleton {
|
|
7515
|
+
animation: none;
|
|
7516
|
+
}
|
|
7517
|
+
}
|
|
7518
|
+
|
|
7519
|
+
/* Header de la factura mientras carga (KdsInvoiceHeaderSkeleton): mismo markup que el
|
|
7520
|
+
header real, con anchos fijos por slot. */
|
|
7521
|
+
.kds-invoice-skeleton .kds-invoice-amount .kds-skeleton--text { width: 7.5em; }
|
|
7522
|
+
.kds-invoice-skeleton .kds-invoice-code .kds-skeleton--text { width: 13em; }
|
|
7523
|
+
.kds-invoice-skeleton .kds-kv dt .kds-skeleton--text { width: 4.5em; }
|
|
7524
|
+
.kds-invoice-skeleton .kds-kv dd .kds-skeleton--text { width: 65%; }
|
|
7525
|
+
|
|
7226
7526
|
/* Titulo del body de la card: alineado a la izquierda, sin importar que el consumidor
|
|
7227
7527
|
traiga .kds-text-center. Va con especificidad de contexto (screen + card) a proposito:
|
|
7228
7528
|
el centrado se venia pidiendo app por app y el resultado era inconsistente entre
|
|
@@ -7907,6 +8207,25 @@ svg[fill='none'] {
|
|
|
7907
8207
|
border-radius: var(--kds-radius-card);
|
|
7908
8208
|
}
|
|
7909
8209
|
|
|
8210
|
+
/* Body card con acción (opt-in, KTUF-388): alto mínimo acotado para que el card no salte de
|
|
8211
|
+
alto entre pasos y la acción (submit) quede anclada al fondo con `.kds-mt-auto`. No cambia
|
|
8212
|
+
el default de arriba: lo pide cada app.
|
|
8213
|
+
- Valor fijo, sin vh/dvh: en un iframe (KTUF-239) el viewport es el propio iframe, cuyo
|
|
8214
|
+
alto lo da el RESIZE del contenido; un mínimo relativo al viewport se realimenta.
|
|
8215
|
+
- 21rem = alto del card de carga en desktop (loader 18rem + padding spacing-3 x2), así el
|
|
8216
|
+
paso loader -> formulario no cambia de alto. Ajustable con el token.
|
|
8217
|
+
- El contenido directo (form) crece para que la acción baje dentro de él y no compita
|
|
8218
|
+
con el `margin-top: auto` de .kds-card-version. */
|
|
8219
|
+
.kds-screen > .kds-card-elevated.kds-card-elevated--action {
|
|
8220
|
+
min-height: var(--kds-card-action-min-height, 21rem);
|
|
8221
|
+
}
|
|
8222
|
+
|
|
8223
|
+
.kds-card-elevated--action > form {
|
|
8224
|
+
flex-grow: 1;
|
|
8225
|
+
display: flex;
|
|
8226
|
+
flex-direction: column;
|
|
8227
|
+
}
|
|
8228
|
+
|
|
7910
8229
|
/* Variante sin radio superior: pantallas de resultado (éxito/fallo/timeout) que van
|
|
7911
8230
|
SIN header arriba — la body card va sola y su tope queda plano (flush) en vez de
|
|
7912
8231
|
con esquinas redondeadas sueltas. El padding del card sigue manejando el inset. */
|
|
@@ -7923,13 +8242,20 @@ svg[fill='none'] {
|
|
|
7923
8242
|
|
|
7924
8243
|
/* Payment stage — full-viewport centered wrapper.
|
|
7925
8244
|
Fondo muted (gris) para que las cards blancas (header + body) y el gap entre
|
|
7926
|
-
ellas se distingan; sin esto, card blanca sobre fondo blanco se funden.
|
|
8245
|
+
ellas se distingan; sin esto, card blanca sobre fondo blanco se funden.
|
|
8246
|
+
|
|
8247
|
+
--kds-color-background-body es el fondo de la pantalla, y es lo que un comercio
|
|
8248
|
+
cambia con su backgroundColor. Se resuelve aca, con muted como fallback, y no
|
|
8249
|
+
como alias en :root: un alias se evalua en :root y queda con el valor de :root,
|
|
8250
|
+
asi que la variable que el widget setea en body nunca llegaria a la etapa. Los
|
|
8251
|
+
otros usos de muted (tabs, bloque de codigo, hover del FAB) no se tocan: son
|
|
8252
|
+
superficies de componentes, no el fondo de la pantalla. */
|
|
7927
8253
|
.kds-payment-stage {
|
|
7928
8254
|
min-height: 100vh;
|
|
7929
8255
|
display: flex;
|
|
7930
8256
|
justify-content: center;
|
|
7931
8257
|
padding: var(--kds-spacing-2-5) var(--kds-spacing-2) var(--kds-spacing-8);
|
|
7932
|
-
background: var(--kds-color-background-muted);
|
|
8258
|
+
background: var(--kds-color-background-body, var(--kds-color-background-muted));
|
|
7933
8259
|
}
|
|
7934
8260
|
|
|
7935
8261
|
/* Payment flow — narrow column */
|
|
@@ -7998,6 +8324,18 @@ svg[fill='none'] {
|
|
|
7998
8324
|
@media (hover: hover) and (pointer: fine) {
|
|
7999
8325
|
.kds-card-elevated.kds-invoice-sticky {
|
|
8000
8326
|
border-radius: var(--kds-radius-card);
|
|
8327
|
+
/* El clip-path del colapso recorta con `round 0 0 R R` y eso PISA al
|
|
8328
|
+
border-radius: aunque la card declare las cuatro esquinas, el recorte las
|
|
8329
|
+
deja rectas arriba. Hay que redondearlas también acá o el fix no se ve. */
|
|
8330
|
+
clip-path: inset(
|
|
8331
|
+
0 0
|
|
8332
|
+
calc(
|
|
8333
|
+
var(--collapse-collapsible-h) * var(--collapse-progress)
|
|
8334
|
+
+ var(--kds-spacing-1) * var(--collapse-progress)
|
|
8335
|
+
)
|
|
8336
|
+
0
|
|
8337
|
+
round var(--kds-radius-card)
|
|
8338
|
+
);
|
|
8001
8339
|
}
|
|
8002
8340
|
|
|
8003
8341
|
.kds-screen > .kds-card-elevated.kds-card-elevated--flush-top,
|
|
@@ -8336,8 +8674,11 @@ svg[fill='none'] {
|
|
|
8336
8674
|
background: var(--kds-color-action-hover);
|
|
8337
8675
|
}
|
|
8338
8676
|
|
|
8339
|
-
/* Search field reutilizable (standalone o dentro del KdsBankModal).
|
|
8340
|
-
|
|
8677
|
+
/* Search field reutilizable (standalone o dentro del KdsBankModal).
|
|
8678
|
+
El selector de descendiente se mantiene por compatibilidad con los consumidores
|
|
8679
|
+
que renderizan el input sin clase (payment lo arma a mano en GSP). */
|
|
8680
|
+
.kds-search-field,
|
|
8681
|
+
.kds-bank-modal-search input {
|
|
8341
8682
|
width: 100%;
|
|
8342
8683
|
padding: var(--kds-spacing-1-25) var(--kds-spacing-1-5);
|
|
8343
8684
|
border: 1px solid var(--kds-color-divider);
|
|
@@ -8349,11 +8690,13 @@ svg[fill='none'] {
|
|
|
8349
8690
|
background: var(--kds-color-surface);
|
|
8350
8691
|
}
|
|
8351
8692
|
|
|
8352
|
-
.kds-search-field::placeholder
|
|
8693
|
+
.kds-search-field::placeholder,
|
|
8694
|
+
.kds-bank-modal-search input::placeholder {
|
|
8353
8695
|
color: var(--kds-color-text-hint);
|
|
8354
8696
|
}
|
|
8355
8697
|
|
|
8356
|
-
.kds-search-field:focus
|
|
8698
|
+
.kds-search-field:focus,
|
|
8699
|
+
.kds-bank-modal-search input:focus {
|
|
8357
8700
|
border-color: var(--kds-color-primary-main);
|
|
8358
8701
|
box-shadow: 0 0 0 2px var(--kds-color-primary-faint);
|
|
8359
8702
|
}
|