nanoui 0.4.0 → 0.5.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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/README.md +130 -6
  4. data/lib/generators/nanoui/component_generator.rb +13 -6
  5. data/lib/generators/nanoui/templates/css/components/accordion.css +58 -58
  6. data/lib/generators/nanoui/templates/css/components/alert.css +56 -56
  7. data/lib/generators/nanoui/templates/css/components/avatar.css +88 -0
  8. data/lib/generators/nanoui/templates/css/components/badge.css +30 -30
  9. data/lib/generators/nanoui/templates/css/components/breadcrumb.css +54 -0
  10. data/lib/generators/nanoui/templates/css/components/button.css +136 -115
  11. data/lib/generators/nanoui/templates/css/components/card.css +35 -35
  12. data/lib/generators/nanoui/templates/css/components/checkbox.css +74 -72
  13. data/lib/generators/nanoui/templates/css/components/dialog.css +103 -103
  14. data/lib/generators/nanoui/templates/css/components/dropdown.css +71 -71
  15. data/lib/generators/nanoui/templates/css/components/input.css +72 -83
  16. data/lib/generators/nanoui/templates/css/components/label.css +11 -5
  17. data/lib/generators/nanoui/templates/css/components/navbar.css +128 -0
  18. data/lib/generators/nanoui/templates/css/components/progress.css +53 -47
  19. data/lib/generators/nanoui/templates/css/components/radio.css +73 -71
  20. data/lib/generators/nanoui/templates/css/components/select.css +49 -22
  21. data/lib/generators/nanoui/templates/css/components/sidebar.css +145 -0
  22. data/lib/generators/nanoui/templates/css/components/skeleton.css +49 -0
  23. data/lib/generators/nanoui/templates/css/components/switch.css +25 -25
  24. data/lib/generators/nanoui/templates/css/components/table.css +45 -39
  25. data/lib/generators/nanoui/templates/css/components/tabs.css +20 -20
  26. data/lib/generators/nanoui/templates/css/components/toast.css +70 -70
  27. data/lib/generators/nanoui/templates/css/components/tooltip.css +79 -72
  28. data/lib/generators/nanoui/templates/css/layout/container.css +6 -6
  29. data/lib/generators/nanoui/templates/js/controllers/navbar_controller.js +70 -0
  30. data/lib/generators/nanoui/templates/js/controllers/sidebar_controller.js +27 -0
  31. data/lib/nanoui/version.rb +1 -1
  32. metadata +9 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f766927e1424d01ab34dd6f17a48b877f19de856399f5cb2584e86b6cc5accad
4
- data.tar.gz: a09a0124675316288e9ac788c0207f035b379ecf305f388f9da619a82002aeae
3
+ metadata.gz: 82bc23f334e4806d1a963f7076b8ae2a91ccbd6cc29661313ccb183a390271e6
4
+ data.tar.gz: dc7f106ca2619cbeeb427f5adf5bd61f9dbe874a904cf3d8aba830935f1c7c23
5
5
  SHA512:
6
- metadata.gz: ce86b42ceaf868b5fcc626d2f7cabcce77bfe273636e78cca191adbf783473c1b92fa0e44de1e0c1d44360aa9095048d78a0f959fb287a7aca4a55d576ae7d53
7
- data.tar.gz: 50b79fafd8493e2981d864cce626b121096eebd24a0206c670496bdace202bc6d85196bedd235ca2963b612a9418775c444b55fed8f7ae92f723057e46212e52
6
+ metadata.gz: 86caab6ae5da7d790a717af769fbc5af29ab6ab9a0581a9fe5c1a4469171f48aef242af66d805dfebe03db9818b57a42a107b101312a7d1fa922176500e1ef28
7
+ data.tar.gz: f3b1f8bd33b51c66be3bc939302d7a7f3acc4d42272863e49aa336257409a61805e22f35ddb4a1787c17d4eff396a0cc4da0030cc239d3e0b499f55b343633c3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.0 (2026-03-21)
4
+
5
+ ### Added
6
+
7
+ - **Navbar** component — Responsive top navigation bar with mobile hamburger menu (CSS + Stimulus)
8
+ - **Sidebar** component — Collapsible sidebar navigation panel with groups and icons (CSS + Stimulus)
9
+ - **Breadcrumb** component — Navigation trail with separators (CSS only)
10
+ - **Avatar** component — Circular avatar with image/initials fallback and status indicator (CSS only)
11
+ - **Skeleton** component — Loading placeholder with shimmer animation (CSS only)
12
+ - New component groups: `navigation` (navbar, sidebar, breadcrumb) and `feedback` (avatar, skeleton)
13
+
14
+ ### Changed
15
+
16
+ - Refactored all CSS to use native CSS nesting for improved readability and maintainability
17
+ - Component count: 18 → 23
18
+ - Stimulus controllers: 7 → 9
19
+
20
+ ---
21
+
22
+ ## 0.4.0 (2026-03-15)
23
+
24
+ ### Added
25
+
26
+ - **Container** layout component with sm, md, lg sizes
27
+
28
+ ---
29
+
3
30
  ## 0.3.0 (2026-03-12)
4
31
 
5
32
  ### Breaking changes
data/README.md CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  Vanilla CSS + Stimulus component library for Rails. Zero runtime dependencies.
4
4
 
5
- 18 components. Semantic HTML. Accessible by default. No build step.
5
+ 23 components. Semantic HTML. Accessible by default. No build step.
6
6
 
7
- **[Documentation & Live Previews](https://chille1987.github.io/nanoui/)** — Browse all 18 components with interactive examples.
7
+ **[Documentation & Live Previews](https://chille1987.github.io/nanoui/)** — Browse all 23 components with interactive examples.
8
8
 
9
- ## What's New in v0.3.0
9
+ ## What's New in v0.5.0
10
10
 
11
- - **Native element styling** — Bare `<button>`, `<input>`, `<select>`, and `<label>` elements are styled out of the box. No `.nano-*` classes needed for default styling. Classes still work for variants.
12
- - **No @import needed** — Propshaft auto-loads all CSS files. Just run the generators and go.
13
- - **HTML-only components** — No ERB partials. Use plain HTML with CSS classes directly.
11
+ - **5 new components** — Navbar, Sidebar, Breadcrumb, Avatar, and Skeleton
12
+ - **Native CSS nesting** — All component CSS refactored to use native nesting for better readability
13
+ - **New component groups** — `navigation` (navbar, sidebar, breadcrumb) and `feedback` (avatar, skeleton)
14
14
 
15
15
  ## Installation
16
16
 
@@ -68,6 +68,8 @@ nanoui_toast_controller.js → data-controller="nanoui-toast"
68
68
  nanoui_tabs_controller.js → data-controller="nanoui-tabs"
69
69
  nanoui_accordion_controller.js → data-controller="nanoui-accordion"
70
70
  nanoui_switch_controller.js → data-controller="nanoui-switch"
71
+ nanoui_navbar_controller.js → data-controller="nanoui-navbar"
72
+ nanoui_sidebar_controller.js → data-controller="nanoui-sidebar"
71
73
  ```
72
74
 
73
75
  Or register manually:
@@ -464,6 +466,123 @@ Native `<progress>` element with custom styling.
464
466
 
465
467
  ---
466
468
 
469
+ ### Navigation
470
+
471
+ #### Navbar
472
+
473
+ Responsive top navigation bar with mobile hamburger menu.
474
+
475
+ ```html
476
+ <nav class="nano-navbar nano-navbar--sticky" data-controller="nanoui-navbar">
477
+ <a href="/" class="nano-navbar__brand">MyApp</a>
478
+ <ul class="nano-navbar__links" data-nanoui-navbar-target="links">
479
+ <li><a href="/dashboard" class="nano-navbar__link nano-navbar__link--active">Dashboard</a></li>
480
+ <li><a href="/projects" class="nano-navbar__link">Projects</a></li>
481
+ <li><a href="/settings" class="nano-navbar__link">Settings</a></li>
482
+ </ul>
483
+ <div class="nano-navbar__actions">
484
+ <button class="nano-btn--outline nano-btn--sm">Log out</button>
485
+ </div>
486
+ <button class="nano-navbar__toggle" data-action="nanoui-navbar#toggle"
487
+ data-nanoui-navbar-target="toggle" aria-label="Toggle menu">
488
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
489
+ <path d="M3 12h18M3 6h18M3 18h18"/>
490
+ </svg>
491
+ </button>
492
+ </nav>
493
+ ```
494
+
495
+ **Modifiers:** `--sticky`
496
+
497
+ #### Sidebar
498
+
499
+ Collapsible sidebar navigation panel with groups and icons.
500
+
501
+ ```html
502
+ <aside class="nano-sidebar" data-controller="nanoui-sidebar">
503
+ <div class="nano-sidebar__header">
504
+ <span>MyApp</span>
505
+ <button class="nano-sidebar__toggle" data-action="nanoui-sidebar#toggle"
506
+ data-nanoui-sidebar-target="toggle">⟨</button>
507
+ </div>
508
+ <nav class="nano-sidebar__nav">
509
+ <div class="nano-sidebar__group">
510
+ <span class="nano-sidebar__group-label">Main</span>
511
+ <a href="/dashboard" class="nano-sidebar__item nano-sidebar__item--active">
512
+ <svg><!-- icon --></svg> <span>Dashboard</span>
513
+ </a>
514
+ <a href="/projects" class="nano-sidebar__item">
515
+ <svg><!-- icon --></svg> <span>Projects</span>
516
+ </a>
517
+ </div>
518
+ </nav>
519
+ <div class="nano-sidebar__footer">
520
+ <a href="/settings" class="nano-sidebar__item">
521
+ <svg><!-- icon --></svg> <span>Settings</span>
522
+ </a>
523
+ </div>
524
+ </aside>
525
+ ```
526
+
527
+ #### Breadcrumb
528
+
529
+ Navigation trail with separators.
530
+
531
+ ```html
532
+ <nav class="nano-breadcrumb" aria-label="Breadcrumb">
533
+ <ol class="nano-breadcrumb__list">
534
+ <li class="nano-breadcrumb__item">
535
+ <a href="/" class="nano-breadcrumb__link">Home</a>
536
+ <span class="nano-breadcrumb__separator" aria-hidden="true"></span>
537
+ </li>
538
+ <li class="nano-breadcrumb__item">
539
+ <a href="/projects" class="nano-breadcrumb__link">Projects</a>
540
+ <span class="nano-breadcrumb__separator" aria-hidden="true"></span>
541
+ </li>
542
+ <li class="nano-breadcrumb__item">
543
+ <span class="nano-breadcrumb__link" aria-current="page">Settings</span>
544
+ </li>
545
+ </ol>
546
+ </nav>
547
+ ```
548
+
549
+ ---
550
+
551
+ ### Feedback
552
+
553
+ #### Avatar
554
+
555
+ Circular avatar with image or initials fallback and optional status indicator.
556
+
557
+ ```html
558
+ <div class="nano-avatar">
559
+ <img src="/avatar.jpg" alt="Jane Doe" class="nano-avatar__image">
560
+ <span class="nano-avatar__status nano-avatar__status--online"></span>
561
+ </div>
562
+
563
+ <div class="nano-avatar nano-avatar--lg">
564
+ <span class="nano-avatar__fallback">JD</span>
565
+ </div>
566
+ ```
567
+
568
+ **Sizes:** sm (32px), default (40px), lg (48px), xl (64px)
569
+ **Status:** `--online`, `--offline`, `--busy`
570
+
571
+ #### Skeleton
572
+
573
+ Loading placeholder with shimmer animation.
574
+
575
+ ```html
576
+ <div class="nano-skeleton" style="width: 200px;"></div>
577
+ <div class="nano-skeleton nano-skeleton--text" style="width: 80%;"></div>
578
+ <div class="nano-skeleton nano-skeleton--circle"></div>
579
+ <div class="nano-skeleton nano-skeleton--card"></div>
580
+ ```
581
+
582
+ **Variants:** default (1rem line), `--text` (0.75rem), `--circle` (40px), `--card` (200px)
583
+
584
+ ---
585
+
467
586
  ## Design Tokens
468
587
 
469
588
  Customize your theme by editing the CSS custom properties:
@@ -498,12 +617,17 @@ All components update automatically, including dark mode.
498
617
  | **Forms** | Checkbox, Radio, Switch, Select |
499
618
  | **Overlays** | Dialog, Dropdown, Tooltip, Toast |
500
619
  | **Data** | Table, Tabs, Accordion, Progress |
620
+ | **Navigation** | Navbar, Sidebar, Breadcrumb |
621
+ | **Feedback** | Avatar, Skeleton |
622
+ | **Layout** | Container |
501
623
 
502
624
  ```bash
503
625
  rails generate nanoui:component --group essentials
504
626
  rails generate nanoui:component --group forms
505
627
  rails generate nanoui:component --group overlays
506
628
  rails generate nanoui:component --group data
629
+ rails generate nanoui:component --group navigation
630
+ rails generate nanoui:component --group feedback
507
631
  rails generate nanoui:component --all
508
632
  ```
509
633
 
@@ -22,6 +22,11 @@ module Nanoui
22
22
  tabs
23
23
  accordion
24
24
  progress
25
+ navbar
26
+ sidebar
27
+ breadcrumb
28
+ avatar
29
+ skeleton
25
30
  container
26
31
  ].freeze
27
32
 
@@ -33,14 +38,16 @@ module Nanoui
33
38
  class_option :all, type: :boolean, default: false, desc: "Install all components"
34
39
 
35
40
  GROUPS = {
36
- "essentials" => %w[button input label card badge alert],
37
- "forms" => %w[button input label checkbox radio switch select badge alert],
38
- "overlays" => %w[dialog dropdown tooltip toast],
39
- "data" => %w[table tabs accordion progress],
40
- "layout" => %w[container],
41
+ "essentials" => %w[button input label card badge alert],
42
+ "forms" => %w[button input label checkbox radio switch select badge alert],
43
+ "overlays" => %w[dialog dropdown tooltip toast],
44
+ "data" => %w[table tabs accordion progress],
45
+ "navigation" => %w[navbar sidebar breadcrumb],
46
+ "feedback" => %w[avatar skeleton],
47
+ "layout" => %w[container],
41
48
  }.freeze
42
49
 
43
- STIMULUS_COMPONENTS = %w[dialog dropdown tooltip toast tabs accordion switch].freeze
50
+ STIMULUS_COMPONENTS = %w[dialog dropdown tooltip toast tabs accordion switch navbar sidebar].freeze
44
51
 
45
52
  def resolve_components
46
53
  @resolved = if options[:all]
@@ -1,63 +1,63 @@
1
1
  .nano-accordion {
2
2
  border: 1px solid hsl(var(--color-border));
3
3
  border-radius: var(--radius-lg);
4
- }
5
-
6
- .nano-accordion__item {
7
- border-bottom: 1px solid hsl(var(--color-border));
8
- }
9
-
10
- .nano-accordion__item:first-child {
11
- border-top-left-radius: var(--radius-lg);
12
- border-top-right-radius: var(--radius-lg);
13
- }
14
-
15
- .nano-accordion__item:last-child {
16
- border-bottom: none;
17
- border-bottom-left-radius: var(--radius-lg);
18
- border-bottom-right-radius: var(--radius-lg);
19
- }
20
-
21
- .nano-accordion__trigger {
22
- list-style: none;
23
- display: flex;
24
- align-items: center;
25
- justify-content: space-between;
26
- width: 100%;
27
- padding: var(--space-4);
28
- font-size: var(--text-sm);
29
- font-weight: var(--font-medium);
30
- color: hsl(var(--color-foreground));
31
- cursor: pointer;
32
- transition: background-color var(--duration-fast) var(--ease-default);
33
- }
34
-
35
- .nano-accordion__trigger:hover {
36
- background-color: hsl(var(--color-muted) / 0.5);
37
- }
38
-
39
- .nano-accordion__trigger:focus-visible {
40
- outline: 2px solid hsl(var(--color-ring));
41
- outline-offset: -2px;
42
- }
43
-
44
- .nano-accordion__icon {
45
- width: 1rem;
46
- height: 1rem;
47
- flex-shrink: 0;
48
- color: hsl(var(--color-muted-foreground));
49
- transition: transform var(--duration-normal) var(--ease-default);
50
- }
51
-
52
- .nano-accordion__item[open] .nano-accordion__icon {
53
- transform: rotate(180deg);
54
- }
55
4
 
56
- .nano-accordion__content {
57
- padding: 0 var(--space-4) var(--space-4);
58
- font-size: var(--text-sm);
59
- line-height: var(--leading-normal);
60
- color: hsl(var(--color-muted-foreground));
61
- display: grid;
62
- grid-template-rows: 1fr;
5
+ .nano-accordion__item {
6
+ border-bottom: 1px solid hsl(var(--color-border));
7
+
8
+ &:first-child {
9
+ border-top-left-radius: var(--radius-lg);
10
+ border-top-right-radius: var(--radius-lg);
11
+ }
12
+
13
+ &:last-child {
14
+ border-bottom: none;
15
+ border-bottom-left-radius: var(--radius-lg);
16
+ border-bottom-right-radius: var(--radius-lg);
17
+ }
18
+
19
+ &[open] .nano-accordion__icon {
20
+ transform: rotate(180deg);
21
+ }
22
+ }
23
+
24
+ .nano-accordion__trigger {
25
+ list-style: none;
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: space-between;
29
+ width: 100%;
30
+ padding: var(--space-4);
31
+ font-size: var(--text-sm);
32
+ font-weight: var(--font-medium);
33
+ color: hsl(var(--color-foreground));
34
+ cursor: pointer;
35
+ transition: background-color var(--duration-fast) var(--ease-default);
36
+
37
+ &:hover {
38
+ background-color: hsl(var(--color-muted) / 0.5);
39
+ }
40
+
41
+ &:focus-visible {
42
+ outline: 2px solid hsl(var(--color-ring));
43
+ outline-offset: -2px;
44
+ }
45
+ }
46
+
47
+ .nano-accordion__icon {
48
+ width: 1rem;
49
+ height: 1rem;
50
+ flex-shrink: 0;
51
+ color: hsl(var(--color-muted-foreground));
52
+ transition: transform var(--duration-normal) var(--ease-default);
53
+ }
54
+
55
+ .nano-accordion__content {
56
+ padding: 0 var(--space-4) var(--space-4);
57
+ font-size: var(--text-sm);
58
+ line-height: var(--leading-normal);
59
+ color: hsl(var(--color-muted-foreground));
60
+ display: grid;
61
+ grid-template-rows: 1fr;
62
+ }
63
63
  }
@@ -5,74 +5,74 @@
5
5
  border-radius: var(--radius-lg);
6
6
  border: 1px solid hsl(var(--color-border));
7
7
  background-color: hsl(var(--color-background));
8
- }
9
8
 
10
- .nano-alert__icon {
11
- width: 1rem;
12
- height: 1rem;
13
- flex-shrink: 0;
14
- margin-top: var(--space-0-5);
15
- }
9
+ .nano-alert__icon {
10
+ width: 1rem;
11
+ height: 1rem;
12
+ flex-shrink: 0;
13
+ margin-top: var(--space-0-5);
16
14
 
17
- .nano-alert__icon svg {
18
- width: 1rem;
19
- height: 1rem;
20
- }
15
+ svg {
16
+ width: 1rem;
17
+ height: 1rem;
18
+ }
19
+ }
21
20
 
22
- .nano-alert__content {
23
- display: flex;
24
- flex-direction: column;
25
- gap: var(--space-1);
26
- }
21
+ .nano-alert__content {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: var(--space-1);
25
+ }
27
26
 
28
- .nano-alert__title {
29
- font-size: var(--text-sm);
30
- font-weight: var(--font-semibold);
31
- line-height: var(--leading-normal);
32
- color: hsl(var(--color-foreground));
33
- }
27
+ .nano-alert__title {
28
+ font-size: var(--text-sm);
29
+ font-weight: var(--font-semibold);
30
+ line-height: var(--leading-normal);
31
+ color: hsl(var(--color-foreground));
32
+ }
34
33
 
35
- .nano-alert__description {
36
- font-size: var(--text-sm);
37
- line-height: var(--leading-normal);
38
- color: hsl(var(--color-foreground));
39
- }
34
+ .nano-alert__description {
35
+ font-size: var(--text-sm);
36
+ line-height: var(--leading-normal);
37
+ color: hsl(var(--color-foreground));
38
+ }
40
39
 
41
- .nano-alert--destructive {
42
- border-color: hsl(var(--color-destructive) / 0.5);
43
- background-color: hsl(var(--color-destructive) / 0.08);
44
- }
40
+ &--destructive {
41
+ border-color: hsl(var(--color-destructive) / 0.5);
42
+ background-color: hsl(var(--color-destructive) / 0.08);
45
43
 
46
- .nano-alert--destructive .nano-alert__icon {
47
- color: hsl(var(--color-destructive));
48
- }
44
+ .nano-alert__icon {
45
+ color: hsl(var(--color-destructive));
46
+ }
49
47
 
50
- .nano-alert--destructive .nano-alert__title {
51
- color: hsl(var(--color-destructive));
52
- }
48
+ .nano-alert__title {
49
+ color: hsl(var(--color-destructive));
50
+ }
51
+ }
53
52
 
54
- .nano-alert--success {
55
- border-color: hsl(var(--color-success) / 0.5);
56
- background-color: hsl(var(--color-success) / 0.08);
57
- }
53
+ &--success {
54
+ border-color: hsl(var(--color-success) / 0.5);
55
+ background-color: hsl(var(--color-success) / 0.08);
58
56
 
59
- .nano-alert--success .nano-alert__icon {
60
- color: hsl(var(--color-success));
61
- }
57
+ .nano-alert__icon {
58
+ color: hsl(var(--color-success));
59
+ }
62
60
 
63
- .nano-alert--success .nano-alert__title {
64
- color: hsl(var(--color-success));
65
- }
61
+ .nano-alert__title {
62
+ color: hsl(var(--color-success));
63
+ }
64
+ }
66
65
 
67
- .nano-alert--warning {
68
- border-color: hsl(var(--color-warning) / 0.5);
69
- background-color: hsl(var(--color-warning) / 0.08);
70
- }
66
+ &--warning {
67
+ border-color: hsl(var(--color-warning) / 0.5);
68
+ background-color: hsl(var(--color-warning) / 0.08);
71
69
 
72
- .nano-alert--warning .nano-alert__icon {
73
- color: hsl(var(--color-warning));
74
- }
70
+ .nano-alert__icon {
71
+ color: hsl(var(--color-warning));
72
+ }
75
73
 
76
- .nano-alert--warning .nano-alert__title {
77
- color: hsl(var(--color-warning));
74
+ .nano-alert__title {
75
+ color: hsl(var(--color-warning));
76
+ }
77
+ }
78
78
  }
@@ -0,0 +1,88 @@
1
+ .nano-avatar {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ width: 40px;
6
+ height: 40px;
7
+ border-radius: var(--radius-full);
8
+ overflow: hidden;
9
+ background-color: hsl(var(--color-muted));
10
+ position: relative;
11
+ flex-shrink: 0;
12
+
13
+ .nano-avatar__image {
14
+ width: 100%;
15
+ height: 100%;
16
+ object-fit: cover;
17
+ }
18
+
19
+ .nano-avatar__fallback {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ width: 100%;
24
+ height: 100%;
25
+ font-size: var(--text-sm);
26
+ font-weight: var(--font-medium);
27
+ color: hsl(var(--color-muted-foreground));
28
+ }
29
+
30
+ .nano-avatar__status {
31
+ position: absolute;
32
+ bottom: 0;
33
+ right: 0;
34
+ width: 10px;
35
+ height: 10px;
36
+ border: 2px solid hsl(var(--color-background));
37
+ border-radius: var(--radius-full);
38
+
39
+ &--online {
40
+ background-color: hsl(var(--color-success));
41
+ }
42
+
43
+ &--offline {
44
+ background-color: hsl(var(--color-muted-foreground));
45
+ }
46
+
47
+ &--busy {
48
+ background-color: hsl(var(--color-destructive));
49
+ }
50
+ }
51
+
52
+ &--sm {
53
+ width: 32px;
54
+ height: 32px;
55
+
56
+ .nano-avatar__fallback {
57
+ font-size: var(--text-xs);
58
+ }
59
+
60
+ .nano-avatar__status {
61
+ width: 8px;
62
+ height: 8px;
63
+ }
64
+ }
65
+
66
+ &--lg {
67
+ width: 48px;
68
+ height: 48px;
69
+
70
+ .nano-avatar__fallback {
71
+ font-size: var(--text-base);
72
+ }
73
+ }
74
+
75
+ &--xl {
76
+ width: 64px;
77
+ height: 64px;
78
+
79
+ .nano-avatar__fallback {
80
+ font-size: var(--text-lg);
81
+ }
82
+
83
+ .nano-avatar__status {
84
+ width: 12px;
85
+ height: 12px;
86
+ }
87
+ }
88
+ }
@@ -8,41 +8,41 @@
8
8
  line-height: var(--leading-none);
9
9
  padding: var(--space-1) var(--space-2-5);
10
10
  white-space: nowrap;
11
- }
12
11
 
13
- .nano-badge--primary {
14
- background-color: hsl(var(--color-primary));
15
- color: hsl(var(--color-primary-foreground));
16
- }
12
+ &--primary {
13
+ background-color: hsl(var(--color-primary));
14
+ color: hsl(var(--color-primary-foreground));
15
+ }
17
16
 
18
- .nano-badge--secondary {
19
- background-color: hsl(var(--color-secondary));
20
- color: hsl(var(--color-secondary-foreground));
21
- }
17
+ &--secondary {
18
+ background-color: hsl(var(--color-secondary));
19
+ color: hsl(var(--color-secondary-foreground));
20
+ }
22
21
 
23
- .nano-badge--destructive {
24
- background-color: hsl(var(--color-destructive));
25
- color: hsl(var(--color-destructive-foreground));
26
- }
22
+ &--destructive {
23
+ background-color: hsl(var(--color-destructive));
24
+ color: hsl(var(--color-destructive-foreground));
25
+ }
27
26
 
28
- .nano-badge--outline {
29
- background-color: transparent;
30
- border: 1px solid hsl(var(--color-border));
31
- color: hsl(var(--color-foreground));
32
- }
27
+ &--outline {
28
+ background-color: transparent;
29
+ border: 1px solid hsl(var(--color-border));
30
+ color: hsl(var(--color-foreground));
31
+ }
33
32
 
34
- .nano-badge--success {
35
- background-color: hsl(var(--color-success));
36
- color: hsl(var(--color-success-foreground));
37
- }
33
+ &--success {
34
+ background-color: hsl(var(--color-success));
35
+ color: hsl(var(--color-success-foreground));
36
+ }
38
37
 
39
- .nano-badge--warning {
40
- background-color: hsl(var(--color-warning));
41
- color: hsl(var(--color-warning-foreground));
42
- }
38
+ &--warning {
39
+ background-color: hsl(var(--color-warning));
40
+ color: hsl(var(--color-warning-foreground));
41
+ }
43
42
 
44
- .nano-badge svg {
45
- width: 0.75rem;
46
- height: 0.75rem;
47
- flex-shrink: 0;
43
+ svg {
44
+ width: 0.75rem;
45
+ height: 0.75rem;
46
+ flex-shrink: 0;
47
+ }
48
48
  }