shadcn-phlex 0.1.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 (113) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +195 -0
  3. data/app.css +20 -0
  4. data/css/shadcn-source.css +3 -0
  5. data/css/shadcn-tailwind.css +160 -0
  6. data/css/themes/mauve.css +62 -0
  7. data/css/themes/mist.css +62 -0
  8. data/css/themes/neutral.css +74 -0
  9. data/css/themes/olive.css +62 -0
  10. data/css/themes/stone.css +62 -0
  11. data/css/themes/taupe.css +62 -0
  12. data/css/themes/zinc.css +62 -0
  13. data/js/controllers/accordion_controller.js +135 -0
  14. data/js/controllers/checkbox_controller.js +52 -0
  15. data/js/controllers/collapsible_controller.js +85 -0
  16. data/js/controllers/combobox_controller.js +168 -0
  17. data/js/controllers/command_controller.js +171 -0
  18. data/js/controllers/context_menu_controller.js +132 -0
  19. data/js/controllers/dark_mode_controller.js +106 -0
  20. data/js/controllers/dialog_controller.js +205 -0
  21. data/js/controllers/drawer_controller.js +161 -0
  22. data/js/controllers/dropdown_menu_controller.js +189 -0
  23. data/js/controllers/hover_card_controller.js +85 -0
  24. data/js/controllers/index.js +89 -0
  25. data/js/controllers/menubar_controller.js +171 -0
  26. data/js/controllers/navigation_menu_controller.js +160 -0
  27. data/js/controllers/popover_controller.js +151 -0
  28. data/js/controllers/radio_group_controller.js +78 -0
  29. data/js/controllers/scroll_area_controller.js +117 -0
  30. data/js/controllers/select_controller.js +198 -0
  31. data/js/controllers/sheet_controller.js +130 -0
  32. data/js/controllers/slider_controller.js +142 -0
  33. data/js/controllers/switch_controller.js +40 -0
  34. data/js/controllers/tabs_controller.js +96 -0
  35. data/js/controllers/toast_controller.js +206 -0
  36. data/js/controllers/toggle_controller.js +30 -0
  37. data/js/controllers/toggle_group_controller.js +73 -0
  38. data/js/controllers/tooltip_controller.js +146 -0
  39. data/lib/generators/shadcn_phlex/component_generator.rb +79 -0
  40. data/lib/generators/shadcn_phlex/install_generator.rb +217 -0
  41. data/lib/shadcn/base.rb +27 -0
  42. data/lib/shadcn/engine.rb +24 -0
  43. data/lib/shadcn/kit.rb +1158 -0
  44. data/lib/shadcn/themes/accent_colors.rb +106 -0
  45. data/lib/shadcn/themes/base_colors.rb +313 -0
  46. data/lib/shadcn/ui/accordion.rb +135 -0
  47. data/lib/shadcn/ui/alert.rb +79 -0
  48. data/lib/shadcn/ui/alert_dialog.rb +220 -0
  49. data/lib/shadcn/ui/aspect_ratio.rb +35 -0
  50. data/lib/shadcn/ui/avatar.rb +134 -0
  51. data/lib/shadcn/ui/badge.rb +48 -0
  52. data/lib/shadcn/ui/breadcrumb.rb +180 -0
  53. data/lib/shadcn/ui/button.rb +63 -0
  54. data/lib/shadcn/ui/button_group.rb +58 -0
  55. data/lib/shadcn/ui/card.rb +133 -0
  56. data/lib/shadcn/ui/checkbox.rb +72 -0
  57. data/lib/shadcn/ui/collapsible.rb +76 -0
  58. data/lib/shadcn/ui/combobox.rb +229 -0
  59. data/lib/shadcn/ui/command.rb +256 -0
  60. data/lib/shadcn/ui/context_menu.rb +319 -0
  61. data/lib/shadcn/ui/dialog.rb +226 -0
  62. data/lib/shadcn/ui/direction.rb +23 -0
  63. data/lib/shadcn/ui/drawer.rb +217 -0
  64. data/lib/shadcn/ui/dropdown_menu.rb +384 -0
  65. data/lib/shadcn/ui/empty.rb +97 -0
  66. data/lib/shadcn/ui/field.rb +126 -0
  67. data/lib/shadcn/ui/hover_card.rb +75 -0
  68. data/lib/shadcn/ui/input.rb +36 -0
  69. data/lib/shadcn/ui/input_group.rb +32 -0
  70. data/lib/shadcn/ui/input_otp.rb +112 -0
  71. data/lib/shadcn/ui/item.rb +115 -0
  72. data/lib/shadcn/ui/kbd.rb +45 -0
  73. data/lib/shadcn/ui/label.rb +28 -0
  74. data/lib/shadcn/ui/menubar.rb +345 -0
  75. data/lib/shadcn/ui/native_select.rb +31 -0
  76. data/lib/shadcn/ui/navigation_menu.rb +238 -0
  77. data/lib/shadcn/ui/pagination.rb +224 -0
  78. data/lib/shadcn/ui/popover.rb +147 -0
  79. data/lib/shadcn/ui/progress.rb +40 -0
  80. data/lib/shadcn/ui/radio_group.rb +92 -0
  81. data/lib/shadcn/ui/resizable.rb +108 -0
  82. data/lib/shadcn/ui/scroll_area.rb +75 -0
  83. data/lib/shadcn/ui/select.rb +235 -0
  84. data/lib/shadcn/ui/separator.rb +36 -0
  85. data/lib/shadcn/ui/sheet.rb +231 -0
  86. data/lib/shadcn/ui/sidebar.rb +420 -0
  87. data/lib/shadcn/ui/skeleton.rb +23 -0
  88. data/lib/shadcn/ui/slider.rb +72 -0
  89. data/lib/shadcn/ui/sonner.rb +177 -0
  90. data/lib/shadcn/ui/spinner.rb +58 -0
  91. data/lib/shadcn/ui/switch.rb +75 -0
  92. data/lib/shadcn/ui/table.rb +154 -0
  93. data/lib/shadcn/ui/tabs.rb +154 -0
  94. data/lib/shadcn/ui/text_field.rb +146 -0
  95. data/lib/shadcn/ui/textarea.rb +32 -0
  96. data/lib/shadcn/ui/theme_toggle.rb +74 -0
  97. data/lib/shadcn/ui/toggle.rb +66 -0
  98. data/lib/shadcn/ui/toggle_group.rb +75 -0
  99. data/lib/shadcn/ui/tooltip.rb +78 -0
  100. data/lib/shadcn/ui/typography.rb +217 -0
  101. data/lib/shadcn/version.rb +5 -0
  102. data/lib/shadcn-phlex.rb +6 -0
  103. data/lib/shadcn.rb +80 -0
  104. data/package.json +14 -0
  105. data/skills/shadcn-phlex/SKILL.md +190 -0
  106. data/skills/shadcn-phlex/evals/evals.json +90 -0
  107. data/skills/shadcn-phlex/references/component-catalog.md +355 -0
  108. data/skills/shadcn-phlex/rules/composition.md +235 -0
  109. data/skills/shadcn-phlex/rules/forms.md +151 -0
  110. data/skills/shadcn-phlex/rules/helpers.md +54 -0
  111. data/skills/shadcn-phlex/rules/stimulus.md +61 -0
  112. data/skills/shadcn-phlex/rules/styling.md +177 -0
  113. metadata +209 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a8ad4a8df10b424812b620f66c8a434b0a769f69432e97129aa9ed4169fef053
4
+ data.tar.gz: 98aacd9c16b51d265ae620daae49ae83f0bed79a19151c2194492b062f904e21
5
+ SHA512:
6
+ metadata.gz: 8568e0f3cc0a4bd83af716d54d58b95d619b68202f8aecca14657ab4682c3bbb08ffc34cccf961f1937bd830ed459eb0ed022cfaacf352b1ea202c424ebc70dd
7
+ data.tar.gz: 830d647f15781c6ed95feb5e14148fb425f3ce5d68757e8963c539856fc152df83c926c07e2855f81e5dcea120496128cbc51c50e1b7a9b003196b081918b9b5
data/README.md ADDED
@@ -0,0 +1,195 @@
1
+ # shadcn-phlex
2
+
3
+ A complete port of [shadcn/ui](https://ui.shadcn.com) to [Phlex](https://www.phlex.fun/) for Ruby on Rails. Every component, every Tailwind class, every variant — with Stimulus controllers that replicate Radix UI behavior and full compatibility with standard shadcn theming.
4
+
5
+ ## Features
6
+
7
+ - **55 Phlex components** — every shadcn/ui v4 component with exact Tailwind classes
8
+ - **25 Stimulus controllers** — full Radix UI behavior (focus trap, keyboard nav, positioning, animations, drag/swipe)
9
+ - **7 base color themes + 17 accent colors** — compatible with [ui.shadcn.com/themes](https://ui.shadcn.com/themes)
10
+ - **Kit module** — `ui_button(variant: :destructive) { "Delete" }` short syntax
11
+ - **Form integration** — hidden inputs for Checkbox, Switch, Select, RadioGroup, Slider, Combobox
12
+ - **Compound field helpers** — `TextField`, `TextareaField` for one-liner form fields
13
+ - **Dark mode** — drop-in toggle with localStorage persistence
14
+ - **Turbo compatible** — all controllers handle page transitions correctly
15
+ - **Rails generators** — fully automated setup
16
+ - **AI skills** — agent skill for Claude Code, Cursor, and 40+ coding agents
17
+
18
+ ## Quick Start
19
+
20
+ Two commands to get started:
21
+
22
+ ```ruby
23
+ # Gemfile
24
+ gem "shadcn-phlex"
25
+ ```
26
+
27
+ ```bash
28
+ rails g shadcn_phlex:install --base-color=zinc --accent-color=violet
29
+ ```
30
+
31
+ The generator sets up everything automatically:
32
+
33
+ - `app/views/application_view.rb` — base view with `Shadcn::Kit` included
34
+ - `app/assets/stylesheets/shadcn.css` — Tailwind entrypoint with theme
35
+ - `app/assets/stylesheets/shadcn-tailwind.css` — custom variants and keyframes
36
+ - `app/assets/stylesheets/shadcn-theme.css` — theme variables (swappable)
37
+ - `app/javascript/controllers/shadcn/` — all 25 Stimulus controllers
38
+ - `config/application.rb` — autoload path for Phlex views
39
+ - `controllers/index.js` — Stimulus registration injected
40
+
41
+ Start building immediately:
42
+
43
+ ```ruby
44
+ class SettingsView < ApplicationView
45
+ def view_template
46
+ ui_card do
47
+ ui_card_header do
48
+ ui_card_title { "Settings" }
49
+ ui_card_description { "Manage your preferences." }
50
+ end
51
+ ui_card_content do
52
+ ui_text_field(
53
+ label: "Display Name",
54
+ name: "user[name]",
55
+ placeholder: "Enter your name"
56
+ )
57
+ ui_text_field(
58
+ label: "Email",
59
+ name: "user[email]",
60
+ type: "email",
61
+ description: "We'll never share your email."
62
+ )
63
+ end
64
+ ui_card_footer do
65
+ ui_button(variant: :outline) { "Cancel" }
66
+ ui_button { "Save" }
67
+ end
68
+ end
69
+ end
70
+ end
71
+ ```
72
+
73
+ ## Usage
74
+
75
+ All components are available as `ui_*` helpers when `Shadcn::Kit` is included (the generator does this for you):
76
+
77
+ ```ruby
78
+ ui_button(variant: :destructive) { "Delete" }
79
+ ui_badge(variant: :outline) { "Beta" }
80
+ ui_separator
81
+ ui_skeleton(class: "h-4 w-[200px]")
82
+ ```
83
+
84
+ Or use direct render calls:
85
+
86
+ ```ruby
87
+ render Shadcn::UI::Button.new(variant: :destructive) { "Delete" }
88
+ ```
89
+
90
+ ## Components
91
+
92
+ ### Layout & Structure
93
+ `Card` `CardHeader` `CardTitle` `CardDescription` `CardAction` `CardContent` `CardFooter` `Separator` `AspectRatio` `ResizablePanelGroup` `ResizablePanel` `ResizableHandle` `ScrollArea` `ScrollBar`
94
+
95
+ ### Forms
96
+ `Input` `Textarea` `Label` `Checkbox` `Switch` `RadioGroup` `RadioGroupItem` `Select` `SelectTrigger` `SelectValue` `SelectContent` `SelectItem` `Slider` `Combobox` `NativeSelect` `InputOTP` `InputGroup` `Field` `FieldControl` `FieldDescription` `FieldError` `Fieldset` `TextField` `TextareaField`
97
+
98
+ ### Buttons & Actions
99
+ `Button` `ButtonGroup` `Toggle` `ToggleGroup` `ToggleGroupItem`
100
+
101
+ ### Navigation
102
+ `Tabs` `TabsList` `TabsTrigger` `TabsContent` `Breadcrumb` `BreadcrumbList` `BreadcrumbItem` `BreadcrumbLink` `BreadcrumbPage` `BreadcrumbSeparator` `Pagination` `NavigationMenu` `Menubar` `Sidebar`
103
+
104
+ ### Feedback
105
+ `Alert` `AlertTitle` `AlertDescription` `Badge` `Progress` `Skeleton` `Spinner` `Toaster` `Toast`
106
+
107
+ ### Overlays
108
+ `Dialog` `DialogTrigger` `DialogContent` `DialogHeader` `DialogFooter` `DialogTitle` `DialogDescription` `AlertDialog` `Sheet` `SheetContent` `Drawer` `DrawerContent` `Popover` `PopoverContent` `Tooltip` `TooltipContent` `HoverCard` `HoverCardContent` `DropdownMenu` `DropdownMenuContent` `DropdownMenuItem` `ContextMenu` `Command` `CommandDialog` `CommandInput` `CommandList` `CommandItem`
109
+
110
+ ### Data Display
111
+ `Table` `TableHeader` `TableBody` `TableRow` `TableHead` `TableCell` `Avatar` `AvatarImage` `AvatarFallback` `AvatarGroup` `Kbd` `Empty`
112
+
113
+ ### Utility
114
+ `Direction` `ThemeToggle` `Typography*`
115
+
116
+ ## Form Integration
117
+
118
+ Custom controls accept a `name:` parameter for form submission:
119
+
120
+ ```ruby
121
+ ui_checkbox(name: "user[terms]", checked: @user.terms)
122
+ ui_switch(name: "user[notifications]", checked: true)
123
+ ui_select(name: "user[role]") do
124
+ ui_select_trigger { ui_select_value(placeholder: "Pick a role") }
125
+ ui_select_content do
126
+ ui_select_item(value: "admin") { "Admin" }
127
+ ui_select_item(value: "user") { "User" }
128
+ end
129
+ end
130
+ ui_slider(name: "user[volume]", value: 50, min: 0, max: 100)
131
+ ```
132
+
133
+ ## Theming
134
+
135
+ Themes use the **exact same CSS variable format** as shadcn/ui. To change themes:
136
+
137
+ 1. Go to [ui.shadcn.com/themes](https://ui.shadcn.com/themes)
138
+ 2. Pick a theme and copy the CSS
139
+ 3. Paste into `app/assets/stylesheets/shadcn-theme.css`
140
+
141
+ Or generate from Ruby:
142
+
143
+ ```ruby
144
+ css = Shadcn::Themes.generate_css(
145
+ base_color: :zinc,
146
+ accent_color: :violet,
147
+ radius: "0.5rem"
148
+ )
149
+ ```
150
+
151
+ ### Available themes
152
+
153
+ **Base colors:** `neutral` `stone` `zinc` `mauve` `olive` `mist` `taupe`
154
+
155
+ **Accent colors:** `blue` `red` `green` `orange` `violet` `amber` `cyan` `emerald` `fuchsia` `indigo` `lime` `pink` `purple` `rose` `sky` `teal` `yellow`
156
+
157
+ ## Dark Mode
158
+
159
+ ```ruby
160
+ ui_theme_toggle # renders sun/moon button, persists to localStorage
161
+ ```
162
+
163
+ ## Generators
164
+
165
+ ```bash
166
+ # Full automated setup
167
+ rails g shadcn_phlex:install
168
+
169
+ # With theme options
170
+ rails g shadcn_phlex:install --base-color=zinc --accent-color=blue --radius=0.5rem
171
+ ```
172
+
173
+ ## AI / LLM Support
174
+
175
+ Install the agent skill so LLMs know how to use the library:
176
+
177
+ ```bash
178
+ npx skills add shadcn-phlex/shadcn-phlex
179
+ ```
180
+
181
+ This uses the standard [agent skills](https://agentskills.io) ecosystem — one command installs into `.claude/skills/`, `.cursor/skills/`, etc. for 40+ coding agents. After installation, any LLM entering the project knows every component, composition pattern, and best practice.
182
+
183
+ The skill follows the same structure as [shadcn's own agent skill](https://github.com/shadcn-ui/ui/tree/main/skills/shadcn) — component selection tables, composition rules, form rules, styling rules, and Incorrect/Correct Ruby/Phlex code pairs for every rule.
184
+
185
+ ## Testing
186
+
187
+ ```bash
188
+ bundle exec rspec
189
+ ```
190
+
191
+ 142 specs covering all components, variants, ARIA, Stimulus wiring, form integration, themes, and the Kit module.
192
+
193
+ ## License
194
+
195
+ MIT
data/app.css ADDED
@@ -0,0 +1,20 @@
1
+ /*
2
+ * Example app.css for shadcn-phlex
3
+ *
4
+ * This is the recommended structure. It matches the standard shadcn setup:
5
+ * 1. Import Tailwind + animations
6
+ * 2. Import shadcn Tailwind config (custom variants, @theme inline, etc.)
7
+ * 3. Import or paste your theme (from ui.shadcn.com/themes or css/themes/)
8
+ *
9
+ * To swap themes, just replace the theme import — or paste CSS from
10
+ * ui.shadcn.com/themes directly. The :root / .dark format is identical.
11
+ */
12
+
13
+ @import "tailwindcss";
14
+ @import "tw-animate-css";
15
+
16
+ /* shadcn Tailwind config: custom variants, @theme inline, keyframes */
17
+ @import "./css/shadcn-tailwind.css";
18
+
19
+ /* Theme: swap this import or paste from ui.shadcn.com/themes */
20
+ @import "./css/themes/neutral.css";
@@ -0,0 +1,3 @@
1
+ /* Include this in your Tailwind entrypoint to ensure component classes aren't purged */
2
+ @source "../../lib/shadcn/ui/*.rb";
3
+ @source "../../lib/shadcn/base.rb";
@@ -0,0 +1,160 @@
1
+ /*
2
+ * shadcn/tailwind.css equivalent for Phlex Rails
3
+ *
4
+ * This file provides the Tailwind v4 config that shadcn components need.
5
+ * It does NOT include theme colors — those come from your theme file.
6
+ *
7
+ * Usage in your app's main CSS:
8
+ * @import "tailwindcss";
9
+ * @import "tw-animate-css";
10
+ * @import "shadcn-phlex/css/shadcn-tailwind.css";
11
+ * @import "shadcn-phlex/css/themes/neutral.css"; /* or paste from ui.shadcn.com/themes */
12
+ */
13
+
14
+ /* ============================================================
15
+ Custom variants — required by all shadcn components
16
+ ============================================================ */
17
+ @custom-variant dark (&:is(.dark *));
18
+ @custom-variant data-open {
19
+ &:where([data-state="open"]),
20
+ &:where([data-open]:not([data-open="false"])) {
21
+ @slot;
22
+ }
23
+ }
24
+ @custom-variant data-closed {
25
+ &:where([data-state="closed"]),
26
+ &:where([data-closed]:not([data-closed="false"])) {
27
+ @slot;
28
+ }
29
+ }
30
+ @custom-variant data-checked {
31
+ &:where([data-state="checked"]),
32
+ &:where([data-checked]:not([data-checked="false"])) {
33
+ @slot;
34
+ }
35
+ }
36
+ @custom-variant data-unchecked {
37
+ &:where([data-state="unchecked"]),
38
+ &:where([data-unchecked]:not([data-unchecked="false"])) {
39
+ @slot;
40
+ }
41
+ }
42
+ @custom-variant data-selected {
43
+ &:where([data-selected="true"]) {
44
+ @slot;
45
+ }
46
+ }
47
+ @custom-variant data-disabled {
48
+ &:where([data-disabled="true"]),
49
+ &:where([data-disabled]:not([data-disabled="false"])) {
50
+ @slot;
51
+ }
52
+ }
53
+ @custom-variant data-active {
54
+ &:where([data-state="active"]),
55
+ &:where([data-active]:not([data-active="false"])) {
56
+ @slot;
57
+ }
58
+ }
59
+ @custom-variant data-horizontal {
60
+ &:where([data-orientation="horizontal"]) {
61
+ @slot;
62
+ }
63
+ }
64
+ @custom-variant data-vertical {
65
+ &:where([data-orientation="vertical"]) {
66
+ @slot;
67
+ }
68
+ }
69
+
70
+ /* ============================================================
71
+ Custom utilities
72
+ ============================================================ */
73
+ @utility no-scrollbar {
74
+ -ms-overflow-style: none;
75
+ scrollbar-width: none;
76
+ &::-webkit-scrollbar {
77
+ display: none;
78
+ }
79
+ }
80
+
81
+ /* ============================================================
82
+ @theme inline — maps CSS variables to Tailwind tokens
83
+ The actual values come from your theme's :root / .dark blocks
84
+ ============================================================ */
85
+ @theme inline {
86
+ --color-background: var(--background);
87
+ --color-foreground: var(--foreground);
88
+ --color-card: var(--card);
89
+ --color-card-foreground: var(--card-foreground);
90
+ --color-popover: var(--popover);
91
+ --color-popover-foreground: var(--popover-foreground);
92
+ --color-primary: var(--primary);
93
+ --color-primary-foreground: var(--primary-foreground);
94
+ --color-secondary: var(--secondary);
95
+ --color-secondary-foreground: var(--secondary-foreground);
96
+ --color-muted: var(--muted);
97
+ --color-muted-foreground: var(--muted-foreground);
98
+ --color-accent: var(--accent);
99
+ --color-accent-foreground: var(--accent-foreground);
100
+ --color-destructive: var(--destructive);
101
+ --color-destructive-foreground: var(--destructive-foreground);
102
+ --color-border: var(--border);
103
+ --color-input: var(--input);
104
+ --color-ring: var(--ring);
105
+ --color-chart-1: var(--chart-1);
106
+ --color-chart-2: var(--chart-2);
107
+ --color-chart-3: var(--chart-3);
108
+ --color-chart-4: var(--chart-4);
109
+ --color-chart-5: var(--chart-5);
110
+ --color-sidebar: var(--sidebar);
111
+ --color-sidebar-foreground: var(--sidebar-foreground);
112
+ --color-sidebar-primary: var(--sidebar-primary);
113
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
114
+ --color-sidebar-accent: var(--sidebar-accent);
115
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
116
+ --color-sidebar-border: var(--sidebar-border);
117
+ --color-sidebar-ring: var(--sidebar-ring);
118
+
119
+ --radius-sm: calc(var(--radius) * 0.6);
120
+ --radius-md: calc(var(--radius) * 0.8);
121
+ --radius-lg: var(--radius);
122
+ --radius-xl: calc(var(--radius) * 1.4);
123
+ --radius-2xl: calc(var(--radius) * 1.8);
124
+ --radius-3xl: calc(var(--radius) * 2.2);
125
+ --radius-4xl: calc(var(--radius) * 2.6);
126
+
127
+ --animate-accordion-down: accordion-down 200ms ease-out;
128
+ --animate-accordion-up: accordion-up 200ms ease-out;
129
+ --animate-collapsible-down: collapsible-down 200ms ease-out;
130
+ --animate-collapsible-up: collapsible-up 200ms ease-out;
131
+
132
+ @keyframes accordion-down {
133
+ from { height: 0; }
134
+ to { height: var(--radix-accordion-content-height, var(--accordion-panel-height, auto)); }
135
+ }
136
+ @keyframes accordion-up {
137
+ from { height: var(--radix-accordion-content-height, var(--accordion-panel-height, auto)); }
138
+ to { height: 0; }
139
+ }
140
+ @keyframes collapsible-down {
141
+ from { height: 0; }
142
+ to { height: var(--radix-collapsible-content-height, var(--collapsible-panel-height)); }
143
+ }
144
+ @keyframes collapsible-up {
145
+ from { height: var(--radix-collapsible-content-height, var(--collapsible-panel-height)); }
146
+ to { height: 0; }
147
+ }
148
+ }
149
+
150
+ /* ============================================================
151
+ Base layer
152
+ ============================================================ */
153
+ @layer base {
154
+ * {
155
+ @apply border-border outline-ring/50;
156
+ }
157
+ body {
158
+ @apply bg-background text-foreground;
159
+ }
160
+ }
@@ -0,0 +1,62 @@
1
+ /*
2
+ * shadcn theme: mauve
3
+ * Compatible with ui.shadcn.com/themes — paste any theme here to swap.
4
+ */
5
+ :root {
6
+ --radius: 0.625rem;
7
+ --background: oklch(1 0 0);
8
+ --foreground: oklch(0.153 0.014 302);
9
+ --card: oklch(1 0 0);
10
+ --card-foreground: oklch(0.153 0.014 302);
11
+ --popover: oklch(1 0 0);
12
+ --popover-foreground: oklch(0.153 0.014 302);
13
+ --primary: oklch(0.218 0.019 302);
14
+ --primary-foreground: oklch(0.985 0.003 302);
15
+ --secondary: oklch(0.968 0.005 302);
16
+ --secondary-foreground: oklch(0.218 0.019 302);
17
+ --muted: oklch(0.968 0.005 302);
18
+ --muted-foreground: oklch(0.554 0.022 302);
19
+ --accent: oklch(0.968 0.005 302);
20
+ --accent-foreground: oklch(0.218 0.019 302);
21
+ --destructive: oklch(0.577 0.245 27.325);
22
+ --border: oklch(0.921 0.008 302);
23
+ --input: oklch(0.921 0.008 302);
24
+ --ring: oklch(0.706 0.02 302);
25
+ --sidebar: oklch(0.985 0.003 302);
26
+ --sidebar-foreground: oklch(0.153 0.014 302);
27
+ --sidebar-primary: oklch(0.218 0.019 302);
28
+ --sidebar-primary-foreground: oklch(0.985 0.003 302);
29
+ --sidebar-accent: oklch(0.968 0.005 302);
30
+ --sidebar-accent-foreground: oklch(0.218 0.019 302);
31
+ --sidebar-border: oklch(0.921 0.008 302);
32
+ --sidebar-ring: oklch(0.706 0.02 302);
33
+ }
34
+
35
+ .dark {
36
+ --background: oklch(0.153 0.014 302);
37
+ --foreground: oklch(0.985 0.003 302);
38
+ --card: oklch(0.218 0.019 302);
39
+ --card-foreground: oklch(0.985 0.003 302);
40
+ --popover: oklch(0.218 0.019 302);
41
+ --popover-foreground: oklch(0.985 0.003 302);
42
+ --primary: oklch(0.921 0.008 302);
43
+ --primary-foreground: oklch(0.218 0.019 302);
44
+ --secondary: oklch(0.274 0.019 302);
45
+ --secondary-foreground: oklch(0.985 0.003 302);
46
+ --muted: oklch(0.274 0.019 302);
47
+ --muted-foreground: oklch(0.706 0.02 302);
48
+ --accent: oklch(0.274 0.019 302);
49
+ --accent-foreground: oklch(0.985 0.003 302);
50
+ --destructive: oklch(0.704 0.191 22.216);
51
+ --border: oklch(1 0 0 / 10%);
52
+ --input: oklch(1 0 0 / 15%);
53
+ --ring: oklch(0.554 0.022 302);
54
+ --sidebar: oklch(0.218 0.019 302);
55
+ --sidebar-foreground: oklch(0.985 0.003 302);
56
+ --sidebar-primary: oklch(0.488 0.243 264.376);
57
+ --sidebar-primary-foreground: oklch(0.985 0 0);
58
+ --sidebar-accent: oklch(0.274 0.019 302);
59
+ --sidebar-accent-foreground: oklch(0.985 0.003 302);
60
+ --sidebar-border: oklch(1 0 0 / 10%);
61
+ --sidebar-ring: oklch(0.554 0.022 302);
62
+ }
@@ -0,0 +1,62 @@
1
+ /*
2
+ * shadcn theme: mist
3
+ * Compatible with ui.shadcn.com/themes — paste any theme here to swap.
4
+ */
5
+ :root {
6
+ --radius: 0.625rem;
7
+ --background: oklch(1 0 0);
8
+ --foreground: oklch(0.15 0.01 230);
9
+ --card: oklch(1 0 0);
10
+ --card-foreground: oklch(0.15 0.01 230);
11
+ --popover: oklch(1 0 0);
12
+ --popover-foreground: oklch(0.15 0.01 230);
13
+ --primary: oklch(0.215 0.015 230);
14
+ --primary-foreground: oklch(0.985 0.002 230);
15
+ --secondary: oklch(0.968 0.004 230);
16
+ --secondary-foreground: oklch(0.215 0.015 230);
17
+ --muted: oklch(0.968 0.004 230);
18
+ --muted-foreground: oklch(0.555 0.018 230);
19
+ --accent: oklch(0.968 0.004 230);
20
+ --accent-foreground: oklch(0.215 0.015 230);
21
+ --destructive: oklch(0.577 0.245 27.325);
22
+ --border: oklch(0.922 0.006 230);
23
+ --input: oklch(0.922 0.006 230);
24
+ --ring: oklch(0.707 0.016 230);
25
+ --sidebar: oklch(0.985 0.002 230);
26
+ --sidebar-foreground: oklch(0.15 0.01 230);
27
+ --sidebar-primary: oklch(0.215 0.015 230);
28
+ --sidebar-primary-foreground: oklch(0.985 0.002 230);
29
+ --sidebar-accent: oklch(0.968 0.004 230);
30
+ --sidebar-accent-foreground: oklch(0.215 0.015 230);
31
+ --sidebar-border: oklch(0.922 0.006 230);
32
+ --sidebar-ring: oklch(0.707 0.016 230);
33
+ }
34
+
35
+ .dark {
36
+ --background: oklch(0.15 0.01 230);
37
+ --foreground: oklch(0.985 0.002 230);
38
+ --card: oklch(0.215 0.015 230);
39
+ --card-foreground: oklch(0.985 0.002 230);
40
+ --popover: oklch(0.215 0.015 230);
41
+ --popover-foreground: oklch(0.985 0.002 230);
42
+ --primary: oklch(0.922 0.006 230);
43
+ --primary-foreground: oklch(0.215 0.015 230);
44
+ --secondary: oklch(0.272 0.015 230);
45
+ --secondary-foreground: oklch(0.985 0.002 230);
46
+ --muted: oklch(0.272 0.015 230);
47
+ --muted-foreground: oklch(0.707 0.016 230);
48
+ --accent: oklch(0.272 0.015 230);
49
+ --accent-foreground: oklch(0.985 0.002 230);
50
+ --destructive: oklch(0.704 0.191 22.216);
51
+ --border: oklch(1 0 0 / 10%);
52
+ --input: oklch(1 0 0 / 15%);
53
+ --ring: oklch(0.555 0.018 230);
54
+ --sidebar: oklch(0.215 0.015 230);
55
+ --sidebar-foreground: oklch(0.985 0.002 230);
56
+ --sidebar-primary: oklch(0.488 0.243 264.376);
57
+ --sidebar-primary-foreground: oklch(0.985 0 0);
58
+ --sidebar-accent: oklch(0.272 0.015 230);
59
+ --sidebar-accent-foreground: oklch(0.985 0.002 230);
60
+ --sidebar-border: oklch(1 0 0 / 10%);
61
+ --sidebar-ring: oklch(0.555 0.018 230);
62
+ }
@@ -0,0 +1,74 @@
1
+ /*
2
+ * shadcn theme: neutral (default)
3
+ * Compatible with ui.shadcn.com/themes — paste any theme here to swap.
4
+ */
5
+ :root {
6
+ --radius: 0.625rem;
7
+ --background: oklch(1 0 0);
8
+ --foreground: oklch(0.145 0 0);
9
+ --card: oklch(1 0 0);
10
+ --card-foreground: oklch(0.145 0 0);
11
+ --popover: oklch(1 0 0);
12
+ --popover-foreground: oklch(0.145 0 0);
13
+ --primary: oklch(0.205 0 0);
14
+ --primary-foreground: oklch(0.985 0 0);
15
+ --secondary: oklch(0.97 0 0);
16
+ --secondary-foreground: oklch(0.205 0 0);
17
+ --muted: oklch(0.97 0 0);
18
+ --muted-foreground: oklch(0.556 0 0);
19
+ --accent: oklch(0.97 0 0);
20
+ --accent-foreground: oklch(0.205 0 0);
21
+ --destructive: oklch(0.577 0.245 27.325);
22
+ --destructive-foreground: oklch(0.985 0 0);
23
+ --border: oklch(0.922 0 0);
24
+ --input: oklch(0.922 0 0);
25
+ --ring: oklch(0.708 0 0);
26
+ --chart-1: oklch(0.646 0.222 41.116);
27
+ --chart-2: oklch(0.6 0.118 184.704);
28
+ --chart-3: oklch(0.398 0.07 227.392);
29
+ --chart-4: oklch(0.828 0.189 84.429);
30
+ --chart-5: oklch(0.769 0.188 70.08);
31
+ --sidebar: oklch(0.985 0 0);
32
+ --sidebar-foreground: oklch(0.145 0 0);
33
+ --sidebar-primary: oklch(0.205 0 0);
34
+ --sidebar-primary-foreground: oklch(0.985 0 0);
35
+ --sidebar-accent: oklch(0.97 0 0);
36
+ --sidebar-accent-foreground: oklch(0.205 0 0);
37
+ --sidebar-border: oklch(0.922 0 0);
38
+ --sidebar-ring: oklch(0.708 0 0);
39
+ }
40
+
41
+ .dark {
42
+ --background: oklch(0.145 0 0);
43
+ --foreground: oklch(0.985 0 0);
44
+ --card: oklch(0.205 0 0);
45
+ --card-foreground: oklch(0.985 0 0);
46
+ --popover: oklch(0.205 0 0);
47
+ --popover-foreground: oklch(0.985 0 0);
48
+ --primary: oklch(0.922 0 0);
49
+ --primary-foreground: oklch(0.205 0 0);
50
+ --secondary: oklch(0.269 0 0);
51
+ --secondary-foreground: oklch(0.985 0 0);
52
+ --muted: oklch(0.269 0 0);
53
+ --muted-foreground: oklch(0.708 0 0);
54
+ --accent: oklch(0.269 0 0);
55
+ --accent-foreground: oklch(0.985 0 0);
56
+ --destructive: oklch(0.704 0.191 22.216);
57
+ --destructive-foreground: oklch(0.985 0 0);
58
+ --border: oklch(1 0 0 / 10%);
59
+ --input: oklch(1 0 0 / 15%);
60
+ --ring: oklch(0.556 0 0);
61
+ --chart-1: oklch(0.488 0.243 264.376);
62
+ --chart-2: oklch(0.696 0.17 162.48);
63
+ --chart-3: oklch(0.769 0.188 70.08);
64
+ --chart-4: oklch(0.627 0.265 303.9);
65
+ --chart-5: oklch(0.645 0.246 16.439);
66
+ --sidebar: oklch(0.205 0 0);
67
+ --sidebar-foreground: oklch(0.985 0 0);
68
+ --sidebar-primary: oklch(0.488 0.243 264.376);
69
+ --sidebar-primary-foreground: oklch(0.985 0 0);
70
+ --sidebar-accent: oklch(0.269 0 0);
71
+ --sidebar-accent-foreground: oklch(0.985 0 0);
72
+ --sidebar-border: oklch(1 0 0 / 10%);
73
+ --sidebar-ring: oklch(0.556 0 0);
74
+ }
@@ -0,0 +1,62 @@
1
+ /*
2
+ * shadcn theme: olive
3
+ * Compatible with ui.shadcn.com/themes — paste any theme here to swap.
4
+ */
5
+ :root {
6
+ --radius: 0.625rem;
7
+ --background: oklch(1 0 0);
8
+ --foreground: oklch(0.155 0.014 155);
9
+ --card: oklch(1 0 0);
10
+ --card-foreground: oklch(0.155 0.014 155);
11
+ --popover: oklch(1 0 0);
12
+ --popover-foreground: oklch(0.155 0.014 155);
13
+ --primary: oklch(0.22 0.018 155);
14
+ --primary-foreground: oklch(0.985 0.003 155);
15
+ --secondary: oklch(0.968 0.005 155);
16
+ --secondary-foreground: oklch(0.22 0.018 155);
17
+ --muted: oklch(0.968 0.005 155);
18
+ --muted-foreground: oklch(0.556 0.02 155);
19
+ --accent: oklch(0.968 0.005 155);
20
+ --accent-foreground: oklch(0.22 0.018 155);
21
+ --destructive: oklch(0.577 0.245 27.325);
22
+ --border: oklch(0.923 0.008 155);
23
+ --input: oklch(0.923 0.008 155);
24
+ --ring: oklch(0.708 0.018 155);
25
+ --sidebar: oklch(0.985 0.003 155);
26
+ --sidebar-foreground: oklch(0.155 0.014 155);
27
+ --sidebar-primary: oklch(0.22 0.018 155);
28
+ --sidebar-primary-foreground: oklch(0.985 0.003 155);
29
+ --sidebar-accent: oklch(0.968 0.005 155);
30
+ --sidebar-accent-foreground: oklch(0.22 0.018 155);
31
+ --sidebar-border: oklch(0.923 0.008 155);
32
+ --sidebar-ring: oklch(0.708 0.018 155);
33
+ }
34
+
35
+ .dark {
36
+ --background: oklch(0.155 0.014 155);
37
+ --foreground: oklch(0.985 0.003 155);
38
+ --card: oklch(0.22 0.018 155);
39
+ --card-foreground: oklch(0.985 0.003 155);
40
+ --popover: oklch(0.22 0.018 155);
41
+ --popover-foreground: oklch(0.985 0.003 155);
42
+ --primary: oklch(0.923 0.008 155);
43
+ --primary-foreground: oklch(0.22 0.018 155);
44
+ --secondary: oklch(0.276 0.018 155);
45
+ --secondary-foreground: oklch(0.985 0.003 155);
46
+ --muted: oklch(0.276 0.018 155);
47
+ --muted-foreground: oklch(0.708 0.018 155);
48
+ --accent: oklch(0.276 0.018 155);
49
+ --accent-foreground: oklch(0.985 0.003 155);
50
+ --destructive: oklch(0.704 0.191 22.216);
51
+ --border: oklch(1 0 0 / 10%);
52
+ --input: oklch(1 0 0 / 15%);
53
+ --ring: oklch(0.556 0.02 155);
54
+ --sidebar: oklch(0.22 0.018 155);
55
+ --sidebar-foreground: oklch(0.985 0.003 155);
56
+ --sidebar-primary: oklch(0.488 0.243 264.376);
57
+ --sidebar-primary-foreground: oklch(0.985 0 0);
58
+ --sidebar-accent: oklch(0.276 0.018 155);
59
+ --sidebar-accent-foreground: oklch(0.985 0.003 155);
60
+ --sidebar-border: oklch(1 0 0 / 10%);
61
+ --sidebar-ring: oklch(0.556 0.02 155);
62
+ }