@umituz/web-dashboard 6.0.0 → 6.2.0

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.
Files changed (133) hide show
  1. package/README.md +47 -73
  2. package/package.json +15 -7
  3. package/src/config/DashboardConfig.ts +19 -68
  4. package/src/domains/analytics/components/index.ts +0 -6
  5. package/src/domains/analytics/hooks/index.ts +0 -6
  6. package/src/domains/analytics/hooks/useAnalytics.ts +2 -20
  7. package/src/domains/analytics/index.ts +0 -10
  8. package/src/domains/analytics/services/AnalyticsEngineService.ts +7 -74
  9. package/src/domains/analytics/services/PerformanceService.ts +27 -138
  10. package/src/domains/analytics/services/index.ts +0 -4
  11. package/src/domains/analytics/types/analytics.ts +100 -270
  12. package/src/domains/analytics/types/index.ts +0 -6
  13. package/src/domains/analytics/utils/analytics.test.ts +2 -9
  14. package/src/domains/analytics/utils/analytics.ts +1 -22
  15. package/src/domains/analytics/utils/index.ts +0 -6
  16. package/src/domains/calendar/config.ts +0 -7
  17. package/src/domains/calendar/hooks/index.ts +0 -4
  18. package/src/domains/calendar/hooks/useCalendar.ts +7 -27
  19. package/src/domains/calendar/index.ts +0 -4
  20. package/src/domains/calendar/services/CalendarService.ts +0 -21
  21. package/src/domains/calendar/services/index.ts +0 -4
  22. package/src/domains/calendar/types/calendar.types.ts +9 -53
  23. package/src/domains/calendar/utils/contentItemMapper.test.ts +0 -4
  24. package/src/domains/calendar/utils/contentItemMapper.ts +0 -31
  25. package/src/domains/calendar/utils/index.ts +0 -26
  26. package/src/domains/layouts/components/index.ts +0 -4
  27. package/src/domains/layouts/hooks/dashboard.ts +0 -21
  28. package/src/domains/layouts/hooks/index.ts +0 -4
  29. package/src/domains/layouts/index.ts +0 -6
  30. package/src/domains/layouts/theme/default.ts +0 -12
  31. package/src/domains/layouts/theme/index.ts +0 -4
  32. package/src/domains/layouts/theme/presets.ts +0 -9
  33. package/src/domains/layouts/theme/utils.ts +0 -15
  34. package/src/domains/layouts/types/index.ts +0 -4
  35. package/src/domains/layouts/types/layout.ts +18 -56
  36. package/src/domains/layouts/types/notification.ts +4 -17
  37. package/src/domains/layouts/types/sidebar.ts +8 -28
  38. package/src/domains/layouts/types/theme.ts +23 -59
  39. package/src/domains/layouts/types/user.ts +9 -30
  40. package/src/domains/layouts/utils/dashboard.ts +4 -48
  41. package/src/domains/layouts/utils/index.ts +0 -4
  42. package/src/domains/modules/build.tsx +2 -16
  43. package/src/domains/modules/types.ts +8 -23
  44. package/src/domains/onboarding/calc/calc.test.ts +173 -0
  45. package/src/domains/onboarding/calc/card-stack-motion-curve.ts +27 -0
  46. package/src/domains/onboarding/calc/count-with-locale.ts +8 -0
  47. package/src/domains/onboarding/calc/duration-equal-split.ts +12 -0
  48. package/src/domains/onboarding/calc/elapsed-millis.ts +6 -0
  49. package/src/domains/onboarding/calc/index.ts +36 -0
  50. package/src/domains/onboarding/calc/progress-percentage.ts +27 -0
  51. package/src/domains/onboarding/calc/slider-value-bounds.ts +34 -0
  52. package/src/domains/onboarding/calc/step-index-clamp.ts +19 -0
  53. package/src/domains/onboarding/calc/swipe-gesture-curve.ts +54 -0
  54. package/src/domains/onboarding/components/AnimationWrapper.tsx +69 -0
  55. package/src/domains/onboarding/components/OnboardingErrorBoundary.tsx +61 -0
  56. package/src/domains/onboarding/components/OnboardingFlow.test.tsx +459 -0
  57. package/src/domains/onboarding/components/OnboardingFlow.tsx +313 -0
  58. package/src/domains/onboarding/components/OnboardingIntl.tsx +98 -0
  59. package/src/domains/onboarding/components/PrimaryButton.tsx +40 -0
  60. package/src/domains/onboarding/components/ProgressBar.tsx +32 -0
  61. package/src/domains/onboarding/components/QuestionWrapper.tsx +28 -0
  62. package/src/domains/onboarding/components/ScreenContainer.tsx +19 -0
  63. package/src/domains/onboarding/components/SwipeCard.test.tsx +49 -0
  64. package/src/domains/onboarding/components/SwipeCard.tsx +88 -0
  65. package/src/domains/onboarding/components/renderBundledIcon.tsx +7 -0
  66. package/src/domains/onboarding/components/screens/AccountGateScreen.tsx +79 -0
  67. package/src/domains/onboarding/components/screens/AppDemoScreen.tsx +33 -0
  68. package/src/domains/onboarding/components/screens/ComparisonScreen.tsx +49 -0
  69. package/src/domains/onboarding/components/screens/GoalQuestionScreen.tsx +59 -0
  70. package/src/domains/onboarding/components/screens/PainPointsScreen.tsx +65 -0
  71. package/src/domains/onboarding/components/screens/PaywallScreen.tsx +122 -0
  72. package/src/domains/onboarding/components/screens/PermissionPrimingScreen.tsx +98 -0
  73. package/src/domains/onboarding/components/screens/PersonalizedSolutionScreen.tsx +40 -0
  74. package/src/domains/onboarding/components/screens/PreferencesScreen.tsx +180 -0
  75. package/src/domains/onboarding/components/screens/ProcessingScreen.tsx +63 -0
  76. package/src/domains/onboarding/components/screens/SocialProofScreen.tsx +87 -0
  77. package/src/domains/onboarding/components/screens/TinderCardsScreen.tsx +91 -0
  78. package/src/domains/onboarding/components/screens/ValueDeliveryScreen.tsx +69 -0
  79. package/src/domains/onboarding/components/screens/WelcomeScreen.tsx +32 -0
  80. package/src/domains/onboarding/components/screens/index.ts +28 -0
  81. package/src/domains/onboarding/hooks/index.ts +7 -0
  82. package/src/domains/onboarding/hooks/useOnboardingAnalytics.test.tsx +74 -0
  83. package/src/domains/onboarding/hooks/useOnboardingAnalytics.ts +49 -0
  84. package/src/domains/onboarding/hooks/useOnboardingProgress.test.tsx +150 -0
  85. package/src/domains/onboarding/hooks/useOnboardingProgress.ts +249 -0
  86. package/src/domains/onboarding/hooks/usePermissionPriming.ts +45 -0
  87. package/src/domains/onboarding/hooks/useReducedMotion.ts +19 -0
  88. package/src/domains/onboarding/index.ts +153 -0
  89. package/src/domains/onboarding/predicates/has-handler.ts +21 -0
  90. package/src/domains/onboarding/predicates/icon-name-resolves.ts +97 -0
  91. package/src/domains/onboarding/predicates/index.ts +26 -0
  92. package/src/domains/onboarding/predicates/permission-granted.ts +21 -0
  93. package/src/domains/onboarding/predicates/permission-supports.ts +56 -0
  94. package/src/domains/onboarding/predicates/predicates.test.ts +188 -0
  95. package/src/domains/onboarding/predicates/screen-emits-data.ts +13 -0
  96. package/src/domains/onboarding/predicates/storage-available.ts +14 -0
  97. package/src/domains/onboarding/templates/TemplateDemoFallback.tsx +92 -0
  98. package/src/domains/onboarding/templates/art-onboarding.ts +71 -0
  99. package/src/domains/onboarding/templates/health-onboarding.ts +92 -0
  100. package/src/domains/onboarding/templates/index.ts +6 -0
  101. package/src/domains/onboarding/templates/platform-onboarding.ts +201 -0
  102. package/src/domains/onboarding/templates/video-onboarding.ts +95 -0
  103. package/src/domains/onboarding/test/setup.ts +23 -0
  104. package/src/domains/onboarding/types/config.ts +57 -0
  105. package/src/domains/onboarding/types/index.ts +10 -0
  106. package/src/domains/onboarding/types/labels.ts +49 -0
  107. package/src/domains/onboarding/types/screens.ts +185 -0
  108. package/src/domains/onboarding/utils/analytics-dispatch.test.ts +93 -0
  109. package/src/domains/onboarding/utils/analytics-dispatch.ts +73 -0
  110. package/src/domains/onboarding/utils/default-storage-key.ts +1 -0
  111. package/src/domains/onboarding/utils/index.ts +12 -0
  112. package/src/domains/onboarding/utils/local-storage-bridge.test.ts +93 -0
  113. package/src/domains/onboarding/utils/local-storage-bridge.ts +84 -0
  114. package/src/domains/onboarding/utils/permission-bridge.test.ts +64 -0
  115. package/src/domains/onboarding/utils/permission-bridge.ts +87 -0
  116. package/src/domains/onboarding/validation/flow-structure-check.ts +22 -0
  117. package/src/domains/onboarding/validation/index.ts +9 -0
  118. package/src/domains/onboarding/validation/permission-status-check.ts +18 -0
  119. package/src/domains/onboarding/validation/screen-config-check.ts +100 -0
  120. package/src/domains/onboarding/validation/stored-progress-check.ts +59 -0
  121. package/src/domains/onboarding/validation/validation.test.ts +170 -0
  122. package/src/domains/permissions/hasPermission.ts +0 -8
  123. package/src/domains/permissions/types.ts +0 -20
  124. package/src/domains/settings/components/index.ts +0 -4
  125. package/src/domains/settings/hooks/index.ts +0 -4
  126. package/src/domains/settings/hooks/useSettings.ts +1 -26
  127. package/src/domains/settings/index.ts +0 -6
  128. package/src/domains/settings/types/index.ts +0 -4
  129. package/src/domains/settings/types/settings.ts +23 -67
  130. package/src/domains/settings/utils/index.ts +0 -4
  131. package/src/domains/settings/utils/settings.ts +0 -45
  132. package/src/styles/dashboard.contract.test.ts +1 -0
  133. package/src/styles/dashboard.css +818 -1
@@ -1,4 +1,3 @@
1
-
2
1
  @import "@umituz/web-design-system/styles.css";
3
2
  :root {
4
3
  --udb-font-size-xs: 11px;
@@ -1688,3 +1687,821 @@
1688
1687
  align-items: center;
1689
1688
  gap: 0.5rem;
1690
1689
  }
1690
+
1691
+ .udb-onb,
1692
+ .udb-onb *,
1693
+ .udb-onb *::before,
1694
+ .udb-onb *::after {
1695
+ box-sizing: border-box;
1696
+ }
1697
+ .udb-onb {
1698
+ font-family: var(--font-sans);
1699
+ color: var(--color-foreground);
1700
+ background: var(--color-background);
1701
+ font-size: var(--udb-font-size-md);
1702
+ line-height: 1.5;
1703
+ }
1704
+ .udb-onb h1,
1705
+ .udb-onb h2,
1706
+ .udb-onb h3,
1707
+ .udb-onb p,
1708
+ .udb-onb ul,
1709
+ .udb-onb ol,
1710
+ .udb-onb figure,
1711
+ .udb-onb blockquote,
1712
+ .udb-onb pre {
1713
+ margin: 0;
1714
+ }
1715
+ .udb-onb ul,
1716
+ .udb-onb ol {
1717
+ list-style: none;
1718
+ padding: 0;
1719
+ }
1720
+ .udb-onb button,
1721
+ .udb-onb input,
1722
+ .udb-onb select,
1723
+ .udb-onb textarea {
1724
+ font: inherit;
1725
+ color: inherit;
1726
+ margin: 0;
1727
+ }
1728
+ .udb-onb button {
1729
+ padding: 0;
1730
+ background: none;
1731
+ border: 0;
1732
+ cursor: pointer;
1733
+ }
1734
+ .udb-onb cite {
1735
+ font-style: normal;
1736
+ }
1737
+ .udb-onb img,
1738
+ .udb-onb svg {
1739
+ display: block;
1740
+ max-width: 100%;
1741
+ }
1742
+ .udb-onb svg {
1743
+ flex-shrink: 0;
1744
+ }
1745
+
1746
+ .udb-onb-screen {
1747
+ display: flex;
1748
+ flex-direction: column;
1749
+ gap: var(--udb-space-6);
1750
+ width: 100%;
1751
+ max-width: 42rem;
1752
+ min-height: 100vh;
1753
+ margin-inline: auto;
1754
+ padding: var(--udb-space-6) var(--udb-space-4) var(--udb-space-8);
1755
+ }
1756
+ .udb-onb-screen__header,
1757
+ .udb-onb-screen__footer {
1758
+ display: flex;
1759
+ flex-direction: column;
1760
+ gap: var(--udb-space-3);
1761
+ }
1762
+ .udb-onb-screen__main {
1763
+ display: flex;
1764
+ flex: 1;
1765
+ flex-direction: column;
1766
+ gap: var(--udb-space-6);
1767
+ }
1768
+ @media (min-width: 640px) {
1769
+ .udb-onb-screen {
1770
+ padding-inline: var(--udb-space-6);
1771
+ }
1772
+ }
1773
+
1774
+ .udb-onb-title {
1775
+ font-size: var(--udb-font-size-2xl);
1776
+ font-weight: 600;
1777
+ }
1778
+ .udb-onb-title--display {
1779
+ font-size: var(--udb-font-size-3xl);
1780
+ font-weight: 700;
1781
+ }
1782
+ @media (min-width: 640px) {
1783
+ .udb-onb-title {
1784
+ font-size: var(--udb-font-size-3xl);
1785
+ }
1786
+ .udb-onb-title--display {
1787
+ font-size: var(--udb-font-size-4xl);
1788
+ }
1789
+ }
1790
+ .udb-onb-lead {
1791
+ font-size: var(--udb-font-size-lg);
1792
+ color: var(--color-muted-foreground);
1793
+ }
1794
+
1795
+ .udb-onb-question {
1796
+ display: flex;
1797
+ flex-direction: column;
1798
+ gap: var(--udb-space-6);
1799
+ width: 100%;
1800
+ }
1801
+ .udb-onb-question__head {
1802
+ display: flex;
1803
+ flex-direction: column;
1804
+ gap: var(--udb-space-2);
1805
+ }
1806
+ .udb-onb-question__body {
1807
+ display: flex;
1808
+ flex-direction: column;
1809
+ gap: var(--udb-space-3);
1810
+ }
1811
+
1812
+ .udb-onb-choice {
1813
+ flex: 1;
1814
+ display: inline-flex;
1815
+ align-items: center;
1816
+ justify-content: center;
1817
+ gap: var(--udb-space-2);
1818
+ padding: var(--udb-space-3);
1819
+ border: 2px solid;
1820
+ border-radius: var(--radius-lg);
1821
+ font-size: var(--udb-font-size-lg);
1822
+ font-weight: 600;
1823
+ transition: background-color 0.15s, border-color 0.15s, color 0.15s;
1824
+ }
1825
+ .udb-onb-choice:focus-visible {
1826
+ outline: 2px solid var(--color-primary);
1827
+ outline-offset: 2px;
1828
+ }
1829
+ .udb-onb-choice:disabled {
1830
+ cursor: not-allowed;
1831
+ opacity: 0.6;
1832
+ }
1833
+ .udb-onb-choice--no {
1834
+ border-color: var(--color-destructive);
1835
+ color: var(--color-destructive);
1836
+ }
1837
+ .udb-onb-choice--no:hover:not(:disabled) {
1838
+ background: var(--color-destructive);
1839
+ color: var(--color-white);
1840
+ }
1841
+ .udb-onb-choice--yes {
1842
+ border-color: var(--color-success);
1843
+ color: var(--color-success);
1844
+ }
1845
+ .udb-onb-choice--yes:hover:not(:disabled) {
1846
+ background: var(--color-success);
1847
+ color: var(--color-white);
1848
+ }
1849
+ .udb-onb-link {
1850
+ font-size: var(--udb-font-size-sm);
1851
+ font-weight: 600;
1852
+ color: var(--color-muted-foreground);
1853
+ text-underline-offset: 4px;
1854
+ }
1855
+ .udb-onb-link:hover:not(:disabled) {
1856
+ color: var(--color-foreground);
1857
+ text-decoration: underline;
1858
+ }
1859
+ .udb-onb-link:disabled {
1860
+ cursor: not-allowed;
1861
+ opacity: 0.5;
1862
+ }
1863
+
1864
+ .udb-onb-progress {
1865
+ display: flex;
1866
+ flex-direction: column;
1867
+ gap: var(--udb-space-2);
1868
+ width: 100%;
1869
+ }
1870
+ .udb-onb-progress__meta {
1871
+ display: flex;
1872
+ justify-content: space-between;
1873
+ font-size: var(--udb-font-size-sm);
1874
+ color: var(--color-muted-foreground);
1875
+ }
1876
+
1877
+ .udb-onb-icon {
1878
+ width: 20px;
1879
+ height: 20px;
1880
+ }
1881
+ .udb-onb-icon--xs {
1882
+ width: 14px;
1883
+ height: 14px;
1884
+ }
1885
+ .udb-onb-icon--sm {
1886
+ width: 16px;
1887
+ height: 16px;
1888
+ }
1889
+ .udb-onb-icon--lg {
1890
+ width: 40px;
1891
+ height: 40px;
1892
+ }
1893
+ .udb-onb-icon--xl {
1894
+ width: 48px;
1895
+ height: 48px;
1896
+ }
1897
+
1898
+ .udb-onb-swipe {
1899
+ position: relative;
1900
+ height: 18rem;
1901
+ width: 100%;
1902
+ user-select: none;
1903
+ }
1904
+ .udb-onb-swipe:focus-visible {
1905
+ outline: 2px solid var(--color-primary);
1906
+ outline-offset: 2px;
1907
+ }
1908
+ .udb-onb-swipe__card {
1909
+ display: flex;
1910
+ height: 100%;
1911
+ width: 100%;
1912
+ flex-direction: column;
1913
+ align-items: center;
1914
+ justify-content: center;
1915
+ padding: var(--udb-space-8);
1916
+ border: 1px solid var(--color-border);
1917
+ border-radius: var(--radius-lg);
1918
+ background: var(--color-card);
1919
+ box-shadow: var(--shadow-sm);
1920
+ text-align: center;
1921
+ cursor: grab;
1922
+ }
1923
+ .udb-onb-swipe__card:active {
1924
+ cursor: grabbing;
1925
+ }
1926
+ .udb-onb-swipe__category {
1927
+ margin-bottom: var(--udb-space-4);
1928
+ font-size: var(--udb-font-size-xs);
1929
+ font-weight: 600;
1930
+ text-transform: uppercase;
1931
+ letter-spacing: 0.025em;
1932
+ color: var(--color-primary);
1933
+ }
1934
+ .udb-onb-swipe__text {
1935
+ font-size: var(--udb-font-size-xl);
1936
+ font-weight: 500;
1937
+ }
1938
+ .udb-onb-swipe__hint {
1939
+ margin-top: var(--udb-space-6);
1940
+ font-size: var(--udb-font-size-sm);
1941
+ color: var(--color-muted-foreground);
1942
+ }
1943
+ .udb-onb-swipe__stamp {
1944
+ position: absolute;
1945
+ top: var(--udb-space-4);
1946
+ padding: var(--udb-space-1) var(--udb-space-3);
1947
+ border: 2px solid;
1948
+ border-radius: var(--radius-md);
1949
+ font-size: var(--udb-font-size-sm);
1950
+ font-weight: 700;
1951
+ text-transform: uppercase;
1952
+ pointer-events: none;
1953
+ }
1954
+ .udb-onb-swipe__stamp--no {
1955
+ left: var(--udb-space-4);
1956
+ border-color: var(--color-destructive);
1957
+ color: var(--color-destructive);
1958
+ }
1959
+ .udb-onb-swipe__stamp--yes {
1960
+ right: var(--udb-space-4);
1961
+ border-color: var(--color-success);
1962
+ color: var(--color-success);
1963
+ }
1964
+
1965
+ .udb-onb-stage {
1966
+ display: flex;
1967
+ flex: 1;
1968
+ flex-direction: column;
1969
+ align-items: center;
1970
+ justify-content: center;
1971
+ gap: var(--udb-space-6);
1972
+ text-align: center;
1973
+ }
1974
+ .udb-onb-stage--wide {
1975
+ gap: var(--udb-space-8);
1976
+ }
1977
+ .udb-onb-hero {
1978
+ display: flex;
1979
+ align-items: center;
1980
+ justify-content: center;
1981
+ border-radius: var(--radius-xl);
1982
+ background: var(--color-primary-soft, var(--color-muted));
1983
+ color: var(--color-primary);
1984
+ }
1985
+ .udb-onb-hero--lg {
1986
+ width: 80px;
1987
+ height: 80px;
1988
+ }
1989
+ .udb-onb-hero--xl {
1990
+ width: 96px;
1991
+ height: 96px;
1992
+ }
1993
+
1994
+ .udb-onb-welcome__group {
1995
+ display: flex;
1996
+ flex-direction: column;
1997
+ gap: var(--udb-space-3);
1998
+ }
1999
+ .udb-onb-welcome__title {
2000
+ font-size: var(--udb-font-size-4xl);
2001
+ font-weight: 700;
2002
+ }
2003
+ .udb-onb-welcome__subtitle {
2004
+ font-size: var(--udb-font-size-lg);
2005
+ }
2006
+ .udb-onb-welcome__highlight {
2007
+ font-size: var(--udb-font-size-sm);
2008
+ font-weight: 600;
2009
+ text-transform: uppercase;
2010
+ letter-spacing: 0.025em;
2011
+ color: var(--color-primary);
2012
+ }
2013
+
2014
+ .udb-onb-proof {
2015
+ display: flex;
2016
+ flex: 1;
2017
+ flex-direction: column;
2018
+ gap: var(--udb-space-8);
2019
+ }
2020
+ .udb-onb-proof__stage {
2021
+ display: flex;
2022
+ flex: 1;
2023
+ flex-direction: column;
2024
+ align-items: center;
2025
+ justify-content: center;
2026
+ }
2027
+ .udb-onb-proof__bar {
2028
+ display: flex;
2029
+ align-items: center;
2030
+ justify-content: space-between;
2031
+ gap: var(--udb-space-4);
2032
+ }
2033
+ .udb-onb-proof__nav {
2034
+ display: flex;
2035
+ gap: var(--udb-space-2);
2036
+ }
2037
+ .udb-onb-quote {
2038
+ display: flex;
2039
+ max-width: 36rem;
2040
+ flex-direction: column;
2041
+ align-items: center;
2042
+ gap: var(--udb-space-4);
2043
+ padding: var(--udb-space-8);
2044
+ border: 1px solid var(--color-border);
2045
+ border-radius: var(--radius-lg);
2046
+ background: var(--color-card);
2047
+ text-align: center;
2048
+ }
2049
+ .udb-onb-quote__stars {
2050
+ display: flex;
2051
+ gap: var(--udb-space-1);
2052
+ }
2053
+ .udb-onb-quote__star {
2054
+ width: 20px;
2055
+ height: 20px;
2056
+ color: var(--color-border);
2057
+ }
2058
+ .udb-onb-quote__star--filled {
2059
+ color: var(--color-warning);
2060
+ fill: currentColor;
2061
+ }
2062
+ .udb-onb-quote__content {
2063
+ font-size: var(--udb-font-size-lg);
2064
+ }
2065
+ .udb-onb-quote__footer {
2066
+ display: flex;
2067
+ flex-direction: column;
2068
+ align-items: center;
2069
+ gap: var(--udb-space-1);
2070
+ }
2071
+ .udb-onb-quote__avatar {
2072
+ width: 48px;
2073
+ height: 48px;
2074
+ border-radius: var(--udb-radius-pill);
2075
+ object-fit: cover;
2076
+ }
2077
+ .udb-onb-quote__cite {
2078
+ font-size: var(--udb-font-size-sm);
2079
+ font-weight: 600;
2080
+ }
2081
+ .udb-onb-quote__role {
2082
+ font-size: var(--udb-font-size-sm);
2083
+ color: var(--color-muted-foreground);
2084
+ }
2085
+ .udb-onb-dots {
2086
+ display: flex;
2087
+ gap: 6px;
2088
+ }
2089
+ .udb-onb-dot {
2090
+ width: 8px;
2091
+ height: 8px;
2092
+ border-radius: var(--udb-radius-pill);
2093
+ background: var(--color-border);
2094
+ transition: width 0.2s, background-color 0.2s;
2095
+ }
2096
+ .udb-onb-dot--active {
2097
+ width: var(--udb-space-6);
2098
+ background: var(--color-primary);
2099
+ }
2100
+
2101
+ .udb-onb-solutions {
2102
+ display: flex;
2103
+ flex-direction: column;
2104
+ gap: var(--udb-space-3);
2105
+ }
2106
+ .udb-onb-solution {
2107
+ display: flex;
2108
+ align-items: flex-start;
2109
+ gap: var(--udb-space-3);
2110
+ padding: var(--udb-space-4);
2111
+ border: 1px solid var(--color-border);
2112
+ border-radius: var(--radius-lg);
2113
+ background: var(--color-card);
2114
+ }
2115
+ .udb-onb-solution__icon {
2116
+ margin-top: 2px;
2117
+ color: var(--color-success);
2118
+ }
2119
+ .udb-onb-solution__body {
2120
+ display: flex;
2121
+ flex: 1;
2122
+ flex-direction: column;
2123
+ gap: var(--udb-space-1);
2124
+ }
2125
+ .udb-onb-solution__stat {
2126
+ font-size: var(--udb-font-size-sm);
2127
+ font-weight: 600;
2128
+ color: var(--color-primary);
2129
+ }
2130
+
2131
+ .udb-onb-compare {
2132
+ display: grid;
2133
+ grid-template-columns: 1fr;
2134
+ gap: var(--udb-space-4);
2135
+ }
2136
+ .udb-onb-compare__col {
2137
+ display: flex;
2138
+ flex-direction: column;
2139
+ gap: var(--udb-space-3);
2140
+ padding: var(--udb-space-5);
2141
+ border: 1px solid;
2142
+ border-radius: var(--radius-lg);
2143
+ background: var(--color-card);
2144
+ }
2145
+ .udb-onb-compare__col--pos {
2146
+ border-color: var(--color-success);
2147
+ }
2148
+ .udb-onb-compare__col--neg {
2149
+ border-color: var(--color-destructive);
2150
+ }
2151
+ .udb-onb-compare__heading {
2152
+ font-size: var(--udb-font-size-lg);
2153
+ font-weight: 600;
2154
+ }
2155
+ .udb-onb-compare__item {
2156
+ display: flex;
2157
+ align-items: flex-start;
2158
+ gap: var(--udb-space-2);
2159
+ font-size: var(--udb-font-size-sm);
2160
+ }
2161
+ .udb-onb-compare__icon {
2162
+ margin-top: 2px;
2163
+ }
2164
+ .udb-onb-compare__icon--pos {
2165
+ color: var(--color-success);
2166
+ }
2167
+ .udb-onb-compare__icon--neg {
2168
+ color: var(--color-destructive);
2169
+ }
2170
+ @media (min-width: 640px) {
2171
+ .udb-onb-compare {
2172
+ grid-template-columns: 1fr 1fr;
2173
+ }
2174
+ }
2175
+
2176
+ .udb-onb-prefs {
2177
+ display: flex;
2178
+ flex-direction: column;
2179
+ gap: var(--udb-space-5);
2180
+ }
2181
+ .udb-onb-field {
2182
+ display: flex;
2183
+ flex-direction: column;
2184
+ gap: var(--udb-space-2);
2185
+ }
2186
+ .udb-onb-field__label {
2187
+ font-size: var(--udb-font-size-sm);
2188
+ font-weight: 600;
2189
+ }
2190
+ .udb-onb-select {
2191
+ width: 100%;
2192
+ padding: var(--udb-space-2);
2193
+ border: 1px solid var(--color-border);
2194
+ border-radius: var(--radius-md);
2195
+ background: var(--color-card);
2196
+ font-size: var(--udb-font-size-sm);
2197
+ }
2198
+ .udb-onb-chips {
2199
+ display: flex;
2200
+ flex-wrap: wrap;
2201
+ gap: var(--udb-space-2);
2202
+ }
2203
+ .udb-onb-chip {
2204
+ padding: var(--udb-space-1) var(--udb-space-3);
2205
+ border: 1px solid var(--color-border);
2206
+ border-radius: var(--udb-radius-pill);
2207
+ background: var(--color-card);
2208
+ font-size: var(--udb-font-size-sm);
2209
+ transition: border-color 0.15s, background-color 0.15s;
2210
+ }
2211
+ .udb-onb-chip:hover {
2212
+ border-color: var(--color-primary);
2213
+ }
2214
+ .udb-onb-chip--on {
2215
+ border-color: transparent;
2216
+ background: var(--color-primary);
2217
+ color: var(--color-primary-foreground);
2218
+ }
2219
+ .udb-onb-switch {
2220
+ width: 44px;
2221
+ height: 24px;
2222
+ padding: 2px;
2223
+ border-radius: var(--udb-radius-pill);
2224
+ background: var(--color-border);
2225
+ transition: background-color 0.15s;
2226
+ }
2227
+ .udb-onb-switch--on {
2228
+ background: var(--color-primary);
2229
+ }
2230
+ .udb-onb-switch__thumb {
2231
+ display: block;
2232
+ width: 20px;
2233
+ height: 20px;
2234
+ border-radius: var(--udb-radius-pill);
2235
+ background: var(--color-white);
2236
+ transition: transform 0.15s;
2237
+ }
2238
+ .udb-onb-switch--on .udb-onb-switch__thumb {
2239
+ transform: translateX(20px);
2240
+ }
2241
+ .udb-onb-slider {
2242
+ display: flex;
2243
+ flex-direction: column;
2244
+ gap: var(--udb-space-1);
2245
+ }
2246
+ .udb-onb-slider input[type='range'] {
2247
+ width: 100%;
2248
+ accent-color: var(--color-primary);
2249
+ }
2250
+ .udb-onb-slider__scale {
2251
+ display: flex;
2252
+ justify-content: space-between;
2253
+ font-size: var(--udb-font-size-xs);
2254
+ color: var(--color-muted-foreground);
2255
+ }
2256
+
2257
+ .udb-onb-list {
2258
+ display: flex;
2259
+ flex-direction: column;
2260
+ gap: var(--udb-space-2);
2261
+ }
2262
+ .udb-onb-benefit {
2263
+ display: flex;
2264
+ align-items: flex-start;
2265
+ gap: var(--udb-space-2);
2266
+ padding: var(--udb-space-3);
2267
+ border: 1px solid var(--color-border);
2268
+ border-radius: var(--radius-md);
2269
+ background: var(--color-card);
2270
+ font-size: var(--udb-font-size-sm);
2271
+ }
2272
+ .udb-onb-benefit__dot {
2273
+ width: 8px;
2274
+ height: 8px;
2275
+ margin-top: 5px;
2276
+ flex-shrink: 0;
2277
+ border-radius: var(--udb-radius-pill);
2278
+ background: var(--color-primary);
2279
+ }
2280
+ .udb-onb-error {
2281
+ padding: var(--udb-space-3);
2282
+ border: 1px solid var(--color-destructive);
2283
+ border-radius: var(--radius-md);
2284
+ background: var(--color-destructive-soft, var(--color-muted));
2285
+ font-size: var(--udb-font-size-sm);
2286
+ color: var(--color-destructive);
2287
+ }
2288
+
2289
+ .udb-onb-steps {
2290
+ display: flex;
2291
+ width: 100%;
2292
+ max-width: 28rem;
2293
+ flex-direction: column;
2294
+ gap: var(--udb-space-3);
2295
+ margin-inline: auto;
2296
+ }
2297
+ .udb-onb-step {
2298
+ display: flex;
2299
+ align-items: center;
2300
+ gap: var(--udb-space-3);
2301
+ padding: var(--udb-space-3);
2302
+ border: 1px solid var(--color-border);
2303
+ border-radius: var(--radius-md);
2304
+ background: var(--color-card);
2305
+ font-size: var(--udb-font-size-sm);
2306
+ text-align: left;
2307
+ }
2308
+ .udb-onb-step--done {
2309
+ border-color: var(--color-success);
2310
+ background: var(--color-success-soft, var(--color-muted));
2311
+ }
2312
+ .udb-onb-step--active {
2313
+ border-color: var(--color-primary);
2314
+ background: var(--color-primary-soft, var(--color-muted));
2315
+ }
2316
+ .udb-onb-step__badge {
2317
+ display: flex;
2318
+ align-items: center;
2319
+ justify-content: center;
2320
+ flex-shrink: 0;
2321
+ width: 24px;
2322
+ height: 24px;
2323
+ border-radius: var(--udb-radius-pill);
2324
+ background: var(--color-border);
2325
+ color: var(--color-muted-foreground);
2326
+ font-size: var(--udb-font-size-xs);
2327
+ }
2328
+ .udb-onb-step--done .udb-onb-step__badge {
2329
+ background: var(--color-success);
2330
+ color: var(--color-primary-foreground);
2331
+ }
2332
+ .udb-onb-step--active .udb-onb-step__badge {
2333
+ background: var(--color-primary);
2334
+ color: var(--color-primary-foreground);
2335
+ }
2336
+ .udb-onb-step__pulse {
2337
+ width: 8px;
2338
+ height: 8px;
2339
+ margin-left: auto;
2340
+ border-radius: var(--udb-radius-pill);
2341
+ background: var(--color-primary);
2342
+ animation: udb-onb-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
2343
+ }
2344
+ @keyframes udb-onb-pulse {
2345
+ 50% {
2346
+ opacity: 0.5;
2347
+ }
2348
+ }
2349
+
2350
+ .udb-onb-demo {
2351
+ padding: var(--udb-space-4);
2352
+ border: 1px solid var(--color-border);
2353
+ border-radius: var(--radius-lg);
2354
+ background: var(--color-muted);
2355
+ }
2356
+
2357
+ .udb-onb-result {
2358
+ width: 100%;
2359
+ max-width: 28rem;
2360
+ padding: var(--udb-space-6);
2361
+ border: 1px solid var(--color-border);
2362
+ border-radius: var(--radius-lg);
2363
+ background: var(--color-card);
2364
+ text-align: left;
2365
+ }
2366
+ .udb-onb-result__pre {
2367
+ overflow-x: auto;
2368
+ white-space: pre-wrap;
2369
+ font-size: var(--udb-font-size-sm);
2370
+ }
2371
+ .udb-onb-share {
2372
+ display: flex;
2373
+ flex-direction: column;
2374
+ align-items: center;
2375
+ gap: var(--udb-space-1);
2376
+ font-size: var(--udb-font-size-sm);
2377
+ color: var(--color-muted-foreground);
2378
+ }
2379
+
2380
+ .udb-onb-price {
2381
+ padding: var(--udb-space-6);
2382
+ border: 2px solid var(--color-primary);
2383
+ border-radius: var(--radius-lg);
2384
+ background: var(--color-primary-soft, var(--color-muted));
2385
+ text-align: center;
2386
+ }
2387
+ .udb-onb-price__amount {
2388
+ font-size: var(--udb-font-size-3xl);
2389
+ font-weight: 700;
2390
+ color: var(--color-primary);
2391
+ }
2392
+ .udb-onb-price__terms {
2393
+ margin-top: var(--udb-space-1);
2394
+ font-size: var(--udb-font-size-sm);
2395
+ color: var(--color-muted-foreground);
2396
+ }
2397
+ .udb-onb-feature {
2398
+ display: flex;
2399
+ align-items: flex-start;
2400
+ gap: var(--udb-space-3);
2401
+ padding: var(--udb-space-3);
2402
+ border: 1px solid var(--color-border);
2403
+ border-radius: var(--radius-md);
2404
+ background: var(--color-card);
2405
+ font-size: var(--udb-font-size-sm);
2406
+ }
2407
+ .udb-onb-feature--hl {
2408
+ border-color: var(--color-primary);
2409
+ background: var(--color-primary-soft, var(--color-muted));
2410
+ }
2411
+ .udb-onb-feature__icon {
2412
+ margin-top: 2px;
2413
+ color: var(--color-primary);
2414
+ }
2415
+ .udb-onb-note {
2416
+ display: flex;
2417
+ align-items: center;
2418
+ justify-content: center;
2419
+ gap: var(--udb-space-1);
2420
+ font-size: var(--udb-font-size-xs);
2421
+ color: var(--color-muted-foreground);
2422
+ }
2423
+
2424
+ .udb-onb-nav {
2425
+ display: flex;
2426
+ align-items: center;
2427
+ justify-content: space-between;
2428
+ }
2429
+
2430
+ .udb-onb-errorpage {
2431
+ display: flex;
2432
+ width: 100%;
2433
+ max-width: 28rem;
2434
+ min-height: 100vh;
2435
+ flex-direction: column;
2436
+ align-items: center;
2437
+ justify-content: center;
2438
+ gap: var(--udb-space-4);
2439
+ margin-inline: auto;
2440
+ padding: var(--udb-space-6);
2441
+ text-align: center;
2442
+ }
2443
+ .udb-onb-errorpage__icon {
2444
+ display: flex;
2445
+ align-items: center;
2446
+ justify-content: center;
2447
+ width: 64px;
2448
+ height: 64px;
2449
+ border-radius: var(--radius-lg);
2450
+ background: var(--color-destructive-soft, var(--color-muted));
2451
+ color: var(--color-destructive);
2452
+ }
2453
+ .udb-onb-question__head--center {
2454
+ align-items: center;
2455
+ text-align: center;
2456
+ }
2457
+ .udb-onb-palettes {
2458
+ display: grid;
2459
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2460
+ gap: var(--udb-space-2);
2461
+ }
2462
+ @media (min-width: 640px) {
2463
+ .udb-onb-palettes {
2464
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2465
+ }
2466
+ }
2467
+ .udb-onb-palette {
2468
+ padding: var(--udb-space-2);
2469
+ border: 2px solid transparent;
2470
+ border-radius: var(--radius-md);
2471
+ text-align: left;
2472
+ }
2473
+ .udb-onb-palette:hover {
2474
+ border-color: var(--color-border);
2475
+ }
2476
+ .udb-onb-palette--active {
2477
+ border-color: var(--color-primary);
2478
+ }
2479
+ .udb-onb-palette__strip {
2480
+ display: flex;
2481
+ height: 48px;
2482
+ width: 100%;
2483
+ overflow: hidden;
2484
+ border-radius: var(--radius-sm);
2485
+ }
2486
+ .udb-onb-palette__strip--lg {
2487
+ height: 128px;
2488
+ }
2489
+ .udb-onb-palette__chip {
2490
+ flex: 1;
2491
+ }
2492
+ .udb-onb-palette__name {
2493
+ display: block;
2494
+ margin-top: var(--udb-space-1);
2495
+ font-size: var(--udb-font-size-xs);
2496
+ font-weight: 500;
2497
+ }
2498
+ .udb-onb-palette-preview {
2499
+ padding: var(--udb-space-6);
2500
+ border: 1px solid var(--color-border);
2501
+ border-radius: var(--radius-lg);
2502
+ background: var(--color-card);
2503
+ }
2504
+ .udb-onb-palette-preview p {
2505
+ margin-top: var(--udb-space-3);
2506
+ font-size: var(--udb-font-size-sm);
2507
+ }