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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +64 -60
  3. data/lib/generators/nanoui/component_generator.rb +5 -5
  4. data/lib/generators/nanoui/install_generator.rb +2 -6
  5. data/lib/generators/nanoui/templates/css/base/{_reset.css → 01_reset.css} +1 -1
  6. data/lib/generators/nanoui/templates/css/base/02_fonts.css +8 -0
  7. data/lib/generators/nanoui/templates/css/{tokens/_colors.css → base/03_colors.css} +1 -1
  8. data/lib/generators/nanoui/templates/css/{tokens/_typography.css → base/04_typography.css} +1 -1
  9. data/lib/generators/nanoui/templates/css/{tokens/_spacing.css → base/05_spacing.css} +1 -1
  10. data/lib/generators/nanoui/templates/css/{tokens/_radius.css → base/06_radius.css} +1 -1
  11. data/lib/generators/nanoui/templates/css/{tokens/_shadows.css → base/07_shadows.css} +1 -1
  12. data/lib/generators/nanoui/templates/css/{tokens/_transitions.css → base/08_transitions.css} +1 -1
  13. data/lib/generators/nanoui/templates/css/{tokens/_z-index.css → base/09_z-index.css} +1 -1
  14. data/lib/generators/nanoui/templates/css/base/{_globals.css → 10_globals.css} +2 -10
  15. data/lib/generators/nanoui/templates/css/components/{_accordion.css → accordion.css} +11 -22
  16. data/lib/generators/nanoui/templates/css/components/{_alert.css → alert.css} +15 -15
  17. data/lib/generators/nanoui/templates/css/components/{_badge.css → badge.css} +8 -8
  18. data/lib/generators/nanoui/templates/css/components/{_button.css → button.css} +23 -23
  19. data/lib/generators/nanoui/templates/css/components/{_card.css → card.css} +8 -8
  20. data/lib/generators/nanoui/templates/css/components/{_checkbox.css → checkbox.css} +11 -11
  21. data/lib/generators/nanoui/templates/css/components/{_dialog.css → dialog.css} +17 -19
  22. data/lib/generators/nanoui/templates/css/components/{_dropdown.css → dropdown.css} +12 -12
  23. data/lib/generators/nanoui/templates/css/components/{_input.css → input.css} +16 -19
  24. data/lib/generators/nanoui/templates/css/components/{_label.css → label.css} +2 -2
  25. data/lib/generators/nanoui/templates/css/components/{_progress.css → progress.css} +13 -16
  26. data/lib/generators/nanoui/templates/css/components/{_radio.css → radio.css} +13 -13
  27. data/lib/generators/nanoui/templates/css/components/{_select.css → select.css} +8 -8
  28. data/lib/generators/nanoui/templates/css/components/{_switch.css → switch.css} +7 -7
  29. data/lib/generators/nanoui/templates/css/components/{_table.css → table.css} +10 -10
  30. data/lib/generators/nanoui/templates/css/components/{_tabs.css → tabs.css} +8 -8
  31. data/lib/generators/nanoui/templates/css/components/{_toast.css → toast.css} +20 -20
  32. data/lib/generators/nanoui/templates/css/components/{_tooltip.css → tooltip.css} +14 -14
  33. data/lib/generators/nanoui/templates/css/nanoui.css +28 -29
  34. data/lib/generators/nanoui/templates/css/nanoui.install.css +10 -11
  35. data/lib/generators/nanoui/templates/js/controllers/dropdown_controller.js +1 -1
  36. data/lib/generators/nanoui/templates/views/components/_accordion.html.erb +5 -5
  37. data/lib/generators/nanoui/templates/views/components/_alert.html.erb +6 -6
  38. data/lib/generators/nanoui/templates/views/components/_badge.html.erb +1 -1
  39. data/lib/generators/nanoui/templates/views/components/_button.html.erb +2 -2
  40. data/lib/generators/nanoui/templates/views/components/_card.html.erb +7 -7
  41. data/lib/generators/nanoui/templates/views/components/_checkbox.html.erb +4 -4
  42. data/lib/generators/nanoui/templates/views/components/_dialog.html.erb +10 -10
  43. data/lib/generators/nanoui/templates/views/components/_dropdown.html.erb +9 -9
  44. data/lib/generators/nanoui/templates/views/components/_input.html.erb +6 -6
  45. data/lib/generators/nanoui/templates/views/components/_label.html.erb +2 -2
  46. data/lib/generators/nanoui/templates/views/components/_progress.html.erb +4 -4
  47. data/lib/generators/nanoui/templates/views/components/_radio_group.html.erb +6 -6
  48. data/lib/generators/nanoui/templates/views/components/_select.html.erb +6 -6
  49. data/lib/generators/nanoui/templates/views/components/_switch.html.erb +3 -3
  50. data/lib/generators/nanoui/templates/views/components/_table.html.erb +11 -11
  51. data/lib/generators/nanoui/templates/views/components/_tabs.html.erb +4 -4
  52. data/lib/generators/nanoui/templates/views/components/_toast.html.erb +7 -7
  53. data/lib/generators/nanoui/templates/views/components/_toast_container.html.erb +1 -1
  54. data/lib/generators/nanoui/templates/views/components/_tooltip.html.erb +3 -3
  55. data/lib/nanoui/version.rb +1 -1
  56. metadata +29 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c33ae0d2c94bdda9bddcf979a57177770c5c50f7ff1602d6744431402507f49d
4
- data.tar.gz: d8d0c324e74ed81eb1fd84f985a81414ee3c343c034824457d84ee1856fe7fc4
3
+ metadata.gz: e93a8fd3240f6ca51636ddf4607fa5b98d75ffd3d9d3d89f5a07e587ccf5dd41
4
+ data.tar.gz: 678d26f0b38587acf444cb685cd9ae3d6587f14868b515ca92ff019058f7c162
5
5
  SHA512:
6
- metadata.gz: b53749cc0036143533f008abf49da63c4a5de75d38b04958b196224461f0c962bcbfce352d18a584825bdf3bd3e119b54541597a5850b2bb3fc6b3aca8b29ec7
7
- data.tar.gz: 73b2f16489e7669236551edf07f873ab2f3053ce96b40771efb54f49aa169cc62a1d84d9ad0b55e766a50c0e0c3b31705d65a4ea5bdd14279a2d846ea06a6859
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 # Tokens, base, fonts
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 (tokens, base, components, Inter Variable font)
28
- cp -r lib/generators/nanoui/templates/css/ app/assets/stylesheets/nanoui/
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/_globals.css` still points to `url("../fonts/inter-variable.ttf")`
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="button button--primary" type="button">Save</button>
136
- <button class="button button--outline button--sm" type="button">Cancel</button>
137
- <button class="button button--primary" disabled>Disabled</button>
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
- | `tokens/_colors.css` | All colors (HSL), dark mode overrides |
481
- | `tokens/_typography.css` | Font families, sizes, weights, line heights |
482
- | `tokens/_spacing.css` | Spacing scale (0 to 16) |
483
- | `tokens/_radius.css` | Border radii (sm to full) |
484
- | `tokens/_shadows.css` | Box shadows (sm to xl) |
485
- | `tokens/_transitions.css` | Durations and easings |
486
- | `tokens/_z-index.css` | Z-index scale (dropdown to toast) |
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 `tokens/_colors.css`:
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/_#{name}.css",
63
- "app/assets/stylesheets/nanoui/components/_#{name}.css"
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/_#{name}.css\";" }.join("\n")
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, "_*.css")).map do |path|
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 (tokens, base styles, fonts)"
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/tokens/_colors.css"
44
+ say " app/assets/stylesheets/nanoui/base/03_colors.css"
49
45
  say ""
50
46
  end
51
47
  end
@@ -1,4 +1,4 @@
1
- /* base/_reset.css */
1
+ /* base/01_reset.css */
2
2
  *,
3
3
  *::before,
4
4
  *::after {
@@ -0,0 +1,8 @@
1
+ /* base/02_fonts.css */
2
+ @font-face {
3
+ font-family: "Inter";
4
+ font-weight: 100 900;
5
+ font-style: normal;
6
+ font-display: swap;
7
+ src: url("../fonts/inter-variable.ttf") format("truetype");
8
+ }
@@ -1,4 +1,4 @@
1
- /* tokens/_colors.css */
1
+ /* base/03_colors.css */
2
2
  :root {
3
3
  /* Base scale — Zinc-inspired neutral palette */
4
4
  --color-background: 0 0% 100%; /* white */
@@ -1,4 +1,4 @@
1
- /* tokens/_typography.css */
1
+ /* base/04_typography.css */
2
2
  :root {
3
3
  --font-sans: "Inter", system-ui, -apple-system, sans-serif;
4
4
  --font-mono: "JetBrains Mono", "Fira Code", monospace;
@@ -1,4 +1,4 @@
1
- /* tokens/_spacing.css */
1
+ /* base/05_spacing.css */
2
2
  :root {
3
3
  --space-0: 0;
4
4
  --space-0-5: 0.125rem; /* 2px */
@@ -1,4 +1,4 @@
1
- /* tokens/_radius.css */
1
+ /* base/06_radius.css */
2
2
  :root {
3
3
  --radius-none: 0;
4
4
  --radius-sm: 0.25rem; /* 4px */
@@ -1,4 +1,4 @@
1
- /* tokens/_shadows.css */
1
+ /* base/07_shadows.css */
2
2
  :root {
3
3
  --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
4
4
  --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
@@ -1,4 +1,4 @@
1
- /* tokens/_transitions.css */
1
+ /* base/08_transitions.css */
2
2
  :root {
3
3
  --duration-fast: 100ms;
4
4
  --duration-normal: 200ms;
@@ -1,4 +1,4 @@
1
- /* tokens/_z-index.css */
1
+ /* base/09_z-index.css */
2
2
  :root {
3
3
  --z-dropdown: 50;
4
4
  --z-sticky: 100;
@@ -1,12 +1,4 @@
1
- /* base/_globals.css */
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
- .accordion__trigger {
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;