nanoui 0.4.0 → 0.6.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -0
  3. data/README.md +353 -15
  4. data/lib/generators/nanoui/component_generator.rb +49 -14
  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/checklist.css +133 -0
  14. data/lib/generators/nanoui/templates/css/components/code.css +80 -0
  15. data/lib/generators/nanoui/templates/css/components/copy.css +71 -0
  16. data/lib/generators/nanoui/templates/css/components/dialog.css +103 -103
  17. data/lib/generators/nanoui/templates/css/components/dropdown.css +71 -71
  18. data/lib/generators/nanoui/templates/css/components/empty.css +68 -0
  19. data/lib/generators/nanoui/templates/css/components/input.css +72 -83
  20. data/lib/generators/nanoui/templates/css/components/label.css +11 -5
  21. data/lib/generators/nanoui/templates/css/components/navbar.css +128 -0
  22. data/lib/generators/nanoui/templates/css/components/progress.css +53 -47
  23. data/lib/generators/nanoui/templates/css/components/radio.css +73 -71
  24. data/lib/generators/nanoui/templates/css/components/select.css +49 -22
  25. data/lib/generators/nanoui/templates/css/components/sidebar.css +145 -0
  26. data/lib/generators/nanoui/templates/css/components/skeleton.css +49 -0
  27. data/lib/generators/nanoui/templates/css/components/stat.css +91 -0
  28. data/lib/generators/nanoui/templates/css/components/switch.css +25 -25
  29. data/lib/generators/nanoui/templates/css/components/table.css +169 -29
  30. data/lib/generators/nanoui/templates/css/components/tabs.css +20 -20
  31. data/lib/generators/nanoui/templates/css/components/timeline.css +141 -0
  32. data/lib/generators/nanoui/templates/css/components/toast.css +119 -68
  33. data/lib/generators/nanoui/templates/css/components/tooltip.css +79 -72
  34. data/lib/generators/nanoui/templates/css/components/upload.css +161 -0
  35. data/lib/generators/nanoui/templates/css/layout/container.css +6 -6
  36. data/lib/generators/nanoui/templates/js/controllers/copy_controller.js +64 -0
  37. data/lib/generators/nanoui/templates/js/controllers/data_table_controller.js +75 -0
  38. data/lib/generators/nanoui/templates/js/controllers/navbar_controller.js +70 -0
  39. data/lib/generators/nanoui/templates/js/controllers/sidebar_controller.js +27 -0
  40. data/lib/generators/nanoui/templates/js/controllers/upload_controller.js +137 -0
  41. data/lib/nanoui/version.rb +1 -1
  42. metadata +47 -2
@@ -1,86 +1,88 @@
1
1
  .nano-checkbox {
2
2
  position: relative;
3
3
  display: inline-flex;
4
- }
5
4
 
6
- .nano-checkbox__input {
7
- position: absolute;
8
- width: 1px;
9
- height: 1px;
10
- padding: 0;
11
- margin: -1px;
12
- overflow: hidden;
13
- clip: rect(0, 0, 0, 0);
14
- white-space: nowrap;
15
- border-width: 0;
16
- }
5
+ .nano-checkbox__input {
6
+ position: absolute;
7
+ width: 1px;
8
+ height: 1px;
9
+ padding: 0;
10
+ margin: -1px;
11
+ overflow: hidden;
12
+ clip: rect(0, 0, 0, 0);
13
+ white-space: nowrap;
14
+ border-width: 0;
17
15
 
18
- .nano-checkbox__label {
19
- display: inline-flex;
20
- align-items: center;
21
- position: relative;
22
- gap: var(--space-2);
23
- min-height: 1.125rem;
24
- cursor: pointer;
25
- user-select: none;
26
- font-size: var(--text-sm);
27
- line-height: var(--leading-normal);
28
- color: hsl(var(--color-foreground));
29
- }
16
+ &:checked + .nano-checkbox__label::before {
17
+ background-color: hsl(var(--color-primary));
18
+ border-color: hsl(var(--color-primary));
19
+ }
30
20
 
31
- .nano-checkbox__label::before {
32
- content: "";
33
- display: block;
34
- width: 1.125rem;
35
- height: 1.125rem;
36
- flex-shrink: 0;
37
- border: 1.5px solid hsl(var(--color-input));
38
- border-radius: var(--radius-sm);
39
- background-color: hsl(var(--color-background));
40
- transition: background-color var(--duration-fast) var(--ease-default),
41
- border-color var(--duration-fast) var(--ease-default);
42
- }
21
+ &:checked + .nano-checkbox__label::after {
22
+ opacity: 1;
23
+ }
43
24
 
44
- .nano-checkbox__label::after {
45
- content: "";
46
- position: absolute;
47
- left: 0;
48
- top: 50%;
49
- width: 1.125rem;
50
- height: 1.125rem;
51
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
52
- background-size: 0.75rem;
53
- background-repeat: no-repeat;
54
- background-position: center;
55
- transform: translateY(-50%);
56
- opacity: 0;
57
- transition: opacity var(--duration-fast) var(--ease-default);
58
- }
25
+ &:focus-visible + .nano-checkbox__label::before {
26
+ outline: 2px solid hsl(var(--color-ring));
27
+ outline-offset: 2px;
28
+ }
59
29
 
60
- .nano-checkbox__input:checked + .nano-checkbox__label::before {
61
- background-color: hsl(var(--color-primary));
62
- border-color: hsl(var(--color-primary));
63
- }
30
+ &:disabled + .nano-checkbox__label {
31
+ opacity: 0.5;
32
+ cursor: not-allowed;
33
+ }
34
+ }
64
35
 
65
- .nano-checkbox__input:checked + .nano-checkbox__label::after {
66
- opacity: 1;
67
- }
36
+ .nano-checkbox__label {
37
+ display: inline-flex;
38
+ align-items: center;
39
+ position: relative;
40
+ gap: var(--space-2);
41
+ min-height: 1.125rem;
42
+ cursor: pointer;
43
+ user-select: none;
44
+ font-size: var(--text-sm);
45
+ line-height: var(--leading-normal);
46
+ color: hsl(var(--color-foreground));
68
47
 
69
- .nano-checkbox__input:focus-visible + .nano-checkbox__label::before {
70
- outline: 2px solid hsl(var(--color-ring));
71
- outline-offset: 2px;
72
- }
48
+ &::before {
49
+ content: "";
50
+ display: block;
51
+ width: 1.125rem;
52
+ height: 1.125rem;
53
+ flex-shrink: 0;
54
+ border: 1.5px solid hsl(var(--color-input));
55
+ border-radius: var(--radius-sm);
56
+ background-color: hsl(var(--color-background));
57
+ transition: background-color var(--duration-fast) var(--ease-default),
58
+ border-color var(--duration-fast) var(--ease-default);
59
+ }
73
60
 
74
- .nano-checkbox__input:disabled + .nano-checkbox__label {
75
- opacity: 0.5;
76
- cursor: not-allowed;
77
- }
61
+ &::after {
62
+ content: "";
63
+ position: absolute;
64
+ left: 0;
65
+ top: 50%;
66
+ width: 1.125rem;
67
+ height: 1.125rem;
68
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
69
+ background-size: 0.75rem;
70
+ background-repeat: no-repeat;
71
+ background-position: center;
72
+ transform: translateY(-50%);
73
+ opacity: 0;
74
+ transition: opacity var(--duration-fast) var(--ease-default);
75
+ }
76
+ }
78
77
 
79
- .nano-checkbox--error .nano-checkbox__label::before {
80
- border-color: hsl(var(--color-destructive));
81
- }
78
+ &--error {
79
+ .nano-checkbox__label::before {
80
+ border-color: hsl(var(--color-destructive));
81
+ }
82
82
 
83
- .nano-checkbox--error .nano-checkbox__input:checked + .nano-checkbox__label::before {
84
- background-color: hsl(var(--color-destructive));
85
- border-color: hsl(var(--color-destructive));
83
+ .nano-checkbox__input:checked + .nano-checkbox__label::before {
84
+ background-color: hsl(var(--color-destructive));
85
+ border-color: hsl(var(--color-destructive));
86
+ }
87
+ }
86
88
  }
@@ -0,0 +1,133 @@
1
+ .nano-checklist {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--space-2);
5
+
6
+ .nano-checklist__summary {
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: space-between;
10
+ gap: var(--space-3);
11
+ padding: var(--space-3) var(--space-4);
12
+ background-color: hsl(var(--color-muted));
13
+ border-radius: var(--radius-md);
14
+ font-size: var(--text-sm);
15
+ color: hsl(var(--color-muted-foreground));
16
+ }
17
+
18
+ .nano-checklist__count {
19
+ font-weight: var(--font-semibold);
20
+ color: hsl(var(--color-foreground));
21
+ }
22
+
23
+ .nano-checklist__bar {
24
+ flex: 1;
25
+ height: 0.375rem;
26
+ background-color: hsl(var(--color-background));
27
+ border-radius: var(--radius-full);
28
+ overflow: hidden;
29
+ }
30
+
31
+ .nano-checklist__bar-fill {
32
+ display: block;
33
+ height: 100%;
34
+ width: var(--nano-checklist-progress, 0%);
35
+ background-color: hsl(var(--color-primary));
36
+ border-radius: var(--radius-full);
37
+ transition: width var(--duration-slow) var(--ease-default);
38
+ }
39
+
40
+ .nano-checklist__item {
41
+ display: flex;
42
+ gap: var(--space-3);
43
+ padding: var(--space-4);
44
+ border: 1px solid hsl(var(--color-border));
45
+ border-radius: var(--radius-md);
46
+ background-color: hsl(var(--color-card));
47
+ transition: border-color var(--duration-fast) var(--ease-default),
48
+ background-color var(--duration-fast) var(--ease-default);
49
+
50
+ &--current {
51
+ border-color: hsl(var(--color-primary) / 0.5);
52
+ background-color: hsl(var(--color-primary) / 0.04);
53
+ }
54
+
55
+ &--done {
56
+ border-color: hsl(var(--color-success) / 0.4);
57
+ background-color: hsl(var(--color-success) / 0.04);
58
+
59
+ .nano-checklist__title {
60
+ color: hsl(var(--color-muted-foreground));
61
+ }
62
+ }
63
+ }
64
+
65
+ .nano-checklist__indicator {
66
+ display: inline-flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ flex-shrink: 0;
70
+ width: 1.75rem;
71
+ height: 1.75rem;
72
+ margin-top: var(--space-0-5);
73
+ border-radius: var(--radius-full);
74
+ border: 2px solid hsl(var(--color-border));
75
+ background-color: hsl(var(--color-background));
76
+ font-size: var(--text-xs);
77
+ font-weight: var(--font-semibold);
78
+ color: hsl(var(--color-muted-foreground));
79
+
80
+ svg {
81
+ width: 0.875rem;
82
+ height: 0.875rem;
83
+ }
84
+ }
85
+
86
+ .nano-checklist__item--current .nano-checklist__indicator {
87
+ border-color: hsl(var(--color-primary));
88
+ color: hsl(var(--color-primary));
89
+ }
90
+
91
+ .nano-checklist__item--done .nano-checklist__indicator {
92
+ border-color: hsl(var(--color-success));
93
+ background-color: hsl(var(--color-success));
94
+ color: hsl(var(--color-success-foreground));
95
+ }
96
+
97
+ .nano-checklist__body {
98
+ display: flex;
99
+ flex-direction: column;
100
+ gap: var(--space-1);
101
+ flex: 1;
102
+ min-width: 0;
103
+ }
104
+
105
+ .nano-checklist__title {
106
+ font-size: var(--text-sm);
107
+ font-weight: var(--font-semibold);
108
+ color: hsl(var(--color-foreground));
109
+ line-height: var(--leading-tight);
110
+ }
111
+
112
+ .nano-checklist__description {
113
+ font-size: var(--text-sm);
114
+ color: hsl(var(--color-muted-foreground));
115
+ line-height: var(--leading-normal);
116
+ }
117
+
118
+ .nano-checklist__action {
119
+ display: inline-flex;
120
+ align-items: center;
121
+ gap: var(--space-1);
122
+ margin-top: var(--space-1);
123
+ font-size: var(--text-sm);
124
+ font-weight: var(--font-medium);
125
+ color: hsl(var(--color-primary));
126
+ text-decoration: none;
127
+ align-self: flex-start;
128
+
129
+ &:hover {
130
+ text-decoration: underline;
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,80 @@
1
+ .nano-code {
2
+ position: relative;
3
+ background-color: hsl(var(--color-muted));
4
+ border: 1px solid hsl(var(--color-border));
5
+ border-radius: var(--radius-md);
6
+ overflow: hidden;
7
+
8
+ .nano-code__header {
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: space-between;
12
+ gap: var(--space-2);
13
+ padding: var(--space-2) var(--space-3);
14
+ background-color: hsl(var(--color-background));
15
+ border-bottom: 1px solid hsl(var(--color-border));
16
+ font-size: var(--text-xs);
17
+ color: hsl(var(--color-muted-foreground));
18
+ }
19
+
20
+ .nano-code__language {
21
+ font-family: var(--font-mono);
22
+ font-weight: var(--font-semibold);
23
+ text-transform: uppercase;
24
+ letter-spacing: var(--tracking-wide);
25
+ }
26
+
27
+ .nano-code__actions {
28
+ display: inline-flex;
29
+ align-items: center;
30
+ gap: var(--space-1);
31
+ }
32
+
33
+ .nano-code__body {
34
+ display: block;
35
+ margin: 0;
36
+ padding: var(--space-4);
37
+ font-family: var(--font-mono);
38
+ font-size: var(--text-sm);
39
+ line-height: var(--leading-relaxed);
40
+ color: hsl(var(--color-foreground));
41
+ overflow-x: auto;
42
+ white-space: pre;
43
+ tab-size: 2;
44
+ }
45
+
46
+ &--inline {
47
+ display: inline-block;
48
+ padding: var(--space-0-5) var(--space-1-5);
49
+ margin: 0;
50
+ background-color: hsl(var(--color-muted));
51
+ border: 1px solid hsl(var(--color-border));
52
+ border-radius: var(--radius-sm);
53
+ font-family: var(--font-mono);
54
+ font-size: 0.9em;
55
+ color: hsl(var(--color-foreground));
56
+ overflow: visible;
57
+ }
58
+
59
+ &--terminal {
60
+ background-color: hsl(var(--color-foreground));
61
+ border-color: hsl(var(--color-foreground));
62
+
63
+ .nano-code__header {
64
+ background-color: hsl(var(--color-foreground) / 0.9);
65
+ border-bottom-color: hsl(var(--color-muted-foreground) / 0.3);
66
+ color: hsl(var(--color-background) / 0.7);
67
+ }
68
+
69
+ .nano-code__body {
70
+ color: hsl(var(--color-background));
71
+ }
72
+ }
73
+
74
+ &--wrap {
75
+ .nano-code__body {
76
+ white-space: pre-wrap;
77
+ word-break: break-word;
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,71 @@
1
+ .nano-copy {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: var(--space-2);
5
+
6
+ .nano-copy__value {
7
+ flex: 1;
8
+ min-width: 0;
9
+ padding: var(--space-2) var(--space-3);
10
+ font-family: var(--font-mono);
11
+ font-size: var(--text-sm);
12
+ color: hsl(var(--color-foreground));
13
+ background-color: hsl(var(--color-muted));
14
+ border: 1px solid hsl(var(--color-border));
15
+ border-radius: var(--radius-md);
16
+ overflow: hidden;
17
+ text-overflow: ellipsis;
18
+ white-space: nowrap;
19
+ user-select: all;
20
+ }
21
+
22
+ .nano-copy__button {
23
+ display: inline-flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ gap: var(--space-1-5);
27
+ padding: var(--space-2) var(--space-3);
28
+ font-size: var(--text-sm);
29
+ font-weight: var(--font-medium);
30
+ color: hsl(var(--color-foreground));
31
+ background-color: hsl(var(--color-background));
32
+ border: 1px solid hsl(var(--color-border));
33
+ border-radius: var(--radius-md);
34
+ cursor: pointer;
35
+ transition: background-color var(--duration-fast) var(--ease-default),
36
+ color var(--duration-fast) var(--ease-default);
37
+
38
+ svg {
39
+ width: 0.875rem;
40
+ height: 0.875rem;
41
+ }
42
+
43
+ &:hover {
44
+ background-color: hsl(var(--color-muted));
45
+ }
46
+
47
+ &:focus-visible {
48
+ outline: 2px solid hsl(var(--color-ring));
49
+ outline-offset: 2px;
50
+ }
51
+
52
+ &[data-nanoui-copy-copied] {
53
+ color: hsl(var(--color-success));
54
+ border-color: hsl(var(--color-success) / 0.4);
55
+ background-color: hsl(var(--color-success) / 0.08);
56
+ }
57
+ }
58
+
59
+ &--block {
60
+ display: flex;
61
+ width: 100%;
62
+ }
63
+
64
+ &--inline {
65
+ .nano-copy__value {
66
+ padding: var(--space-0-5) var(--space-2);
67
+ background-color: transparent;
68
+ border: none;
69
+ }
70
+ }
71
+ }
@@ -13,108 +13,108 @@
13
13
  transform: scale(0.95);
14
14
  transition: opacity var(--duration-normal) var(--ease-default),
15
15
  transform var(--duration-normal) var(--ease-default);
16
- }
17
-
18
- .nano-dialog[open] {
19
- position: fixed;
20
- }
21
-
22
- .nano-dialog.is-open {
23
- opacity: 1;
24
- transform: scale(1);
25
- }
26
-
27
- .nano-dialog::backdrop {
28
- background-color: rgb(0 0 0 / 0.5);
29
- backdrop-filter: blur(4px);
30
- }
31
-
32
- .nano-dialog--sm {
33
- max-width: 24rem;
34
- }
35
-
36
- .nano-dialog--lg {
37
- max-width: 42rem;
38
- }
39
-
40
- .nano-dialog--full {
41
- max-width: 100vw;
42
- max-height: 100vh;
43
- width: 100vw;
44
- height: 100vh;
45
- margin: 0;
46
- border-radius: 0;
47
- }
48
-
49
- .nano-dialog__content {
50
- position: relative;
51
- display: flex;
52
- flex-direction: column;
53
- }
54
-
55
- .nano-dialog__header {
56
- display: flex;
57
- flex-direction: column;
58
- gap: var(--space-1-5);
59
- padding: var(--space-6);
60
- padding-bottom: 0;
61
- padding-right: var(--space-12);
62
- }
63
-
64
- .nano-dialog__title {
65
- font-size: var(--text-lg);
66
- font-weight: var(--font-semibold);
67
- line-height: var(--leading-tight);
68
- letter-spacing: var(--tracking-tight);
69
- }
70
-
71
- .nano-dialog__description {
72
- font-size: var(--text-sm);
73
- color: hsl(var(--color-muted-foreground));
74
- }
75
-
76
- .nano-dialog__body {
77
- padding: var(--space-6);
78
- }
79
-
80
- .nano-dialog__footer {
81
- display: flex;
82
- align-items: center;
83
- justify-content: flex-end;
84
- gap: var(--space-2);
85
- padding: var(--space-6);
86
- }
87
-
88
- .nano-dialog__close {
89
- position: absolute;
90
- top: var(--space-4);
91
- right: var(--space-4);
92
- display: inline-flex;
93
- align-items: center;
94
- justify-content: center;
95
- width: 1.5rem;
96
- height: 1.5rem;
97
- padding: 0;
98
- border: none;
99
- border-radius: var(--radius-sm);
100
- background-color: transparent;
101
- color: hsl(var(--color-muted-foreground));
102
- cursor: pointer;
103
- transition: color var(--duration-fast) var(--ease-default),
104
- background-color var(--duration-fast) var(--ease-default);
105
- }
106
-
107
- .nano-dialog__close:hover {
108
- color: hsl(var(--color-foreground));
109
- background-color: hsl(var(--color-muted));
110
- }
111
-
112
- .nano-dialog__close:focus-visible {
113
- outline: 2px solid hsl(var(--color-ring));
114
- outline-offset: 2px;
115
- }
116
16
 
117
- .nano-dialog__close svg {
118
- width: 1rem;
119
- height: 1rem;
17
+ &[open] {
18
+ position: fixed;
19
+ }
20
+
21
+ &.is-open {
22
+ opacity: 1;
23
+ transform: scale(1);
24
+ }
25
+
26
+ &::backdrop {
27
+ background-color: rgb(0 0 0 / 0.5);
28
+ backdrop-filter: blur(4px);
29
+ }
30
+
31
+ &--sm {
32
+ max-width: 24rem;
33
+ }
34
+
35
+ &--lg {
36
+ max-width: 42rem;
37
+ }
38
+
39
+ &--full {
40
+ max-width: 100vw;
41
+ max-height: 100vh;
42
+ width: 100vw;
43
+ height: 100vh;
44
+ margin: 0;
45
+ border-radius: 0;
46
+ }
47
+
48
+ .nano-dialog__content {
49
+ position: relative;
50
+ display: flex;
51
+ flex-direction: column;
52
+ }
53
+
54
+ .nano-dialog__header {
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: var(--space-1-5);
58
+ padding: var(--space-6);
59
+ padding-bottom: 0;
60
+ padding-right: var(--space-12);
61
+ }
62
+
63
+ .nano-dialog__title {
64
+ font-size: var(--text-lg);
65
+ font-weight: var(--font-semibold);
66
+ line-height: var(--leading-tight);
67
+ letter-spacing: var(--tracking-tight);
68
+ }
69
+
70
+ .nano-dialog__description {
71
+ font-size: var(--text-sm);
72
+ color: hsl(var(--color-muted-foreground));
73
+ }
74
+
75
+ .nano-dialog__body {
76
+ padding: var(--space-6);
77
+ }
78
+
79
+ .nano-dialog__footer {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: flex-end;
83
+ gap: var(--space-2);
84
+ padding: var(--space-6);
85
+ }
86
+
87
+ .nano-dialog__close {
88
+ position: absolute;
89
+ top: var(--space-4);
90
+ right: var(--space-4);
91
+ display: inline-flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+ width: 1.5rem;
95
+ height: 1.5rem;
96
+ padding: 0;
97
+ border: none;
98
+ border-radius: var(--radius-sm);
99
+ background-color: transparent;
100
+ color: hsl(var(--color-muted-foreground));
101
+ cursor: pointer;
102
+ transition: color var(--duration-fast) var(--ease-default),
103
+ background-color var(--duration-fast) var(--ease-default);
104
+
105
+ &:hover {
106
+ color: hsl(var(--color-foreground));
107
+ background-color: hsl(var(--color-muted));
108
+ }
109
+
110
+ &:focus-visible {
111
+ outline: 2px solid hsl(var(--color-ring));
112
+ outline-offset: 2px;
113
+ }
114
+
115
+ svg {
116
+ width: 1rem;
117
+ height: 1rem;
118
+ }
119
+ }
120
120
  }