@khipu/design-system 0.1.0-alpha.36 → 0.1.0-alpha.38

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-04-08T16:25:45.555Z
14
+ * Generated: 2026-04-09T17:23:49.715Z
15
15
  *
16
16
  * To regenerate:
17
17
  * cd design-system && npm run tokens:generate
@@ -27,14 +27,14 @@
27
27
 
28
28
 
29
29
  /* Primary palette - Khipu brand */
30
- --kds-color-primary-main: #7548a8;
31
- --kds-color-primary-light: #6fb2e2;
32
- --kds-color-primary-dark: #6A3A8C;
30
+ --kds-color-primary-main: #8347AD;
31
+ --kds-color-primary-light: #9B6BBD;
32
+ --kds-color-primary-dark: #5B3179;
33
33
  --kds-color-primary-contrast: #FFFFFF;
34
- --kds-color-primary-hover: rgba(117, 72, 168, 0.04);
35
- --kds-color-primary-selected: rgba(117, 72, 168, 0.08);
36
- --kds-color-primary-focus: rgba(117, 72, 168, 0.12);
37
- --kds-color-primary-focus-visible: rgba(117, 72, 168, 0.30);
34
+ --kds-color-primary-hover: rgba(131, 71, 173, 0.04);
35
+ --kds-color-primary-selected: rgba(131, 71, 173, 0.08);
36
+ --kds-color-primary-focus: rgba(131, 71, 173, 0.12);
37
+ --kds-color-primary-focus-visible: rgba(131, 71, 173, 0.30);
38
38
 
39
39
  /* Secondary palette */
40
40
  --kds-color-secondary-main: #4CAF50;
@@ -63,7 +63,7 @@
63
63
  --kds-color-text-hint: rgba(0, 0, 0, 0.38);
64
64
 
65
65
  /* Background colors */
66
- --kds-color-background-default: #F5F5F5;
66
+ --kds-color-background-default: #FFFFFF;
67
67
  --kds-color-background-paper: #FFFFFF;
68
68
  --kds-color-background-elevated: #FAFAFA;
69
69
 
@@ -105,6 +105,14 @@
105
105
  --kds-alert-warning-bg: #FFFBEB;
106
106
  --kds-alert-success-bg: #ECFDF5;
107
107
  --kds-alert-error-bg: #FEF2F2;
108
+ --kds-alert-success-text: #1E4620;
109
+ --kds-alert-warning-text: #663C00;
110
+ --kds-alert-error-text: #5F2120;
111
+ --kds-alert-info-text: #014361;
112
+ --kds-alert-success-border: #2CA24D;
113
+ --kds-alert-warning-border: #FF9800;
114
+ --kds-alert-error-border: #E53E3E;
115
+ --kds-alert-info-border: #006699;
108
116
 
109
117
  /* ==========================================================================
110
118
  TYPOGRAPHY TOKENS
@@ -249,7 +257,7 @@
249
257
 
250
258
 
251
259
  /* Border colors */
252
- --kds-border-light: #DDDDDD;
260
+ --kds-border-light: #DDDEE0;
253
261
  --kds-border-medium: #999999;
254
262
  --kds-border-dark: #666666;
255
263
 
@@ -605,6 +613,13 @@ body.dark {
605
613
  --kds-scroll-sm-height: 280px;
606
614
  --kds-scroll-md-height: 420px;
607
615
  --kds-scroll-lg-height: 600px;
616
+
617
+ /* Stage Layout */
618
+ --kds-stage-narrow-max-width: 420px;
619
+ --kds-navbar-height: 64px;
620
+
621
+ /* Snackbar */
622
+ --kds-snackbar-max-width: 560px;
608
623
  }
609
624
 
610
625
  /* ========================================
@@ -909,6 +924,12 @@ a.kds-btn.kds-btn-md {
909
924
 
910
925
  /* Default .kds-btn uses --kds-spacing-button-min-height (50px) from base styles */
911
926
 
927
+ /* Full-width button */
928
+ button.kds-btn.kds-btn-block,
929
+ a.kds-btn.kds-btn-block {
930
+ width: 100%;
931
+ }
932
+
912
933
  /* ========================================
913
934
  Card Components (Material Design 3)
914
935
  ======================================== */
@@ -1385,6 +1406,7 @@ a.kds-btn.kds-btn-md {
1385
1406
  .kds-mt-8 { margin-top: var(--kds-spacing-8); }
1386
1407
 
1387
1408
  .kds-mb-0 { margin-bottom: 0; }
1409
+ .kds-mb-1 { margin-bottom: var(--kds-spacing-1); }
1388
1410
  .kds-mb-2 { margin-bottom: var(--kds-spacing-2); }
1389
1411
  .kds-mb-4 { margin-bottom: var(--kds-spacing-4); }
1390
1412
  .kds-mb-6 { margin-bottom: var(--kds-spacing-6); }
@@ -1597,13 +1619,48 @@ a.kds-btn.kds-btn-md {
1597
1619
 
1598
1620
  .snackbar {
1599
1621
  position: fixed;
1600
- bottom: 24px;
1622
+ bottom: var(--kds-spacing-3);
1601
1623
  left: 50%;
1602
1624
  transform: translateX(-50%);
1603
- z-index: 9999;
1625
+ z-index: var(--kds-z-index-snackbar);
1604
1626
  min-width: 344px;
1605
- max-width: 672px;
1606
- box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
1627
+ max-width: var(--kds-snackbar-max-width);
1628
+ box-shadow: var(--kds-shadow-8);
1629
+ }
1630
+
1631
+ /* Snackbar active state - ensure visibility when toggled via JS */
1632
+ .snackbar.active {
1633
+ visibility: visible !important;
1634
+ opacity: 1 !important;
1635
+ transform: translateX(-50%) !important;
1636
+ }
1637
+
1638
+ /* Snackbar semantic variants - background + text/icon color */
1639
+ .snackbar.error {
1640
+ background-color: var(--kds-color-error-main) !important;
1641
+ color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1642
+ }
1643
+
1644
+ .snackbar.error i {
1645
+ color: var(--on-error, var(--kds-color-primary-contrast)) !important;
1646
+ }
1647
+
1648
+ .snackbar.info {
1649
+ background-color: var(--kds-color-info-main) !important;
1650
+ color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1651
+ }
1652
+
1653
+ .snackbar.info i {
1654
+ color: var(--on-info, var(--kds-color-primary-contrast)) !important;
1655
+ }
1656
+
1657
+ .snackbar.success {
1658
+ background-color: var(--kds-color-success-main) !important;
1659
+ color: var(--on-success, var(--kds-color-primary-contrast)) !important;
1660
+ }
1661
+
1662
+ .snackbar.success i {
1663
+ color: var(--on-success, var(--kds-color-primary-contrast)) !important;
1607
1664
  }
1608
1665
 
1609
1666
  /* ========================================
@@ -1617,9 +1674,223 @@ nav.primary {
1617
1674
  z-index: 1000;
1618
1675
  }
1619
1676
 
1620
- nav.primary a,
1621
- nav.primary button {
1622
- color: white;
1677
+ nav.primary > a,
1678
+ nav.primary > button,
1679
+ nav.primary > div > a,
1680
+ nav.primary > div > button {
1681
+ color: var(--on-primary);
1682
+ }
1683
+
1684
+ /* ========================================
1685
+ Locale Switcher (Navbar dropdown)
1686
+ ======================================== */
1687
+
1688
+ .kds-locale-switcher {
1689
+ position: relative;
1690
+ display: inline-flex;
1691
+ align-items: center;
1692
+ }
1693
+
1694
+ button.kds-locale-switcher-toggle,
1695
+ .kds-locale-switcher .kds-locale-switcher-toggle {
1696
+ display: inline-flex;
1697
+ align-items: center;
1698
+ gap: var(--kds-spacing-0-75);
1699
+ background: transparent;
1700
+ border: 1px solid var(--kds-color-gray-400);
1701
+ border-radius: var(--kds-radius-button);
1702
+ color: var(--on-primary);
1703
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-1-5);
1704
+ cursor: pointer;
1705
+ font-size: var(--kds-font-size-sm);
1706
+ font-family: var(--kds-font-family-secondary);
1707
+ transition: background var(--kds-transition-shorter) var(--kds-easing-standard),
1708
+ border-color var(--kds-transition-shorter) var(--kds-easing-standard);
1709
+ line-height: var(--kds-line-height-snug);
1710
+ }
1711
+
1712
+ button.kds-locale-switcher-toggle:hover,
1713
+ .kds-locale-switcher .kds-locale-switcher-toggle:hover {
1714
+ background: var(--kds-color-primary-focus);
1715
+ border-color: var(--kds-color-gray-200);
1716
+ }
1717
+
1718
+ .kds-locale-switcher-toggle .kds-locale-flag {
1719
+ font-size: var(--kds-font-size-lg);
1720
+ line-height: 1;
1721
+ }
1722
+
1723
+ .kds-locale-switcher-toggle .kds-locale-arrow {
1724
+ font-size: var(--kds-spacing-button-icon-size);
1725
+ transition: transform var(--kds-transition-shorter) var(--kds-easing-standard);
1726
+ }
1727
+
1728
+ .kds-locale-switcher.active .kds-locale-arrow {
1729
+ transform: rotate(180deg);
1730
+ }
1731
+
1732
+ .kds-locale-switcher-menu {
1733
+ display: none;
1734
+ position: absolute;
1735
+ top: calc(100% + var(--kds-spacing-0-5));
1736
+ right: 0;
1737
+ min-width: 180px;
1738
+ background: var(--kds-color-background-paper);
1739
+ border-radius: var(--kds-radius-md);
1740
+ box-shadow: var(--kds-shadow-dropdown);
1741
+ z-index: var(--kds-z-index-appbar);
1742
+ overflow: hidden;
1743
+ padding: var(--kds-spacing-0-5) 0;
1744
+ }
1745
+
1746
+ .kds-locale-switcher.active .kds-locale-switcher-menu {
1747
+ display: block;
1748
+ }
1749
+
1750
+ .kds-locale-switcher-menu a,
1751
+ .kds-locale-switcher-menu button {
1752
+ display: flex !important;
1753
+ align-items: center;
1754
+ justify-content: flex-start;
1755
+ padding: 0 var(--kds-spacing-3);
1756
+ gap: var(--kds-spacing-2);
1757
+ width: 100%;
1758
+ box-sizing: border-box !important;
1759
+ background: transparent !important;
1760
+ border: none !important;
1761
+ color: var(--kds-color-text-primary) !important;
1762
+ font-size: var(--kds-font-size-sm);
1763
+ font-family: var(--kds-font-family-secondary);
1764
+ cursor: pointer;
1765
+ text-decoration: none;
1766
+ transition: background var(--kds-transition-shortest) var(--kds-easing-standard);
1767
+ text-align: left;
1768
+ border-radius: 0 !important;
1769
+ min-height: auto !important;
1770
+ margin: 0 !important;
1771
+ box-shadow: none !important;
1772
+ position: relative;
1773
+ }
1774
+
1775
+ /* Kill BeerCSS pseudo-elements on active buttons */
1776
+ .kds-locale-switcher-menu button::before,
1777
+ .kds-locale-switcher-menu button::after,
1778
+ .kds-locale-switcher-menu a::before,
1779
+ .kds-locale-switcher-menu a::after {
1780
+ display: none !important;
1781
+ }
1782
+
1783
+ .kds-locale-switcher-menu a:hover,
1784
+ .kds-locale-switcher-menu button:hover {
1785
+ background: var(--kds-color-background-elevated) !important;
1786
+ }
1787
+
1788
+ .kds-locale-switcher-menu .kds-locale-flag {
1789
+ font-size: var(--kds-font-size-base);
1790
+ line-height: 1;
1791
+ flex-shrink: 0;
1792
+ }
1793
+
1794
+ .kds-locale-switcher-menu button.active,
1795
+ .kds-locale-switcher-menu a.active {
1796
+ background: var(--kds-color-primary-selected) !important;
1797
+ font-weight: var(--kds-font-weight-medium);
1798
+ }
1799
+
1800
+ /* ========================================
1801
+ Google Sign-In Button
1802
+ Per Google Identity branding guidelines:
1803
+ https://developers.google.com/identity/branding-guidelines
1804
+ ======================================== */
1805
+
1806
+ button.kds-btn-google,
1807
+ a.kds-btn-google {
1808
+ display: inline-flex;
1809
+ align-items: center;
1810
+ justify-content: center;
1811
+ gap: var(--kds-spacing-1-5);
1812
+ width: 100%;
1813
+ background: var(--kds-color-background-paper);
1814
+ color: #1F1F1F;
1815
+ border: 1px solid #747775;
1816
+ border-radius: var(--kds-radius-button);
1817
+ padding: var(--kds-spacing-1) var(--kds-spacing-1-5);
1818
+ min-height: var(--kds-spacing-button-min-height);
1819
+ font-family: "Roboto", var(--kds-font-family-secondary);
1820
+ font-weight: var(--kds-font-weight-medium);
1821
+ font-size: var(--kds-font-size-sm);
1822
+ line-height: var(--kds-line-height-normal);
1823
+ letter-spacing: var(--kds-letter-spacing-normal);
1824
+ text-transform: none;
1825
+ cursor: pointer;
1826
+ transition: background var(--kds-transition-shorter) var(--kds-easing-standard),
1827
+ box-shadow var(--kds-transition-shorter) var(--kds-easing-standard);
1828
+ box-sizing: border-box;
1829
+ box-shadow: none;
1830
+ }
1831
+
1832
+ button.kds-btn-google:hover,
1833
+ a.kds-btn-google:hover {
1834
+ background: #F2F2F2;
1835
+ box-shadow: var(--kds-shadow-1);
1836
+ }
1837
+
1838
+ button.kds-btn-google:active,
1839
+ a.kds-btn-google:active {
1840
+ background: #E8E8E8;
1841
+ }
1842
+
1843
+ button.kds-btn-google:disabled,
1844
+ a.kds-btn-google:disabled {
1845
+ background: var(--kds-color-action-disabled-bg);
1846
+ color: var(--kds-color-action-disabled);
1847
+ border-color: var(--kds-color-action-disabled-bg);
1848
+ cursor: not-allowed;
1849
+ box-shadow: none;
1850
+ }
1851
+
1852
+ /* Google G icon container - white background per guidelines */
1853
+ .kds-btn-google .kds-google-icon {
1854
+ display: flex;
1855
+ align-items: center;
1856
+ justify-content: center;
1857
+ flex-shrink: 0;
1858
+ }
1859
+
1860
+ .kds-btn-google .kds-google-icon svg {
1861
+ width: var(--kds-spacing-button-icon-size);
1862
+ height: var(--kds-spacing-button-icon-size);
1863
+ }
1864
+
1865
+ /* ========================================
1866
+ Link Styles
1867
+ ======================================== */
1868
+
1869
+ /* Explicit link class */
1870
+ .kds-link {
1871
+ color: var(--kds-color-primary-main);
1872
+ text-decoration: none;
1873
+ cursor: pointer;
1874
+ transition: color var(--kds-transition-shorter) var(--kds-easing-standard);
1875
+ }
1876
+
1877
+ .kds-link:hover {
1878
+ color: var(--kds-color-primary-dark);
1879
+ text-decoration: underline;
1880
+ }
1881
+
1882
+ /* Contextual links inside cards and stage forms */
1883
+ .kds-card-body a:not(.kds-btn):not([class*="kds-btn"]),
1884
+ .kds-stage-content a:not(.kds-btn):not([class*="kds-btn"]) {
1885
+ color: var(--kds-color-primary-main);
1886
+ text-decoration: none;
1887
+ transition: color var(--kds-transition-shorter) var(--kds-easing-standard);
1888
+ }
1889
+
1890
+ .kds-card-body a:not(.kds-btn):not([class*="kds-btn"]):hover,
1891
+ .kds-stage-content a:not(.kds-btn):not([class*="kds-btn"]):hover {
1892
+ color: var(--kds-color-primary-dark);
1893
+ text-decoration: underline;
1623
1894
  }
1624
1895
 
1625
1896
  /* ========================================
@@ -1646,28 +1917,29 @@ body.kds-layout {
1646
1917
  ======================================== */
1647
1918
 
1648
1919
  footer.primary {
1649
- background: var(--surface-container-high, #F5F5F5);
1920
+ background: var(--primary);
1650
1921
  padding: var(--kds-spacing-4) var(--kds-spacing-3);
1651
1922
  margin-top: var(--kds-spacing-6);
1923
+ color: var(--on-primary);
1652
1924
  }
1653
1925
 
1654
1926
  footer.primary h6 {
1655
- color: var(--khipu-primary);
1656
- font-weight: 600;
1657
- margin-bottom: 16px;
1927
+ color: var(--on-primary);
1928
+ font-weight: var(--kds-font-weight-semibold);
1929
+ margin-bottom: var(--kds-spacing-2);
1658
1930
  }
1659
1931
 
1660
1932
  footer.primary a {
1661
- color: var(--on-surface);
1933
+ color: var(--on-primary);
1662
1934
  text-decoration: none;
1663
1935
  display: block;
1664
- padding: 4px 0;
1665
- transition: color 0.2s ease;
1936
+ padding: var(--kds-spacing-0-5) 0;
1937
+ transition: opacity var(--kds-transition-shorter) var(--kds-easing-standard);
1666
1938
  text-align: center;
1667
1939
  }
1668
1940
 
1669
1941
  footer.primary a:hover {
1670
- color: var(--khipu-primary);
1942
+ opacity: 0.8;
1671
1943
  }
1672
1944
 
1673
1945
  /* ========================================
@@ -2039,6 +2311,23 @@ label.radio:has(input:disabled) {
2039
2311
  flex-direction: column;
2040
2312
  }
2041
2313
 
2314
+ /* Stage Content Narrow - For login/register pages with centered card */
2315
+ .kds-stage-content.narrow {
2316
+ max-width: var(--kds-stage-narrow-max-width);
2317
+ margin-left: auto;
2318
+ margin-right: auto;
2319
+ width: 100%;
2320
+ }
2321
+
2322
+ /* Stage Centered - Vertically center content in viewport (pre-login pages) */
2323
+ .kds-stage-centered {
2324
+ display: flex;
2325
+ align-items: center;
2326
+ justify-content: center;
2327
+ flex: 1;
2328
+ min-height: calc(100vh - var(--kds-navbar-height));
2329
+ }
2330
+
2042
2331
  /* Stage Actions - Bottom button area (if not using sticky footer) */
2043
2332
  .kds-stage-actions {
2044
2333
  display: flex;
@@ -2316,6 +2605,7 @@ nav {
2316
2605
  nav > .kds-container-center {
2317
2606
  display: flex;
2318
2607
  align-items: center;
2608
+ justify-content: space-between;
2319
2609
  gap: var(--kds-spacing-4);
2320
2610
  margin-left: auto !important;
2321
2611
  margin-right: auto !important;
@@ -2325,6 +2615,14 @@ nav > .kds-container-center {
2325
2615
  padding-bottom: var(--kds-spacing-2);
2326
2616
  }
2327
2617
 
2618
+ /* Navbar brand/logo */
2619
+ .kds-navbar-brand {
2620
+ font-weight: var(--kds-font-weight-bold);
2621
+ font-size: var(--kds-font-size-lg);
2622
+ text-decoration: none;
2623
+ color: inherit;
2624
+ }
2625
+
2328
2626
  footer,
2329
2627
  footer.primary {
2330
2628
  padding-left: 0 !important;
@@ -3584,7 +3882,16 @@ dialog#surveyModal button.circle {
3584
3882
  text-decoration: none;
3585
3883
  }
3586
3884
 
3885
+ .kds-text-muted {
3886
+ color: var(--on-surface-variant);
3887
+ }
3888
+
3889
+ .kds-text-sm {
3890
+ font-size: var(--kds-font-size-sm);
3891
+ }
3892
+
3587
3893
  /* Spacing utilities */
3894
+ .kds-mt-1 { margin-top: var(--kds-spacing-1); }
3588
3895
  .kds-mt-2 { margin-top: var(--kds-spacing-2); }
3589
3896
  .kds-mt-3 { margin-top: var(--kds-spacing-3); }
3590
3897
  .kds-mt-4 { margin-top: var(--kds-spacing-4); }
@@ -3757,10 +4064,13 @@ dialog#surveyModal button.circle {
3757
4064
 
3758
4065
  .kds-divider-text {
3759
4066
  text-align: center;
3760
- margin: var(--kds-spacing-6) 0;
4067
+ margin: var(--kds-spacing-2) 0;
3761
4068
  color: var(--kds-color-text-secondary);
3762
4069
  position: relative;
3763
4070
  font-size: var(--kds-font-size-sm);
4071
+ /* Reset BeerCSS [class*=divider] overrides */
4072
+ background-color: transparent !important;
4073
+ block-size: auto !important;
3764
4074
  }
3765
4075
 
3766
4076
  .kds-divider-text span {
@@ -3770,6 +4080,12 @@ dialog#surveyModal button.circle {
3770
4080
  z-index: 1;
3771
4081
  }
3772
4082
 
4083
+ /* Inside cards/elevated surfaces, use paper background */
4084
+ .kds-card-elevated .kds-divider-text span,
4085
+ .kds-card-body .kds-divider-text span {
4086
+ background: var(--kds-color-background-paper);
4087
+ }
4088
+
3773
4089
  .kds-divider-text::before {
3774
4090
  content: '';
3775
4091
  position: absolute;