@khipu/design-system 0.3.4 → 0.3.5-alpha.10

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.
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * AUTO-GENERATED FILE - DO NOT EDIT MANUALLY
17
17
  * Source: design-system/src/tokens/tokens.json
18
- * Generated: 2026-08-12T21:28:55.469Z
18
+ * Generated: 2026-08-14T20:37:28.660Z
19
19
  *
20
20
  * To regenerate:
21
21
  * cd design-system && npm run tokens:generate
@@ -687,6 +687,37 @@
687
687
  --outline: var(--kds-color-input-border);
688
688
  --outline-variant: var(--kds-border-light);
689
689
 
690
+ /* ========================================
691
+ EXTENDED BRAND ROLES
692
+
693
+ Several roles used to resolve straight to --kds-color-primary-main, which
694
+ meant a brand could not have (say) a green link next to a navy button.
695
+ They are split into their own tokens:
696
+
697
+ --kds-color-accent form icon, expand toggle, checkbox/radio
698
+ --kds-color-accent-soft form icon backdrop
699
+ --kds-font-family-heading display/heading tier
700
+ --kds-invoice-amount-font-family
701
+ --kds-invoice-amount-color
702
+ --kds-button-font-family
703
+ --kds-button-text-transform
704
+ --kds-button-primary-bg
705
+ --kds-button-primary-bg-hover
706
+
707
+ These are deliberately NOT declared here. Each one is consumed as
708
+ var(--new-token, <the expression it used to be>), so the default is
709
+ supplied at the point of use.
710
+
711
+ Declaring them as :root aliases looks equivalent but is not. A custom
712
+ property is substituted on the element that DECLARES it, so
713
+ `--kds-color-accent: var(--kds-color-primary-main)` on :root freezes to
714
+ whatever the primary is at :root. A brand that sets its primary further
715
+ down the tree (which is how khenshin-web applies merchant styles) would
716
+ inherit the already-resolved Khipu purple and lose its own colour. Using
717
+ them as fallbacks resolves against the primary in effect at the consuming
718
+ element, so unbranded output and existing brands are both unchanged.
719
+ ======================================== */
720
+
690
721
  /* ========================================
691
722
  ONBOARDING COMPONENTS TOKENS
692
723
  ======================================== */
@@ -1012,12 +1043,12 @@
1012
1043
  width: 100%;
1013
1044
 
1014
1045
  /* Typography - Using design tokens */
1015
- font-family: var(--kds-font-family-secondary);
1046
+ font-family: var(--kds-button-font-family, var(--kds-font-family-secondary));
1016
1047
  font-weight: var(--kds-font-weight-medium); /* 500 */
1017
1048
  font-size: var(--kds-typography-button-font-size); /* 0.875rem = 14px */
1018
1049
  line-height: var(--kds-typography-button-line-height); /* 1.5 */
1019
1050
  letter-spacing: var(--kds-typography-button-letter-spacing); /* 0.46px */
1020
- text-transform: uppercase;
1051
+ text-transform: var(--kds-button-text-transform, uppercase);
1021
1052
 
1022
1053
  /* Spacing - Using design tokens */
1023
1054
  padding: var(--kds-spacing-button-padding); /* 0 16px */
@@ -1074,16 +1105,19 @@
1074
1105
  /* Primary button - Khipu purple */
1075
1106
  .kds-theme-root button.kds-btn-primary,
1076
1107
  .kds-theme-root a.kds-btn-primary {
1077
- background: var(--kds-color-primary-main); /* #8347AD */
1108
+ background: var(--kds-button-primary-bg, var(--kds-color-primary-main)); /* #8347AD */
1078
1109
  color: var(--kds-color-primary-contrast); /* #FFF light / dark-purple on dark (lavender bg) */
1079
1110
  border: none;
1080
1111
  box-shadow: 0 1px 2px rgba(131, 71, 173, .25);
1081
1112
  }
1082
1113
 
1083
- /* Hover State - background más oscuro */
1114
+ /* Hover State - background más oscuro.
1115
+ Its own token, not primary-dark: once a brand sets the button background
1116
+ independently of the primary, deriving hover from the primary would snap it
1117
+ back to the brand's other colour on the first pointer-over. */
1084
1118
  .kds-theme-root button.kds-btn-primary:hover:not(:disabled),
1085
1119
  .kds-theme-root a.kds-btn-primary:hover:not(:disabled) {
1086
- background: var(--kds-color-primary-dark); /* #5B3179 */
1120
+ background: var(--kds-button-primary-bg-hover, var(--kds-color-primary-dark)); /* #5B3179 */
1087
1121
  }
1088
1122
 
1089
1123
  /* Active/Focus State */
@@ -1091,7 +1125,7 @@
1091
1125
  .kds-theme-root button.kds-btn-primary:focus-visible:not(:disabled),
1092
1126
  .kds-theme-root a.kds-btn-primary:active:not(:disabled),
1093
1127
  .kds-theme-root a.kds-btn-primary:focus-visible:not(:disabled) {
1094
- background: var(--kds-color-primary-dark);
1128
+ background: var(--kds-button-primary-bg-hover, var(--kds-color-primary-dark));
1095
1129
  }
1096
1130
 
1097
1131
  /* Dark mode: the button is a light lavender with dark text, so hover/active must
@@ -2424,12 +2458,21 @@
2424
2458
  /* Llena y centra dentro de contenedores flex (pantalla de carga); en flujo
2425
2459
  normal (contenedor no-flex) se reduce a su contenido. */
2426
2460
  flex: 1 1 auto;
2427
- /* Alto propio: el loader es contenido minimo por definicion, asi que sin esto la
2428
- card queda del alto del spinner y se lee como un recorte. Ocupa el body completo
2429
- de un telefono para que la pantalla de carga se lea como una pantalla y no como
2430
- una franja. Va aca y no en la card para que el minimo aplique solo a la carga:
2431
- el resto de las pantallas crece con su contenido. */
2432
- min-height: 36rem;
2461
+ /* Alto propio: el loader es contenido minimo por definicion, asi que sin esto la card
2462
+ queda del alto del spinner y se lee como un recorte. Va aca y no en la card para que
2463
+ el minimo aplique solo a la carga: el resto de las pantallas crece con su contenido.
2464
+ El valor de escritorio es moderado a proposito: el minimo de telefono (36rem) dejaba
2465
+ la card de la carga mucho mas alta que cualquier otra pantalla, y al entrar y salir
2466
+ del loader el widget crecia y volvia a encoger. */
2467
+ min-height: 18rem;
2468
+ }
2469
+
2470
+ /* En telefono la carga si ocupa el alto util de la pantalla: ahi la card va a ancho
2471
+ completo y un loader corto se lee como una franja perdida en el medio. */
2472
+ @media (max-width: 767px) {
2473
+ .kds-theme-root .kds-secure-loader {
2474
+ min-height: 36rem;
2475
+ }
2433
2476
  }
2434
2477
 
2435
2478
  .kds-theme-root .kds-secure-loader-text {
@@ -3242,7 +3285,7 @@
3242
3285
  /* Checked state */
3243
3286
  .kds-theme-root label.checkbox input[type="checkbox"]:checked,
3244
3287
  .kds-theme-root label.radio input[type="radio"]:checked {
3245
- accent-color: var(--primary);
3288
+ accent-color: var(--kds-color-accent, var(--primary));
3246
3289
  }
3247
3290
 
3248
3291
  /* Disabled state */
@@ -5011,9 +5054,12 @@
5011
5054
  background-color: var(--kds-color-info-soft);
5012
5055
  }
5013
5056
 
5014
- /* ── Typography variants ── */
5057
+ /* ── Typography variants ──
5058
+ The display/heading tier resolves through --kds-font-family-heading so a
5059
+ brand can pair a display face with a different body face. Unset by default,
5060
+ so it falls through to the primary family and output is unchanged. */
5015
5061
  .kds-theme-root .kds-text-display1 {
5016
- font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
5062
+ font-family: var(--kds-font-family-heading, var(--kds-font-family-primary, 'Public Sans', sans-serif));
5017
5063
  font-size: var(--kds-font-size-4xl, 36px);
5018
5064
  font-weight: var(--kds-font-weight-bold, 700);
5019
5065
  line-height: var(--kds-line-height-tight, 1.2);
@@ -5021,7 +5067,7 @@
5021
5067
  }
5022
5068
 
5023
5069
  .kds-theme-root .kds-text-display2 {
5024
- font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
5070
+ font-family: var(--kds-font-family-heading, var(--kds-font-family-primary, 'Public Sans', sans-serif));
5025
5071
  font-size: var(--kds-font-size-3xl, 30px);
5026
5072
  font-weight: var(--kds-font-weight-bold, 700);
5027
5073
  line-height: var(--kds-line-height-tight, 1.2);
@@ -5029,21 +5075,21 @@
5029
5075
  }
5030
5076
 
5031
5077
  .kds-theme-root .kds-text-heading1 {
5032
- font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
5078
+ font-family: var(--kds-font-family-heading, var(--kds-font-family-primary, 'Public Sans', sans-serif));
5033
5079
  font-size: var(--kds-font-size-2xl, 24px);
5034
5080
  font-weight: var(--kds-font-weight-semibold, 600);
5035
5081
  line-height: var(--kds-line-height-snug, 1.375);
5036
5082
  }
5037
5083
 
5038
5084
  .kds-theme-root .kds-text-heading2 {
5039
- font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
5085
+ font-family: var(--kds-font-family-heading, var(--kds-font-family-primary, 'Public Sans', sans-serif));
5040
5086
  font-size: var(--kds-font-size-xl, 20px);
5041
5087
  font-weight: var(--kds-font-weight-semibold, 600);
5042
5088
  line-height: var(--kds-line-height-snug, 1.375);
5043
5089
  }
5044
5090
 
5045
5091
  .kds-theme-root .kds-text-heading3 {
5046
- font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
5092
+ font-family: var(--kds-font-family-heading, var(--kds-font-family-primary, 'Public Sans', sans-serif));
5047
5093
  font-size: var(--kds-font-size-lg, 18px);
5048
5094
  font-weight: var(--kds-font-weight-semibold, 600);
5049
5095
  line-height: var(--kds-line-height-normal, 1.5);
@@ -6268,7 +6314,7 @@
6268
6314
  irregular arriba (pegado al resumen) y abajo (~26px hasta el panel). Con height
6269
6315
  auto el botón ajusta a su contenido y el ritmo lo gobiernan los márgenes. */
6270
6316
  height: auto;
6271
- color: var(--kds-color-primary-main);
6317
+ color: var(--kds-color-accent, var(--kds-color-primary-main));
6272
6318
  font-weight: var(--kds-font-weight-medium);
6273
6319
  font-size: var(--kds-font-size-sm);
6274
6320
  cursor: pointer;
@@ -7098,11 +7144,13 @@
7098
7144
  }
7099
7145
 
7100
7146
  .kds-theme-root .kds-invoice-amount {
7147
+ /* inherit: the amount had no family of its own before, it took the body's. */
7148
+ font-family: var(--kds-invoice-amount-font-family, inherit);
7101
7149
  font-weight: var(--kds-font-weight-semibold);
7102
7150
  font-size: var(--kds-font-size-3xl);
7103
7151
  line-height: var(--kds-line-height-tight);
7104
7152
  letter-spacing: var(--kds-letter-spacing-wide);
7105
- color: var(--kds-color-gray-900);
7153
+ color: var(--kds-invoice-amount-color, var(--kds-color-gray-900));
7106
7154
  margin: 0;
7107
7155
  }
7108
7156
 
@@ -7200,6 +7248,8 @@
7200
7248
 
7201
7249
  /* -- Card Title -- */
7202
7250
  .kds-theme-root .kds-card-title {
7251
+ /* inherit: the card title had no family of its own before. */
7252
+ font-family: var(--kds-font-family-heading, inherit);
7203
7253
  font-weight: var(--kds-font-weight-semibold);
7204
7254
  font-size: var(--kds-font-size-base);
7205
7255
  line-height: 1.5;
@@ -7949,6 +7999,36 @@
7949
7999
  }
7950
8000
  }
7951
8001
 
8002
+ /* Widget embebido: dentro de un iframe los media queries de ancho evalúan el viewport
8003
+ DEL IFRAME (~420px), no la pantalla, así que el flujo se ve siempre como mobile
8004
+ aunque el usuario esté en desktop — y el tope plano, pensado para cuando la card se
8005
+ pega al borde del teléfono, queda cortando una card que en realidad flota centrada.
8006
+ `hover`/`pointer` describen el dispositivo de entrada y no el viewport, así que
8007
+ sobreviven al iframe: con mouse las cards conservan las esquinas superiores. */
8008
+ @media (hover: hover) and (pointer: fine) {
8009
+ .kds-theme-root .kds-card-elevated.kds-invoice-sticky {
8010
+ border-radius: var(--kds-radius-card);
8011
+ /* El clip-path del colapso recorta con `round 0 0 R R` y eso PISA al
8012
+ border-radius: aunque la card declare las cuatro esquinas, el recorte las
8013
+ deja rectas arriba. Hay que redondearlas también acá o el fix no se ve. */
8014
+ clip-path: inset(
8015
+ 0 0
8016
+ calc(
8017
+ var(--collapse-collapsible-h) * var(--collapse-progress)
8018
+ + var(--kds-spacing-1) * var(--collapse-progress)
8019
+ )
8020
+ 0
8021
+ round var(--kds-radius-card)
8022
+ );
8023
+ }
8024
+
8025
+ .kds-theme-root .kds-screen > .kds-card-elevated.kds-card-elevated--flush-top,
8026
+ .kds-theme-root .kds-card-elevated.kds-card-elevated--flush-top {
8027
+ border-top-left-radius: var(--kds-radius-card);
8028
+ border-top-right-radius: var(--kds-radius-card);
8029
+ }
8030
+ }
8031
+
7952
8032
  /* Brand logo row (external, outside cards) */
7953
8033
  .kds-theme-root .kds-brand-row {
7954
8034
  padding: 0 var(--kds-spacing-0-5);
@@ -9081,7 +9161,11 @@
9081
9161
 
9082
9162
  .kds-theme-root .kds-form-icon-box {
9083
9163
  align-items: center;
9084
- background: var(--kds-color-background-brand-subtle, #f0f0fa);
9164
+ background: var(--kds-color-accent-soft, var(--kds-color-background-brand-subtle, #f0f0fa));
9165
+ /* The glyph inherits this, so the icon tracks the accent role without the
9166
+ markup having to name a colour utility. Falls back to the primary, which
9167
+ is what the .kds-text-primary utility on the glyph resolved to. */
9168
+ color: var(--kds-color-accent, var(--kds-color-primary-main));
9085
9169
  border-radius: var(--kds-radius-md);
9086
9170
  display: flex;
9087
9171
  height: 52px;