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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/README.md +130 -6
- data/lib/generators/nanoui/component_generator.rb +13 -6
- data/lib/generators/nanoui/templates/css/components/accordion.css +58 -58
- data/lib/generators/nanoui/templates/css/components/alert.css +56 -56
- data/lib/generators/nanoui/templates/css/components/avatar.css +88 -0
- data/lib/generators/nanoui/templates/css/components/badge.css +30 -30
- data/lib/generators/nanoui/templates/css/components/breadcrumb.css +54 -0
- data/lib/generators/nanoui/templates/css/components/button.css +136 -115
- data/lib/generators/nanoui/templates/css/components/card.css +35 -35
- data/lib/generators/nanoui/templates/css/components/checkbox.css +74 -72
- data/lib/generators/nanoui/templates/css/components/dialog.css +103 -103
- data/lib/generators/nanoui/templates/css/components/dropdown.css +71 -71
- data/lib/generators/nanoui/templates/css/components/input.css +72 -83
- data/lib/generators/nanoui/templates/css/components/label.css +11 -5
- data/lib/generators/nanoui/templates/css/components/navbar.css +128 -0
- data/lib/generators/nanoui/templates/css/components/progress.css +53 -47
- data/lib/generators/nanoui/templates/css/components/radio.css +73 -71
- data/lib/generators/nanoui/templates/css/components/select.css +49 -22
- data/lib/generators/nanoui/templates/css/components/sidebar.css +145 -0
- data/lib/generators/nanoui/templates/css/components/skeleton.css +49 -0
- data/lib/generators/nanoui/templates/css/components/switch.css +25 -25
- data/lib/generators/nanoui/templates/css/components/table.css +45 -39
- data/lib/generators/nanoui/templates/css/components/tabs.css +20 -20
- data/lib/generators/nanoui/templates/css/components/toast.css +70 -70
- data/lib/generators/nanoui/templates/css/components/tooltip.css +79 -72
- data/lib/generators/nanoui/templates/css/layout/container.css +6 -6
- data/lib/generators/nanoui/templates/js/controllers/navbar_controller.js +70 -0
- data/lib/generators/nanoui/templates/js/controllers/sidebar_controller.js +27 -0
- data/lib/nanoui/version.rb +1 -1
- metadata +9 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 82bc23f334e4806d1a963f7076b8ae2a91ccbd6cc29661313ccb183a390271e6
|
|
4
|
+
data.tar.gz: dc7f106ca2619cbeeb427f5adf5bd61f9dbe874a904cf3d8aba830935f1c7c23
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
5
|
+
23 components. Semantic HTML. Accessible by default. No build step.
|
|
6
6
|
|
|
7
|
-
**[Documentation & Live Previews](https://chille1987.github.io/nanoui/)** — Browse all
|
|
7
|
+
**[Documentation & Live Previews](https://chille1987.github.io/nanoui/)** — Browse all 23 components with interactive examples.
|
|
8
8
|
|
|
9
|
-
## What's New in v0.
|
|
9
|
+
## What's New in v0.5.0
|
|
10
10
|
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
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"
|
|
37
|
-
"forms"
|
|
38
|
-
"overlays"
|
|
39
|
-
"data"
|
|
40
|
-
"
|
|
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-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
15
|
+
svg {
|
|
16
|
+
width: 1rem;
|
|
17
|
+
height: 1rem;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
21
20
|
|
|
22
|
-
.nano-alert__content {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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-
|
|
47
|
-
|
|
48
|
-
}
|
|
44
|
+
.nano-alert__icon {
|
|
45
|
+
color: hsl(var(--color-destructive));
|
|
46
|
+
}
|
|
49
47
|
|
|
50
|
-
.nano-
|
|
51
|
-
|
|
52
|
-
}
|
|
48
|
+
.nano-alert__title {
|
|
49
|
+
color: hsl(var(--color-destructive));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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-
|
|
60
|
-
|
|
61
|
-
}
|
|
57
|
+
.nano-alert__icon {
|
|
58
|
+
color: hsl(var(--color-success));
|
|
59
|
+
}
|
|
62
60
|
|
|
63
|
-
.nano-
|
|
64
|
-
|
|
65
|
-
}
|
|
61
|
+
.nano-alert__title {
|
|
62
|
+
color: hsl(var(--color-success));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
66
65
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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-
|
|
73
|
-
|
|
74
|
-
}
|
|
70
|
+
.nano-alert__icon {
|
|
71
|
+
color: hsl(var(--color-warning));
|
|
72
|
+
}
|
|
75
73
|
|
|
76
|
-
.nano-
|
|
77
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
12
|
+
&--primary {
|
|
13
|
+
background-color: hsl(var(--color-primary));
|
|
14
|
+
color: hsl(var(--color-primary-foreground));
|
|
15
|
+
}
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
17
|
+
&--secondary {
|
|
18
|
+
background-color: hsl(var(--color-secondary));
|
|
19
|
+
color: hsl(var(--color-secondary-foreground));
|
|
20
|
+
}
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
22
|
+
&--destructive {
|
|
23
|
+
background-color: hsl(var(--color-destructive));
|
|
24
|
+
color: hsl(var(--color-destructive-foreground));
|
|
25
|
+
}
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
33
|
+
&--success {
|
|
34
|
+
background-color: hsl(var(--color-success));
|
|
35
|
+
color: hsl(var(--color-success-foreground));
|
|
36
|
+
}
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
38
|
+
&--warning {
|
|
39
|
+
background-color: hsl(var(--color-warning));
|
|
40
|
+
color: hsl(var(--color-warning-foreground));
|
|
41
|
+
}
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
svg {
|
|
44
|
+
width: 0.75rem;
|
|
45
|
+
height: 0.75rem;
|
|
46
|
+
flex-shrink: 0;
|
|
47
|
+
}
|
|
48
48
|
}
|