baldur 0.1.1

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 (164) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +21 -0
  4. data/README.md +318 -0
  5. data/TODO.md +6 -0
  6. data/app/assets/javascripts/baldur/controllers/accordion_controller.js +148 -0
  7. data/app/assets/javascripts/baldur/controllers/alert_controller.js +209 -0
  8. data/app/assets/javascripts/baldur/controllers/date_field_controller.js +558 -0
  9. data/app/assets/javascripts/baldur/controllers/details_menu_controller.js +30 -0
  10. data/app/assets/javascripts/baldur/controllers/form_submit_controller.js +7 -0
  11. data/app/assets/javascripts/baldur/controllers/marketing_pricing_controller.js +47 -0
  12. data/app/assets/javascripts/baldur/controllers/marketing_tabs_controller.js +118 -0
  13. data/app/assets/javascripts/baldur/controllers/menu_select_controller.js +401 -0
  14. data/app/assets/javascripts/baldur/controllers/mobile_sidebar_controller.js +13 -0
  15. data/app/assets/javascripts/baldur/controllers/modal_controller.js +149 -0
  16. data/app/assets/javascripts/baldur/controllers/panel_right_controller.js +1 -0
  17. data/app/assets/javascripts/baldur/controllers/panel_secondary_controller.js +129 -0
  18. data/app/assets/javascripts/baldur/controllers/segmented_tabs_controller.js +38 -0
  19. data/app/assets/javascripts/baldur/controllers/sidebar_controller.js +77 -0
  20. data/app/assets/javascripts/baldur/controllers/smooth_scroll_controller.js +29 -0
  21. data/app/assets/javascripts/baldur/controllers/snackbar_controller.js +158 -0
  22. data/app/assets/javascripts/baldur/controllers/table_disclosure_controller.js +46 -0
  23. data/app/assets/javascripts/baldur/controllers/theme_controller.js +90 -0
  24. data/app/assets/javascripts/baldur/controllers/tooltip_controller.js +136 -0
  25. data/app/assets/javascripts/baldur/lib/animation-helpers.js +56 -0
  26. data/app/assets/javascripts/baldur/lib/dom-helpers.js +80 -0
  27. data/app/assets/javascripts/baldur/lib/field-validation-helpers.js +36 -0
  28. data/app/assets/javascripts/baldur/lib/focus-management.js +89 -0
  29. data/app/assets/javascripts/baldur/lib/formatting-helpers.js +100 -0
  30. data/app/assets/javascripts/baldur/lib/lucide.js +20 -0
  31. data/app/assets/javascripts/baldur/lib/snackbar.js +50 -0
  32. data/app/assets/javascripts/baldur/lib/storage-helpers.js +50 -0
  33. data/app/assets/stylesheets/baldur/application/components/alert.css +226 -0
  34. data/app/assets/stylesheets/baldur/application/components/app_bar.css +41 -0
  35. data/app/assets/stylesheets/baldur/application/components/button.css +173 -0
  36. data/app/assets/stylesheets/baldur/application/components/card.css +63 -0
  37. data/app/assets/stylesheets/baldur/application/components/chart.css +40 -0
  38. data/app/assets/stylesheets/baldur/application/components/chip.css +51 -0
  39. data/app/assets/stylesheets/baldur/application/components/dialog.css +81 -0
  40. data/app/assets/stylesheets/baldur/application/components/forms.css +624 -0
  41. data/app/assets/stylesheets/baldur/application/components/layout.css +2 -0
  42. data/app/assets/stylesheets/baldur/application/components/list.css +15 -0
  43. data/app/assets/stylesheets/baldur/application/components/menu.css +300 -0
  44. data/app/assets/stylesheets/baldur/application/components/panel-right.css +1 -0
  45. data/app/assets/stylesheets/baldur/application/components/panel-secondary.css +71 -0
  46. data/app/assets/stylesheets/baldur/application/components/progress.css +84 -0
  47. data/app/assets/stylesheets/baldur/application/components/segmented-buttons.css +117 -0
  48. data/app/assets/stylesheets/baldur/application/components/settings-nav.css +84 -0
  49. data/app/assets/stylesheets/baldur/application/components/sidebar.css +123 -0
  50. data/app/assets/stylesheets/baldur/application/components/snackbar.css +179 -0
  51. data/app/assets/stylesheets/baldur/application/components/stepper.css +124 -0
  52. data/app/assets/stylesheets/baldur/application/components/switch.css +105 -0
  53. data/app/assets/stylesheets/baldur/application/components/table.css +331 -0
  54. data/app/assets/stylesheets/baldur/application/components/timeline.css +184 -0
  55. data/app/assets/stylesheets/baldur/application/components/utilities.css +180 -0
  56. data/app/assets/stylesheets/baldur/application/global.css +125 -0
  57. data/app/assets/stylesheets/baldur/application/marketing/layout.css +36 -0
  58. data/app/assets/stylesheets/baldur/application/motion.css +125 -0
  59. data/app/assets/stylesheets/baldur/application/theme.css +329 -0
  60. data/app/assets/stylesheets/baldur/theme/dark.css +90 -0
  61. data/app/assets/stylesheets/baldur/theme/light.css +82 -0
  62. data/app/assets/stylesheets/baldur.css +27 -0
  63. data/app/assets/stylesheets/baldur_panel_right.css +1 -0
  64. data/app/assets/stylesheets/baldur_panel_secondary.css +1 -0
  65. data/app/assets/tailwind/baldur/engine.css +5 -0
  66. data/app/helpers/baldur/compatibility/ui_aliases.rb +7 -0
  67. data/app/helpers/baldur/marketing_helper.rb +121 -0
  68. data/app/helpers/baldur/optional/auth_page_helper.rb +17 -0
  69. data/app/helpers/baldur/optional/google_auth_helper.rb +16 -0
  70. data/app/helpers/baldur/optional/panel_right_helper.rb +7 -0
  71. data/app/helpers/baldur/optional/panel_secondary_helper.rb +26 -0
  72. data/app/helpers/baldur/render_helper.rb +13 -0
  73. data/app/helpers/baldur/ui_helper.rb +217 -0
  74. data/app/helpers/baldur/ui_helper_feedback.rb +93 -0
  75. data/app/helpers/baldur/ui_helper_forms.rb +230 -0
  76. data/app/helpers/baldur/ui_helper_unavailable.rb +98 -0
  77. data/app/views/baldur/components/_accordion.html.erb +30 -0
  78. data/app/views/baldur/components/_action_row.html.erb +6 -0
  79. data/app/views/baldur/components/_alert.html.erb +61 -0
  80. data/app/views/baldur/components/_badge.html.erb +25 -0
  81. data/app/views/baldur/components/_button.html.erb +81 -0
  82. data/app/views/baldur/components/_card.html.erb +40 -0
  83. data/app/views/baldur/components/_chart_card.html.erb +42 -0
  84. data/app/views/baldur/components/_checkbox.html.erb +27 -0
  85. data/app/views/baldur/components/_date_field.html.erb +43 -0
  86. data/app/views/baldur/components/_google_sign_in_button.html.erb +1 -0
  87. data/app/views/baldur/components/_kebab_menu.html.erb +36 -0
  88. data/app/views/baldur/components/_kpi.html.erb +45 -0
  89. data/app/views/baldur/components/_menu_select.html.erb +78 -0
  90. data/app/views/baldur/components/_modal.html.erb +54 -0
  91. data/app/views/baldur/components/_pagination.html.erb +61 -0
  92. data/app/views/baldur/components/_segmented_buttons.html.erb +51 -0
  93. data/app/views/baldur/components/_settings_nav.html.erb +41 -0
  94. data/app/views/baldur/components/_snackbar.html.erb +42 -0
  95. data/app/views/baldur/components/_snackbar_stack.html.erb +13 -0
  96. data/app/views/baldur/components/_stepper.html.erb +39 -0
  97. data/app/views/baldur/components/_table.html.erb +117 -0
  98. data/app/views/baldur/components/_table_card.html.erb +86 -0
  99. data/app/views/baldur/components/_table_footer.html.erb +68 -0
  100. data/app/views/baldur/components/_text_field.html.erb +33 -0
  101. data/app/views/baldur/components/_tooltip.html.erb +73 -0
  102. data/app/views/baldur/marketing/_cta_banner.html.erb +20 -0
  103. data/app/views/baldur/marketing/_faq_section.html.erb +37 -0
  104. data/app/views/baldur/marketing/_features_section.html.erb +67 -0
  105. data/app/views/baldur/marketing/_footer.html.erb +38 -0
  106. data/app/views/baldur/marketing/_hero_section.html.erb +259 -0
  107. data/app/views/baldur/marketing/_pricing_tables.html.erb +99 -0
  108. data/app/views/baldur/marketing/_testimonials_section.html.erb +80 -0
  109. data/app/views/baldur/marketing/_top_nav.html.erb +28 -0
  110. data/app/views/baldur/optional/_auth_page.html.erb +21 -0
  111. data/app/views/baldur/optional/_google_sign_in_button.html.erb +19 -0
  112. data/app/views/baldur/optional/_panel_right.html.erb +1 -0
  113. data/app/views/baldur/optional/_panel_secondary.html.erb +34 -0
  114. data/baldur.gemspec +30 -0
  115. data/config/importmap.rb +2 -0
  116. data/lib/baldur/configuration.rb +24 -0
  117. data/lib/baldur/engine.rb +10 -0
  118. data/lib/baldur/version.rb +3 -0
  119. data/lib/baldur.rb +17 -0
  120. data/lib/generators/baldur/install/install_generator.rb +113 -0
  121. data/lib/generators/baldur/install/templates/baldur_initializer.rb +19 -0
  122. data/lib/generators/baldur/install/templates/fonts.css +14 -0
  123. data/lib/generators/baldur/install/templates/theme.css +27 -0
  124. data/lib/generators/baldur/install/templates/ui_helper.rb +4 -0
  125. data/lib/generators/baldur/install_google_auth/install_google_auth_generator.rb +15 -0
  126. data/lib/generators/baldur/install_panel_right/install_panel_right_generator.rb +9 -0
  127. data/lib/generators/baldur/install_panel_secondary/install_panel_secondary_generator.rb +21 -0
  128. data/script/verify_host_install +111 -0
  129. data/test/gemspec_test.rb +11 -0
  130. data/test/install_generator_test.rb +35 -0
  131. data/test/install_panel_secondary_generator_test.rb +21 -0
  132. data/test/marketing_helper_test.rb +38 -0
  133. data/test/run_all.rb +3 -0
  134. data/test/test_helper.rb +9 -0
  135. data/test/tmp/install_generator/app/assets/stylesheets/fonts.css +14 -0
  136. data/test/tmp/install_generator/app/assets/stylesheets/theme.css +27 -0
  137. data/test/tmp/install_generator/app/assets/tailwind/application.css +4 -0
  138. data/test/tmp/install_generator/app/helpers/ui_helper.rb +4 -0
  139. data/test/tmp/install_generator/app/javascript/controllers/accordion_controller.js +1 -0
  140. data/test/tmp/install_generator/app/javascript/controllers/date_field_controller.js +1 -0
  141. data/test/tmp/install_generator/app/javascript/controllers/details_menu_controller.js +1 -0
  142. data/test/tmp/install_generator/app/javascript/controllers/form_submit_controller.js +1 -0
  143. data/test/tmp/install_generator/app/javascript/controllers/marketing_pricing_controller.js +1 -0
  144. data/test/tmp/install_generator/app/javascript/controllers/marketing_tabs_controller.js +1 -0
  145. data/test/tmp/install_generator/app/javascript/controllers/menu_select_controller.js +1 -0
  146. data/test/tmp/install_generator/app/javascript/controllers/modal_controller.js +1 -0
  147. data/test/tmp/install_generator/app/javascript/controllers/segmented_tabs_controller.js +1 -0
  148. data/test/tmp/install_generator/app/javascript/controllers/sidebar_controller.js +1 -0
  149. data/test/tmp/install_generator/app/javascript/controllers/smooth_scroll_controller.js +1 -0
  150. data/test/tmp/install_generator/app/javascript/controllers/snackbar_controller.js +1 -0
  151. data/test/tmp/install_generator/app/javascript/controllers/theme_controller.js +1 -0
  152. data/test/tmp/install_generator/app/javascript/controllers/tooltip_controller.js +1 -0
  153. data/test/tmp/install_generator/app/javascript/lib/animation-helpers.js +1 -0
  154. data/test/tmp/install_generator/app/javascript/lib/dom-helpers.js +1 -0
  155. data/test/tmp/install_generator/app/javascript/lib/field-validation-helpers.js +1 -0
  156. data/test/tmp/install_generator/app/javascript/lib/focus-management.js +1 -0
  157. data/test/tmp/install_generator/app/javascript/lib/formatting-helpers.js +1 -0
  158. data/test/tmp/install_generator/app/javascript/lib/snackbar.js +1 -0
  159. data/test/tmp/install_generator/app/javascript/lib/storage-helpers.js +1 -0
  160. data/test/tmp/install_generator/config/initializers/baldur.rb +19 -0
  161. data/test/tmp/install_panel_secondary_generator/app/assets/tailwind/application.css +2 -0
  162. data/test/tmp/install_panel_secondary_generator/app/helpers/panel_secondary_helper.rb +3 -0
  163. data/test/tmp/install_panel_secondary_generator/app/javascript/controllers/panel_secondary_controller.js +1 -0
  164. metadata +259 -0
@@ -0,0 +1,125 @@
1
+ @layer base {
2
+ :root {
3
+ --font-body: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
4
+ --font-heading: var(--font-body);
5
+ --font-ui: var(--font-body);
6
+ --font-family: var(--font-body);
7
+ --font-sans: var(--font-body);
8
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
9
+ --radius-xs: 4px;
10
+ --radius-sm: 8px;
11
+ --radius-md: 12px;
12
+ --radius-lg: 16px;
13
+ --radius-xl: 24px;
14
+ --space-1: 4px;
15
+ --space-2: 8px;
16
+ --space-3: 12px;
17
+ --space-4: 16px;
18
+ --space-5: 20px;
19
+ --space-6: 24px;
20
+ --space-7: 28px;
21
+ --space-8: 32px;
22
+ --space-10: 40px;
23
+ --space-12: 48px;
24
+ --space-14: 56px;
25
+ --space-16: 64px;
26
+ --space-20: 80px;
27
+ --space-24: 96px;
28
+ --space-32: 128px;
29
+ --elev-0: none;
30
+ --elev-1: 0 1px 2px 0 color-mix(in srgb, var(--color-shadow) 5%, transparent), 0 6px 14px -6px color-mix(in srgb, var(--color-shadow) 9%, transparent);
31
+ --elev-2: 0 2px 4px 0 color-mix(in srgb, var(--color-shadow) 6%, transparent), 0 10px 22px -8px color-mix(in srgb, var(--color-shadow) 10%, transparent);
32
+ --elev-3: 0 3px 6px 0 color-mix(in srgb, var(--color-shadow) 7%, transparent), 0 16px 32px -10px color-mix(in srgb, var(--color-shadow) 12%, transparent);
33
+ --elev-4: 0 4px 8px 0 color-mix(in srgb, var(--color-shadow) 8%, transparent), 0 22px 40px -12px color-mix(in srgb, var(--color-shadow) 14%, transparent);
34
+ --elev-5: 0 6px 12px 0 color-mix(in srgb, var(--color-shadow) 10%, transparent), 0 28px 52px -14px color-mix(in srgb, var(--color-shadow) 16%, transparent);
35
+ --surface-tonal-0: var(--color-surface);
36
+ --surface-tonal-1: color-mix(in srgb, var(--color-surface) 95%, var(--color-primary) 5%);
37
+ --surface-tonal-2: color-mix(in srgb, var(--color-surface) 92%, var(--color-primary) 8%);
38
+ --surface-tonal-3: color-mix(in srgb, var(--color-surface) 89%, var(--color-primary) 11%);
39
+ --surface-tonal-4: color-mix(in srgb, var(--color-surface) 86%, var(--color-primary) 14%);
40
+ --surface-tonal-5: color-mix(in srgb, var(--color-surface) 82%, var(--color-primary) 18%);
41
+ }
42
+
43
+ html {
44
+ scroll-behavior: smooth;
45
+ }
46
+
47
+ @media (prefers-reduced-motion: reduce) {
48
+ html {
49
+ scroll-behavior: auto;
50
+ }
51
+ }
52
+
53
+ #hero h1 {
54
+ letter-spacing: -0.125rem;
55
+ font-weight: 600;
56
+ }
57
+
58
+ h1,
59
+ h2,
60
+ h3,
61
+ h4,
62
+ h5,
63
+ h6 {
64
+ font-family: var(--font-heading);
65
+ }
66
+
67
+ h2 {
68
+ font-size: var(--text-4xl);
69
+ font-weight: 500;
70
+ line-height: 3rem;
71
+ }
72
+
73
+ body {
74
+ font-family: var(--font-body);
75
+ background-color: var(--color-surface-lowest, var(--color-background));
76
+ color: var(--color-on-background);
77
+ }
78
+
79
+ button,
80
+ input,
81
+ select,
82
+ optgroup,
83
+ textarea {
84
+ font-family: var(--font-ui);
85
+ }
86
+
87
+ code,
88
+ kbd,
89
+ samp,
90
+ pre {
91
+ font-family: var(--font-mono);
92
+ }
93
+
94
+ a {
95
+ color: var(--color-primary);
96
+ }
97
+
98
+ a:hover {
99
+ color: color-mix(in srgb, var(--color-primary) 90%, var(--color-on-background));
100
+ }
101
+
102
+ :is(
103
+ a[href],
104
+ button:not(:disabled),
105
+ input[type="button"]:not(:disabled),
106
+ input[type="submit"]:not(:disabled),
107
+ input[type="reset"]:not(:disabled),
108
+ [role="button"]:not([aria-disabled="true"]),
109
+ [onclick],
110
+ [data-action*="click->"]
111
+ ) {
112
+ cursor: pointer;
113
+ }
114
+
115
+ :is(
116
+ button:disabled,
117
+ input[type="button"]:disabled,
118
+ input[type="submit"]:disabled,
119
+ input[type="reset"]:disabled,
120
+ [role="button"][aria-disabled="true"]
121
+ ) {
122
+ cursor: not-allowed;
123
+ }
124
+
125
+ }
@@ -0,0 +1,36 @@
1
+ @layer components {
2
+ .marketing-hero {
3
+ color: var(--color-on-surface);
4
+ }
5
+
6
+ .marketing-hero a:not(.button) {
7
+ color: inherit;
8
+ }
9
+
10
+ .marketing-hero .button--outlined {
11
+ --btn-bg: var(--color-surface);
12
+ --btn-fg: var(--color-on-surface);
13
+ --btn-state: var(--color-on-surface);
14
+ --btn-border: var(--color-outline);
15
+ }
16
+
17
+ .marketing-cta-banner .button--outlined {
18
+ --btn-fg: var(--color-on-secondary);
19
+ --btn-state: var(--color-on-secondary);
20
+ --btn-border: color-mix(in srgb, var(--color-on-secondary) 65%, transparent);
21
+ }
22
+
23
+ .marketing-cta-banner {
24
+ background-color: #08192b;
25
+ background-image: linear-gradient(135deg, #08192b 0%, #041220 100%);
26
+ background-repeat: no-repeat;
27
+ background-size: cover;
28
+ }
29
+
30
+ .marketing-cta-banner .button--filled {
31
+ --btn-bg: var(--color-surface-highest);
32
+ --btn-fg: var(--color-on-surface);
33
+ --btn-state: var(--color-on-surface);
34
+ --btn-border: transparent;
35
+ }
36
+ }
@@ -0,0 +1,125 @@
1
+ @layer base {
2
+ :root {
3
+ /* M3 standard motion tokens — values from material-components/material-web v0_192 */
4
+ --motion-duration-short1: 50ms;
5
+ --motion-duration-short2: 100ms;
6
+ --motion-duration-short3: 150ms;
7
+ --motion-duration-short4: 200ms;
8
+ --motion-duration-medium1: 250ms;
9
+ --motion-duration-medium2: 300ms;
10
+ --motion-duration-medium3: 350ms;
11
+ --motion-duration-medium4: 400ms;
12
+ --motion-duration-long1: 450ms;
13
+ --motion-duration-long2: 500ms;
14
+ --motion-duration-long3: 550ms;
15
+ --motion-duration-long4: 600ms;
16
+ --motion-duration-extra-long1: 700ms;
17
+ --motion-duration-extra-long2: 800ms;
18
+ --motion-duration-extra-long3: 900ms;
19
+ --motion-duration-extra-long4: 1000ms;
20
+ --motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
21
+ --motion-easing-standard-accelerate: cubic-bezier(0.3, 0, 1, 1);
22
+ --motion-easing-standard-decelerate: cubic-bezier(0, 0, 0, 1);
23
+ --motion-easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
24
+ --motion-easing-emphasized-accelerate: cubic-bezier(0.3, 0, 0.8, 0.15);
25
+ --motion-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1);
26
+ --motion-easing-linear: cubic-bezier(0, 0, 1, 1);
27
+ }
28
+
29
+ :root.theme-transition body,
30
+ :root.theme-transition body * {
31
+ transition-property: background-color, color, border-color, fill, stroke;
32
+ transition-duration: var(--motion-duration-extra-long1);
33
+ transition-timing-function: var(--motion-easing-standard);
34
+ }
35
+
36
+ @keyframes layer-enter {
37
+ from {
38
+ opacity: 0;
39
+ transform: translateY(20px) scale(0.96);
40
+ }
41
+ to {
42
+ opacity: 1;
43
+ transform: translateY(0) scale(1);
44
+ }
45
+ }
46
+
47
+ @keyframes layer-exit {
48
+ from {
49
+ opacity: 1;
50
+ transform: translateY(0) scale(1);
51
+ }
52
+ to {
53
+ opacity: 0;
54
+ transform: translateY(12px) scale(0.98);
55
+ }
56
+ }
57
+
58
+ @keyframes fade-scale {
59
+ from {
60
+ opacity: 0;
61
+ transform: scale(0.96);
62
+ }
63
+ to {
64
+ opacity: 1;
65
+ transform: scale(1);
66
+ }
67
+ }
68
+
69
+ @keyframes slide-up {
70
+ from {
71
+ opacity: 0;
72
+ transform: translateY(16px);
73
+ }
74
+ to {
75
+ opacity: 1;
76
+ transform: translateY(0);
77
+ }
78
+ }
79
+ }
80
+
81
+ @layer components {
82
+ .motion-layer-enter {
83
+ animation: layer-enter var(--motion-duration-medium2) var(--motion-easing-emphasized-decelerate) both;
84
+ }
85
+
86
+ .motion-layer-exit {
87
+ animation: layer-exit var(--motion-duration-short4) var(--motion-easing-emphasized-accelerate) both;
88
+ }
89
+
90
+ .motion-fade-scale {
91
+ animation: fade-scale var(--motion-duration-medium1) var(--motion-easing-emphasized-decelerate) both;
92
+ }
93
+
94
+ .motion-slide-up {
95
+ animation: slide-up var(--motion-duration-medium1) var(--motion-easing-standard-decelerate) both;
96
+ }
97
+ }
98
+
99
+ @media (prefers-reduced-motion: reduce) {
100
+ :root {
101
+ --motion-duration-short1: 0ms;
102
+ --motion-duration-short2: 0ms;
103
+ --motion-duration-short3: 0ms;
104
+ --motion-duration-short4: 0ms;
105
+ --motion-duration-medium1: 0ms;
106
+ --motion-duration-medium2: 0ms;
107
+ --motion-duration-medium3: 0ms;
108
+ --motion-duration-medium4: 0ms;
109
+ --motion-duration-long1: 0ms;
110
+ --motion-duration-long2: 0ms;
111
+ --motion-duration-long3: 0ms;
112
+ --motion-duration-long4: 0ms;
113
+ --motion-duration-extra-long1: 0ms;
114
+ --motion-duration-extra-long2: 0ms;
115
+ --motion-duration-extra-long3: 0ms;
116
+ --motion-duration-extra-long4: 0ms;
117
+ }
118
+
119
+ .motion-layer-enter,
120
+ .motion-layer-exit,
121
+ .motion-fade-scale,
122
+ .motion-slide-up {
123
+ animation: none !important;
124
+ }
125
+ }
@@ -0,0 +1,329 @@
1
+ :root {
2
+ /* Brand inputs (edit these for new themes). */
3
+ --_primary-base: oklch(0.682 0.157 27.1);
4
+ --_secondary-base: oklch(0.2968 0.0383 195.29);
5
+ --_accent-base: oklch(0.482 0.067 91.7);
6
+ --_neutral-base: oklch(0.8672 0 0);
7
+
8
+ --_scale-light: oklch(from var(--_neutral-base) 1 c h);
9
+ --_scale-dark: oklch(from var(--_neutral-base) 0.08 c h);
10
+
11
+ --_success-base: oklch(0.56 0.17 142.89);
12
+ --_warning-base: oklch(0.82 0.15 85);
13
+ --_info-base: oklch(0.75 0.12 230);
14
+ --_error-base: oklch(0.72 0.18 25);
15
+
16
+ --_tone-50: 10%;
17
+ --_tone-100: 18%;
18
+ --_neutral-tone-50: 1.5%;
19
+ --_tone-200: 28%;
20
+ --_tone-300: 42%;
21
+ --_tone-400: 60%;
22
+ --_tone-600: 82%;
23
+ --_tone-700: 68%;
24
+ --_tone-800: 54%;
25
+ --_tone-900: 40%;
26
+ --_tone-950: 28%;
27
+ }
28
+
29
+ @theme {
30
+ /* Palette scales. */
31
+ --color-primary-500: var(--_primary-base);
32
+ --color-primary-50: color-mix(in oklch, var(--color-primary-500) var(--_tone-50), var(--_scale-light));
33
+ --color-primary-100: color-mix(in oklch, var(--color-primary-500) var(--_tone-100), var(--_scale-light));
34
+ --color-primary-200: color-mix(in oklch, var(--color-primary-500) var(--_tone-200), var(--_scale-light));
35
+ --color-primary-300: color-mix(in oklch, var(--color-primary-500) var(--_tone-300), var(--_scale-light));
36
+ --color-primary-400: color-mix(in oklch, var(--color-primary-500) var(--_tone-400), var(--_scale-light));
37
+ --color-primary-600: color-mix(in oklch, var(--color-primary-500) var(--_tone-600), var(--_scale-dark));
38
+ --color-primary-700: color-mix(in oklch, var(--color-primary-500) var(--_tone-700), var(--_scale-dark));
39
+ --color-primary-800: color-mix(in oklch, var(--color-primary-500) var(--_tone-800), var(--_scale-dark));
40
+ --color-primary-900: color-mix(in oklch, var(--color-primary-500) var(--_tone-900), var(--_scale-dark));
41
+ --color-primary-950: color-mix(in oklch, var(--color-primary-500) var(--_tone-950), var(--_scale-dark));
42
+
43
+ --color-secondary-500: var(--_secondary-base);
44
+ --color-secondary-50: color-mix(in oklch, var(--color-secondary-500) var(--_tone-50), var(--_scale-light));
45
+ --color-secondary-100: color-mix(in oklch, var(--color-secondary-500) var(--_tone-100), var(--_scale-light));
46
+ --color-secondary-200: color-mix(in oklch, var(--color-secondary-500) var(--_tone-200), var(--_scale-light));
47
+ --color-secondary-300: color-mix(in oklch, var(--color-secondary-500) var(--_tone-300), var(--_scale-light));
48
+ --color-secondary-400: color-mix(in oklch, var(--color-secondary-500) var(--_tone-400), var(--_scale-light));
49
+ --color-secondary-600: color-mix(in oklch, var(--color-secondary-500) var(--_tone-600), var(--_scale-dark));
50
+ --color-secondary-700: color-mix(in oklch, var(--color-secondary-500) var(--_tone-700), var(--_scale-dark));
51
+ --color-secondary-800: color-mix(in oklch, var(--color-secondary-500) var(--_tone-800), var(--_scale-dark));
52
+ --color-secondary-900: color-mix(in oklch, var(--color-secondary-500) var(--_tone-900), var(--_scale-dark));
53
+ --color-secondary-950: color-mix(in oklch, var(--color-secondary-500) var(--_tone-950), var(--_scale-dark));
54
+
55
+ --color-accent-500: var(--_accent-base);
56
+ --color-accent-50: color-mix(in oklch, var(--color-accent-500) var(--_tone-50), var(--_scale-light));
57
+ --color-accent-100: color-mix(in oklch, var(--color-accent-500) var(--_tone-100), var(--_scale-light));
58
+ --color-accent-200: color-mix(in oklch, var(--color-accent-500) var(--_tone-200), var(--_scale-light));
59
+ --color-accent-300: color-mix(in oklch, var(--color-accent-500) var(--_tone-300), var(--_scale-light));
60
+ --color-accent-400: color-mix(in oklch, var(--color-accent-500) var(--_tone-400), var(--_scale-light));
61
+ --color-accent-600: color-mix(in oklch, var(--color-accent-500) var(--_tone-600), var(--_scale-dark));
62
+ --color-accent-700: color-mix(in oklch, var(--color-accent-500) var(--_tone-700), var(--_scale-dark));
63
+ --color-accent-800: color-mix(in oklch, var(--color-accent-500) var(--_tone-800), var(--_scale-dark));
64
+ --color-accent-900: color-mix(in oklch, var(--color-accent-500) var(--_tone-900), var(--_scale-dark));
65
+ --color-accent-950: color-mix(in oklch, var(--color-accent-500) var(--_tone-950), var(--_scale-dark));
66
+
67
+ --color-neutral-500: var(--_neutral-base);
68
+ --color-neutral-50: color-mix(in oklch, var(--color-neutral-500) var(--_neutral-tone-50), var(--_scale-light));
69
+ --color-neutral-100: color-mix(in oklch, var(--color-neutral-500) var(--_tone-100), var(--_scale-light));
70
+ --color-neutral-200: color-mix(in oklch, var(--color-neutral-500) var(--_tone-200), var(--_scale-light));
71
+ --color-neutral-300: color-mix(in oklch, var(--color-neutral-500) var(--_tone-300), var(--_scale-light));
72
+ --color-neutral-400: color-mix(in oklch, var(--color-neutral-500) var(--_tone-400), var(--_scale-light));
73
+ --color-neutral-600: color-mix(in oklch, var(--color-neutral-500) var(--_tone-600), var(--_scale-dark));
74
+ --color-neutral-700: color-mix(in oklch, var(--color-neutral-500) var(--_tone-700), var(--_scale-dark));
75
+ --color-neutral-800: color-mix(in oklch, var(--color-neutral-500) var(--_tone-800), var(--_scale-dark));
76
+ --color-neutral-900: color-mix(in oklch, var(--color-neutral-500) var(--_tone-900), var(--_scale-dark));
77
+ --color-neutral-950: color-mix(in oklch, var(--color-neutral-500) var(--_tone-950), var(--_scale-dark));
78
+ --color-neutral: var(--color-neutral-500);
79
+
80
+ /* Semantic roles (set in theme files). */
81
+ --color-primary: initial;
82
+ --color-secondary: initial;
83
+ --color-tertiary: initial;
84
+ --color-accent: initial;
85
+
86
+ --color-on-primary: initial;
87
+ --color-on-secondary: initial;
88
+ --color-on-tertiary: initial;
89
+ --color-on-accent: initial;
90
+
91
+ --color-primary-container: initial;
92
+ --color-on-primary-container: initial;
93
+ --color-secondary-container: initial;
94
+ --color-on-secondary-container: initial;
95
+ --color-tertiary-container: initial;
96
+ --color-on-tertiary-container: initial;
97
+ --color-accent-container: initial;
98
+ --color-on-accent-container: initial;
99
+
100
+ --color-success: initial;
101
+ --color-success-container: initial;
102
+ --color-on-success: initial;
103
+ --color-on-success-container: initial;
104
+ --color-success-outline: initial;
105
+
106
+ --color-warning: initial;
107
+ --color-warning-container: initial;
108
+ --color-on-warning: initial;
109
+ --color-on-warning-container: initial;
110
+ --color-warning-outline: initial;
111
+
112
+ --color-info: initial;
113
+ --color-info-container: initial;
114
+ --color-on-info: initial;
115
+ --color-on-info-container: initial;
116
+ --color-info-outline: initial;
117
+
118
+ --color-error: initial;
119
+ --color-on-error: initial;
120
+ --color-error-container: initial;
121
+ --color-on-error-container: initial;
122
+ --color-error-outline: initial;
123
+
124
+ --color-background: initial;
125
+ --color-on-background: initial;
126
+ --color-surface: initial;
127
+ --color-on-surface: initial;
128
+ --color-surface-variant: initial;
129
+ --color-on-surface-variant: initial;
130
+
131
+ --color-surface-lowest: initial;
132
+ --color-surface-low: initial;
133
+ --color-surface-medium: initial;
134
+ --color-surface-high: initial;
135
+ --color-surface-highest: initial;
136
+
137
+ --color-outline: initial;
138
+ --color-outline-variant: initial;
139
+ --color-shadow: initial;
140
+ --color-scrim: initial;
141
+ --color-inverse-surface: initial;
142
+ --color-inverse-on-surface: initial;
143
+ --color-inverse-primary: initial;
144
+
145
+ --color-text: initial;
146
+ --color-text-soft: initial;
147
+ --color-text-muted: initial;
148
+ --color-icon: initial;
149
+
150
+ --color-border-subtle: initial;
151
+ --color-border-strong: initial;
152
+ --color-ring-focus: initial;
153
+ }
154
+
155
+ @layer components {
156
+ .surface {
157
+ background-color: var(--color-surface);
158
+ color: var(--color-on-surface);
159
+ }
160
+
161
+ .surface-1 {
162
+ background-color: var(--color-surface-medium);
163
+ color: var(--color-on-surface);
164
+ }
165
+
166
+ .surface-2 {
167
+ background-color: var(--color-surface-high);
168
+ color: var(--color-on-surface);
169
+ }
170
+
171
+ .outline {
172
+ border: 1px solid var(--color-outline-variant);
173
+ }
174
+
175
+ .bg-base-100 {
176
+ background-color: var(--color-surface);
177
+ }
178
+
179
+ .bg-base-100\/70 {
180
+ background-color: color-mix(in srgb, var(--color-surface) 70%, transparent);
181
+ }
182
+
183
+ .bg-base-100\/90 {
184
+ background-color: color-mix(in srgb, var(--color-surface) 90%, transparent);
185
+ }
186
+
187
+ .bg-base-200 {
188
+ background-color: var(--color-surface-low);
189
+ }
190
+
191
+ .bg-base-300 {
192
+ background-color: var(--color-surface-medium);
193
+ }
194
+
195
+ .text-base-content {
196
+ color: var(--color-on-surface);
197
+ }
198
+
199
+ .text-base-content\/80 {
200
+ color: color-mix(in srgb, var(--color-on-surface) 80%, transparent);
201
+ }
202
+
203
+ .text-base-content\/70 {
204
+ color: color-mix(in srgb, var(--color-on-surface) 70%, transparent);
205
+ }
206
+
207
+ .text-base-content\/60 {
208
+ color: color-mix(in srgb, var(--color-on-surface) 60%, transparent);
209
+ }
210
+
211
+ .border-base-200 {
212
+ border-color: var(--color-outline-variant);
213
+ }
214
+
215
+ .border-base-300 {
216
+ border-color: color-mix(in srgb, var(--color-outline-variant) 70%, var(--color-outline));
217
+ }
218
+
219
+ .text-primary {
220
+ color: var(--color-primary);
221
+ }
222
+
223
+ .bg-primary\/5 {
224
+ background-color: color-mix(in srgb, var(--color-primary) 5%, transparent);
225
+ }
226
+
227
+ .bg-primary\/10 {
228
+ background-color: color-mix(in srgb, var(--color-primary) 10%, transparent);
229
+ }
230
+
231
+ .bg-primary\/20 {
232
+ background-color: color-mix(in srgb, var(--color-primary) 20%, transparent);
233
+ }
234
+
235
+ .from-primary\/10 {
236
+ --tw-gradient-from: color-mix(in srgb, var(--color-primary) 10%, transparent);
237
+ --tw-gradient-to: transparent;
238
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, transparent);
239
+ }
240
+
241
+ .to-secondary\/10 {
242
+ --tw-gradient-to: color-mix(in srgb, var(--color-secondary) 10%, transparent);
243
+ }
244
+
245
+ .bg-secondary\/10 {
246
+ background-color: color-mix(in srgb, var(--color-secondary) 10%, transparent);
247
+ }
248
+
249
+ .bg-gradient-to-br {
250
+ background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));
251
+ }
252
+
253
+ .bg-gradient-to-r {
254
+ background-image: linear-gradient(to right, var(--tw-gradient-stops));
255
+ }
256
+
257
+ .via-base-200 {
258
+ --tw-gradient-stops: var(--tw-gradient-from), color-mix(in srgb, var(--color-surface-low) 100%, transparent), var(--tw-gradient-to, transparent);
259
+ }
260
+
261
+ .ring,
262
+ .ring-primary {
263
+ box-shadow: 0 0 0 2px var(--color-primary);
264
+ }
265
+
266
+ .ring-2 {
267
+ box-shadow: 0 0 0 2px var(--color-outline);
268
+ }
269
+
270
+ .ring-primary\/50 {
271
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary) 50%, transparent);
272
+ }
273
+
274
+ .focus\:ring-primary\/30:focus {
275
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--color-primary) 30%, transparent);
276
+ }
277
+
278
+ .focus\:ring-2:focus {
279
+ box-shadow: 0 0 0 2px var(--color-outline);
280
+ }
281
+
282
+ .focus\:border-primary:focus {
283
+ border-color: var(--color-primary);
284
+ }
285
+
286
+ .hover\:border-primary\/40:hover {
287
+ border-color: color-mix(in srgb, var(--color-primary) 40%, transparent);
288
+ }
289
+
290
+ .border-primary\/40 {
291
+ border-color: color-mix(in srgb, var(--color-primary) 40%, transparent);
292
+ }
293
+
294
+ .text-primary-content {
295
+ color: var(--color-on-primary);
296
+ }
297
+
298
+ .placeholder\:text-base-content\/60::placeholder {
299
+ color: color-mix(in srgb, var(--color-on-surface) 60%, transparent);
300
+ }
301
+
302
+ .divide-base-200> :not([hidden])~ :not([hidden]) {
303
+ border-top: 1px solid var(--color-outline-variant);
304
+ }
305
+
306
+ .elevation-0 {
307
+ box-shadow: var(--elev-0);
308
+ }
309
+
310
+ .elevation-1 {
311
+ box-shadow: var(--elev-1);
312
+ }
313
+
314
+ .elevation-2 {
315
+ box-shadow: var(--elev-2);
316
+ }
317
+
318
+ .elevation-3 {
319
+ box-shadow: var(--elev-3);
320
+ }
321
+
322
+ .elevation-4 {
323
+ box-shadow: var(--elev-4);
324
+ }
325
+
326
+ .elevation-5 {
327
+ box-shadow: var(--elev-5);
328
+ }
329
+ }
@@ -0,0 +1,90 @@
1
+ .dark {
2
+ /* Pastel-forward dark mode: lighten chroma via neutral-50, not pure white. */
3
+ --color-neutral-500: color-mix(in oklch, var(--_neutral-base) 8%, var(--_scale-dark));
4
+
5
+ --color-primary-500: color-mix(in oklch, var(--_primary-base) 80%, var(--color-neutral-50));
6
+ --color-secondary-500: color-mix(in oklch, var(--_secondary-base) 45%, var(--color-neutral-50));
7
+ --color-accent-500: color-mix(in oklch, var(--_accent-base) 55%, var(--color-neutral-50));
8
+ --color-success: color-mix(in oklch, var(--_success-base) 95%, var(--color-neutral-50));
9
+ --color-warning: color-mix(in oklch, var(--_warning-base) 90%, var(--color-neutral-50));
10
+ --color-info: color-mix(in oklch, var(--_info-base) 90%, var(--color-neutral-50));
11
+ --color-error: color-mix(in oklch, var(--_error-base) 90%, var(--color-neutral-50));
12
+
13
+ /* Subtle pastel wash on the canvas. */
14
+ --_surface-tint: color-mix(in oklch, var(--color-primary-950) 85%, var(--color-accent-950));
15
+ --color-surface-lowest: color-mix(in oklch, var(--_scale-dark) 98%, var(--_surface-tint));
16
+
17
+ /* Elevation ladder: higher surfaces get noticeably lighter. */
18
+ --color-surface-low: color-mix(in oklch, var(--color-surface-lowest) 92%, var(--color-neutral-400));
19
+ --color-surface-medium: color-mix(in oklch, var(--color-surface-lowest) 86%, var(--color-neutral-300));
20
+ --color-surface-high: color-mix(in oklch, var(--color-surface-lowest) 80%, var(--color-neutral-200));
21
+ --color-surface-highest: color-mix(in oklch, var(--color-surface-lowest) 72%, var(--color-neutral-100));
22
+
23
+ --color-background: var(--color-surface-lowest);
24
+ --color-surface: var(--color-surface-low);
25
+
26
+ --color-on-background: var(--color-neutral-100);
27
+ --color-on-surface: var(--color-neutral-100);
28
+
29
+ --color-surface-variant: color-mix(in oklch, var(--color-surface-high) 92%, var(--color-primary-800));
30
+ --color-on-surface-variant: var(--color-neutral-200);
31
+
32
+ --color-primary: var(--color-primary-500);
33
+ --color-secondary: var(--color-secondary-700);
34
+ --color-tertiary: var(--color-accent-500);
35
+ --color-accent: var(--color-accent-500);
36
+
37
+ --color-primary-container: color-mix(in oklch, var(--color-surface-high) 86%, var(--color-primary-500));
38
+ --color-secondary-container: color-mix(in oklch, var(--color-surface-high) 88%, var(--color-secondary-500));
39
+ --color-tertiary-container: color-mix(in oklch, var(--color-surface-high) 88%, var(--color-accent-500));
40
+ --color-accent-container: color-mix(in oklch, var(--color-surface-high) 88%, var(--color-accent-500));
41
+
42
+ --color-success-container: color-mix(in oklch, var(--color-success) 40%, black 60%);
43
+ --color-warning-container: color-mix(in oklch, var(--color-warning) 40%, black 60%);
44
+ --color-info-container: color-mix(in oklch, var(--color-info) 40%, black 60%);
45
+ --color-error-container: color-mix(in oklch, var(--color-error) 40%, black 60%);
46
+
47
+ --color-on-primary: var(--color-neutral-950);
48
+ --color-on-secondary: var(--color-neutral-950);
49
+ --color-on-tertiary: var(--color-neutral-950);
50
+ --color-on-accent: var(--color-neutral-950);
51
+ --color-on-error: var(--color-neutral-950);
52
+ --color-on-success: var(--color-neutral-950);
53
+ --color-on-warning: var(--color-neutral-950);
54
+ --color-on-info: var(--color-neutral-950);
55
+
56
+ --color-on-primary-container: var(--color-neutral-50);
57
+ --color-on-secondary-container: var(--color-neutral-50);
58
+ --color-on-tertiary-container: var(--color-neutral-50);
59
+ --color-on-accent-container: var(--color-neutral-50);
60
+ --color-on-success-container: oklch(from var(--color-success) 0.8 c h);
61
+ --color-on-warning-container: oklch(from var(--color-warning) 0.84 c h);
62
+ --color-on-info-container: oklch(from var(--color-info) 0.82 c h);
63
+ --color-on-error-container: oklch(from var(--color-error) 0.84 c h);
64
+
65
+ --color-text: var(--color-neutral-200);
66
+ --color-text-soft: color-mix(in oklch, var(--color-neutral-200) 55%, var(--color-neutral-300));
67
+ --color-text-muted: var(--color-neutral-300);
68
+ --color-icon: var(--color-neutral-200);
69
+
70
+ --color-outline: color-mix(in oklch, var(--color-surface-highest) 97%, var(--color-neutral-50));
71
+ --color-outline-variant: color-mix(in oklch, var(--color-surface-high) 98%, var(--color-neutral-50));
72
+ --color-border-subtle: color-mix(in oklch, var(--color-surface-low) 90%, var(--color-neutral-300));
73
+ --color-border-strong: var(--color-outline);
74
+ --color-ring-focus: var(--color-primary-300);
75
+
76
+ --color-success-outline: oklch(from var(--color-success) calc(l + 0.08) calc(c * 1.2) h);
77
+ --color-warning-outline: color-mix(in oklch, var(--color-warning) 72%, var(--color-outline-variant));
78
+ --color-info-outline: color-mix(in oklch, var(--color-info) 72%, var(--color-outline-variant));
79
+ --color-error-outline: color-mix(in oklch, var(--color-error) 72%, var(--color-outline-variant));
80
+
81
+ --color-inverse-surface: var(--color-neutral-50);
82
+ --color-inverse-on-surface: var(--color-neutral-900);
83
+ --color-inverse-primary: var(--color-primary-700);
84
+
85
+ --color-shadow: oklch(from var(--_neutral-base) 0 c h);
86
+ --color-scrim: oklch(from var(--_neutral-base) 0 c h);
87
+
88
+ --segmented-selected-bg: var(--color-primary-container);
89
+ --segmented-selected-fg: var(--color-on-primary-container);
90
+ }