@khipu/design-system 0.2.0-alpha.2 → 0.2.0-alpha.21

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-05T20:41:24.239Z
14
+ * Generated: 2026-05-25T17:31:40.439Z
15
15
  *
16
16
  * To regenerate:
17
17
  * cd design-system && npm run tokens:generate
@@ -147,9 +147,9 @@
147
147
  --kds-letter-spacing-widest: 1px;
148
148
 
149
149
  /* Button typography */
150
- --kds-typography-button-font-size: 0.9375rem;
150
+ --kds-typography-button-font-size: 0.875rem;
151
151
  --kds-typography-button-font-weight: 500;
152
- --kds-typography-button-line-height: 26px;
152
+ --kds-typography-button-line-height: 1.5;
153
153
  --kds-typography-button-letter-spacing: 0.46px;
154
154
 
155
155
  /* Typography margins */
@@ -199,10 +199,10 @@
199
199
  --kds-spacing-input-padding-y: 16px;
200
200
  --kds-spacing-input-padding-x: 12px;
201
201
  --kds-spacing-input-padding: 16px 12px;
202
- --kds-spacing-button-padding-y: 8px;
203
- --kds-spacing-button-padding-x: 22px;
204
- --kds-spacing-button-padding: 8px 22px;
205
- --kds-spacing-button-min-height: 50px;
202
+ --kds-spacing-button-padding-y: 0;
203
+ --kds-spacing-button-padding-x: 16px;
204
+ --kds-spacing-button-padding: 0 16px;
205
+ --kds-spacing-button-min-height: 44px;
206
206
  --kds-spacing-button-icon-size: 20px;
207
207
  --kds-spacing-sidebar-width: 280px;
208
208
  --kds-spacing-sidebar-width-collapsed: 72px;
@@ -241,7 +241,7 @@
241
241
  --kds-radius-full: 9999px;
242
242
 
243
243
  /* Component-specific radii */
244
- --kds-radius-button: 4px;
244
+ --kds-radius-button: 10px;
245
245
  --kds-radius-input: 4px;
246
246
  --kds-radius-card: 14px;
247
247
  --kds-radius-modal: 20px;
@@ -643,6 +643,7 @@ body.dark {
643
643
  /* Scroll Container Utilities */
644
644
  --kds-scroll-sm-height: 280px;
645
645
  --kds-scroll-md-height: 420px;
646
+
646
647
  --kds-scroll-lg-height: 600px;
647
648
 
648
649
  /* Stage Layout */
@@ -755,7 +756,7 @@ footer {
755
756
  ======================================== */
756
757
  :root {
757
758
  /* Scroll-linked collapse range (mobile sticky invoice) */
758
- --kds-scroll-collapse-end: 150px;
759
+ --kds-scroll-collapse-end: 60px;
759
760
 
760
761
  /* Merchant tile: normal and collapsed sizes (from source prototype) */
761
762
  --kds-merchant-size: 64px;
@@ -777,6 +778,10 @@ footer {
777
778
  * Source: design.khipu.com and Material Design 3 specifications
778
779
  */
779
780
 
781
+ * {
782
+ border-radius: 0;
783
+ }
784
+
780
785
 
781
786
  :has(>main) {
782
787
  background-color: transparent !important;
@@ -821,34 +826,37 @@ a.kds-btn {
821
826
  justify-content: center;
822
827
  gap: 8px;
823
828
  text-align: center;
829
+ width: 100%;
824
830
 
825
831
  /* Typography - Using design tokens */
826
832
  font-family: var(--kds-font-family-secondary);
827
- font-weight: var(--kds-font-weight-medium); /* 500, no 600 */
828
- font-size: var(--kds-typography-button-font-size); /* 0.9375rem = 15px */
829
- line-height: var(--kds-typography-button-line-height); /* 26px, no 1 */
833
+ font-weight: var(--kds-font-weight-medium); /* 500 */
834
+ font-size: var(--kds-typography-button-font-size); /* 0.875rem = 14px */
835
+ line-height: var(--kds-typography-button-line-height); /* 1.5 */
830
836
  letter-spacing: var(--kds-typography-button-letter-spacing); /* 0.46px */
831
837
  text-transform: uppercase;
832
838
 
833
839
  /* Spacing - Using design tokens */
834
- padding: var(--kds-spacing-button-padding); /* 8px 22px */
835
- min-height: var(--kds-spacing-button-min-height); /* 50px */
836
- height: auto; /* Remove fixed height, let content + padding define it */
840
+ padding: var(--kds-spacing-button-padding); /* 0 16px */
841
+ height: var(--kds-spacing-button-min-height); /* 44px */
837
842
 
838
843
  /* Border - Using design token */
839
- border-radius: var(--kds-radius-button); /* 4px */
844
+ border-radius: var(--kds-radius-button); /* 10px */
840
845
  border: none;
841
846
 
842
847
  /* Interaction */
843
848
  cursor: pointer;
844
- transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1),
845
- box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1),
846
- border-color 250ms cubic-bezier(0.4, 0, 0.2, 1),
847
- color 250ms cubic-bezier(0.4, 0, 0.2, 1);
849
+ transition: background .15s, box-shadow .15s, transform .05s;
848
850
  box-sizing: border-box;
849
851
  vertical-align: middle;
850
852
  }
851
853
 
854
+ /* Active state - add subtle press effect */
855
+ button.kds-btn:active:not(:disabled),
856
+ a.kds-btn:active:not(:disabled) {
857
+ transform: translateY(1px);
858
+ }
859
+
852
860
  /* Disabled state - colores específicos en lugar de opacity */
853
861
  button.kds-btn:disabled,
854
862
  a.kds-btn:disabled {
@@ -866,18 +874,13 @@ a.kds-btn-primary {
866
874
  background: var(--kds-color-primary-main); /* #8347AD */
867
875
  color: white;
868
876
  border: none;
869
- box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2),
870
- 0px 2px 2px 0px rgba(0, 0, 0, 0.14),
871
- 0px 1px 5px 0px rgba(0, 0, 0, 0.12); /* elevation/2 */
877
+ box-shadow: 0 1px 2px rgba(131, 71, 173, .25);
872
878
  }
873
879
 
874
- /* Hover State - background más oscuro + elevation/4 */
880
+ /* Hover State - background más oscuro */
875
881
  button.kds-btn-primary:hover:not(:disabled),
876
882
  a.kds-btn-primary:hover:not(:disabled) {
877
- background: var(--kds-color-primary-dark); /* #6A3A8C */
878
- box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2),
879
- 0px 4px 5px 0px rgba(0, 0, 0, 0.14),
880
- 0px 1px 10px 0px rgba(0, 0, 0, 0.12); /* elevation/4 */
883
+ background: var(--kds-color-primary-dark); /* #5B3179 */
881
884
  }
882
885
 
883
886
  /* Active/Focus State */
@@ -1047,6 +1050,7 @@ a.kds-btn.kds-btn-md {
1047
1050
  padding: var(--kds-spacing-2);
1048
1051
  box-shadow: var(--kds-shadow-card);
1049
1052
  transition: box-shadow 0.3s ease;
1053
+ margin-block-start: 0 !important;
1050
1054
  }
1051
1055
 
1052
1056
  .kds-card-elevated:hover,
@@ -1723,53 +1727,108 @@ a.kds-btn.kds-btn-md {
1723
1727
  }
1724
1728
 
1725
1729
  /* ========================================
1726
- Snackbar Positioning
1730
+ Snackbar Positioning & Styling
1727
1731
  ======================================== */
1728
1732
 
1729
1733
  .snackbar {
1730
1734
  position: fixed;
1731
- bottom: var(--kds-spacing-3);
1732
- left: 50%;
1733
- transform: translateX(-50%);
1734
1735
  z-index: var(--kds-z-index-snackbar);
1735
1736
  min-width: 344px;
1736
1737
  max-width: var(--kds-snackbar-max-width);
1737
1738
  box-shadow: var(--kds-shadow-8);
1739
+ border-radius: var(--kds-radius-md);
1740
+ padding: var(--kds-spacing-1-5) var(--kds-spacing-2);
1741
+ gap: var(--kds-spacing-1);
1742
+ font-family: var(--kds-font-family-primary);
1743
+ font-size: var(--kds-font-size-body2);
1744
+ font-weight: var(--kds-font-weight-medium);
1745
+ line-height: var(--kds-line-height-normal);
1746
+ letter-spacing: var(--kds-letter-spacing-normal);
1747
+ overflow: hidden;
1738
1748
  }
1739
1749
 
1740
1750
  /* Snackbar active state - ensure visibility when toggled via JS */
1741
1751
  .snackbar.active {
1742
1752
  visibility: visible !important;
1743
1753
  opacity: 1 !important;
1744
- transform: translateX(-50%) !important;
1745
1754
  }
1746
1755
 
1747
- /* Snackbar semantic variants - background + text/icon color */
1756
+ /* Snackbar semantic variants
1757
+ All use white text (--kds-color-primary-contrast) on solid semantic backgrounds */
1748
1758
  .snackbar.error {
1749
1759
  background-color: var(--kds-color-error-main) !important;
1750
- color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1760
+ color: var(--kds-color-primary-contrast) !important;
1751
1761
  }
1752
1762
 
1753
1763
  .snackbar.error i {
1754
- color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1764
+ color: var(--kds-color-primary-contrast) !important;
1755
1765
  }
1756
1766
 
1757
1767
  .snackbar.info {
1758
1768
  background-color: var(--kds-color-info-main) !important;
1759
- color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1769
+ color: var(--kds-color-primary-contrast) !important;
1760
1770
  }
1761
1771
 
1762
1772
  .snackbar.info i {
1763
- color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1773
+ color: var(--kds-color-primary-contrast) !important;
1764
1774
  }
1765
1775
 
1766
1776
  .snackbar.success {
1767
1777
  background-color: var(--kds-color-success-main) !important;
1768
- color: var(--on-success, var(--kds-color-primary-contrast)) !important;
1778
+ color: var(--kds-color-primary-contrast) !important;
1769
1779
  }
1770
1780
 
1771
1781
  .snackbar.success i {
1772
- color: var(--on-success, var(--kds-color-primary-contrast)) !important;
1782
+ color: var(--kds-color-primary-contrast) !important;
1783
+ }
1784
+
1785
+ /* Snackbar progress bar — animated timer for auto-dismiss */
1786
+ .snackbar[data-auto-dismiss]::after {
1787
+ content: '';
1788
+ position: absolute;
1789
+ bottom: 0;
1790
+ left: 0;
1791
+ height: 3px;
1792
+ width: 100%;
1793
+ background: rgba(255, 255, 255, 0.35);
1794
+ border-radius: 0 0 var(--kds-radius-md) var(--kds-radius-md);
1795
+ animation: kds-snackbar-timer var(--kds-snackbar-duration, 5s) linear forwards;
1796
+ }
1797
+
1798
+ @keyframes kds-snackbar-timer {
1799
+ from { width: 100%; }
1800
+ to { width: 0; }
1801
+ }
1802
+
1803
+ /* Snackbar close button */
1804
+ .kds-snackbar-close {
1805
+ background: none !important;
1806
+ border: none !important;
1807
+ color: var(--kds-color-primary-contrast) !important;
1808
+ cursor: pointer;
1809
+ padding: var(--kds-spacing-0-5) !important;
1810
+ margin: calc(-1 * var(--kds-spacing-0-5)) !important;
1811
+ margin-left: 0 !important;
1812
+ border-radius: var(--kds-radius-full) !important;
1813
+ display: flex;
1814
+ align-items: center;
1815
+ justify-content: center;
1816
+ flex-shrink: 0;
1817
+ opacity: 0.7;
1818
+ transition: opacity 150ms;
1819
+ min-width: auto !important;
1820
+ width: auto !important;
1821
+ height: auto !important;
1822
+ }
1823
+
1824
+ .kds-snackbar-close:hover {
1825
+ opacity: 1;
1826
+ background: rgba(255, 255, 255, 0.15) !important;
1827
+ }
1828
+
1829
+ .kds-snackbar-close i {
1830
+ font-size: 18px !important;
1831
+ color: var(--kds-color-primary-contrast) !important;
1773
1832
  }
1774
1833
 
1775
1834
  /* ========================================
@@ -2102,6 +2161,17 @@ body.dark {
2102
2161
  transition: border-color 0.2s, box-shadow 0.2s, outline-color 0.2s;
2103
2162
  }
2104
2163
 
2164
+ /* === TEXTAREA FIX === */
2165
+ /* BeerCSS base sets minimal block padding; add breathing room for textarea */
2166
+ .field > textarea {
2167
+ padding-block: 0.75rem;
2168
+ resize: vertical;
2169
+ }
2170
+
2171
+ .field.label > textarea {
2172
+ padding-block-start: 1.5rem;
2173
+ }
2174
+
2105
2175
  /* ==========================================
2106
2176
  NOTCH VISIBILITY (opacity)
2107
2177
  ========================================== */
@@ -2189,12 +2259,16 @@ body.dark {
2189
2259
  Asegurar que el dropdown arrow sea visible
2190
2260
  ========================================== */
2191
2261
 
2192
- /* Select: mantener appearance nativa para mostrar el dropdown arrow */
2262
+ /* Select: reset nativo + arrow custom via SVG (iOS Safari ignora estilos con appearance:auto) */
2193
2263
  .field select {
2194
- /* BeerCSS puede estar ocultando el arrow, aseguramos que sea visible */
2195
- appearance: auto;
2196
- -webkit-appearance: auto;
2197
- -moz-appearance: auto;
2264
+ -webkit-appearance: none;
2265
+ -moz-appearance: none;
2266
+ appearance: none;
2267
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='%23333' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");
2268
+ background-repeat: no-repeat;
2269
+ background-position: right var(--kds-spacing-1) center;
2270
+ background-size: 20px;
2271
+ padding-right: var(--kds-spacing-4) !important;
2198
2272
  }
2199
2273
 
2200
2274
  /* ==========================================
@@ -2742,7 +2816,8 @@ dialog.modal .field.border:focus-within {
2742
2816
  padding: var(--kds-spacing-2);
2743
2817
  }
2744
2818
 
2745
- .snackbar {
2819
+ .snackbar,
2820
+ .snackbar.active {
2746
2821
  min-width: calc(100% - 32px);
2747
2822
  left: 16px;
2748
2823
  right: 16px;
@@ -4906,20 +4981,50 @@ dialog#surveyModal button.circle {
4906
4981
  display: flex;
4907
4982
  align-items: center;
4908
4983
  justify-content: center;
4909
- gap: var(--kds-spacing-1);
4910
- color: var(--kds-color-text-disabled);
4984
+ gap: var(--kds-spacing-0-5);
4985
+ color: var(--kds-color-gray-400);
4911
4986
  font-size: var(--kds-font-size-xs);
4987
+ letter-spacing: var(--kds-letter-spacing-wide);
4912
4988
  padding: var(--kds-spacing-1) 0;
4913
4989
  }
4914
4990
 
4915
- .kds-secure-footer i {
4916
- font-size: var(--kds-font-size-sm);
4991
+ /* Desktop: footer inside card hidden; Mobile: footer outside card hidden */
4992
+ .kds-card-elevated > .kds-secure-footer {
4993
+ display: none;
4917
4994
  }
4918
4995
 
4919
- /* Inside a card: push to bottom with auto margin, subtle top spacing */
4920
- .kds-secure-footer.inside {
4921
- margin-top: auto;
4922
- padding-top: var(--kds-spacing-3);
4996
+ .kds-screen > form {
4997
+ margin-block-start: 0 !important;
4998
+ }
4999
+
5000
+ @media (max-width: 767px) {
5001
+ .kds-card-elevated > .kds-secure-footer {
5002
+ display: flex;
5003
+ }
5004
+ .kds-screen > .kds-secure-footer {
5005
+ display: none;
5006
+ }
5007
+ }
5008
+
5009
+ .kds-secure-footer-lock {
5010
+ width: 12px;
5011
+ height: 12px;
5012
+ flex: 0 0 auto;
5013
+ display: block;
5014
+ fill: none;
5015
+ stroke: currentColor;
5016
+ stroke-width: 1.75;
5017
+ stroke-linecap: round;
5018
+ stroke-linejoin: round;
5019
+ }
5020
+
5021
+ .kds-secure-footer .khipu-mark {
5022
+ height: 11px;
5023
+ width: auto;
5024
+ flex: 0 0 auto;
5025
+ display: block;
5026
+ object-fit: contain;
5027
+ overflow: visible;
4923
5028
  }
4924
5029
 
4925
5030
  .kds-secure-footer-code {
@@ -4934,21 +5039,27 @@ dialog#surveyModal button.circle {
4934
5039
  .kds-expand-toggle {
4935
5040
  background: none;
4936
5041
  border: 0;
4937
- padding: var(--kds-spacing-0-5) 0;
5042
+ padding: 0;
4938
5043
  color: var(--kds-color-primary-main);
4939
5044
  font-weight: var(--kds-font-weight-medium);
4940
5045
  font-size: var(--kds-font-size-sm);
4941
5046
  cursor: pointer;
4942
5047
  display: inline-flex;
4943
5048
  align-items: center;
4944
- gap: var(--kds-spacing-0-75);
5049
+ gap: 0;
4945
5050
  }
4946
5051
 
4947
- .kds-expand-toggle:hover {
5052
+ .kds-expand-toggle:hover,
5053
+ .kds-expand-toggle:focus,
5054
+ .kds-expand-toggle:active {
4948
5055
  background: transparent;
5056
+ outline: none;
5057
+ box-shadow: none;
4949
5058
  }
4950
5059
 
4951
- .kds-expand-toggle:hover span {
5060
+ .kds-expand-toggle:hover span,
5061
+ .kds-expand-toggle:focus span,
5062
+ .kds-expand-toggle:active span {
4952
5063
  text-decoration: underline;
4953
5064
  }
4954
5065
 
@@ -4974,7 +5085,7 @@ dialog#surveyModal button.circle {
4974
5085
 
4975
5086
  .kds-expand-panel.open {
4976
5087
  max-height: 800px;
4977
- margin-top: var(--kds-spacing-1);
5088
+ margin-top: 0;
4978
5089
  }
4979
5090
 
4980
5091
  /* ========================================
@@ -5150,12 +5261,19 @@ dialog#surveyModal button.circle {
5150
5261
  color: var(--kds-color-error-main);
5151
5262
  }
5152
5263
 
5264
+ /* Variant: info */
5265
+ .kds-status-block[data-status="info"] .kds-status-block-icon {
5266
+ background: var(--kds-color-info-soft);
5267
+ border: var(--kds-border-width-md) solid var(--kds-color-info-main);
5268
+ color: var(--kds-color-info-main);
5269
+ }
5270
+
5153
5271
  /* Inline variant: icon left + text right */
5154
5272
  .kds-status-block.inline {
5155
5273
  text-align: left;
5156
5274
  display: flex;
5157
5275
  align-items: center;
5158
- gap: var(--kds-spacing-3);
5276
+ gap: var(--kds-spacing-2);
5159
5277
  padding: var(--kds-spacing-1) 0;
5160
5278
  }
5161
5279
 
@@ -5310,6 +5428,7 @@ dialog#surveyModal button.circle {
5310
5428
  background: var(--kds-color-background-muted);
5311
5429
  border-radius: var(--kds-radius-lg);
5312
5430
  padding: var(--kds-spacing-0-25);
5431
+ margin-bottom: var(--kds-spacing-2);
5313
5432
  display: flex;
5314
5433
  position: relative;
5315
5434
  }
@@ -5451,7 +5570,13 @@ dialog#surveyModal button.circle {
5451
5570
  opacity: calc(1 - var(--collapse-progress) * 1.5);
5452
5571
  }
5453
5572
 
5454
- /* Amount: NO font-size change (source keeps 30px always) */
5573
+ /* Amount: 30px 24px (progressive) */
5574
+ .kds-invoice-sticky .kds-invoice-amount {
5575
+ font-size: calc(
5576
+ var(--kds-font-size-3xl) -
5577
+ (var(--kds-font-size-3xl) - var(--kds-font-size-2xl)) * var(--collapse-progress)
5578
+ );
5579
+ }
5455
5580
 
5456
5581
  /* Merchant tile: 64×64px → 50×50px, radius 8px → 6px (progressive) */
5457
5582
  .kds-invoice-sticky .kds-invoice-merchant {
@@ -5477,10 +5602,11 @@ dialog#surveyModal button.circle {
5477
5602
  );
5478
5603
  }
5479
5604
 
5480
- /* Code: margin-top 4px → 0 (progressive). Font-size stays 12px. */
5605
+ /* Code: margin-top 8px → 0, font-size 12px → 11px (progressive) */
5481
5606
  .kds-invoice-sticky .kds-invoice-code {
5482
5607
  margin-top: calc(var(--kds-spacing-1) * (1 - var(--collapse-progress)));
5483
5608
  margin-bottom: 0;
5609
+ font-size: calc(var(--kds-font-size-xs) - 1px * var(--collapse-progress));
5484
5610
  }
5485
5611
 
5486
5612
  /* Pull all siblings after sticky wrapper up to fill clipped gap.
@@ -5510,23 +5636,19 @@ dialog#surveyModal button.circle {
5510
5636
 
5511
5637
  /* -- Invoice Collapsible (kv rows below header) -- */
5512
5638
  .kds-invoice-collapsible {
5513
- margin-top: var(--kds-spacing-1-5);
5639
+ margin-top: var(--kds-spacing-1);
5514
5640
  }
5515
5641
 
5516
- /* -- Invoice Summary (kv + expand toggle side by side) -- */
5642
+ /* -- Invoice Summary -- */
5517
5643
  .kds-invoice-summary {
5518
5644
  display: flex;
5519
5645
  align-items: flex-end;
5520
- gap: var(--kds-spacing-2);
5646
+ gap: var(--kds-spacing-1);
5521
5647
  }
5522
5648
  .kds-invoice-summary .kds-kv {
5523
5649
  flex: 1;
5524
5650
  min-width: 0;
5525
5651
  }
5526
- .kds-invoice-summary .kds-expand-toggle {
5527
- flex-shrink: 0;
5528
- white-space: nowrap;
5529
- }
5530
5652
 
5531
5653
  /* -- Invoice Header (amount + merchant tile) -- */
5532
5654
  /* Compound selector overrides BeerCSS `header { padding:0 1rem; display:grid; align-content:center }` */
@@ -5542,6 +5664,13 @@ div.kds-invoice-header,
5542
5664
  align-content: initial;
5543
5665
  }
5544
5666
 
5667
+ /* Mobile collapsed state: center-align so merchant tile aligns with the smaller amount */
5668
+ @media (max-width: 767px) {
5669
+ .kds-invoice-sticky.is-collapsed .kds-invoice-header {
5670
+ align-items: center;
5671
+ }
5672
+ }
5673
+
5545
5674
  /* Reset BeerCSS sibling margin on <p> inside invoice header — specificity (0,4,1) ties BeerCSS, wins by source order */
5546
5675
  .kds-card-elevated.kds-invoice-sticky .kds-invoice-header p.kds-invoice-amount,
5547
5676
  .kds-card-elevated.kds-invoice-sticky .kds-invoice-header p.kds-invoice-code {
@@ -5549,11 +5678,11 @@ div.kds-invoice-header,
5549
5678
  }
5550
5679
 
5551
5680
  .kds-invoice-amount {
5552
- font-weight: 700;
5553
- font-size: 30px;
5554
- line-height: 1.25;
5555
- letter-spacing: 0.4px;
5556
- color: var(--kds-color-text-primary);
5681
+ font-weight: var(--kds-font-weight-semibold);
5682
+ font-size: var(--kds-font-size-3xl);
5683
+ line-height: var(--kds-line-height-tight);
5684
+ letter-spacing: var(--kds-letter-spacing-wide);
5685
+ color: var(--kds-color-gray-900);
5557
5686
  margin: 0;
5558
5687
  }
5559
5688
 
@@ -5562,10 +5691,25 @@ div.kds-invoice-header,
5562
5691
  }
5563
5692
 
5564
5693
  .kds-invoice-code {
5694
+ font-family: var(--kds-font-family-mono);
5565
5695
  font-size: var(--kds-font-size-xs);
5566
- color: var(--kds-color-text-hint);
5696
+ font-weight: var(--kds-font-weight-regular);
5697
+ letter-spacing: var(--kds-letter-spacing-wider);
5698
+ font-variant-numeric: tabular-nums;
5699
+ color: var(--kds-color-gray-400);
5700
+ text-transform: uppercase;
5567
5701
  margin: 0;
5568
- margin-top: var(--kds-spacing-1);
5702
+ margin-block: unset;
5703
+ display: flex;
5704
+ gap: var(--kds-spacing-1-5);
5705
+ }
5706
+
5707
+ .kds-invoice-code-value {
5708
+ color: var(--kds-color-gray-400);
5709
+ }
5710
+
5711
+ .kds-invoice-code-value--lowercase {
5712
+ text-transform: lowercase;
5569
5713
  }
5570
5714
 
5571
5715
  .kds-invoice-merchant {
@@ -5595,29 +5739,36 @@ div.kds-invoice-header,
5595
5739
  line-height: 1;
5596
5740
  }
5597
5741
 
5742
+ .kds-invoice-merchant img {
5743
+ width: 100%;
5744
+ height: 100%;
5745
+ object-fit: cover;
5746
+ border-radius: var(--kds-radius-md);
5747
+ }
5748
+
5598
5749
  /* -- Card Title -- */
5599
5750
  .kds-card-title {
5600
- font-weight: 700;
5751
+ font-weight: var(--kds-font-weight-semibold);
5601
5752
  font-size: var(--kds-font-size-base);
5602
5753
  line-height: 1.5;
5603
5754
  letter-spacing: -0.31px;
5604
5755
  color: var(--kds-color-text-primary);
5605
- margin: 0 0 var(--kds-spacing-2);
5756
+ margin-bottom: var(--kds-spacing-2) !important;
5606
5757
  }
5607
5758
 
5608
5759
  /* -- Key-Value Grid -- */
5609
5760
  .kds-kv {
5610
5761
  display: grid;
5611
5762
  grid-template-columns: auto 1fr;
5612
- row-gap: var(--kds-spacing-1);
5613
- column-gap: var(--kds-spacing-1-5);
5763
+ column-gap: var(--kds-spacing-1);
5614
5764
  align-items: baseline;
5615
5765
  }
5616
5766
 
5617
5767
  .kds-kv dt {
5618
5768
  font-size: var(--kds-font-size-xs);
5619
- letter-spacing: 0.2px;
5620
- color: var(--kds-color-text-hint);
5769
+ line-height: var(--kds-line-height-relaxed);
5770
+ letter-spacing: normal;
5771
+ color: var(--kds-color-text-secondary);
5621
5772
  text-transform: uppercase;
5622
5773
  margin: 0;
5623
5774
  }
@@ -5625,8 +5776,14 @@ div.kds-invoice-header,
5625
5776
  .kds-kv dd {
5626
5777
  margin: 0;
5627
5778
  font-size: var(--kds-font-size-sm);
5628
- font-weight: 600;
5629
- color: var(--kds-color-text-primary);
5779
+ line-height: var(--kds-line-height-relaxed);
5780
+ font-weight: var(--kds-font-weight-semibold);
5781
+ letter-spacing: normal;
5782
+ color: var(--kds-color-gray-800);
5783
+ min-width: 0;
5784
+ white-space: nowrap;
5785
+ overflow: hidden;
5786
+ text-overflow: ellipsis;
5630
5787
  }
5631
5788
 
5632
5789
  /* -- Dividers -- */
@@ -5648,13 +5805,19 @@ div.kds-invoice-header,
5648
5805
  .kds-detail-list {
5649
5806
  display: flex;
5650
5807
  flex-direction: column;
5651
- gap: var(--kds-spacing-1-75);
5652
- margin: var(--kds-spacing-1-75) 0 0;
5808
+ gap: var(--kds-spacing-1-5);
5809
+ margin: 0;
5653
5810
  padding: 0;
5654
5811
  }
5655
5812
 
5813
+ @media (max-width: 767px) {
5814
+ .kds-detail-list {
5815
+ padding-bottom: var(--kds-spacing-2);
5816
+ }
5817
+ }
5818
+
5656
5819
  .kds-detail-group {
5657
- margin-bottom: var(--kds-spacing-1-75);
5820
+ margin-bottom: var(--kds-spacing-1-5);
5658
5821
  }
5659
5822
 
5660
5823
  .kds-detail-group:last-child {
@@ -5663,16 +5826,15 @@ div.kds-invoice-header,
5663
5826
 
5664
5827
  .kds-detail-group dt {
5665
5828
  font-size: var(--kds-font-size-xs);
5666
- letter-spacing: 0.2px;
5829
+ letter-spacing: var(--kds-letter-spacing-wide);
5667
5830
  color: var(--kds-color-text-hint);
5668
5831
  text-transform: uppercase;
5669
- margin: 0 0 var(--kds-spacing-0-5);
5670
5832
  }
5671
5833
 
5672
5834
  .kds-detail-group dd {
5673
5835
  margin: 0;
5674
5836
  font-size: var(--kds-font-size-sm);
5675
- line-height: 1.45;
5837
+ line-height: var(--kds-line-height-normal);
5676
5838
  color: var(--kds-color-text-primary);
5677
5839
  }
5678
5840
 
@@ -5813,6 +5975,8 @@ button.kds-btn-success::after {
5813
5975
  /* -- Alert inline (borderless, used inside cards) -- */
5814
5976
  .kds-alert-inline {
5815
5977
  border: none;
5978
+ padding: var(--kds-spacing-1) var(--kds-spacing-1-5);
5979
+ margin-bottom: var(--kds-spacing-1-5);
5816
5980
  }
5817
5981
 
5818
5982
  /* -- Card dimmed (behind overlays) -- */
@@ -5834,7 +5998,11 @@ button.kds-btn-success::after {
5834
5998
  display: flex;
5835
5999
  flex-direction: column;
5836
6000
  gap: var(--kds-spacing-1);
5837
- margin-top: var(--kds-spacing-1);
6001
+ margin-bottom: var(--kds-spacing-1);
6002
+ }
6003
+
6004
+ .kds-bank-list:last-child {
6005
+ margin-bottom: 0;
5838
6006
  }
5839
6007
 
5840
6008
  /* -- Field group spacing -- */
@@ -5888,6 +6056,159 @@ button.kds-btn-success::after {
5888
6056
  margin-top: var(--kds-spacing-2-5);
5889
6057
  }
5890
6058
 
6059
+ /* -- PSP Banner -- */
6060
+ .kds-psp-banner {
6061
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-1-25);
6062
+ font-size: var(--kds-font-size-sm);
6063
+ border-radius: var(--kds-radius-sm);
6064
+ margin-top: var(--kds-spacing-1-5);
6065
+ }
6066
+
6067
+ /* -- Bill Description -- */
6068
+ .kds-bill-description-body {
6069
+ font-family: inherit;
6070
+ white-space: pre-wrap;
6071
+ overflow-wrap: anywhere;
6072
+ margin: 0;
6073
+ padding: 0;
6074
+ background: transparent;
6075
+ color: var(--kds-color-text-secondary);
6076
+ font-size: var(--kds-font-size-sm);
6077
+ line-height: var(--kds-line-height-normal);
6078
+ }
6079
+
6080
+ .kds-bill-description-picture {
6081
+ max-width: 100px;
6082
+ object-fit: contain;
6083
+ background: var(--kds-color-background-paper);
6084
+ margin-top: var(--kds-spacing-1-25);
6085
+ display: block;
6086
+ box-sizing: content-box;
6087
+ }
6088
+
6089
+ /* -- Bill Attachments -- */
6090
+ .kds-bill-attachments {
6091
+ display: flex;
6092
+ flex-direction: column;
6093
+ gap: var(--kds-spacing-0-75);
6094
+ }
6095
+
6096
+ .kds-bill-attachment {
6097
+ display: inline-flex;
6098
+ align-items: center;
6099
+ justify-content: flex-start;
6100
+ width: fit-content;
6101
+ color: var(--kds-color-info-main);
6102
+ font-size: var(--kds-font-size-sm);
6103
+ font-weight: var(--kds-font-weight-medium);
6104
+ text-decoration: none;
6105
+ }
6106
+
6107
+ .kds-bill-attachment:hover span {
6108
+ text-decoration: underline;
6109
+ }
6110
+
6111
+ .kds-bill-attachment i {
6112
+ font-size: var(--kds-font-size-lg);
6113
+ min-width: unset;
6114
+ justify-content: flex-start;
6115
+ }
6116
+
6117
+ /* -- Share Card (mustContinue) -- */
6118
+ .kds-share-card {
6119
+ margin-top: var(--kds-spacing-2);
6120
+ padding: var(--kds-spacing-2);
6121
+ border: var(--kds-border-width-sm) solid var(--kds-color-gray-200);
6122
+ border-radius: var(--kds-radius-lg);
6123
+ background: var(--kds-color-background-paper);
6124
+ }
6125
+
6126
+ .kds-share-eyebrow {
6127
+ font-size: var(--kds-font-size-caption);
6128
+ letter-spacing: var(--kds-letter-spacing-wide);
6129
+ color: var(--kds-color-gray-500);
6130
+ text-transform: uppercase;
6131
+ font-weight: var(--kds-font-weight-bold);
6132
+ margin: 0 0 var(--kds-spacing-0-75);
6133
+ }
6134
+
6135
+ .kds-share-copy {
6136
+ font-size: var(--kds-font-size-body1);
6137
+ line-height: var(--kds-line-height-normal);
6138
+ color: var(--kds-color-gray-800);
6139
+ margin: 0 0 var(--kds-spacing-1-5);
6140
+ }
6141
+
6142
+ .kds-share-divider {
6143
+ height: 0;
6144
+ border: 0;
6145
+ border-top: var(--kds-border-width-sm) dashed var(--kds-color-gray-200);
6146
+ margin: var(--kds-spacing-1-5) 0;
6147
+ }
6148
+
6149
+ .kds-share-link {
6150
+ display: block;
6151
+ font-size: var(--kds-font-size-sm);
6152
+ color: var(--kds-color-primary-main);
6153
+ text-decoration: none;
6154
+ word-break: break-all;
6155
+ margin: 0 0 var(--kds-spacing-1-5);
6156
+ }
6157
+
6158
+ .kds-share-link:hover {
6159
+ text-decoration: underline;
6160
+ }
6161
+
6162
+ .kds-share-action {
6163
+ display: flex;
6164
+ align-items: center;
6165
+ justify-content: center;
6166
+ gap: var(--kds-spacing-0-75);
6167
+ background: none;
6168
+ border: 0;
6169
+ padding: var(--kds-spacing-0-75) var(--kds-spacing-1-25);
6170
+ cursor: pointer;
6171
+ color: var(--kds-color-text-primary);
6172
+ font-size: var(--kds-font-size-sm);
6173
+ font-family: inherit;
6174
+ border-radius: var(--kds-radius-sm);
6175
+ margin: 0 auto;
6176
+ }
6177
+
6178
+ .kds-share-action:hover {
6179
+ background: var(--kds-color-primary-hover);
6180
+ color: var(--kds-color-primary-main);
6181
+ }
6182
+
6183
+ .kds-share-action .material-symbols-outlined {
6184
+ font-size: var(--kds-font-size-2xl);
6185
+ }
6186
+
6187
+ /* -- Participants List (mustContinue) -- */
6188
+ .kds-participants {
6189
+ margin: 0 0 var(--kds-spacing-2);
6190
+ padding: var(--kds-spacing-1-5) var(--kds-spacing-1-75);
6191
+ background: var(--kds-alert-success-bg);
6192
+ border-radius: var(--kds-radius-md);
6193
+ }
6194
+
6195
+ .kds-participants-label {
6196
+ font-size: var(--kds-font-size-xs);
6197
+ font-weight: var(--kds-font-weight-bold);
6198
+ color: var(--kds-alert-success-text);
6199
+ margin: 0 0 var(--kds-spacing-0-75);
6200
+ text-transform: uppercase;
6201
+ letter-spacing: var(--kds-letter-spacing-wide);
6202
+ }
6203
+
6204
+ .kds-participants-list {
6205
+ margin: 0;
6206
+ padding-left: var(--kds-spacing-2);
6207
+ color: var(--kds-alert-success-text);
6208
+ font-size: var(--kds-font-size-sm);
6209
+ line-height: var(--kds-line-height-relaxed);
6210
+ }
6211
+
5891
6212
  /* ================================================================
5892
6213
  PAYMENT FLOW LAYOUT
5893
6214
  Stage, flow container, brand row, screen transitions
@@ -5905,6 +6226,14 @@ button.kds-btn-success::after {
5905
6226
  padding-top: 0;
5906
6227
  padding-bottom: 0;
5907
6228
  }
6229
+
6230
+ /* Reset BeerCSS sibling margin on form/section inside payment cards.
6231
+ BeerCSS sets `:not(.grid,nav,.row) > … + form/section { margin-block-start:1rem }`
6232
+ which adds unwanted spacing inside cards that contain forms. */
6233
+ .kds-payment-flow .kds-card-elevated > form,
6234
+ .kds-payment-flow .kds-card-elevated > section {
6235
+ margin-block-start: 0;
6236
+ }
5908
6237
  .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
5909
6238
  padding-top: var(--kds-spacing-1);
5910
6239
  padding-bottom: 0;
@@ -5930,6 +6259,7 @@ button.kds-btn-success::after {
5930
6259
  /* Mobile: Cards full-width with rounded corners */
5931
6260
  @media (max-width: 767px) {
5932
6261
  .kds-payment-stage {
6262
+ padding-top: 0;
5933
6263
  padding-left: 0;
5934
6264
  padding-right: 0;
5935
6265
  }
@@ -5939,7 +6269,7 @@ button.kds-btn-success::after {
5939
6269
  padding: 0;
5940
6270
  }
5941
6271
 
5942
- /* Cards: rounded corners, full width within padded stage */
6272
+ /* Cards: rounded corners, full width, explicit vertical padding */
5943
6273
  .kds-card-elevated,
5944
6274
  .khipu-card-elevated {
5945
6275
  margin-left: 0;
@@ -5948,6 +6278,18 @@ button.kds-btn-success::after {
5948
6278
  width: 100%;
5949
6279
  }
5950
6280
 
6281
+ .kds-payment-flow .kds-card-elevated {
6282
+ padding-top: var(--kds-spacing-2);
6283
+ padding-bottom: var(--kds-spacing-2);
6284
+ }
6285
+
6286
+ /* Invoice sticky card: progressive padding-top (expanded 20px → collapsed 8px).
6287
+ Overrides base rule at same specificity; source order wins here. */
6288
+ .kds-payment-flow .kds-card-elevated.kds-invoice-sticky {
6289
+ padding-top: var(--kds-spacing-1-5);
6290
+ }
6291
+
6292
+
5951
6293
  }
5952
6294
 
5953
6295
  /* Desktop: restore card padding and full border-radius on invoice sticky */
@@ -5983,7 +6325,8 @@ button.kds-btn-success::after {
5983
6325
  }
5984
6326
  .kds-brand-inner svg,
5985
6327
  .kds-brand-inner img {
5986
- height: 22px;
6328
+ width: calc(50px - 16px * var(--collapse-progress, 0));
6329
+ height: auto;
5987
6330
  display: block;
5988
6331
  }
5989
6332
 
@@ -5995,6 +6338,7 @@ button.kds-btn-success::after {
5995
6338
  .kds-brand-inner {
5996
6339
  display: flex;
5997
6340
  }
6341
+
5998
6342
  }
5999
6343
 
6000
6344
  /* Screen transitions (multi-step flows) */
@@ -6008,8 +6352,8 @@ button.kds-btn-success::after {
6008
6352
  gap: var(--kds-spacing-3);
6009
6353
  }
6010
6354
  @keyframes kds-fadein {
6011
- from { opacity: 0; transform: translateY(var(--kds-spacing-0-5)); }
6012
- to { opacity: 1; transform: none; }
6355
+ from { opacity: 0; }
6356
+ to { opacity: 1; }
6013
6357
  }
6014
6358
 
6015
6359
  /* ================================================================
@@ -6201,7 +6545,7 @@ button.kds-btn-success::after {
6201
6545
  inset: 0;
6202
6546
  background: var(--kds-modal-backdrop);
6203
6547
  display: none;
6204
- align-items: center;
6548
+ align-items: flex-start;
6205
6549
  justify-content: center;
6206
6550
  z-index: var(--kds-z-index-modal, 50);
6207
6551
  animation: kds-fade 0.2s ease both;
@@ -6229,7 +6573,7 @@ button.kds-btn-success::after {
6229
6573
  display: flex;
6230
6574
  align-items: center;
6231
6575
  justify-content: space-between;
6232
- padding: var(--kds-spacing-2) var(--kds-spacing-2) var(--kds-spacing-1);
6576
+ padding: var(--kds-spacing-1) var(--kds-spacing-2) var(--kds-spacing-1);
6233
6577
  }
6234
6578
 
6235
6579
  .kds-bank-modal-header h3 {
@@ -6615,6 +6959,14 @@ a.kds-copy-all-btn.copied:hover {
6615
6959
  min-height: unset;
6616
6960
  }
6617
6961
 
6962
+ /* Severity variants — default stays warning (backward-compatible) */
6963
+ .kds-section-note.kds-info { color: var(--kds-color-info-dark); }
6964
+ .kds-section-note.kds-info > i { color: var(--kds-color-info-dark); }
6965
+ .kds-section-note.kds-success { color: var(--kds-color-success-dark); }
6966
+ .kds-section-note.kds-success > i { color: var(--kds-color-success-dark); }
6967
+ .kds-section-note.kds-error { color: var(--kds-color-error-dark); }
6968
+ .kds-section-note.kds-error > i { color: var(--kds-color-error-dark); }
6969
+
6618
6970
  /* ========================================
6619
6971
  INFO TOOLTIP (.kds-info-tip)
6620
6972
  Inline info button with hover/click tooltip bubble.
@@ -6710,7 +7062,7 @@ a.kds-copy-all-btn.copied:hover {
6710
7062
  .kds-monto-row {
6711
7063
  display: flex;
6712
7064
  justify-content: space-between;
6713
- align-items: flex-end;
7065
+ align-items: flex-start;
6714
7066
  padding: var(--kds-spacing-1-75) 0 var(--kds-spacing-1);
6715
7067
  border-top: 1px dashed var(--kds-color-divider);
6716
7068
  margin-top: var(--kds-spacing-1-75);