aeno 0.0.3

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 (140) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +230 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/stylesheets/aeno/application.css +1 -0
  6. data/app/assets/stylesheets/aeno/base.css +43 -0
  7. data/app/assets/stylesheets/aeno/reset.css +397 -0
  8. data/app/assets/stylesheets/aeno/source.css +15 -0
  9. data/app/assets/stylesheets/aeno/theme.css +6 -0
  10. data/app/assets/stylesheets/aeno/themes/slate.css +163 -0
  11. data/app/assets/stylesheets/aeno/themes/zinc.css +163 -0
  12. data/app/assets/stylesheets/aeno/utilities.css +23 -0
  13. data/app/components/aeno/application_view_component.rb +219 -0
  14. data/app/components/aeno/blocks/component_preview/component.html.erb +7 -0
  15. data/app/components/aeno/blocks/component_preview/component.rb +10 -0
  16. data/app/components/aeno/blocks/component_preview/styles.css +10 -0
  17. data/app/components/aeno/form_builder.rb +87 -0
  18. data/app/components/aeno/pages/showcase/index/component.html.erb +53 -0
  19. data/app/components/aeno/pages/showcase/index/component.rb +7 -0
  20. data/app/components/aeno/pages/showcase/index/styles.css +27 -0
  21. data/app/components/aeno/pages/showcase/placeholder/component.html.erb +7 -0
  22. data/app/components/aeno/pages/showcase/placeholder/component.rb +10 -0
  23. data/app/components/aeno/pages/showcase/show/component.html.erb +38 -0
  24. data/app/components/aeno/pages/showcase/show/component.rb +48 -0
  25. data/app/components/aeno/primitives/button/component.rb +66 -0
  26. data/app/components/aeno/primitives/button/controller.js +7 -0
  27. data/app/components/aeno/primitives/button/styles.css +153 -0
  28. data/app/components/aeno/primitives/card/component.html.erb +3 -0
  29. data/app/components/aeno/primitives/card/component.rb +42 -0
  30. data/app/components/aeno/primitives/card/styles.css +28 -0
  31. data/app/components/aeno/primitives/conversation/component.html.erb +28 -0
  32. data/app/components/aeno/primitives/conversation/component.rb +15 -0
  33. data/app/components/aeno/primitives/conversation/controller.js +18 -0
  34. data/app/components/aeno/primitives/conversation/message/component.html.erb +24 -0
  35. data/app/components/aeno/primitives/conversation/message/component.rb +35 -0
  36. data/app/components/aeno/primitives/conversation/streaming_indicator/component.html.erb +21 -0
  37. data/app/components/aeno/primitives/conversation/streaming_indicator/component.rb +18 -0
  38. data/app/components/aeno/primitives/conversation/styles.css +221 -0
  39. data/app/components/aeno/primitives/conversation/user_message_box/component.html.erb +1 -0
  40. data/app/components/aeno/primitives/conversation/user_message_box/component.rb +4 -0
  41. data/app/components/aeno/primitives/drawer/component.html.erb +43 -0
  42. data/app/components/aeno/primitives/drawer/component.rb +33 -0
  43. data/app/components/aeno/primitives/drawer/controller.js +104 -0
  44. data/app/components/aeno/primitives/drawer/styles.css +90 -0
  45. data/app/components/aeno/primitives/dropdown/checkbox.rb +22 -0
  46. data/app/components/aeno/primitives/dropdown/component.html.erb +38 -0
  47. data/app/components/aeno/primitives/dropdown/component.rb +53 -0
  48. data/app/components/aeno/primitives/dropdown/controller.js +153 -0
  49. data/app/components/aeno/primitives/dropdown/item.rb +29 -0
  50. data/app/components/aeno/primitives/dropdown/label.rb +7 -0
  51. data/app/components/aeno/primitives/dropdown/radio_group.rb +16 -0
  52. data/app/components/aeno/primitives/dropdown/radio_item.rb +24 -0
  53. data/app/components/aeno/primitives/dropdown/separator.rb +7 -0
  54. data/app/components/aeno/primitives/dropdown/styles.css +155 -0
  55. data/app/components/aeno/primitives/empty/component.html.erb +15 -0
  56. data/app/components/aeno/primitives/empty/component.rb +18 -0
  57. data/app/components/aeno/primitives/empty/styles.css +40 -0
  58. data/app/components/aeno/primitives/input_attachments/component.html.erb +60 -0
  59. data/app/components/aeno/primitives/input_attachments/component.rb +52 -0
  60. data/app/components/aeno/primitives/input_attachments/controller.js +357 -0
  61. data/app/components/aeno/primitives/input_attachments/styles.css +102 -0
  62. data/app/components/aeno/primitives/input_color/component.html.erb +24 -0
  63. data/app/components/aeno/primitives/input_color/component.rb +42 -0
  64. data/app/components/aeno/primitives/input_color/styles.css +64 -0
  65. data/app/components/aeno/primitives/input_password/component.html.erb +43 -0
  66. data/app/components/aeno/primitives/input_password/component.rb +20 -0
  67. data/app/components/aeno/primitives/input_password/controller.js +17 -0
  68. data/app/components/aeno/primitives/input_password/styles.css +61 -0
  69. data/app/components/aeno/primitives/input_select/component.html.erb +43 -0
  70. data/app/components/aeno/primitives/input_select/component.rb +21 -0
  71. data/app/components/aeno/primitives/input_select/option.rb +14 -0
  72. data/app/components/aeno/primitives/input_select/styles.css +30 -0
  73. data/app/components/aeno/primitives/input_slider/component.html.erb +33 -0
  74. data/app/components/aeno/primitives/input_slider/component.rb +35 -0
  75. data/app/components/aeno/primitives/input_slider/styles.css +74 -0
  76. data/app/components/aeno/primitives/input_tagging/component.html.erb +73 -0
  77. data/app/components/aeno/primitives/input_tagging/component.rb +40 -0
  78. data/app/components/aeno/primitives/input_tagging/controller.js +326 -0
  79. data/app/components/aeno/primitives/input_tagging/styles.css +148 -0
  80. data/app/components/aeno/primitives/input_text/component.html.erb +25 -0
  81. data/app/components/aeno/primitives/input_text/component.rb +20 -0
  82. data/app/components/aeno/primitives/input_text/styles.css +38 -0
  83. data/app/components/aeno/primitives/input_text_area/component.html.erb +23 -0
  84. data/app/components/aeno/primitives/input_text_area/component.rb +19 -0
  85. data/app/components/aeno/primitives/input_text_area/styles.css +30 -0
  86. data/app/components/aeno/primitives/input_text_area_ai/component.html.erb +51 -0
  87. data/app/components/aeno/primitives/input_text_area_ai/component.rb +47 -0
  88. data/app/components/aeno/primitives/input_text_area_ai/controller.js +198 -0
  89. data/app/components/aeno/primitives/input_text_area_ai/styles.css +91 -0
  90. data/app/components/aeno/primitives/input_wrapper/component.html.erb +20 -0
  91. data/app/components/aeno/primitives/input_wrapper/component.rb +31 -0
  92. data/app/components/aeno/primitives/input_wrapper/styles.css +72 -0
  93. data/app/components/aeno/primitives/layouts/agentic/component.html.erb +4 -0
  94. data/app/components/aeno/primitives/layouts/agentic/component.rb +9 -0
  95. data/app/components/aeno/primitives/layouts/agentic/styles.css +23 -0
  96. data/app/components/aeno/primitives/layouts/app/aside.rb +9 -0
  97. data/app/components/aeno/primitives/layouts/app/component.html.erb +14 -0
  98. data/app/components/aeno/primitives/layouts/app/component.rb +11 -0
  99. data/app/components/aeno/primitives/layouts/app/sidebar.rb +9 -0
  100. data/app/components/aeno/primitives/layouts/app/styles.css +46 -0
  101. data/app/components/aeno/primitives/page/component.html.erb +24 -0
  102. data/app/components/aeno/primitives/page/component.rb +23 -0
  103. data/app/components/aeno/primitives/page/styles.css +55 -0
  104. data/app/components/aeno/primitives/sidebar/component.html.erb +25 -0
  105. data/app/components/aeno/primitives/sidebar/component.rb +14 -0
  106. data/app/components/aeno/primitives/sidebar/footer.rb +7 -0
  107. data/app/components/aeno/primitives/sidebar/group.rb +18 -0
  108. data/app/components/aeno/primitives/sidebar/header.rb +7 -0
  109. data/app/components/aeno/primitives/sidebar/item.rb +19 -0
  110. data/app/components/aeno/primitives/sidebar/styles.css +95 -0
  111. data/app/components/aeno/primitives/spinner/component.rb +36 -0
  112. data/app/components/aeno/primitives/spinner/styles.css +81 -0
  113. data/app/components/aeno/primitives/table/cell.rb +7 -0
  114. data/app/components/aeno/primitives/table/column.rb +7 -0
  115. data/app/components/aeno/primitives/table/component.html.erb +8 -0
  116. data/app/components/aeno/primitives/table/component.rb +14 -0
  117. data/app/components/aeno/primitives/table/header.rb +13 -0
  118. data/app/components/aeno/primitives/table/row.rb +11 -0
  119. data/app/components/aeno/primitives/table/styles.css +39 -0
  120. data/app/controllers/aeno/application_controller.rb +15 -0
  121. data/app/controllers/aeno/showcase_controller.rb +40 -0
  122. data/app/controllers/aeno/theme_controller.rb +10 -0
  123. data/app/helpers/aeno/application_helper.rb +28 -0
  124. data/app/javascript/aeno/application.js +3 -0
  125. data/app/javascript/aeno/controllers/application.js +5 -0
  126. data/app/javascript/aeno/controllers/index.js +5 -0
  127. data/app/javascript/aeno/controllers/loader.js +62 -0
  128. data/app/jobs/aeno/application_job.rb +4 -0
  129. data/app/models/aeno/application_record.rb +5 -0
  130. data/app/views/layouts/aeno/application.html.erb +55 -0
  131. data/config/importmap.rb +20 -0
  132. data/config/routes.rb +5 -0
  133. data/lib/aeno/configuration.rb +56 -0
  134. data/lib/aeno/engine.rb +43 -0
  135. data/lib/aeno/engine_helpers.rb +44 -0
  136. data/lib/aeno/theme.rb +326 -0
  137. data/lib/aeno/version.rb +3 -0
  138. data/lib/aeno.rb +11 -0
  139. data/lib/tasks/aeno_tasks.rake +39 -0
  140. metadata +310 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 15afc06d6d270ec022d6a5419c8d2763b09e995f9e506d49b1bf1242c4e1cb98
4
+ data.tar.gz: 9402473593a1890032a6fc681633031c2220773542160e5616166a7f635fdfc7
5
+ SHA512:
6
+ metadata.gz: 6479ee70be9688bc211cd1fee62e8198b1982e9e890d7de24c22891bbd81bb64ebfa74e2876c28763b1b3b1536702cc26580dcedc0e27514f74910ecf2b3ed2b
7
+ data.tar.gz: 60e3bac326296984a6c7affa887f1502fe727146e2a25c263ae07b58a16c1c1c20e1f949e9eb0d6262adf6e68cf3cb6cde868b92aee79760c4a0413e1bb88b7f
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright Ben
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,230 @@
1
+ # Aeno - Rails Engine UI Component Library
2
+
3
+ A Rails engine providing reusable UI components with Tailwind CSS styling and Stimulus controllers. Built with ViewComponent and designed for easy integration into Rails engines.
4
+
5
+ ## Components Library
6
+
7
+ The Aeno gem provides the following components:
8
+
9
+ ### Form Components
10
+ - **`Button`** - Styled button with variants (default, white, light, outline) and sizes (xsmall, small, large)
11
+ - **`InputText`** - Text input field with wrapper and label support
12
+ - **`InputPassword`** - Password input with show/hide toggle functionality
13
+ - **`InputSelect`** - Styled select dropdown
14
+ - **`InputWrapper`** - Wrapper component for form inputs with labels
15
+
16
+ ### Layout Components
17
+ - **`Page`** - Page container component
18
+ - **`Card`** - Card container with styling
19
+ - **`Table`** - Styled table component
20
+ - **`Dropdown`** - Interactive dropdown menu with Stimulus controller
21
+ - **`Empty`** - Empty state component
22
+ - **`Spinner`** - Loading spinner with size and variant options
23
+
24
+ ### Usage in Views
25
+
26
+ ```erb
27
+ <%= ui("button", label: "Click me", variant: :default) %>
28
+ <%= ui("input_text", name: "email", label: "Email") %>
29
+ <%= ui("input_password", name: "password", label: "Password") %>
30
+ <%= ui("card") do %>
31
+ <h2>Card content</h2>
32
+ <% end %>
33
+ ```
34
+
35
+ ## Installation
36
+
37
+ Add this line to your engine's Gemfile:
38
+
39
+ ```ruby
40
+ gem "aeno", path: "../ui" # or from a gem server
41
+ ```
42
+
43
+ And then execute:
44
+ ```bash
45
+ $ bundle
46
+ ```
47
+
48
+ ## Integration with Rails Engines
49
+
50
+ The Aeno gem provides convenience helpers to quickly integrate it into your Rails engine.
51
+
52
+ ### 1. Engine Setup
53
+
54
+ In your `lib/your_engine/engine.rb`:
55
+
56
+ ```ruby
57
+ require "aeno"
58
+
59
+ module YourEngine
60
+ class << self
61
+ attr_accessor :importmap
62
+ end
63
+
64
+ class Engine < ::Rails::Engine
65
+ isolate_namespace YourEngine
66
+
67
+ # Setup assets and importmap with Aeno gem integration
68
+ Aeno::EngineHelpers.setup_assets(self, namespace: YourEngine)
69
+ Aeno::EngineHelpers.setup_importmap(self, namespace: YourEngine)
70
+ end
71
+ end
72
+ ```
73
+
74
+ **What this does:**
75
+ - Configures asset paths for your engine and the Aeno gem
76
+ - Sets up importmap that automatically includes Aeno gem's JavaScript and components
77
+ - Configures cache sweepers for development hot-reloading
78
+
79
+ ### 2. ApplicationViewComponent
80
+
81
+ Create `app/components/your_engine/application_view_component.rb`:
82
+
83
+ ```ruby
84
+ module YourEngine
85
+ class ApplicationViewComponent < Aeno::ApplicationViewComponent
86
+ def controller_name
87
+ # Override to use your engine's namespace for Stimulus controllers
88
+ name = self.class.name
89
+ .sub(/^YourEngine::/, "")
90
+ .sub(/::Component$/, "")
91
+ .underscore
92
+
93
+ "your-engine--#{name.gsub('/', '--').gsub('_', '-')}"
94
+ end
95
+ end
96
+ end
97
+ ```
98
+
99
+ **What this provides:**
100
+ - All Aeno gem helper methods (stimulus_controller, stimulus_target, etc.)
101
+ - TailwindMerge integration for CSS class merging
102
+ - Style variants support via ViewComponentContrib
103
+ - Dry::Initializer for clean option definitions
104
+
105
+ ### 3. Controller Loading
106
+
107
+ In `app/javascript/your_engine/controllers/index.js`:
108
+
109
+ ```javascript
110
+ import { application } from "your_engine/controllers/application";
111
+ import { eagerLoadEngineControllersFrom } from "aeno/controllers/loader";
112
+
113
+ // Load your engine's controllers
114
+ eagerLoadEngineControllersFrom("your_engine/controllers", application);
115
+ eagerLoadEngineControllersFrom("your_engine/components", application);
116
+
117
+ // Load Aeno gem component controllers
118
+ eagerLoadEngineControllersFrom("aeno/components", application);
119
+ ```
120
+
121
+ **What this does:**
122
+ - Uses the shared controller loader from Aeno gem
123
+ - Automatically registers Stimulus controllers with correct naming conventions
124
+ - Supports multiple namespaces (your engine + Aeno gem)
125
+
126
+ ### 4. Layout Integration
127
+
128
+ In `app/views/layouts/your_engine/application.html.erb`:
129
+
130
+ ```erb
131
+ <!DOCTYPE html>
132
+ <html>
133
+ <head>
134
+ <%= csrf_meta_tags %>
135
+ <%= csp_meta_tag %>
136
+
137
+ <!-- Include Aeno gem stylesheets -->
138
+ <%= stylesheet_link_tag "aeno/application", media: "all" %>
139
+ <%= stylesheet_link_tag "aeno/tailwind", media: "all" %>
140
+
141
+ <!-- Your engine's stylesheets -->
142
+ <%= stylesheet_link_tag "your_engine/application", media: "all" %>
143
+ <%= stylesheet_link_tag "your_engine/tailwind", media: "all" %>
144
+
145
+ <!-- Importmap with Aeno gem integration -->
146
+ <%= javascript_importmap_tags "your_engine/application", importmap: YourEngine.importmap %>
147
+ </head>
148
+ <body>
149
+ <%= yield %>
150
+ </body>
151
+ </html>
152
+ ```
153
+
154
+ ### 5. Importmap Configuration
155
+
156
+ In `config/importmap.rb`:
157
+
158
+ ```ruby
159
+ pin "@hotwired/turbo-rails", to: "turbo.min.js"
160
+ pin "your_engine/application"
161
+ pin "@hotwired/stimulus", to: "stimulus.min.js"
162
+ pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"
163
+
164
+ pin_all_from(
165
+ YourEngine::Engine.root.join("app/javascript/your_engine/controllers"),
166
+ under: "your_engine/controllers",
167
+ )
168
+
169
+ pin_all_from(
170
+ YourEngine::Engine.root.join("app/components/your_engine"),
171
+ under: "your_engine/components",
172
+ to: "your_engine"
173
+ )
174
+ ```
175
+
176
+ **Note:** Aeno gem's importmap is automatically included via `Aeno::EngineHelpers.setup_importmap`
177
+
178
+ ## Convenience Utilities
179
+
180
+ ### Ruby Helpers
181
+
182
+ #### `Aeno::EngineHelpers.setup_assets(engine_class, namespace:)`
183
+ Sets up asset paths for your engine with Propshaft/Sprockets support.
184
+
185
+ #### `Aeno::EngineHelpers.setup_importmap(engine_class, namespace:)`
186
+ Configures importmap with:
187
+ - Your engine's importmap
188
+ - Aeno gem's importmap (automatic)
189
+ - Cache sweepers for development
190
+ - Controller action integration
191
+
192
+ ### JavaScript Utilities
193
+
194
+ #### `eagerLoadEngineControllersFrom(under, application)`
195
+ Intelligent Stimulus controller loader for Rails engines that:
196
+ - Parses importmap to find controllers
197
+ - Registers with correct naming conventions (e.g., `aeno--button`, `your-engine--views--index`)
198
+ - Handles both `controller.js` and `*_controller.js` naming
199
+ - Supports multiple namespaces
200
+
201
+ ## Development
202
+
203
+ ### Running the Demo App
204
+
205
+ ```bash
206
+ cd ui
207
+ bin/rails server
208
+ ```
209
+
210
+ ### Watching Tailwind CSS
211
+
212
+ ```bash
213
+ bundle exec rake app:aeno:tailwind_engine_watch
214
+ ```
215
+
216
+ ## Dependencies
217
+
218
+ - Rails >= 8.0.3
219
+ - importmap-rails ~> 2.2.2
220
+ - turbo-rails ~> 2.0
221
+ - stimulus-rails ~> 1.3
222
+ - tailwindcss-rails ~> 4.3.0
223
+ - view_component ~> 4.0
224
+ - view_component-contrib ~> 0.2.5
225
+ - dry-effects ~> 0.5.0
226
+ - tailwind_merge ~> 1.3
227
+
228
+ ## License
229
+
230
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ @layer aeno-reset, aeno-base, aeno-theme, aeno-components, aeno-config;@import url("https://rsms.me/inter/inter.css") layer(aeno-reset);@layer aeno-reset{}@layer aeno-reset{*,:after,:before{border:0 solid;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:Inter,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:"liga" 1,"calt" 1;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}@supports (font-variation-settings:normal){:host,html{font-family:InterVariable,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:var(--ui-input-placeholder,#737373);opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}}@layer aeno-base{:root{--ui-spacing:1rem;--ui-radius-sm:0.25rem;--ui-radius:0.375rem;--ui-radius-md:0.5rem;--ui-radius-lg:0.75rem}html{background-color:var(--ui-background);color:var(--ui-foreground)}[data-slot=command-item],[role=menuitem],a,button,input[type=submit],option,select{cursor:pointer!important}button{text-align:left}::-webkit-scrollbar{display:none}}@layer aeno-base{.pad-1{padding:var(--ui-spacing)}.pad-2{padding:calc(var(--ui-spacing)*2)}.pad-3{padding:calc(var(--ui-spacing)*3)}.pad-4{padding:calc(var(--ui-spacing)*4)}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-muted{color:var(--ui-muted-color)}.cg-theme-toggle{bottom:1.5rem;position:fixed;right:1.5rem;z-index:50}}@layer aeno-theme{}@layer aeno-theme{[data-theme=slate]{--ui-background:#fff;--ui-foreground:#0f172a;--ui-border:#e2e8f0;--ui-destructive:#dc2626;--ui-primary:#0f172a;--ui-accent:#f1f5f9;--ui-accent-foreground:#0f172a;--ui-popover:#fff;--ui-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1);--ui-shadow-xl:0 20px 25px -5px rgba(0,0,0,.1);--ui-muted:#f1f5f9;--ui-muted-foreground:#64748b;--ui-card-bg:#fff;--ui-card-fg:#0f172a;--ui-card-border:#e2e8f0;--ui-card-radius:0.75rem;--ui-card-shadow:0 1px 2px 0 rgba(0,0,0,.05);--ui-area-bg:#f8fafc;--ui-area-fg:#0f172a;--ui-area-border:#e2e8f0;--ui-sidebar-bg:#f8fafc;--ui-sidebar-fg:#0f172a;--ui-sidebar-border:#e2e8f0;--ui-sidebar-hover:#f1f5f9;--ui-sidebar-active:#e2e8f0;--ui-button-bg:#0f172a;--ui-button-bg-hover:#1e293b;--ui-button-fg:#fff;--ui-button-border:#0f172a;--ui-button-secondary-bg:#f1f5f9;--ui-button-secondary-bg-hover:#e2e8f0;--ui-button-secondary-fg:#0f172a;--ui-button-destructive-bg:#dc2626;--ui-button-destructive-bg-hover:#b91c1c;--ui-button-destructive-fg:#fff;--ui-button-ghost-bg-hover:#f1f5f9;--ui-button-ghost-fg:#0f172a;--ui-button-outline-bg-hover:#f1f5f9;--ui-button-outline-fg:#0f172a;--ui-input-bg:#fff;--ui-input-fg:#0f172a;--ui-input-border:#e2e8f0;--ui-input-border-focus:#94a3b8;--ui-input-ring:#3b82f6;--ui-input-placeholder:#94a3b8;--ui-heading-color:#0f172a;--ui-body-color:#334155;--ui-muted-color:#64748b;--ui-link-color:#2563eb;--ui-link-hover:#1d4ed8;--ui-ring:#3b82f6;--ui-menu-bg:#fff;--ui-menu-fg:#0f172a;--ui-menu-border:#e2e8f0;--ui-menu-radius:0.375rem;--ui-menu-shadow:0 10px 15px -3px rgba(0,0,0,.1);--ui-menu-padding:0.25rem;--ui-menu-item-radius:0.25rem}[data-theme=slate][data-mode=dark]{--ui-background:#0f172a;--ui-foreground:#f8fafc;--ui-border:#334155;--ui-destructive:#dc2626;--ui-primary:#f8fafc;--ui-accent:#1e293b;--ui-accent-foreground:#f8fafc;--ui-popover:#1e293b;--ui-shadow-lg:0 10px 15px -3px rgba(0,0,0,.3);--ui-shadow-xl:0 20px 25px -5px rgba(0,0,0,.3);--ui-muted:#1e293b;--ui-muted-foreground:#94a3b8;--ui-card-bg:#1e293b;--ui-card-fg:#f8fafc;--ui-card-border:#334155;--ui-card-shadow:0 1px 2px 0 rgba(0,0,0,.3);--ui-area-bg:#1e293b;--ui-area-fg:#f8fafc;--ui-area-border:#334155;--ui-sidebar-bg:#1e293b;--ui-sidebar-fg:#f8fafc;--ui-sidebar-border:#334155;--ui-sidebar-hover:#334155;--ui-sidebar-active:#475569;--ui-button-bg:#f8fafc;--ui-button-bg-hover:#e2e8f0;--ui-button-fg:#0f172a;--ui-button-border:#f8fafc;--ui-button-secondary-bg:#334155;--ui-button-secondary-bg-hover:#475569;--ui-button-secondary-fg:#f8fafc;--ui-button-destructive-bg:#dc2626;--ui-button-destructive-bg-hover:#ef4444;--ui-button-destructive-fg:#fff;--ui-button-ghost-bg-hover:#334155;--ui-button-ghost-fg:#f8fafc;--ui-button-outline-bg-hover:#334155;--ui-button-outline-fg:#f8fafc;--ui-input-bg:#1e293b;--ui-input-fg:#f8fafc;--ui-input-border:#334155;--ui-input-border-focus:#64748b;--ui-input-ring:#3b82f6;--ui-input-placeholder:#64748b;--ui-heading-color:#f8fafc;--ui-body-color:#cbd5e1;--ui-muted-color:#94a3b8;--ui-link-color:#60a5fa;--ui-link-hover:#93c5fd;--ui-ring:#3b82f6;--ui-menu-bg:#1e293b;--ui-menu-fg:#f8fafc;--ui-menu-border:#334155;--ui-menu-radius:0.375rem;--ui-menu-shadow:0 10px 15px -3px rgba(0,0,0,.3);--ui-menu-padding:0.25rem;--ui-menu-item-radius:0.25rem}[data-theme=zinc]{--ui-background:#fff;--ui-foreground:#18181b;--ui-border:#e4e4e7;--ui-destructive:#dc2626;--ui-primary:#18181b;--ui-accent:#f4f4f5;--ui-accent-foreground:#18181b;--ui-popover:#fff;--ui-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1);--ui-shadow-xl:0 20px 25px -5px rgba(0,0,0,.1);--ui-muted:#f4f4f5;--ui-muted-foreground:#71717a;--ui-card-bg:#fff;--ui-card-fg:#18181b;--ui-card-border:#e4e4e7;--ui-card-radius:0.75rem;--ui-card-shadow:0 1px 2px 0 rgba(0,0,0,.05);--ui-area-bg:#fafafa;--ui-area-fg:#18181b;--ui-area-border:#e4e4e7;--ui-sidebar-bg:#fafafa;--ui-sidebar-fg:#18181b;--ui-sidebar-border:#e4e4e7;--ui-sidebar-hover:#f4f4f5;--ui-sidebar-active:#e4e4e7;--ui-button-bg:#18181b;--ui-button-bg-hover:#27272a;--ui-button-fg:#fff;--ui-button-border:#18181b;--ui-button-secondary-bg:#f4f4f5;--ui-button-secondary-bg-hover:#e4e4e7;--ui-button-secondary-fg:#18181b;--ui-button-destructive-bg:#dc2626;--ui-button-destructive-bg-hover:#b91c1c;--ui-button-destructive-fg:#fff;--ui-button-ghost-bg-hover:#f4f4f5;--ui-button-ghost-fg:#18181b;--ui-button-outline-bg-hover:#f4f4f5;--ui-button-outline-fg:#18181b;--ui-input-bg:#fff;--ui-input-fg:#18181b;--ui-input-border:#e4e4e7;--ui-input-border-focus:#a1a1aa;--ui-input-ring:#3b82f6;--ui-input-placeholder:#a1a1aa;--ui-heading-color:#18181b;--ui-body-color:#3f3f46;--ui-muted-color:#71717a;--ui-link-color:#2563eb;--ui-link-hover:#1d4ed8;--ui-ring:#3b82f6;--ui-menu-bg:#fff;--ui-menu-fg:#18181b;--ui-menu-border:#e4e4e7;--ui-menu-radius:0.375rem;--ui-menu-shadow:0 10px 15px -3px rgba(0,0,0,.1);--ui-menu-padding:0.25rem;--ui-menu-item-radius:0.25rem}[data-theme=zinc][data-mode=dark]{--ui-background:#09090b;--ui-foreground:#fafafa;--ui-border:#27272a;--ui-destructive:#dc2626;--ui-primary:#fafafa;--ui-accent:#27272a;--ui-accent-foreground:#fafafa;--ui-popover:#18181b;--ui-shadow-lg:0 10px 15px -3px rgba(0,0,0,.3);--ui-shadow-xl:0 20px 25px -5px rgba(0,0,0,.3);--ui-muted:#27272a;--ui-muted-foreground:#a1a1aa;--ui-card-bg:#18181b;--ui-card-fg:#fafafa;--ui-card-border:#27272a;--ui-card-shadow:0 1px 2px 0 rgba(0,0,0,.3);--ui-area-bg:#18181b;--ui-area-fg:#fafafa;--ui-area-border:#27272a;--ui-sidebar-bg:#18181b;--ui-sidebar-fg:#fafafa;--ui-sidebar-border:#27272a;--ui-sidebar-hover:#27272a;--ui-sidebar-active:#3f3f46;--ui-button-bg:#fafafa;--ui-button-bg-hover:#e4e4e7;--ui-button-fg:#18181b;--ui-button-border:#fafafa;--ui-button-secondary-bg:#27272a;--ui-button-secondary-bg-hover:#3f3f46;--ui-button-secondary-fg:#fafafa;--ui-button-destructive-bg:#dc2626;--ui-button-destructive-bg-hover:#ef4444;--ui-button-destructive-fg:#fff;--ui-button-ghost-bg-hover:#27272a;--ui-button-ghost-fg:#fafafa;--ui-button-outline-bg-hover:#27272a;--ui-button-outline-fg:#fafafa;--ui-input-bg:#18181b;--ui-input-fg:#fafafa;--ui-input-border:#27272a;--ui-input-border-focus:#52525b;--ui-input-ring:#3b82f6;--ui-input-placeholder:#52525b;--ui-heading-color:#fafafa;--ui-body-color:#d4d4d8;--ui-muted-color:#a1a1aa;--ui-link-color:#60a5fa;--ui-link-hover:#93c5fd;--ui-ring:#3b82f6;--ui-menu-bg:#18181b;--ui-menu-fg:#fafafa;--ui-menu-border:#27272a;--ui-menu-radius:0.375rem;--ui-menu-shadow:0 10px 15px -3px rgba(0,0,0,.3);--ui-menu-padding:0.25rem;--ui-menu-item-radius:0.25rem}}@layer aeno-theme{}@layer aeno-components{.cb-component-preview__title{color:var(--ui-muted-color);font-size:.875rem;font-weight:600;letter-spacing:.05em;margin-bottom:.75rem;text-transform:uppercase}.cg-showcase{display:flex;flex-direction:column;gap:1.5rem;max-width:900px}.cg-showcase h1{font-size:2rem;font-weight:700}.cg-showcase h2{color:var(--ui-muted-color);font-size:.875rem;font-weight:600;letter-spacing:.05em;margin-bottom:1rem;text-transform:uppercase}.cg-showcase__row{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem}.cp-button{align-items:center;border-radius:var(--ui-rounded-button,.375rem);cursor:pointer;display:inline-flex;font-weight:600;gap:.25rem;padding:.625rem .875rem;transition:color .15s ease,background-color .15s ease,border-color .15s ease}}@layer aeno-components{}@layer aeno-components{.cp-button:focus-visible{outline:2px solid var(--ui-ring,#3b82f6);outline-offset:2px}.cp-button>span{flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cp-button>svg{flex-shrink:0;height:1rem;width:1rem}.cp-button .spinner{display:none}.cp-button.loading{opacity:.5;pointer-events:none}.cp-button.loading .icon{display:none}.cp-button.loading .spinner{display:flex}.cp-button--default{background-color:var(--ui-button-bg,#475569);color:var(--ui-button-foreground,#fff)}.cp-button--default:hover{background-color:var(--ui-button-hover,#334155)}.cp-button--secondary{background-color:var(--ui-button-secondary-bg,#e2e8f0);color:var(--ui-button-secondary-foreground,#1e293b)}.cp-button--secondary:hover{background-color:var(--ui-button-secondary-hover,#cbd5e1)}.cp-button--destructive{background-color:var(--ui-button-destructive-bg,#ef4444);color:var(--ui-button-destructive-foreground,#fff)}.cp-button--destructive:hover{background-color:var(--ui-button-destructive-hover,#dc2626)}.cp-button--outline{background-color:var(--ui-background,#fff);border:1px solid var(--ui-button-border,#e2e8f0);color:var(--ui-button-outline-foreground,#1e293b)}.cp-button--outline:hover{background-color:var(--ui-button-outline-hover,#f1f5f9)}.cp-button--ghost{background-color:transparent;color:var(--ui-button-ghost-foreground,#1e293b)}.cp-button--ghost:hover{background-color:var(--ui-button-ghost-hover,#f1f5f9)}.cp-button--link{background-color:transparent;color:var(--ui-link,#3b82f6);text-underline-offset:4px}.cp-button--link:hover{color:var(--ui-link-hover,#2563eb);text-decoration:underline}.cp-button--xsmall{border-radius:var(--ui-rounded-button-sm,.25rem);font-size:.75rem;gap:.25rem;padding:.25rem .625rem}.cp-button--xsmall>svg{height:.75rem;width:.75rem}.cp-button--small{border-radius:var(--ui-rounded-button-sm,.25rem);font-size:.875rem;padding:.375rem .75rem}.cp-button--small>svg{height:1rem;width:1rem}.cp-button--large{border-radius:var(--ui-rounded-button-lg,.5rem);font-size:1.125rem;gap:.5rem;padding:.75rem 1.5rem}.cp-button--large>svg{height:1.25rem;width:1.25rem}.cp-button--disabled{opacity:.5;pointer-events:none}.cp-button--full{justify-content:center;width:100%}.cp-card{background-color:var(--ui-card-bg);border:1px solid var(--ui-card-border);border-radius:var(--ui-card-radius);box-shadow:var(--ui-card-shadow);color:var(--ui-card-fg)}.cp-card--centered{align-items:center;display:flex;justify-content:center}.cp-card--ghost{background-color:transparent;border-color:transparent;box-shadow:none}.cp-card--elevated{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1)}.cp-conversation{background:var(--ui-background);display:flex;flex-direction:column;height:100%}.cp-conversation__header{background:var(--ui-background);border-bottom:1px solid var(--ui-border);padding:1rem 1.5rem}.cp-conversation__title{color:var(--ui-foreground);font-size:1.125rem;font-weight:600;margin:0}.cp-conversation__messages{flex:1;overflow-y:auto}.cp-conversation__empty{align-items:center;color:var(--ui-muted-foreground);display:flex;height:100%;justify-content:center}.cp-conversation__empty-content{text-align:center}.cp-conversation__empty-title{font-size:1.5rem;font-weight:500;margin-bottom:.5rem}.cp-conversation__empty-subtitle{font-size:.875rem}.cp-conversation__streaming-hidden{display:none}.cp-conversation-message{padding:2rem 0}.cp-conversation-message--user{background:var(--ui-background)}.cp-conversation-message--assistant{background:var(--ui-accent)}.cp-conversation-message--error{background:var(--ui-background)}.cp-conversation-message--system{background:var(--ui-accent)}.cp-conversation-message__container{margin:0 auto;max-width:48rem;padding:0 1.5rem}.cp-conversation-message__row{display:flex;gap:1rem}.cp-conversation-message__avatar-wrapper{flex-shrink:0}.cp-conversation-message__avatar{align-items:center;background:var(--ui-muted-foreground);border-radius:9999px;color:#fff;display:flex;font-size:.875rem;font-weight:600;height:2rem;justify-content:center;width:2rem}.cp-conversation-message__avatar--user{background:var(--ui-primary)}.cp-conversation-message__avatar--assistant{background:#16a34a}.cp-conversation-message__avatar--error{background:var(--ui-destructive)}.cp-conversation-message__avatar--system{background:var(--ui-muted-foreground)}.cp-conversation-message__content{flex:1;min-width:0}.cp-conversation-message__role{color:var(--ui-foreground);font-size:.875rem;font-weight:600;margin-bottom:.25rem}.cp-conversation-message__body{color:var(--ui-foreground);white-space:pre-wrap}.cp-conversation-message__timestamp{color:var(--ui-muted-foreground);font-size:.75rem;margin-top:.25rem}.cp-conversation-streaming{background:var(--ui-accent);padding:2rem 0}.cp-conversation-streaming__container{margin:0 auto;max-width:48rem;padding:0 1.5rem}.cp-conversation-streaming__row{display:flex;gap:1rem}.cp-conversation-streaming__avatar-wrapper{flex-shrink:0}.cp-conversation-streaming__avatar{align-items:center;background:var(--ui-muted-foreground);border-radius:9999px;color:#fff;display:flex;font-size:.875rem;font-weight:600;height:2rem;justify-content:center;width:2rem}.cp-conversation-streaming__avatar--user{background:var(--ui-primary)}.cp-conversation-streaming__avatar--assistant{background:#16a34a}.cp-conversation-streaming__content{flex:1;min-width:0}.cp-conversation-streaming__label{color:var(--ui-foreground);font-size:.875rem;font-weight:600;margin-bottom:.25rem}.cp-conversation-streaming__dots{align-items:center;display:flex;gap:.25rem}.cp-conversation-streaming__dot{animation:cp-bounce 1s infinite;background:var(--ui-muted-foreground);border-radius:9999px;height:.5rem;width:.5rem}}@layer aeno-components{}@layer aeno-components{@keyframes cp-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-.25rem)}}.cp-drawer__backdrop{background:rgba(0,0,0,.5);inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .3s ease}.cp-drawer__backdrop--open{opacity:1;pointer-events:auto}.cp-drawer__panel{background:var(--ui-background);border-left:1px solid var(--ui-border);bottom:0;box-shadow:var(--ui-shadow-xl);height:100%;position:fixed;right:0;top:0;transform:translateX(100%);transition:transform .3s ease}.cp-drawer__panel--open{transform:translateX(0)}.cp-drawer__container{display:flex;flex-direction:column;height:100vh}.cp-drawer__header{align-items:center;border-bottom:1px solid var(--ui-border);display:flex;flex-shrink:0;justify-content:space-between;padding:var(--ui-spacing-lg)}.cp-drawer__header-content{flex:1;min-width:0}.cp-drawer__close{align-items:center;background:var(--ui-muted);border:none;border-radius:9999px;cursor:pointer;display:flex;flex-shrink:0;height:2.5rem;justify-content:center;margin-left:var(--ui-spacing);transition:background-color .15s ease;width:2.5rem}.cp-drawer__close:hover{background:var(--ui-accent)}.cp-drawer__close-icon{color:var(--ui-muted-foreground);height:1.25rem;width:1.25rem}.cp-drawer__body{flex:1;overflow-y:auto}.cp-drawer__footer{border-top:1px solid var(--ui-border);flex-shrink:0;padding:var(--ui-spacing-lg)}.cp-dropdown{display:inline-block;position:relative}.cp-dropdown__trigger{cursor:pointer}.cp-dropdown__content{background:var(--ui-menu-bg);border:1px solid var(--ui-menu-border);border-radius:var(--ui-menu-radius);box-shadow:var(--ui-menu-shadow);min-width:12rem;opacity:0;position:absolute;transform:scale(.95);transition:opacity .15s ease,transform .15s ease,visibility .15s;visibility:hidden;z-index:50}.cp-dropdown__content--open{opacity:1;transform:scale(1);visibility:visible}.cp-dropdown__search{border-bottom:1px solid var(--ui-menu-border);padding:var(--ui-menu-padding)}.cp-dropdown__search-input{background:var(--ui-muted);border:1px solid var(--ui-menu-border);border-radius:var(--ui-menu-item-radius);color:var(--ui-menu-fg);font-size:.875rem;outline:none;padding:.5rem .75rem;width:100%}}@layer aeno-components{}@layer aeno-components{.cp-dropdown__search-input::placeholder{color:var(--ui-muted-color)}.cp-dropdown__search-input:focus{border-color:var(--ui-ring);box-shadow:0 0 0 2px var(--ui-ring-alpha)}.cp-dropdown__items{max-height:20rem;overflow-y:auto;padding:var(--ui-menu-padding)}.cp-dropdown__item{align-items:center;background:transparent;border:none;border-radius:var(--ui-menu-item-radius);color:var(--ui-menu-fg);cursor:pointer;display:flex;font-size:.875rem;gap:.5rem;padding:.5rem .75rem;text-align:left;text-decoration:none;transition:background-color .1s ease;width:100%}.cp-dropdown__item:hover{background:var(--ui-muted)}.cp-dropdown__item--disabled{opacity:.5;pointer-events:none}.cp-dropdown__item--checkbox,.cp-dropdown__item--radio{padding-left:.5rem}.cp-dropdown__item--hidden{display:none}.cp-dropdown__item-check{align-items:center;display:flex;height:1rem;justify-content:center;width:1rem}.cp-dropdown__check-icon{color:var(--ui-menu-fg);height:.875rem;width:.875rem}.cp-dropdown__item-icon{color:var(--ui-muted-color);height:1rem;width:1rem}.cp-dropdown__item-label{flex:1}.cp-dropdown__item-shortcut,.cp-dropdown__label{color:var(--ui-muted-color);font-size:.75rem}.cp-dropdown__label{font-weight:500;letter-spacing:.05em;padding:.5rem .75rem;text-transform:uppercase}.cp-dropdown__separator{background:var(--ui-menu-border);height:1px;margin:var(--ui-menu-padding) 0}.cp-dropdown__radio-group{display:flex;flex-direction:column}.cp-dropdown__empty{color:var(--ui-muted-color);display:none;font-size:.875rem;padding:.5rem .75rem;text-align:center}.cp-dropdown__empty--visible{display:block}.cp-empty{padding:var(--ui-spacing-lg)}.cp-empty__container{border:1px dashed var(--ui-border);border-radius:var(--ui-radius-lg);min-height:200px;padding:var(--ui-spacing-lg)}.cp-empty__container,.cp-empty__content{align-items:center;display:flex;flex-direction:column;justify-content:center}.cp-empty__content{gap:var(--ui-spacing)}.cp-empty__icon{color:var(--ui-muted-foreground);height:3rem;width:3rem}.cp-empty__title{color:var(--ui-foreground);font-size:1.125rem;font-weight:600}.cp-empty__description{color:var(--ui-muted-foreground);text-align:center}.cp-input-attachments__container{display:flex;flex-direction:column;gap:.75rem}.cp-input-attachments__dropzone{align-items:center;background:var(--ui-input-bg);border:2px dashed var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:1.5rem;transition:border-color .15s ease,background-color .15s ease}.cp-input-attachments__dropzone--dragging,.cp-input-attachments__dropzone:hover{background:var(--ui-muted);border-color:var(--ui-input-ring)}.cp-input-attachments__dropzone-content{align-items:center;display:flex;flex-direction:column;gap:.5rem;text-align:center}.cp-input-attachments__icon{color:var(--ui-muted-foreground);height:2rem;width:2rem}.cp-input-attachments__text{color:var(--ui-muted-foreground);font-size:.875rem}.cp-input-attachments__link{color:var(--ui-primary);font-weight:500}.cp-input-attachments__hint{color:var(--ui-muted-foreground);font-size:.75rem}.cp-input-attachments__file-input{display:none}.cp-input-attachments__progress{display:flex;flex-direction:column;gap:.25rem}.cp-input-attachments__progress--hidden{display:none}.cp-input-attachments__progress-info{align-items:center;color:var(--ui-muted-foreground);display:flex;font-size:.875rem;gap:.5rem}.cp-input-attachments__progress-track{background:var(--ui-accent);border-radius:9999px;height:.375rem;overflow:hidden}.cp-input-attachments__progress-bar{background:var(--ui-primary);height:100%;transition:width .3s ease}.cp-input-attachments__previews{display:grid;gap:.75rem;grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}.cp-input-color--disabled{opacity:.5;pointer-events:none}.cp-input-color__container{align-items:center;display:flex;gap:.75rem}.cp-input-color__input{border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);cursor:pointer;height:2.5rem;overflow:hidden;padding:0;width:2.5rem}}@layer aeno-components{}@layer aeno-components{}@layer aeno-components{.cp-input-color__input::-webkit-color-swatch-wrapper{padding:0}.cp-input-color__input::-webkit-color-swatch{border:none;border-radius:calc(var(--ui-input-radius, .375rem) - 1px)}.cp-input-color__input::-moz-color-swatch{border:none;border-radius:calc(var(--ui-input-radius, .375rem) - 1px)}.cp-input-color__input:focus{box-shadow:0 0 0 2px var(--ui-background),0 0 0 4px var(--ui-ring);outline:none}.cp-input-color__input--small{height:2rem;width:2rem}.cp-input-color__input--large{height:3rem;width:3rem}.cp-input-color__label{color:var(--ui-foreground);font-size:.875rem}.cp-input-color__helper{color:var(--ui-muted-foreground);font-size:.875rem;margin-top:.25rem}.cp-input-password__field{position:relative}.cp-input-password__input{background:var(--ui-input-bg);border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);color:var(--ui-input-fg);display:block;font-size:.875rem;outline:none;padding:.5rem 2.5rem .5rem .75rem;transition:border-color .15s ease,box-shadow .15s ease;width:100%}}@layer aeno-components{.cp-input-password__input::placeholder{color:var(--ui-input-placeholder)}.cp-input-password__input:focus{border-color:var(--ui-input-border-focus);box-shadow:0 0 0 1px var(--ui-input-ring)}.cp-input-password__input:disabled{cursor:not-allowed;opacity:.5}.cp-input-password__toggle{background:transparent;border:none;border-radius:.25rem;color:var(--ui-input-placeholder);cursor:pointer;padding:.25rem;position:absolute;right:.5rem;top:50%;transform:translateY(-50%)}.cp-input-password__toggle:hover{color:var(--ui-input-fg)}.cp-input-password__toggle-icon{display:block;height:1rem;width:1rem}.cp-input-password__toggle-icon--hidden{display:none}.cp-input-select__select{appearance:none;background:var(--ui-input-bg);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);color:var(--ui-input-fg);display:block;font-size:.875rem;outline:none;padding:.5rem 2rem .5rem .75rem;transition:border-color .15s ease,box-shadow .15s ease;width:100%}.cp-input-select__select:focus{border-color:var(--ui-input-border-focus);box-shadow:0 0 0 1px var(--ui-input-ring)}.cp-input-select__select--error{border-color:var(--ui-destructive)}.cp-input-slider--disabled{opacity:.5;pointer-events:none}.cp-input-slider__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:.5rem}.cp-input-slider__label{color:var(--ui-foreground);font-size:.875rem;font-weight:500}.cp-input-slider__value{color:var(--ui-muted-foreground);font-family:monospace;font-size:.875rem}.cp-input-slider__input{appearance:none;background:var(--ui-accent);border-radius:9999px;cursor:pointer;height:.5rem;outline:none;width:100%}}@layer aeno-components{}@layer aeno-components{.cp-input-slider__input::-webkit-slider-thumb{appearance:none;background:var(--ui-primary);border-radius:50%;cursor:pointer;height:1rem;transition:transform .15s ease;width:1rem}.cp-input-slider__input::-webkit-slider-thumb:hover{transform:scale(1.1)}.cp-input-slider__input::-moz-range-thumb{background:var(--ui-primary);border:none;border-radius:50%;cursor:pointer;height:1rem;width:1rem}.cp-input-slider__input:focus{outline:none}.cp-input-slider__input:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--ui-background),0 0 0 4px var(--ui-ring)}.cp-input-slider__helper{color:var(--ui-muted-foreground);font-size:.875rem;margin-top:.25rem}.cp-input-tagging__container{position:relative}.cp-input-tagging__tags{display:flex;flex-wrap:wrap;gap:.375rem;margin-bottom:.5rem;min-height:1.75rem}.cp-input-tagging__tag{align-items:center;background:var(--ui-accent);border-radius:var(--ui-radius-sm);color:var(--ui-accent-foreground);display:inline-flex;font-size:.75rem;font-weight:500;gap:.25rem;padding:.125rem .5rem}.cp-input-tagging__tag-remove{align-items:center;background:none;border:none;border-radius:2px;color:inherit;cursor:pointer;display:flex;justify-content:center;margin-left:.125rem;opacity:.7;padding:0}.cp-input-tagging__tag-remove:hover{background:rgba(0,0,0,.1);opacity:1}.cp-input-tagging__tag-icon{height:.75rem;width:.75rem}.cp-input-tagging__search{position:relative}.cp-input-tagging__input{background:var(--ui-input-bg);border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);color:var(--ui-input-fg);display:block;font-size:.875rem;outline:none;padding:.5rem .75rem;transition:border-color .15s ease,box-shadow .15s ease;width:100%}.cp-input-tagging__input:focus{border-color:var(--ui-input-border-focus);box-shadow:0 0 0 1px var(--ui-input-ring)}.cp-input-tagging__dropdown{background:var(--ui-popover);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:var(--ui-shadow-lg);margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.cp-input-tagging__dropdown--hidden{display:none}.cp-input-tagging__loading{align-items:center;color:var(--ui-muted-foreground);display:flex;font-size:.875rem;gap:.5rem;padding:.5rem 1rem}.cp-input-tagging__loading--hidden{display:none}.cp-input-tagging__options{padding:.25rem 0}.cp-input-tagging__create{border-top:1px solid var(--ui-border)}.cp-input-tagging__create--hidden{display:none}.cp-input-tagging__create-btn{align-items:center;background:none;border:none;color:var(--ui-foreground);cursor:pointer;display:flex;font-size:.875rem;gap:.5rem;padding:.5rem 1rem;text-align:left;width:100%}.cp-input-tagging__create-btn:hover{background:var(--ui-accent)}.cp-input-tagging__create-icon{height:1rem;width:1rem}.cp-input-tagging__empty{color:var(--ui-muted-foreground);font-size:.875rem;padding:.5rem 1rem}.cp-input-tagging__empty--hidden{display:none}.cp-input-text__input{background:var(--ui-input-bg);border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);color:var(--ui-input-fg);display:block;font-size:.875rem;outline:none;padding:.5rem .75rem;transition:border-color .15s ease,box-shadow .15s ease;width:100%}}@layer aeno-components{}@layer aeno-components{.cp-input-text__input::placeholder{color:var(--ui-input-placeholder)}.cp-input-text__input:focus{border-color:var(--ui-input-border-focus);box-shadow:0 0 0 1px var(--ui-input-ring)}.cp-input-text__input:disabled{cursor:not-allowed;opacity:.5}.cp-input-text__input--error{border-color:var(--ui-destructive)}.cp-input-text__input--error:focus{box-shadow:0 0 0 1px var(--ui-destructive)}.cp-input-text-area__textarea{background:var(--ui-input-bg);border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);color:var(--ui-input-fg);display:block;font-size:.875rem;outline:none;padding:.5rem .75rem;resize:vertical;transition:border-color .15s ease,box-shadow .15s ease;width:100%}}@layer aeno-components{.cp-input-text-area__textarea::placeholder{color:var(--ui-input-placeholder)}.cp-input-text-area__textarea:focus{border-color:var(--ui-input-border-focus);box-shadow:0 0 0 1px var(--ui-input-ring)}.cp-input-text-area__textarea--error{border-color:var(--ui-destructive)}.cp-input-text-area-ai__container{position:relative}.cp-input-text-area-ai__textarea{background:var(--ui-input-bg);border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);color:var(--ui-input-fg);display:block;font-size:.875rem;outline:none;padding:.5rem 6rem .5rem .75rem;resize:vertical;transition:border-color .15s ease,box-shadow .15s ease;width:100%}}@layer aeno-components{.cp-input-text-area-ai__textarea::placeholder{color:var(--ui-input-placeholder)}.cp-input-text-area-ai__textarea:focus{border-color:var(--ui-input-border-focus);box-shadow:0 0 0 1px var(--ui-input-ring)}.cp-input-text-area-ai__textarea:disabled{cursor:not-allowed;opacity:.5}.cp-input-text-area-ai__actions{bottom:.5rem;position:absolute;right:.5rem}.cp-input-text-area-ai__ai-btn{align-items:center;background:var(--ui-accent);border:none;border-radius:var(--ui-radius-sm);color:var(--ui-primary);cursor:pointer;display:inline-flex;font-size:.75rem;font-weight:500;gap:.375rem;padding:.375rem .75rem;transition:background-color .15s ease}.cp-input-text-area-ai__ai-btn:hover{background:var(--ui-accent-foreground);color:var(--ui-accent)}.cp-input-text-area-ai__ai-btn:disabled{cursor:not-allowed;opacity:.5}.cp-input-text-area-ai__ai-icon{height:1rem;width:1rem}.cp-input-text-area-ai__spinner--hidden{display:none}.cp-input-text-area-ai__streaming{align-items:center;bottom:.5rem;color:var(--ui-muted-foreground);display:flex;font-size:.75rem;gap:.25rem;left:.5rem;position:absolute}.cp-input-text-area-ai__streaming--hidden{display:none}.cp-input-wrapper--disabled{opacity:.5;pointer-events:none}.cp-input-wrapper__label{color:var(--ui-foreground);display:block;font-size:.875rem;font-weight:500;margin-bottom:.25rem}.cp-input-wrapper__required{color:var(--ui-destructive)}.cp-input-wrapper__field{position:relative}.cp-input-wrapper__helper{color:var(--ui-muted-foreground);font-size:.875rem;margin-top:.25rem}.cp-input-wrapper__error{color:var(--ui-destructive);font-size:.875rem;margin-top:.25rem}.cp-input{background:var(--ui-input-bg);border:1px solid var(--ui-input-border);border-radius:var(--ui-input-radius,.375rem);color:var(--ui-input-fg);display:block;font-size:.875rem;outline:none;padding:.5rem .75rem;transition:border-color .15s ease,box-shadow .15s ease;width:100%}}@layer aeno-components{.cp-input::placeholder{color:var(--ui-input-placeholder)}.cp-input:focus{border-color:var(--ui-input-border-focus);box-shadow:0 0 0 1px var(--ui-input-ring)}.cp-input:disabled{cursor:not-allowed;opacity:.5}.cp-input--error{border-color:var(--ui-destructive)}.cp-input--error:focus{box-shadow:0 0 0 1px var(--ui-destructive)}.cp-layout-app{display:grid;grid-template-columns:auto 1fr;height:100vh;inset:0;position:fixed;width:100vw}.cp-layout-app--with-aside{grid-template-columns:auto 1fr auto}.cp-layout-app__sidebar{flex-shrink:0;height:100vh;overflow:hidden}.cp-layout-app__main{display:flex;flex-direction:column;height:100vh;min-width:0;overflow:hidden}.cp-layout-app__header{border-bottom:1px solid var(--ui-sidebar-border,#e5e5e5);flex-shrink:0;padding:1rem 2rem}.cp-layout-app__body{flex:1;overflow-y:auto;padding:2rem}.cp-layout-app__aside{border-left:1px solid var(--ui-sidebar-border,#e5e5e5);flex-shrink:0;height:100vh;overflow:hidden}.cp-page{display:flex;flex-direction:column;width:100%}.cp-page__header{align-items:center;display:flex;gap:var(--ui-spacing-lg);justify-content:space-between;padding:var(--ui-spacing-lg) 0}.cp-page__title-area{flex:1;min-width:0}.cp-page__title{align-items:center;color:var(--ui-foreground);display:flex;font-size:1.875rem;font-weight:600;gap:var(--ui-spacing-sm);letter-spacing:-.025em}.cp-page__title-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cp-page__subtitle{color:var(--ui-muted-foreground);flex-shrink:0}.cp-page__description{color:var(--ui-muted-foreground);margin-top:var(--ui-spacing-sm)}.cp-page__actions{flex-shrink:0}.cp-page__content{padding-bottom:var(--ui-spacing-lg);width:100%}.cp-sidebar{background-color:var(--ui-sidebar-bg,#fafafa);border-right:1px solid var(--ui-sidebar-border,#e5e5e5);color:var(--ui-sidebar-fg,#1a1a1a);display:flex;flex-direction:column;height:100vh;overflow:hidden;width:100%}.cp-sidebar__header{flex-shrink:0}.cp-sidebar__nav{flex:1;overflow-y:auto;padding:0 .5rem}.cp-sidebar__footer{border-top:1px solid var(--ui-sidebar-border,#e5e5e5);color:var(--ui-muted-color,#737373);flex-shrink:0;font-size:.75rem;padding:1rem}.cp-sidebar__menu{gap:.25rem}.cp-sidebar__group,.cp-sidebar__menu{display:flex;flex-direction:column;min-width:0;width:100%}.cp-sidebar__group{padding:.25rem 0}.cp-sidebar__group-label{align-items:center;color:var(--ui-muted-color,#737373);display:flex;font-size:.75rem;font-weight:500;height:2rem;letter-spacing:.05em;padding:0 .5rem;text-transform:uppercase}.cp-sidebar__group-menu{display:flex;flex-direction:column;gap:.25rem;min-width:0;width:100%}.cp-sidebar__item{align-items:center;border-radius:var(--ui-input-radius,.375rem);color:var(--ui-sidebar-fg,#1a1a1a);display:flex;font-size:.875rem;gap:.5rem;padding:.5rem;text-align:left;transition:background-color .15s ease,color .15s ease;width:100%}.cp-sidebar__item:hover{background-color:var(--ui-sidebar-hover,#f0f0f0)}.cp-sidebar__item svg{flex-shrink:0;height:1rem;width:1rem}.cp-sidebar__item--active{background-color:var(--ui-sidebar-active,#e5e5e5);font-weight:500}.cp-spinner{height:1.25rem;inset:0;margin-right:0;padding-left:.5rem;position:relative;width:1.25rem}.cp-spinner:before{animation:spin 1s linear infinite;border-radius:9999px;border-style:solid;border-width:2px;box-sizing:border-box;content:"";height:1.25rem;left:50%;margin-left:-.625rem;margin-top:-.625rem;position:absolute;top:50%;width:1.25rem}.cp-spinner--xs:before{height:.75rem;margin-left:-.375rem;margin-top:-.375rem;width:.75rem}.cp-spinner--sm:before{height:1rem;margin-left:-.5rem;margin-top:-.5rem;width:1rem}.cp-spinner--lg:before{height:1.5rem;margin-left:-.75rem;margin-top:-.75rem;width:1.5rem}.cp-spinner--xl:before{height:2rem;margin-left:-1rem;margin-top:-1rem;width:2rem}.cp-spinner--white:before{border-color:#fff hsla(0,0%,100%,.5) hsla(0,0%,100%,.5)}.cp-spinner--default:before{border-color:#6b7280 hsla(220,9%,46%,.5) hsla(220,9%,46%,.5)}.cp-spinner--primary:before{border-color:rgb(from var(--ui-button-bg,#475569) r g b/.5);border-top-color:var(--ui-button-bg,#475569)}.cp-spinner--black:before{border-color:#000 rgba(0,0,0,.5) rgba(0,0,0,.5)}}@layer aeno-components{}@layer aeno-components{}@layer aeno-components{}@layer aeno-components{@keyframes spin{to{transform:rotate(1turn)}}}@layer aeno-components{.cp-table{overflow-x:auto}.cp-table table{border-collapse:collapse;width:100%}.cp-table__head{background-color:var(--ui-area-bg)}.cp-table__th{color:var(--ui-muted-color);font-size:.75rem;font-weight:500;letter-spacing:.05em;padding:.75rem 1rem;text-align:left;text-transform:uppercase}.cp-table__tr{border-bottom:1px solid var(--ui-card-border)}.cp-table__td{color:var(--ui-foreground);font-size:.875rem;padding:.75rem 1rem}.cp-table__td code{background:var(--ui-area-bg);border-radius:.25rem;font-size:.8125rem;padding:.125rem .375rem}}
@@ -0,0 +1,43 @@
1
+ /* =============================================================================
2
+ Aeno - Base (non-theme)
3
+ ============================================================================= */
4
+
5
+ :root {
6
+ /* Spacing */
7
+ --ui-spacing: 1rem;
8
+
9
+ /* Radius */
10
+ --ui-radius-sm: 0.25rem;
11
+ --ui-radius: 0.375rem;
12
+ --ui-radius-md: 0.5rem;
13
+ --ui-radius-lg: 0.75rem;
14
+ }
15
+
16
+ html {
17
+ color: var(--ui-foreground);
18
+ background-color: var(--ui-background);
19
+ }
20
+
21
+ @keyframes spin {
22
+ to {
23
+ transform: rotate(360deg);
24
+ }
25
+ }
26
+
27
+ button,
28
+ a,
29
+ input[type="submit"],
30
+ select,
31
+ option,
32
+ [role="menuitem"],
33
+ [data-slot="command-item"] {
34
+ cursor: pointer !important;
35
+ }
36
+
37
+ button {
38
+ text-align: left;
39
+ }
40
+
41
+ *::-webkit-scrollbar {
42
+ display: none;
43
+ }