@khipu/design-system 0.1.0-alpha.55 → 0.2.0-alpha.2

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-04T15:34:36.820Z
14
+ * Generated: 2026-05-05T20:41:24.239Z
15
15
  *
16
16
  * To regenerate:
17
17
  * cd design-system && npm run tokens:generate
@@ -133,16 +133,7 @@
133
133
  --kds-font-weight-semibold: 600;
134
134
  --kds-font-weight-bold: 700;
135
135
 
136
- /* Font sizes */
137
- --kds-font-size-xs: 0.75rem;
138
- --kds-font-size-sm: 0.875rem;
139
- --kds-font-size-base: 1rem;
140
- --kds-font-size-lg: 1.125rem;
141
- --kds-font-size-xl: 1.25rem;
142
- --kds-font-size-2xl: 1.5rem;
143
- --kds-font-size-3xl: 1.875rem;
144
- --kds-font-size-4xl: 2.25rem;
145
-
136
+ /* Font sizes (base scale xs–4xl: see responsive section below) */
146
137
  /* Line heights */
147
138
  --kds-line-height-tight: 1.2;
148
139
  --kds-line-height-snug: 1.375;
@@ -365,6 +356,16 @@
365
356
  ========================================================================== */
366
357
 
367
358
 
359
+ /* Base font-size scale */
360
+ --kds-font-size-xs: 0.6875rem;
361
+ --kds-font-size-sm: 0.8125rem;
362
+ --kds-font-size-base: 0.875rem;
363
+ --kds-font-size-lg: 1rem;
364
+ --kds-font-size-xl: 1.125rem;
365
+ --kds-font-size-2xl: 1.25rem;
366
+ --kds-font-size-3xl: 1.5rem;
367
+ --kds-font-size-4xl: 1.875rem;
368
+
368
369
  /* Headings */
369
370
  --kds-font-size-h1: 1.75rem;
370
371
  --kds-font-size-h2: 1.5rem;
@@ -401,6 +402,16 @@
401
402
  /* Tablet (600px+) - Typography */
402
403
  @media (min-width: 600px) {
403
404
  :root {
405
+
406
+ /* Base font-size scale */
407
+ --kds-font-size-xs: 0.75rem;
408
+ --kds-font-size-sm: 0.875rem;
409
+ --kds-font-size-base: 1rem;
410
+ --kds-font-size-lg: 1.125rem;
411
+ --kds-font-size-xl: 1.25rem;
412
+ --kds-font-size-2xl: 1.5rem;
413
+ --kds-font-size-3xl: 1.875rem;
414
+ --kds-font-size-4xl: 2.25rem;
404
415
  --kds-font-size-h1: 2rem;
405
416
  --kds-font-size-h2: 1.75rem;
406
417
  --kds-font-size-h3: 1.5rem;
@@ -428,6 +439,16 @@
428
439
  /* Desktop (840px+) - Typography */
429
440
  @media (min-width: 840px) {
430
441
  :root {
442
+
443
+ /* Base font-size scale */
444
+ --kds-font-size-xs: 0.75rem;
445
+ --kds-font-size-sm: 0.875rem;
446
+ --kds-font-size-base: 1rem;
447
+ --kds-font-size-lg: 1.125rem;
448
+ --kds-font-size-xl: 1.25rem;
449
+ --kds-font-size-2xl: 1.5rem;
450
+ --kds-font-size-3xl: 1.875rem;
451
+ --kds-font-size-4xl: 2.25rem;
431
452
  --kds-font-size-h1: 2.5rem;
432
453
  --kds-font-size-h2: 2rem;
433
454
  --kds-font-size-h3: 1.75rem;
@@ -799,6 +820,7 @@ a.kds-btn {
799
820
  align-items: center;
800
821
  justify-content: center;
801
822
  gap: 8px;
823
+ text-align: center;
802
824
 
803
825
  /* Typography - Using design tokens */
804
826
  font-family: var(--kds-font-family-secondary);
@@ -984,7 +1006,12 @@ a.kds-btn > .kds-icon > i {
984
1006
  min-width: var(--kds-spacing-button-icon-size);
985
1007
  min-height: var(--kds-spacing-button-icon-size);
986
1008
  line-height: 1;
987
- top: 1px;
1009
+ }
1010
+
1011
+ /* Full-width button */
1012
+ button.kds-btn.kds-btn-block,
1013
+ a.kds-btn.kds-btn-block {
1014
+ width: 100%;
988
1015
  }
989
1016
 
990
1017
  /* ========================================
@@ -1008,12 +1035,6 @@ a.kds-btn.kds-btn-md {
1008
1035
 
1009
1036
  /* Default .kds-btn uses --kds-spacing-button-min-height (50px) from base styles */
1010
1037
 
1011
- /* Full-width button */
1012
- button.kds-btn.kds-btn-block,
1013
- a.kds-btn.kds-btn-block {
1014
- width: 100%;
1015
- }
1016
-
1017
1038
  /* ========================================
1018
1039
  Card Components (Material Design 3)
1019
1040
  ======================================== */
@@ -4032,6 +4053,96 @@ dialog#surveyModal button.circle {
4032
4053
  font-size: var(--kds-font-size-sm);
4033
4054
  }
4034
4055
 
4056
+ /* ── Typography variants ── */
4057
+ .kds-text-display1 {
4058
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4059
+ font-size: var(--kds-font-size-4xl, 36px);
4060
+ font-weight: var(--kds-font-weight-bold, 700);
4061
+ line-height: var(--kds-line-height-tight, 1.2);
4062
+ letter-spacing: var(--kds-letter-spacing-tight, -0.025em);
4063
+ }
4064
+
4065
+ .kds-text-display2 {
4066
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4067
+ font-size: var(--kds-font-size-3xl, 30px);
4068
+ font-weight: var(--kds-font-weight-bold, 700);
4069
+ line-height: var(--kds-line-height-tight, 1.2);
4070
+ letter-spacing: var(--kds-letter-spacing-tight, -0.025em);
4071
+ }
4072
+
4073
+ .kds-text-heading1 {
4074
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4075
+ font-size: var(--kds-font-size-2xl, 24px);
4076
+ font-weight: var(--kds-font-weight-semibold, 600);
4077
+ line-height: var(--kds-line-height-snug, 1.375);
4078
+ }
4079
+
4080
+ .kds-text-heading2 {
4081
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4082
+ font-size: var(--kds-font-size-xl, 20px);
4083
+ font-weight: var(--kds-font-weight-semibold, 600);
4084
+ line-height: var(--kds-line-height-snug, 1.375);
4085
+ }
4086
+
4087
+ .kds-text-heading3 {
4088
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4089
+ font-size: var(--kds-font-size-lg, 18px);
4090
+ font-weight: var(--kds-font-weight-semibold, 600);
4091
+ line-height: var(--kds-line-height-normal, 1.5);
4092
+ }
4093
+
4094
+ .kds-text-body-large {
4095
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4096
+ font-size: var(--kds-font-size-base, 16px);
4097
+ font-weight: var(--kds-font-weight-regular, 400);
4098
+ line-height: var(--kds-line-height-relaxed, 1.66);
4099
+ }
4100
+
4101
+ .kds-text-body {
4102
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4103
+ font-size: var(--kds-font-size-sm, 14px);
4104
+ font-weight: var(--kds-font-weight-regular, 400);
4105
+ line-height: var(--kds-line-height-normal, 1.5);
4106
+ }
4107
+
4108
+ .kds-text-body-small {
4109
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4110
+ font-size: var(--kds-font-size-sm, 12px);
4111
+ font-weight: var(--kds-font-weight-regular, 400);
4112
+ line-height: var(--kds-line-height-normal, 1.5);
4113
+ }
4114
+
4115
+ .kds-text-label {
4116
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4117
+ font-size: var(--kds-font-size-sm, 12px);
4118
+ font-weight: var(--kds-font-weight-semibold, 600);
4119
+ line-height: var(--kds-line-height-normal, 1.5);
4120
+ letter-spacing: var(--kds-letter-spacing-widest, 1px);
4121
+ text-transform: uppercase;
4122
+ }
4123
+
4124
+ .kds-text-label-small {
4125
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4126
+ font-size: var(--kds-font-size-xs, 10px);
4127
+ font-weight: var(--kds-font-weight-semibold, 600);
4128
+ line-height: var(--kds-line-height-normal, 1.5);
4129
+ letter-spacing: var(--kds-letter-spacing-widest, 1px);
4130
+ text-transform: uppercase;
4131
+ }
4132
+
4133
+ .kds-text-link {
4134
+ font-family: var(--kds-font-family-primary, 'Public Sans', sans-serif);
4135
+ font-size: inherit;
4136
+ font-weight: var(--kds-font-weight-medium, 500);
4137
+ color: var(--kds-color-primary-main, #8347AD);
4138
+ text-decoration: underline;
4139
+ cursor: pointer;
4140
+ }
4141
+
4142
+ .kds-text-link:hover {
4143
+ color: var(--kds-color-primary-dark, #5B3179);
4144
+ }
4145
+
4035
4146
  /* Display utilities */
4036
4147
  .kds-hidden {
4037
4148
  display: none;
@@ -4535,14 +4646,26 @@ dialog#surveyModal button.circle {
4535
4646
 
4536
4647
  .field.locked > input,
4537
4648
  .field.locked > textarea {
4538
- background: var(--kds-color-shell);
4539
- color: var(--kds-color-text-secondary);
4649
+ color: var(--kds-color-text-disabled);
4540
4650
  cursor: default;
4541
- border-color: var(--kds-color-divider);
4651
+ pointer-events: none;
4542
4652
  }
4543
4653
 
4544
4654
  .field.locked > label {
4545
- color: var(--kds-color-text-hint);
4655
+ color: var(--kds-color-text-disabled);
4656
+ }
4657
+
4658
+ /* Locked: suppress all hover/focus visual changes */
4659
+ .field.label.border:not(.fill).locked:hover:not(:focus-within) > label::after,
4660
+ .field.label.border:not(.fill).locked:focus-within > label::after {
4661
+ border-block-start-color: var(--outline);
4662
+ }
4663
+ .field.label.border:not(.fill).locked:hover:not(:focus-within) > :is(input, textarea, select),
4664
+ .field.label.border:not(.fill).locked:focus-within > :is(input, textarea, select) {
4665
+ border-color: var(--outline);
4666
+ }
4667
+ .field.label.locked:hover:not(:focus-within) > label {
4668
+ color: var(--kds-color-text-disabled);
4546
4669
  }
4547
4670
 
4548
4671
  .field.locked > i {
@@ -5234,6 +5357,11 @@ dialog#surveyModal button.circle {
5234
5357
  font-weight: var(--kds-font-weight-semibold);
5235
5358
  }
5236
5359
 
5360
+ /* Auto-managed tab panels: hidden attribute must win over any display rule */
5361
+ [data-kds-tab-panel][hidden] {
5362
+ display: none;
5363
+ }
5364
+
5237
5365
 
5238
5366
  /* ========================================
5239
5367
  PAYMENT FLOW — DOMAIN COMPONENTS
@@ -5279,8 +5407,8 @@ dialog#surveyModal button.circle {
5279
5407
  /* Symmetric padding */
5280
5408
  padding: var(--kds-spacing-2);
5281
5409
 
5282
- /* Static border-radius on all corners */
5283
- border-radius: var(--kds-radius-card);
5410
+ /* Bottom-only border-radius top is flush so the brand-inner logo isn't clipped */
5411
+ border-radius: 0 0 var(--kds-radius-card) var(--kds-radius-card);
5284
5412
 
5285
5413
  /* Override .kds-card-elevated transition — scroll drives the animation, not CSS transitions */
5286
5414
  transition: none;
@@ -5292,10 +5420,8 @@ dialog#surveyModal button.circle {
5292
5420
  /* clip-path clips the card from the bottom to hide the collapsible space.
5293
5421
  This is VISUAL ONLY — no layout change — prevents scroll feedback loop.
5294
5422
  Safari 13.1+ compatible (inset + round)
5295
- When collapsed (progress=1): bottom corners get border-radius,
5296
- top stays flush with screen edge. */
5297
- /* Bottom inset = collapsible height + half the card padding to tighten
5298
- the gap between "Código" and the visible bottom edge when collapsed. */
5423
+ round uses bottom-only radii (0 top, card-radius bottom) to match
5424
+ border-radius and avoid clipping the brand logo at the top corners. */
5299
5425
  clip-path: inset(
5300
5426
  0 0
5301
5427
  calc(
@@ -5303,7 +5429,7 @@ dialog#surveyModal button.circle {
5303
5429
  + var(--kds-spacing-1) * var(--collapse-progress)
5304
5430
  )
5305
5431
  0
5306
- round var(--kds-radius-card)
5432
+ round 0 0 var(--kds-radius-card) var(--kds-radius-card)
5307
5433
  );
5308
5434
 
5309
5435
  /* Suppress card's own shadow — wrapper handles it */
@@ -5314,7 +5440,8 @@ dialog#surveyModal button.circle {
5314
5440
  .kds-invoice-sticky .kds-brand-inner {
5315
5441
  margin-bottom: calc(var(--kds-spacing-1) * (1 - var(--collapse-progress)) + var(--kds-spacing-0-5) * var(--collapse-progress));
5316
5442
  }
5317
- .kds-invoice-sticky .kds-brand-inner svg {
5443
+ .kds-invoice-sticky .kds-brand-inner svg,
5444
+ .kds-invoice-sticky .kds-brand-inner img {
5318
5445
  height: calc(22px - 5px * var(--collapse-progress));
5319
5446
  }
5320
5447
 
@@ -5375,6 +5502,12 @@ dialog#surveyModal button.circle {
5375
5502
  }
5376
5503
  }
5377
5504
 
5505
+ /* Invoice sticky: mobile-first — bottom-only border-radius to prevent clipping the brand logo.
5506
+ Desktop restores full border-radius (see min-width:768px block below). */
5507
+ .kds-card-elevated.kds-invoice-sticky {
5508
+ border-radius: 0 0 var(--kds-radius-card) var(--kds-radius-card);
5509
+ }
5510
+
5378
5511
  /* -- Invoice Collapsible (kv rows below header) -- */
5379
5512
  .kds-invoice-collapsible {
5380
5513
  margin-top: var(--kds-spacing-1-5);
@@ -5396,11 +5529,17 @@ dialog#surveyModal button.circle {
5396
5529
  }
5397
5530
 
5398
5531
  /* -- Invoice Header (amount + merchant tile) -- */
5532
+ /* Compound selector overrides BeerCSS `header { padding:0 1rem; display:grid; align-content:center }` */
5533
+ header.kds-invoice-header,
5534
+ div.kds-invoice-header,
5399
5535
  .kds-invoice-header {
5400
5536
  display: flex;
5401
5537
  align-items: flex-start;
5402
5538
  justify-content: space-between;
5403
5539
  gap: var(--kds-spacing-2);
5540
+ padding: 0;
5541
+ border-radius: 0;
5542
+ align-content: initial;
5404
5543
  }
5405
5544
 
5406
5545
  /* Reset BeerCSS sibling margin on <p> inside invoice header — specificity (0,4,1) ties BeerCSS, wins by source order */
@@ -5759,6 +5898,18 @@ button.kds-btn-success::after {
5759
5898
  box-shadow: var(--kds-shadow-card);
5760
5899
  }
5761
5900
 
5901
+ /* Payment flow cards — mobile-first: no vertical padding.
5902
+ Desktop (min-width: 768px) restores padding + full border-radius. */
5903
+ .kds-payment-flow .kds-card-elevated {
5904
+ margin-top: 0;
5905
+ padding-top: 0;
5906
+ padding-bottom: 0;
5907
+ }
5908
+ .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
5909
+ padding-top: var(--kds-spacing-1);
5910
+ padding-bottom: 0;
5911
+ }
5912
+
5762
5913
  /* Payment stage — full-viewport centered wrapper */
5763
5914
  .kds-payment-stage {
5764
5915
  min-height: 100vh;
@@ -5799,13 +5950,26 @@ button.kds-btn-success::after {
5799
5950
 
5800
5951
  }
5801
5952
 
5953
+ /* Desktop: restore card padding and full border-radius on invoice sticky */
5954
+ @media (min-width: 768px) {
5955
+ .kds-payment-flow .kds-card-elevated,
5956
+ .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
5957
+ padding-top: var(--kds-spacing-2);
5958
+ padding-bottom: var(--kds-spacing-2);
5959
+ }
5960
+ .kds-card-elevated.kds-invoice-sticky {
5961
+ border-radius: var(--kds-radius-card);
5962
+ }
5963
+ }
5964
+
5802
5965
  /* Brand logo row (external, outside cards) */
5803
5966
  .kds-brand-row {
5804
5967
  padding: 0 var(--kds-spacing-0-5);
5805
5968
  display: flex;
5806
5969
  align-items: center;
5807
5970
  }
5808
- .kds-brand-row svg {
5971
+ .kds-brand-row svg,
5972
+ .kds-brand-row img {
5809
5973
  height: 22px;
5810
5974
  display: block;
5811
5975
  }
@@ -5815,8 +5979,10 @@ button.kds-btn-success::after {
5815
5979
  display: none;
5816
5980
  align-items: center;
5817
5981
  margin-bottom: var(--kds-spacing-1);
5982
+ border-radius: 0;
5818
5983
  }
5819
- .kds-brand-inner svg {
5984
+ .kds-brand-inner svg,
5985
+ .kds-brand-inner img {
5820
5986
  height: 22px;
5821
5987
  display: block;
5822
5988
  }
@@ -1136,13 +1136,14 @@ const ui = _context.ui;
1136
1136
  * Initialize segmented tabs
1137
1137
  * Delegated click on .kds-segmented-tabs button toggles .active and aria-selected
1138
1138
  * Sets --_active-idx and --_tab-count CSS custom properties for sliding pill animation
1139
+ * Auto-manages tab panels via data-kds-tab-panel attributes on sibling elements
1139
1140
  * Dispatches kds:tab:change with { index, button }
1140
1141
  * @param {Element} root - Root element to scope listeners (default: document)
1141
1142
  */
1142
1143
  function initSegmentedTabs(root) {
1143
1144
  root = root || document;
1144
1145
 
1145
- /* Set initial CSS vars on all segmented-tab containers */
1146
+ /* Set initial CSS vars and panel visibility on all segmented-tab containers */
1146
1147
  root.querySelectorAll('.kds-segmented-tabs').forEach(function(tabs) {
1147
1148
  var buttons = tabs.querySelectorAll('button');
1148
1149
  tabs.style.setProperty('--_tab-count', buttons.length);
@@ -1151,6 +1152,15 @@ const ui = _context.ui;
1151
1152
  if (b.classList.contains('active') || b.getAttribute('aria-selected') === 'true') activeIdx = i;
1152
1153
  });
1153
1154
  tabs.style.setProperty('--_active-idx', activeIdx);
1155
+
1156
+ /* Auto-bind panels: find sibling elements with data-kds-tab-panel */
1157
+ var parent = tabs.parentElement;
1158
+ if (parent) {
1159
+ var panels = parent.querySelectorAll('[data-kds-tab-panel]');
1160
+ panels.forEach(function(panel, i) {
1161
+ panel.hidden = i !== activeIdx;
1162
+ });
1163
+ }
1154
1164
  });
1155
1165
 
1156
1166
  root.addEventListener('click', function(e) {
@@ -1171,6 +1181,14 @@ const ui = _context.ui;
1171
1181
  var index = Array.prototype.indexOf.call(buttons, btn);
1172
1182
  tabs.style.setProperty('--_active-idx', index);
1173
1183
 
1184
+ /* Auto-toggle panels */
1185
+ var parent = tabs.parentElement;
1186
+ if (parent) {
1187
+ parent.querySelectorAll('[data-kds-tab-panel]').forEach(function(panel, i) {
1188
+ panel.hidden = i !== index;
1189
+ });
1190
+ }
1191
+
1174
1192
  tabs.dispatchEvent(new CustomEvent('kds:tab:change', {
1175
1193
  bubbles: true,
1176
1194
  detail: { index: index, button: btn }