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.
- checksums.yaml +7 -0
- data/README.md +195 -0
- data/app.css +20 -0
- data/css/shadcn-source.css +3 -0
- data/css/shadcn-tailwind.css +160 -0
- data/css/themes/mauve.css +62 -0
- data/css/themes/mist.css +62 -0
- data/css/themes/neutral.css +74 -0
- data/css/themes/olive.css +62 -0
- data/css/themes/stone.css +62 -0
- data/css/themes/taupe.css +62 -0
- data/css/themes/zinc.css +62 -0
- data/js/controllers/accordion_controller.js +135 -0
- data/js/controllers/checkbox_controller.js +52 -0
- data/js/controllers/collapsible_controller.js +85 -0
- data/js/controllers/combobox_controller.js +168 -0
- data/js/controllers/command_controller.js +171 -0
- data/js/controllers/context_menu_controller.js +132 -0
- data/js/controllers/dark_mode_controller.js +106 -0
- data/js/controllers/dialog_controller.js +205 -0
- data/js/controllers/drawer_controller.js +161 -0
- data/js/controllers/dropdown_menu_controller.js +189 -0
- data/js/controllers/hover_card_controller.js +85 -0
- data/js/controllers/index.js +89 -0
- data/js/controllers/menubar_controller.js +171 -0
- data/js/controllers/navigation_menu_controller.js +160 -0
- data/js/controllers/popover_controller.js +151 -0
- data/js/controllers/radio_group_controller.js +78 -0
- data/js/controllers/scroll_area_controller.js +117 -0
- data/js/controllers/select_controller.js +198 -0
- data/js/controllers/sheet_controller.js +130 -0
- data/js/controllers/slider_controller.js +142 -0
- data/js/controllers/switch_controller.js +40 -0
- data/js/controllers/tabs_controller.js +96 -0
- data/js/controllers/toast_controller.js +206 -0
- data/js/controllers/toggle_controller.js +30 -0
- data/js/controllers/toggle_group_controller.js +73 -0
- data/js/controllers/tooltip_controller.js +146 -0
- data/lib/generators/shadcn_phlex/component_generator.rb +79 -0
- data/lib/generators/shadcn_phlex/install_generator.rb +217 -0
- data/lib/shadcn/base.rb +27 -0
- data/lib/shadcn/engine.rb +24 -0
- data/lib/shadcn/kit.rb +1158 -0
- data/lib/shadcn/themes/accent_colors.rb +106 -0
- data/lib/shadcn/themes/base_colors.rb +313 -0
- data/lib/shadcn/ui/accordion.rb +135 -0
- data/lib/shadcn/ui/alert.rb +79 -0
- data/lib/shadcn/ui/alert_dialog.rb +220 -0
- data/lib/shadcn/ui/aspect_ratio.rb +35 -0
- data/lib/shadcn/ui/avatar.rb +134 -0
- data/lib/shadcn/ui/badge.rb +48 -0
- data/lib/shadcn/ui/breadcrumb.rb +180 -0
- data/lib/shadcn/ui/button.rb +63 -0
- data/lib/shadcn/ui/button_group.rb +58 -0
- data/lib/shadcn/ui/card.rb +133 -0
- data/lib/shadcn/ui/checkbox.rb +72 -0
- data/lib/shadcn/ui/collapsible.rb +76 -0
- data/lib/shadcn/ui/combobox.rb +229 -0
- data/lib/shadcn/ui/command.rb +256 -0
- data/lib/shadcn/ui/context_menu.rb +319 -0
- data/lib/shadcn/ui/dialog.rb +226 -0
- data/lib/shadcn/ui/direction.rb +23 -0
- data/lib/shadcn/ui/drawer.rb +217 -0
- data/lib/shadcn/ui/dropdown_menu.rb +384 -0
- data/lib/shadcn/ui/empty.rb +97 -0
- data/lib/shadcn/ui/field.rb +126 -0
- data/lib/shadcn/ui/hover_card.rb +75 -0
- data/lib/shadcn/ui/input.rb +36 -0
- data/lib/shadcn/ui/input_group.rb +32 -0
- data/lib/shadcn/ui/input_otp.rb +112 -0
- data/lib/shadcn/ui/item.rb +115 -0
- data/lib/shadcn/ui/kbd.rb +45 -0
- data/lib/shadcn/ui/label.rb +28 -0
- data/lib/shadcn/ui/menubar.rb +345 -0
- data/lib/shadcn/ui/native_select.rb +31 -0
- data/lib/shadcn/ui/navigation_menu.rb +238 -0
- data/lib/shadcn/ui/pagination.rb +224 -0
- data/lib/shadcn/ui/popover.rb +147 -0
- data/lib/shadcn/ui/progress.rb +40 -0
- data/lib/shadcn/ui/radio_group.rb +92 -0
- data/lib/shadcn/ui/resizable.rb +108 -0
- data/lib/shadcn/ui/scroll_area.rb +75 -0
- data/lib/shadcn/ui/select.rb +235 -0
- data/lib/shadcn/ui/separator.rb +36 -0
- data/lib/shadcn/ui/sheet.rb +231 -0
- data/lib/shadcn/ui/sidebar.rb +420 -0
- data/lib/shadcn/ui/skeleton.rb +23 -0
- data/lib/shadcn/ui/slider.rb +72 -0
- data/lib/shadcn/ui/sonner.rb +177 -0
- data/lib/shadcn/ui/spinner.rb +58 -0
- data/lib/shadcn/ui/switch.rb +75 -0
- data/lib/shadcn/ui/table.rb +154 -0
- data/lib/shadcn/ui/tabs.rb +154 -0
- data/lib/shadcn/ui/text_field.rb +146 -0
- data/lib/shadcn/ui/textarea.rb +32 -0
- data/lib/shadcn/ui/theme_toggle.rb +74 -0
- data/lib/shadcn/ui/toggle.rb +66 -0
- data/lib/shadcn/ui/toggle_group.rb +75 -0
- data/lib/shadcn/ui/tooltip.rb +78 -0
- data/lib/shadcn/ui/typography.rb +217 -0
- data/lib/shadcn/version.rb +5 -0
- data/lib/shadcn-phlex.rb +6 -0
- data/lib/shadcn.rb +80 -0
- data/package.json +14 -0
- data/skills/shadcn-phlex/SKILL.md +190 -0
- data/skills/shadcn-phlex/evals/evals.json +90 -0
- data/skills/shadcn-phlex/references/component-catalog.md +355 -0
- data/skills/shadcn-phlex/rules/composition.md +235 -0
- data/skills/shadcn-phlex/rules/forms.md +151 -0
- data/skills/shadcn-phlex/rules/helpers.md +54 -0
- data/skills/shadcn-phlex/rules/stimulus.md +61 -0
- data/skills/shadcn-phlex/rules/styling.md +177 -0
- 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,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
|
+
}
|
data/css/themes/mist.css
ADDED
|
@@ -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
|
+
}
|