nanoui 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +64 -60
- data/lib/generators/nanoui/component_generator.rb +5 -5
- data/lib/generators/nanoui/install_generator.rb +2 -6
- data/lib/generators/nanoui/templates/css/base/{_reset.css → 01_reset.css} +1 -1
- data/lib/generators/nanoui/templates/css/base/02_fonts.css +8 -0
- data/lib/generators/nanoui/templates/css/{tokens/_colors.css → base/03_colors.css} +1 -1
- data/lib/generators/nanoui/templates/css/{tokens/_typography.css → base/04_typography.css} +1 -1
- data/lib/generators/nanoui/templates/css/{tokens/_spacing.css → base/05_spacing.css} +1 -1
- data/lib/generators/nanoui/templates/css/{tokens/_radius.css → base/06_radius.css} +1 -1
- data/lib/generators/nanoui/templates/css/{tokens/_shadows.css → base/07_shadows.css} +1 -1
- data/lib/generators/nanoui/templates/css/{tokens/_transitions.css → base/08_transitions.css} +1 -1
- data/lib/generators/nanoui/templates/css/{tokens/_z-index.css → base/09_z-index.css} +1 -1
- data/lib/generators/nanoui/templates/css/base/{_globals.css → 10_globals.css} +2 -10
- data/lib/generators/nanoui/templates/css/components/{_accordion.css → accordion.css} +11 -22
- data/lib/generators/nanoui/templates/css/components/{_alert.css → alert.css} +15 -15
- data/lib/generators/nanoui/templates/css/components/{_badge.css → badge.css} +8 -8
- data/lib/generators/nanoui/templates/css/components/{_button.css → button.css} +23 -23
- data/lib/generators/nanoui/templates/css/components/{_card.css → card.css} +8 -8
- data/lib/generators/nanoui/templates/css/components/{_checkbox.css → checkbox.css} +11 -11
- data/lib/generators/nanoui/templates/css/components/{_dialog.css → dialog.css} +17 -19
- data/lib/generators/nanoui/templates/css/components/{_dropdown.css → dropdown.css} +12 -12
- data/lib/generators/nanoui/templates/css/components/{_input.css → input.css} +16 -19
- data/lib/generators/nanoui/templates/css/components/{_label.css → label.css} +2 -2
- data/lib/generators/nanoui/templates/css/components/{_progress.css → progress.css} +13 -16
- data/lib/generators/nanoui/templates/css/components/{_radio.css → radio.css} +13 -13
- data/lib/generators/nanoui/templates/css/components/{_select.css → select.css} +8 -8
- data/lib/generators/nanoui/templates/css/components/{_switch.css → switch.css} +7 -7
- data/lib/generators/nanoui/templates/css/components/{_table.css → table.css} +10 -10
- data/lib/generators/nanoui/templates/css/components/{_tabs.css → tabs.css} +8 -8
- data/lib/generators/nanoui/templates/css/components/{_toast.css → toast.css} +20 -20
- data/lib/generators/nanoui/templates/css/components/{_tooltip.css → tooltip.css} +14 -14
- data/lib/generators/nanoui/templates/css/nanoui.css +28 -29
- data/lib/generators/nanoui/templates/css/nanoui.install.css +10 -11
- data/lib/generators/nanoui/templates/js/controllers/dropdown_controller.js +1 -1
- data/lib/generators/nanoui/templates/views/components/_accordion.html.erb +5 -5
- data/lib/generators/nanoui/templates/views/components/_alert.html.erb +6 -6
- data/lib/generators/nanoui/templates/views/components/_badge.html.erb +1 -1
- data/lib/generators/nanoui/templates/views/components/_button.html.erb +2 -2
- data/lib/generators/nanoui/templates/views/components/_card.html.erb +7 -7
- data/lib/generators/nanoui/templates/views/components/_checkbox.html.erb +4 -4
- data/lib/generators/nanoui/templates/views/components/_dialog.html.erb +10 -10
- data/lib/generators/nanoui/templates/views/components/_dropdown.html.erb +9 -9
- data/lib/generators/nanoui/templates/views/components/_input.html.erb +6 -6
- data/lib/generators/nanoui/templates/views/components/_label.html.erb +2 -2
- data/lib/generators/nanoui/templates/views/components/_progress.html.erb +4 -4
- data/lib/generators/nanoui/templates/views/components/_radio_group.html.erb +6 -6
- data/lib/generators/nanoui/templates/views/components/_select.html.erb +6 -6
- data/lib/generators/nanoui/templates/views/components/_switch.html.erb +3 -3
- data/lib/generators/nanoui/templates/views/components/_table.html.erb +11 -11
- data/lib/generators/nanoui/templates/views/components/_tabs.html.erb +4 -4
- data/lib/generators/nanoui/templates/views/components/_toast.html.erb +7 -7
- data/lib/generators/nanoui/templates/views/components/_toast_container.html.erb +1 -1
- data/lib/generators/nanoui/templates/views/components/_tooltip.html.erb +3 -3
- data/lib/nanoui/version.rb +1 -1
- metadata +29 -28
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e93a8fd3240f6ca51636ddf4607fa5b98d75ffd3d9d3d89f5a07e587ccf5dd41
|
|
4
|
+
data.tar.gz: 678d26f0b38587acf444cb685cd9ae3d6587f14868b515ca92ff019058f7c162
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 32cf0b6c85d29c62a970991e2970acb7e9f0f6fa013aef378f8f21c1317f9f07a92fb8c7f3ec2524fe24fea8dc4b35614dcaff20e5f671c717c533fab739e512
|
|
7
|
+
data.tar.gz: 75bfb7626afff70a8734733979f5bf372074d4ce7c0e43217498d74140d5d9b165032e8311be11959c6d71c7ba44f2e5010a667e71bb6076bf7ab40ea12f51da
|
data/README.md
CHANGED
|
@@ -15,7 +15,7 @@ gem "nanoui", group: :development
|
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
bundle install
|
|
18
|
-
rails generate nanoui:install #
|
|
18
|
+
rails generate nanoui:install # Base styles and fonts
|
|
19
19
|
rails generate nanoui:component --all # All components
|
|
20
20
|
```
|
|
21
21
|
|
|
@@ -24,8 +24,12 @@ rails generate nanoui:component --all # All components
|
|
|
24
24
|
Copy files directly into your Rails 8 app:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
# 1. CSS (
|
|
28
|
-
|
|
27
|
+
# 1. CSS (base, components, entrypoint, Inter Variable font)
|
|
28
|
+
mkdir -p app/assets/stylesheets/nanoui
|
|
29
|
+
cp -r lib/generators/nanoui/templates/css/base app/assets/stylesheets/nanoui/
|
|
30
|
+
cp -r lib/generators/nanoui/templates/css/components app/assets/stylesheets/nanoui/
|
|
31
|
+
cp -r lib/generators/nanoui/templates/css/fonts app/assets/stylesheets/nanoui/
|
|
32
|
+
cp lib/generators/nanoui/templates/css/nanoui.css app/assets/stylesheets/nanoui/
|
|
29
33
|
|
|
30
34
|
# 2. Stimulus controllers
|
|
31
35
|
cp lib/generators/nanoui/templates/js/controllers/*_controller.js \
|
|
@@ -58,7 +62,7 @@ Or if using Propshaft, add the import to your layout:
|
|
|
58
62
|
If NanoUI falls back to system fonts instead of Inter:
|
|
59
63
|
|
|
60
64
|
- Confirm the font file exists at `app/assets/stylesheets/nanoui/fonts/inter-variable.ttf`
|
|
61
|
-
- Confirm `app/assets/stylesheets/nanoui/base/
|
|
65
|
+
- Confirm `app/assets/stylesheets/nanoui/base/02_fonts.css` still points to `url("../fonts/inter-variable.ttf")`
|
|
62
66
|
- If you installed NanoUI before this change, rerun `rails generate nanoui:install` or copy `lib/generators/nanoui/templates/css/fonts/inter-variable.ttf` into `app/assets/stylesheets/nanoui/fonts/`
|
|
63
67
|
- In the browser devtools Network tab, verify `inter-variable.ttf` loads successfully instead of returning `404`
|
|
64
68
|
|
|
@@ -132,16 +136,16 @@ document.documentElement.classList.toggle("dark")
|
|
|
132
136
|
Or use classes directly:
|
|
133
137
|
|
|
134
138
|
```html
|
|
135
|
-
<button class="
|
|
136
|
-
<button class="
|
|
137
|
-
<button class="
|
|
139
|
+
<button class="nano-btn nano-btn--primary" type="button">Save</button>
|
|
140
|
+
<button class="nano-btn nano-btn--outline nano-btn--sm" type="button">Cancel</button>
|
|
141
|
+
<button class="nano-btn nano-btn--primary" disabled>Disabled</button>
|
|
138
142
|
```
|
|
139
143
|
|
|
140
144
|
**Options:** `variant` (primary, secondary, destructive, outline, ghost, link), `size` (sm, lg, icon), `tag` (:button), `href`, `class`, `html`
|
|
141
145
|
|
|
142
146
|
#### Input
|
|
143
147
|
|
|
144
|
-
Text fields wrapped in `.field` with label and error support.
|
|
148
|
+
Text fields wrapped in `.nano-field` with label and error support.
|
|
145
149
|
|
|
146
150
|
```erb
|
|
147
151
|
<%= render "components/input", label: "Email", type: "email", required: true,
|
|
@@ -151,9 +155,9 @@ Text fields wrapped in `.field` with label and error support.
|
|
|
151
155
|
```
|
|
152
156
|
|
|
153
157
|
```html
|
|
154
|
-
<div class="field">
|
|
155
|
-
<label for="email" class="label label--required">Email</label>
|
|
156
|
-
<input id="email" type="email" class="input" placeholder="you@example.com" required>
|
|
158
|
+
<div class="nano-field">
|
|
159
|
+
<label for="email" class="nano-label nano-label--required">Email</label>
|
|
160
|
+
<input id="email" type="email" class="nano-input" placeholder="you@example.com" required>
|
|
157
161
|
</div>
|
|
158
162
|
```
|
|
159
163
|
|
|
@@ -166,7 +170,7 @@ Text fields wrapped in `.field` with label and error support.
|
|
|
166
170
|
```
|
|
167
171
|
|
|
168
172
|
```html
|
|
169
|
-
<label for="name" class="label label--required">Name</label>
|
|
173
|
+
<label for="name" class="nano-label nano-label--required">Name</label>
|
|
170
174
|
```
|
|
171
175
|
|
|
172
176
|
#### Card
|
|
@@ -183,13 +187,13 @@ Container with header, content, and footer sections.
|
|
|
183
187
|
```
|
|
184
188
|
|
|
185
189
|
```html
|
|
186
|
-
<article class="card">
|
|
187
|
-
<div class="card__header">
|
|
188
|
-
<h3 class="card__title">Settings</h3>
|
|
189
|
-
<p class="card__description">Manage your account.</p>
|
|
190
|
+
<article class="nano-card">
|
|
191
|
+
<div class="nano-card__header">
|
|
192
|
+
<h3 class="nano-card__title">Settings</h3>
|
|
193
|
+
<p class="nano-card__description">Manage your account.</p>
|
|
190
194
|
</div>
|
|
191
|
-
<div class="card__content">...</div>
|
|
192
|
-
<div class="card__footer">...</div>
|
|
195
|
+
<div class="nano-card__content">...</div>
|
|
196
|
+
<div class="nano-card__footer">...</div>
|
|
193
197
|
</article>
|
|
194
198
|
```
|
|
195
199
|
|
|
@@ -205,8 +209,8 @@ Inline status indicators.
|
|
|
205
209
|
```
|
|
206
210
|
|
|
207
211
|
```html
|
|
208
|
-
<span class="badge badge--success">Active</span>
|
|
209
|
-
<span class="badge badge--destructive">Failed</span>
|
|
212
|
+
<span class="nano-badge nano-badge--success">Active</span>
|
|
213
|
+
<span class="nano-badge nano-badge--destructive">Failed</span>
|
|
210
214
|
```
|
|
211
215
|
|
|
212
216
|
**Variants:** primary, secondary, destructive, outline, success, warning
|
|
@@ -222,11 +226,11 @@ Contextual feedback with icon, title, and description.
|
|
|
222
226
|
```
|
|
223
227
|
|
|
224
228
|
```html
|
|
225
|
-
<div class="alert alert--success" role="alert">
|
|
226
|
-
<div class="alert__icon"><!-- SVG --></div>
|
|
227
|
-
<div class="alert__content">
|
|
228
|
-
<p class="alert__title">Saved!</p>
|
|
229
|
-
<p class="alert__description">Your changes have been saved.</p>
|
|
229
|
+
<div class="nano-alert nano-alert--success" role="alert">
|
|
230
|
+
<div class="nano-alert__icon"><!-- SVG --></div>
|
|
231
|
+
<div class="nano-alert__content">
|
|
232
|
+
<p class="nano-alert__title">Saved!</p>
|
|
233
|
+
<p class="nano-alert__description">Your changes have been saved.</p>
|
|
230
234
|
</div>
|
|
231
235
|
</div>
|
|
232
236
|
```
|
|
@@ -245,9 +249,9 @@ Contextual feedback with icon, title, and description.
|
|
|
245
249
|
```
|
|
246
250
|
|
|
247
251
|
```html
|
|
248
|
-
<div class="checkbox">
|
|
249
|
-
<input type="checkbox" id="tos" class="checkbox__input" name="tos">
|
|
250
|
-
<label for="tos" class="checkbox__label">Accept terms</label>
|
|
252
|
+
<div class="nano-checkbox">
|
|
253
|
+
<input type="checkbox" id="tos" class="nano-checkbox__input" name="tos">
|
|
254
|
+
<label for="tos" class="nano-checkbox__label">Accept terms</label>
|
|
251
255
|
</div>
|
|
252
256
|
```
|
|
253
257
|
|
|
@@ -267,11 +271,11 @@ Contextual feedback with icon, title, and description.
|
|
|
267
271
|
```
|
|
268
272
|
|
|
269
273
|
```html
|
|
270
|
-
<fieldset class="radio-group">
|
|
271
|
-
<legend class="radio-group__legend">Plan</legend>
|
|
272
|
-
<div class="radio">
|
|
273
|
-
<input type="radio" id="plan-0" name="plan" value="free" class="radio__input" checked>
|
|
274
|
-
<label for="plan-0" class="radio__label">Free</label>
|
|
274
|
+
<fieldset class="nano-radio-group">
|
|
275
|
+
<legend class="nano-radio-group__legend">Plan</legend>
|
|
276
|
+
<div class="nano-radio">
|
|
277
|
+
<input type="radio" id="plan-0" name="plan" value="free" class="nano-radio__input" checked>
|
|
278
|
+
<label for="plan-0" class="nano-radio__label">Free</label>
|
|
275
279
|
</div>
|
|
276
280
|
<!-- ... -->
|
|
277
281
|
</fieldset>
|
|
@@ -286,10 +290,10 @@ Toggle switch with Stimulus controller.
|
|
|
286
290
|
```
|
|
287
291
|
|
|
288
292
|
```html
|
|
289
|
-
<button type="button" role="switch" aria-checked="true" class="switch"
|
|
293
|
+
<button type="button" role="switch" aria-checked="true" class="nano-switch"
|
|
290
294
|
data-controller="nanoui-switch" data-action="nanoui-switch#toggle">
|
|
291
|
-
<span class="switch__thumb"></span>
|
|
292
|
-
<span class="sr-only">Enable notifications</span>
|
|
295
|
+
<span class="nano-switch__thumb"></span>
|
|
296
|
+
<span class="nano-sr-only">Enable notifications</span>
|
|
293
297
|
</button>
|
|
294
298
|
```
|
|
295
299
|
|
|
@@ -339,15 +343,15 @@ Native `<dialog>` with `showModal()` — free focus trap, Escape close, and `::b
|
|
|
339
343
|
<div data-controller="nanoui-dialog">
|
|
340
344
|
<button data-action="nanoui-dialog#open">Open</button>
|
|
341
345
|
|
|
342
|
-
<dialog data-nanoui-dialog-target="modal" class="dialog"
|
|
346
|
+
<dialog data-nanoui-dialog-target="modal" class="nano-dialog"
|
|
343
347
|
aria-labelledby="dialog-title">
|
|
344
|
-
<div class="dialog__content">
|
|
345
|
-
<header class="dialog__header">
|
|
346
|
-
<h2 id="dialog-title" class="dialog__title">Title</h2>
|
|
348
|
+
<div class="nano-dialog__content">
|
|
349
|
+
<header class="nano-dialog__header">
|
|
350
|
+
<h2 id="dialog-title" class="nano-dialog__title">Title</h2>
|
|
347
351
|
</header>
|
|
348
|
-
<div class="dialog__body">...</div>
|
|
349
|
-
<footer class="dialog__footer">...</footer>
|
|
350
|
-
<button class="dialog__close" data-action="nanoui-dialog#close"
|
|
352
|
+
<div class="nano-dialog__body">...</div>
|
|
353
|
+
<footer class="nano-dialog__footer">...</footer>
|
|
354
|
+
<button class="nano-dialog__close" data-action="nanoui-dialog#close"
|
|
351
355
|
aria-label="Close dialog">...</button>
|
|
352
356
|
</div>
|
|
353
357
|
</dialog>
|
|
@@ -363,10 +367,10 @@ Click-activated menu with keyboard navigation.
|
|
|
363
367
|
```erb
|
|
364
368
|
<%= render "components/dropdown",
|
|
365
369
|
trigger: render("components/button", variant: "outline") { "Options" } do %>
|
|
366
|
-
<button class="dropdown__item">Profile</button>
|
|
367
|
-
<button class="dropdown__item">Settings</button>
|
|
368
|
-
<div class="dropdown__separator"></div>
|
|
369
|
-
<button class="dropdown__item">Log out</button>
|
|
370
|
+
<button class="nano-dropdown__item">Profile</button>
|
|
371
|
+
<button class="nano-dropdown__item">Settings</button>
|
|
372
|
+
<div class="nano-dropdown__separator"></div>
|
|
373
|
+
<button class="nano-dropdown__item">Log out</button>
|
|
370
374
|
<% end %>
|
|
371
375
|
```
|
|
372
376
|
|
|
@@ -418,10 +422,10 @@ Semantic table with responsive scroll wrapper.
|
|
|
418
422
|
<%= render "components/table",
|
|
419
423
|
headers: ["Name", "Email", "Status"],
|
|
420
424
|
striped: true, hoverable: true do %>
|
|
421
|
-
<tr class="table__row">
|
|
422
|
-
<td class="table__cell">Jane Doe</td>
|
|
423
|
-
<td class="table__cell">jane@example.com</td>
|
|
424
|
-
<td class="table__cell">
|
|
425
|
+
<tr class="nano-table__row">
|
|
426
|
+
<td class="nano-table__cell">Jane Doe</td>
|
|
427
|
+
<td class="nano-table__cell">jane@example.com</td>
|
|
428
|
+
<td class="nano-table__cell">
|
|
425
429
|
<%= render "components/badge", variant: "success" do %>Active<% end %>
|
|
426
430
|
</td>
|
|
427
431
|
</tr>
|
|
@@ -477,17 +481,17 @@ Customize your theme by editing the CSS custom properties:
|
|
|
477
481
|
|
|
478
482
|
| Token File | What it controls |
|
|
479
483
|
|---|---|
|
|
480
|
-
| `
|
|
481
|
-
| `
|
|
482
|
-
| `
|
|
483
|
-
| `
|
|
484
|
-
| `
|
|
485
|
-
| `
|
|
486
|
-
| `
|
|
484
|
+
| `base/03_colors.css` | All colors (HSL), dark mode overrides |
|
|
485
|
+
| `base/04_typography.css` | Font families, sizes, weights, line heights |
|
|
486
|
+
| `base/05_spacing.css` | Spacing scale (0 to 16) |
|
|
487
|
+
| `base/06_radius.css` | Border radii (sm to full) |
|
|
488
|
+
| `base/07_shadows.css` | Box shadows (sm to xl) |
|
|
489
|
+
| `base/08_transitions.css` | Durations and easings |
|
|
490
|
+
| `base/09_z-index.css` | Z-index scale (dropdown to toast) |
|
|
487
491
|
|
|
488
492
|
### Changing your brand color
|
|
489
493
|
|
|
490
|
-
Edit one line in `
|
|
494
|
+
Edit one line in `base/03_colors.css`:
|
|
491
495
|
|
|
492
496
|
```css
|
|
493
497
|
--color-primary: 220 70% 50%; /* Change this HSL value */
|
|
@@ -522,7 +526,7 @@ rails generate nanoui:component --all
|
|
|
522
526
|
- **Accessibility is not optional** — ARIA attributes, keyboard navigation, focus management, screen reader support
|
|
523
527
|
- **No build step** — No Tailwind, no PostCSS, no webpack. Vanilla CSS with native nesting
|
|
524
528
|
- **You own the code** — Generator copies files into your app. Edit freely, no runtime dependency
|
|
525
|
-
- **BEM naming** — `.block`, `.block--modifier`, `.block__element`
|
|
529
|
+
- **BEM naming** — `.nano-block`, `.nano-block--modifier`, `.nano-block__element`
|
|
526
530
|
- **CSS custom properties** — One file to theme everything. Dark mode with a single class swap
|
|
527
531
|
|
|
528
532
|
## Browser Support
|
|
@@ -23,7 +23,7 @@ module Nanoui
|
|
|
23
23
|
accordion
|
|
24
24
|
progress
|
|
25
25
|
].freeze
|
|
26
|
-
COMPONENT_IMPORT_PATTERN = /^\s*@import "components\/_([^\"]+)\.css";\s*\n?/
|
|
26
|
+
COMPONENT_IMPORT_PATTERN = /^\s*@import "components\/_?([^\"]+)\.css";\s*\n?/
|
|
27
27
|
|
|
28
28
|
argument :components, type: :array, default: [], banner: "component [component] ..."
|
|
29
29
|
|
|
@@ -59,8 +59,8 @@ module Nanoui
|
|
|
59
59
|
|
|
60
60
|
def copy_component_css
|
|
61
61
|
@resolved.each do |name|
|
|
62
|
-
copy_file "css/components
|
|
63
|
-
"app/assets/stylesheets/nanoui/components
|
|
62
|
+
copy_file "css/components/#{name}.css",
|
|
63
|
+
"app/assets/stylesheets/nanoui/components/#{name}.css"
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
|
|
@@ -114,12 +114,12 @@ module Nanoui
|
|
|
114
114
|
private
|
|
115
115
|
|
|
116
116
|
def component_imports
|
|
117
|
-
installed_components.map { |name| "@import \"components
|
|
117
|
+
installed_components.map { |name| "@import \"components/#{name}.css\";" }.join("\n")
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
def installed_components
|
|
121
121
|
component_dir = "app/assets/stylesheets/nanoui/components"
|
|
122
|
-
names = Dir.glob(File.join(component_dir, "
|
|
122
|
+
names = Dir.glob(File.join(component_dir, "*.css")).map do |path|
|
|
123
123
|
File.basename(path, ".css").delete_prefix("_")
|
|
124
124
|
end
|
|
125
125
|
|
|
@@ -6,11 +6,7 @@ module Nanoui
|
|
|
6
6
|
APPLICATION_IMPORT = '@import "nanoui/nanoui.css";'.freeze
|
|
7
7
|
LEADING_CSS_HEADER_PATTERN = /\A((?:\s|\/\*.*?\*\/\s*)*(?:@charset\s+[^;]+;\s*)?(?:@import\s+[^;]+;\s*)*)/m.freeze
|
|
8
8
|
|
|
9
|
-
desc "Install NanoUI foundation (
|
|
10
|
-
|
|
11
|
-
def copy_tokens
|
|
12
|
-
directory "css/tokens", "app/assets/stylesheets/nanoui/tokens"
|
|
13
|
-
end
|
|
9
|
+
desc "Install NanoUI foundation (base styles, fonts)"
|
|
14
10
|
|
|
15
11
|
def copy_base
|
|
16
12
|
directory "css/base", "app/assets/stylesheets/nanoui/base"
|
|
@@ -45,7 +41,7 @@ module Nanoui
|
|
|
45
41
|
say " rails generate nanoui:component button input card"
|
|
46
42
|
say ""
|
|
47
43
|
say " 2. Customize your theme in:"
|
|
48
|
-
say " app/assets/stylesheets/nanoui/
|
|
44
|
+
say " app/assets/stylesheets/nanoui/base/03_colors.css"
|
|
49
45
|
say ""
|
|
50
46
|
end
|
|
51
47
|
end
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
/* base/
|
|
2
|
-
|
|
3
|
-
@font-face {
|
|
4
|
-
font-family: "Inter";
|
|
5
|
-
font-weight: 100 900;
|
|
6
|
-
font-style: normal;
|
|
7
|
-
font-display: swap;
|
|
8
|
-
src: url("../fonts/inter-variable.ttf") format("truetype");
|
|
9
|
-
}
|
|
1
|
+
/* base/10_globals.css */
|
|
10
2
|
|
|
11
3
|
html {
|
|
12
4
|
scroll-behavior: smooth;
|
|
@@ -28,7 +20,7 @@ body {
|
|
|
28
20
|
outline-offset: 2px;
|
|
29
21
|
}
|
|
30
22
|
|
|
31
|
-
.sr-only {
|
|
23
|
+
.nano-sr-only {
|
|
32
24
|
position: absolute;
|
|
33
25
|
width: 1px;
|
|
34
26
|
height: 1px;
|
|
@@ -1,36 +1,25 @@
|
|
|
1
|
-
.
|
|
2
|
-
list-style: none;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
.accordion__trigger::-webkit-details-marker {
|
|
6
|
-
display: none;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.accordion__trigger::marker {
|
|
10
|
-
content: none;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.accordion {
|
|
1
|
+
.nano-accordion {
|
|
14
2
|
border: 1px solid hsl(var(--color-border));
|
|
15
3
|
border-radius: var(--radius-lg);
|
|
16
4
|
}
|
|
17
5
|
|
|
18
|
-
.accordion__item {
|
|
6
|
+
.nano-accordion__item {
|
|
19
7
|
border-bottom: 1px solid hsl(var(--color-border));
|
|
20
8
|
}
|
|
21
9
|
|
|
22
|
-
.accordion__item:first-child {
|
|
10
|
+
.nano-accordion__item:first-child {
|
|
23
11
|
border-top-left-radius: var(--radius-lg);
|
|
24
12
|
border-top-right-radius: var(--radius-lg);
|
|
25
13
|
}
|
|
26
14
|
|
|
27
|
-
.accordion__item:last-child {
|
|
15
|
+
.nano-accordion__item:last-child {
|
|
28
16
|
border-bottom: none;
|
|
29
17
|
border-bottom-left-radius: var(--radius-lg);
|
|
30
18
|
border-bottom-right-radius: var(--radius-lg);
|
|
31
19
|
}
|
|
32
20
|
|
|
33
|
-
.accordion__trigger {
|
|
21
|
+
.nano-accordion__trigger {
|
|
22
|
+
list-style: none;
|
|
34
23
|
display: flex;
|
|
35
24
|
align-items: center;
|
|
36
25
|
justify-content: space-between;
|
|
@@ -43,16 +32,16 @@
|
|
|
43
32
|
transition: background-color var(--duration-fast) var(--ease-default);
|
|
44
33
|
}
|
|
45
34
|
|
|
46
|
-
.accordion__trigger:hover {
|
|
35
|
+
.nano-accordion__trigger:hover {
|
|
47
36
|
background-color: hsl(var(--color-muted) / 0.5);
|
|
48
37
|
}
|
|
49
38
|
|
|
50
|
-
.accordion__trigger:focus-visible {
|
|
39
|
+
.nano-accordion__trigger:focus-visible {
|
|
51
40
|
outline: 2px solid hsl(var(--color-ring));
|
|
52
41
|
outline-offset: -2px;
|
|
53
42
|
}
|
|
54
43
|
|
|
55
|
-
.accordion__icon {
|
|
44
|
+
.nano-accordion__icon {
|
|
56
45
|
width: 1rem;
|
|
57
46
|
height: 1rem;
|
|
58
47
|
flex-shrink: 0;
|
|
@@ -60,11 +49,11 @@
|
|
|
60
49
|
transition: transform var(--duration-normal) var(--ease-default);
|
|
61
50
|
}
|
|
62
51
|
|
|
63
|
-
.accordion__item[open] .accordion__icon {
|
|
52
|
+
.nano-accordion__item[open] .nano-accordion__icon {
|
|
64
53
|
transform: rotate(180deg);
|
|
65
54
|
}
|
|
66
55
|
|
|
67
|
-
.accordion__content {
|
|
56
|
+
.nano-accordion__content {
|
|
68
57
|
padding: 0 var(--space-4) var(--space-4);
|
|
69
58
|
font-size: var(--text-sm);
|
|
70
59
|
line-height: var(--leading-normal);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.alert {
|
|
1
|
+
.nano-alert {
|
|
2
2
|
display: flex;
|
|
3
3
|
gap: var(--space-3);
|
|
4
4
|
padding: var(--space-4);
|
|
@@ -7,72 +7,72 @@
|
|
|
7
7
|
background-color: hsl(var(--color-background));
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
.alert__icon {
|
|
10
|
+
.nano-alert__icon {
|
|
11
11
|
width: 1rem;
|
|
12
12
|
height: 1rem;
|
|
13
13
|
flex-shrink: 0;
|
|
14
14
|
margin-top: var(--space-0-5);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
.alert__icon svg {
|
|
17
|
+
.nano-alert__icon svg {
|
|
18
18
|
width: 1rem;
|
|
19
19
|
height: 1rem;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
.alert__content {
|
|
22
|
+
.nano-alert__content {
|
|
23
23
|
display: flex;
|
|
24
24
|
flex-direction: column;
|
|
25
25
|
gap: var(--space-1);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
.alert__title {
|
|
28
|
+
.nano-alert__title {
|
|
29
29
|
font-size: var(--text-sm);
|
|
30
30
|
font-weight: var(--font-semibold);
|
|
31
31
|
line-height: var(--leading-normal);
|
|
32
32
|
color: hsl(var(--color-foreground));
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
.alert__description {
|
|
35
|
+
.nano-alert__description {
|
|
36
36
|
font-size: var(--text-sm);
|
|
37
37
|
line-height: var(--leading-normal);
|
|
38
38
|
color: hsl(var(--color-muted-foreground));
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
.alert--destructive {
|
|
41
|
+
.nano-alert--destructive {
|
|
42
42
|
border-color: hsl(var(--color-destructive) / 0.5);
|
|
43
43
|
background-color: hsl(var(--color-destructive) / 0.08);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
.alert--destructive .alert__icon {
|
|
46
|
+
.nano-alert--destructive .nano-alert__icon {
|
|
47
47
|
color: hsl(var(--color-destructive));
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
.alert--destructive .alert__title {
|
|
50
|
+
.nano-alert--destructive .nano-alert__title {
|
|
51
51
|
color: hsl(var(--color-destructive));
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
.alert--success {
|
|
54
|
+
.nano-alert--success {
|
|
55
55
|
border-color: hsl(var(--color-success) / 0.5);
|
|
56
56
|
background-color: hsl(var(--color-success) / 0.08);
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
.alert--success .alert__icon {
|
|
59
|
+
.nano-alert--success .nano-alert__icon {
|
|
60
60
|
color: hsl(var(--color-success));
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
.alert--success .alert__title {
|
|
63
|
+
.nano-alert--success .nano-alert__title {
|
|
64
64
|
color: hsl(var(--color-success));
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
.alert--warning {
|
|
67
|
+
.nano-alert--warning {
|
|
68
68
|
border-color: hsl(var(--color-warning) / 0.5);
|
|
69
69
|
background-color: hsl(var(--color-warning) / 0.08);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
.alert--warning .alert__icon {
|
|
72
|
+
.nano-alert--warning .nano-alert__icon {
|
|
73
73
|
color: hsl(var(--color-warning));
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
.alert--warning .alert__title {
|
|
76
|
+
.nano-alert--warning .nano-alert__title {
|
|
77
77
|
color: hsl(var(--color-warning));
|
|
78
78
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.badge {
|
|
1
|
+
.nano-badge {
|
|
2
2
|
display: inline-flex;
|
|
3
3
|
align-items: center;
|
|
4
4
|
gap: var(--space-1);
|
|
@@ -10,38 +10,38 @@
|
|
|
10
10
|
white-space: nowrap;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
.badge--primary {
|
|
13
|
+
.nano-badge--primary {
|
|
14
14
|
background-color: hsl(var(--color-primary));
|
|
15
15
|
color: hsl(var(--color-primary-foreground));
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
.badge--secondary {
|
|
18
|
+
.nano-badge--secondary {
|
|
19
19
|
background-color: hsl(var(--color-secondary));
|
|
20
20
|
color: hsl(var(--color-secondary-foreground));
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
.badge--destructive {
|
|
23
|
+
.nano-badge--destructive {
|
|
24
24
|
background-color: hsl(var(--color-destructive));
|
|
25
25
|
color: hsl(var(--color-destructive-foreground));
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
.badge--outline {
|
|
28
|
+
.nano-badge--outline {
|
|
29
29
|
background-color: transparent;
|
|
30
30
|
border: 1px solid hsl(var(--color-border));
|
|
31
31
|
color: hsl(var(--color-foreground));
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
.badge--success {
|
|
34
|
+
.nano-badge--success {
|
|
35
35
|
background-color: hsl(var(--color-success));
|
|
36
36
|
color: hsl(var(--color-success-foreground));
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
.badge--warning {
|
|
39
|
+
.nano-badge--warning {
|
|
40
40
|
background-color: hsl(var(--color-warning));
|
|
41
41
|
color: hsl(var(--color-warning-foreground));
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
.badge svg {
|
|
44
|
+
.nano-badge svg {
|
|
45
45
|
width: 0.75rem;
|
|
46
46
|
height: 0.75rem;
|
|
47
47
|
flex-shrink: 0;
|