oat-glassed 0.1.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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/css/00-base.css +194 -0
- package/css/01-theme.css +148 -0
- package/css/accordion.css +67 -0
- package/css/alert.css +68 -0
- package/css/animations.css +61 -0
- package/css/avatar.css +49 -0
- package/css/badge.css +56 -0
- package/css/button.css +155 -0
- package/css/card.css +21 -0
- package/css/command.css +107 -0
- package/css/dialog.css +94 -0
- package/css/dropdown.css +59 -0
- package/css/empty-state.css +38 -0
- package/css/form.css +264 -0
- package/css/grid.css +65 -0
- package/css/nav.css +89 -0
- package/css/progress.css +75 -0
- package/css/sidebar.css +189 -0
- package/css/skeleton.css +39 -0
- package/css/spinner.css +52 -0
- package/css/table.css +54 -0
- package/css/tabs.css +48 -0
- package/css/tag.css +67 -0
- package/css/toast.css +126 -0
- package/css/tooltip.css +49 -0
- package/css/utilities.css +54 -0
- package/js/base.js +107 -0
- package/js/command.js +137 -0
- package/js/dropdown.js +74 -0
- package/js/index.js +13 -0
- package/js/sidebar.js +22 -0
- package/js/tabs.js +94 -0
- package/js/toast.js +144 -0
- package/js/tooltip.js +36 -0
- package/oat-glassed.min.css +1 -0
- package/oat-glassed.min.js +1 -0
- package/package.json +27 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kailash Nadh. https://nadh.in
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Oat Glassed UI
|
|
2
|
+
|
|
3
|
+
(Forked [Oat UI](https://github.com/knadh/oat))
|
|
4
|
+
See [CHANGELOG](CHANGELOG.md) for changes and updates.
|
|
5
|
+
|
|
6
|
+
> Semantic, minimal, zero dependencies. ~11KB CSS and JS.
|
|
7
|
+
|
|
8
|
+
Oat Glassed is an ultra-lightweight HTML + CSS, semantic UI component library with zero dependencies. No framework, build, or dev complexity. Just include the tiny CSS and JS files and you are good to go building decent looking web applications with most commonly needed components and elements. Forked from Oat UI, it is now built with a glassmorphism design and has a few new components.
|
|
9
|
+
|
|
10
|
+
Semantic tags and attributes are styled contextually out of the box without classes, forcing best practices, and reducing markup class pollution. A few dynamic components are WebComponents and use minimal JavaScript.
|
|
11
|
+
|
|
12
|
+
See live demo and docs at [**https://good-lly.github.io/oat-glassed**](https://good-lly.github.io/oat-glassed)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<img width="739" alt="image" src="https://github.com/good-lly/oat-glassed/blob/main/docs/static/screenshot.png?raw=true" />
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
### CDN
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<link
|
|
24
|
+
rel="stylesheet"
|
|
25
|
+
href="https://cdn.jsdelivr.net/npm/oat-glassed@1.0.0/dist/oat-glassed.min.css"
|
|
26
|
+
/>
|
|
27
|
+
<script src="https://cdn.jsdelivr.net/npm/oat-glassed@1.0.0/dist/oat-glassed.min.js"></script>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### NPM
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install oat-glassed
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```js
|
|
37
|
+
import "oat-glassed/dist/oat-glassed.min.css";
|
|
38
|
+
import "oat-glassed/dist/oat-glassed.min.js";
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## License is licensed under [MIT](LICENSE).
|
package/css/00-base.css
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
@layer theme, base, components, animations, utilities;
|
|
2
|
+
|
|
3
|
+
@layer base {
|
|
4
|
+
*, *::before, *::after {
|
|
5
|
+
box-sizing: border-box;
|
|
6
|
+
-webkit-tap-highlight-color: transparent;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
* {
|
|
10
|
+
margin: 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
html {
|
|
14
|
+
tab-size: 4;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Top-layer elements don't inherit from body. Set explicitly. */
|
|
18
|
+
body, dialog, [popover] {
|
|
19
|
+
font-family: var(--font-sans);
|
|
20
|
+
font-size: var(--text-regular);
|
|
21
|
+
line-height: var(--leading-normal);
|
|
22
|
+
color: var(--foreground);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
body {
|
|
26
|
+
background-color: var(--background);
|
|
27
|
+
color: var(--foreground);
|
|
28
|
+
-webkit-font-smoothing: antialiased;
|
|
29
|
+
-moz-osx-font-smoothing: grayscale;
|
|
30
|
+
text-rendering: optimizeLegibility;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
main {
|
|
34
|
+
padding-block-start: var(--space-8);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
img, picture, video, canvas, svg {
|
|
38
|
+
max-width: 100%;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
p, h1, h2, h3, h4, h5, h6 {
|
|
42
|
+
overflow-wrap: break-word;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
h1, h2, h3, h4, h5, h6 {
|
|
46
|
+
font-weight: var(--font-semibold);
|
|
47
|
+
line-height: 1.25;
|
|
48
|
+
|
|
49
|
+
&:first-child {
|
|
50
|
+
margin-block-start: 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
h1 {
|
|
55
|
+
font-size: var(--text-1);
|
|
56
|
+
margin: var(--space-10) 0 var(--space-6);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
h2 {
|
|
60
|
+
font-size: var(--text-2);
|
|
61
|
+
margin: var(--space-8) 0 var(--space-5);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
h3 {
|
|
65
|
+
font-size: var(--text-3);
|
|
66
|
+
margin: var(--space-6) 0 var(--space-4);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
h4 {
|
|
70
|
+
font-size: var(--text-4);
|
|
71
|
+
margin: var(--space-5) 0 var(--space-3);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
h5 {
|
|
75
|
+
font-size: var(--text-5);
|
|
76
|
+
margin: var(--space-4) 0 var(--space-2);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
h6 {
|
|
80
|
+
font-size: var(--text-regular);
|
|
81
|
+
margin: var(--space-4) 0 var(--space-2);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
p {
|
|
85
|
+
margin-block-end: var(--space-4);
|
|
86
|
+
|
|
87
|
+
&:last-child {
|
|
88
|
+
margin-block-end: 0;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
a {
|
|
93
|
+
color: var(--link);
|
|
94
|
+
text-decoration: underline;
|
|
95
|
+
text-underline-offset: 2px;
|
|
96
|
+
transition: color var(--transition-fast);
|
|
97
|
+
|
|
98
|
+
&:hover {
|
|
99
|
+
color: rgb(from var(--link) r g b / 0.8);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
strong, b {
|
|
104
|
+
font-weight: var(--font-semibold);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
em, i {
|
|
108
|
+
font-style: italic;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
small {
|
|
112
|
+
font-size: var(--text-7);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
code {
|
|
116
|
+
font-family: var(--font-mono);
|
|
117
|
+
font-size: 0.875em;
|
|
118
|
+
padding: calc(var(--space-1) / 2) var(--space-2);
|
|
119
|
+
background-color: var(--faint);
|
|
120
|
+
border: 1px solid var(--border);
|
|
121
|
+
border-radius: var(--radius-small);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
pre {
|
|
125
|
+
font-family: var(--font-mono);
|
|
126
|
+
padding: var(--space-5);
|
|
127
|
+
background-color: light-dark(rgb(246 246 250 / 0.45), rgb(18 18 24 / 0.45));
|
|
128
|
+
border: 1px solid var(--glass-border);
|
|
129
|
+
border-radius: var(--radius-medium);
|
|
130
|
+
overflow-x: auto;
|
|
131
|
+
margin-block-end: var(--space-4);
|
|
132
|
+
box-shadow: var(--glass-edge);
|
|
133
|
+
|
|
134
|
+
code {
|
|
135
|
+
padding: 0;
|
|
136
|
+
background: none;
|
|
137
|
+
border: none;
|
|
138
|
+
border-radius: 0;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
blockquote {
|
|
143
|
+
border-inline-start: 3px solid light-dark(rgb(from var(--primary) r g b / 0.3), rgb(from var(--primary) r g b / 0.4));
|
|
144
|
+
padding: var(--space-3) var(--space-4);
|
|
145
|
+
margin: var(--space-4) 0;
|
|
146
|
+
color: var(--muted-foreground);
|
|
147
|
+
font-style: italic;
|
|
148
|
+
background-color: var(--faint);
|
|
149
|
+
border-radius: 0 var(--radius-small) var(--radius-small) 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
hr {
|
|
153
|
+
border: none;
|
|
154
|
+
border-top: 1px solid var(--border);
|
|
155
|
+
margin: var(--space-2) 0;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
ul, ol {
|
|
159
|
+
padding-inline-start: var(--space-6);
|
|
160
|
+
margin-block-end: var(--space-4);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
ul {
|
|
164
|
+
list-style-type: disc;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
ol {
|
|
168
|
+
list-style-type: decimal;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
li {
|
|
172
|
+
margin-block-end: var(--space-1);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
mark {
|
|
176
|
+
background-color: rgb(from var(--warning) r g b / 0.3);
|
|
177
|
+
padding: calc(var(--space-1) / 2) var(--space-1);
|
|
178
|
+
border-radius: var(--radius-small);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
[hidden] {
|
|
182
|
+
display: none;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
:focus-visible {
|
|
186
|
+
outline: 2px solid rgb(from var(--ring) r g b / 0.6);
|
|
187
|
+
outline-offset: 2px;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
:disabled {
|
|
191
|
+
opacity: 0.5;
|
|
192
|
+
cursor: not-allowed;
|
|
193
|
+
}
|
|
194
|
+
}
|
package/css/01-theme.css
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
@layer theme {
|
|
2
|
+
:root {
|
|
3
|
+
color-scheme: light dark;
|
|
4
|
+
|
|
5
|
+
/* Surface & text — Tailwind gray */
|
|
6
|
+
--background: light-dark(#ffffff, #030712);
|
|
7
|
+
--foreground: light-dark(#111827, #f9fafb);
|
|
8
|
+
--card: light-dark(rgb(255 255 255 / 0.55), rgb(17 24 39 / 0.48));
|
|
9
|
+
--card-foreground: light-dark(#111827, #f9fafb);
|
|
10
|
+
--primary: light-dark(#111827, #f9fafb);
|
|
11
|
+
--primary-foreground: light-dark(#ffffff, #111827);
|
|
12
|
+
--secondary: light-dark(rgb(243 244 246 / 0.55), rgb(31 41 55 / 0.4));
|
|
13
|
+
--secondary-foreground: light-dark(#1f2937, #f3f4f6);
|
|
14
|
+
--muted: light-dark(rgb(243 244 246 / 0.45), rgb(31 41 55 / 0.4));
|
|
15
|
+
--muted-foreground: light-dark(#6b7280, #9ca3af);
|
|
16
|
+
--faint: light-dark(rgb(249 250 251 / 0.35), rgb(17 24 39 / 0.3));
|
|
17
|
+
--faint-foreground: light-dark(#9ca3af, #6b7280);
|
|
18
|
+
--accent: light-dark(rgb(243 244 246 / 0.55), rgb(31 41 55 / 0.4));
|
|
19
|
+
--link: light-dark(#0284c7, #7dd3fc);
|
|
20
|
+
|
|
21
|
+
/* Semantic — Tailwind red/emerald/amber */
|
|
22
|
+
--danger: light-dark(#ef4444, #f87171);
|
|
23
|
+
--danger-foreground: light-dark(#ffffff, #111827);
|
|
24
|
+
--success: light-dark(#10b981, #34d399);
|
|
25
|
+
--success-foreground: light-dark(#ffffff, #111827);
|
|
26
|
+
--warning: light-dark(#f59e0b, #fbbf24);
|
|
27
|
+
--warning-foreground: #111827;
|
|
28
|
+
|
|
29
|
+
/* Borders & rings */
|
|
30
|
+
--border: light-dark(rgb(0 0 0 / 0.08), rgb(255 255 255 / 0.08));
|
|
31
|
+
--input: light-dark(rgb(0 0 0 / 0.1), rgb(255 255 255 / 0.1));
|
|
32
|
+
--ring: light-dark(#111827, #f9fafb);
|
|
33
|
+
|
|
34
|
+
/* Glass — Tier 1 (real blur on nav, sidebar, dialog only) */
|
|
35
|
+
--glass-blur: 12px;
|
|
36
|
+
--glass-saturate: 120%;
|
|
37
|
+
--glass-border: light-dark(
|
|
38
|
+
rgb(255 255 255 / 0.65),
|
|
39
|
+
rgb(255 255 255 / 0.09)
|
|
40
|
+
);
|
|
41
|
+
--glass-highlight: light-dark(
|
|
42
|
+
linear-gradient(
|
|
43
|
+
135deg,
|
|
44
|
+
rgb(255 255 255 / 0.7) 0%,
|
|
45
|
+
rgb(255 255 255 / 0.15) 40%,
|
|
46
|
+
rgb(255 255 255 / 0) 60%
|
|
47
|
+
),
|
|
48
|
+
linear-gradient(
|
|
49
|
+
135deg,
|
|
50
|
+
rgb(255 255 255 / 0.1) 0%,
|
|
51
|
+
rgb(255 255 255 / 0.03) 40%,
|
|
52
|
+
rgb(255 255 255 / 0) 60%
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
/* Faux glass edge — Tier 2 (inset highlights simulate glass reflection) */
|
|
56
|
+
--glass-edge: light-dark(
|
|
57
|
+
inset 0 0 0 1px rgb(255 255 255 / 0.12), inset 0 1px 0 rgb(255 255 255 / 0.15), 0 8px 32px rgb(0 0 0 / 0.08),
|
|
58
|
+
inset 0 0 0 1px rgb(255 255 255 / 0.08), inset 0 1px 0 rgb(255 255 255 / 0.1), 0 8px 32px rgb(0 0 0 / 0.25)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
/* ==================== */
|
|
62
|
+
--space-1: 0.25rem;
|
|
63
|
+
--space-2: 0.5rem;
|
|
64
|
+
--space-3: 0.75rem;
|
|
65
|
+
--space-4: 1rem;
|
|
66
|
+
--space-5: 1.25rem;
|
|
67
|
+
--space-6: 1.5rem;
|
|
68
|
+
--space-8: 2rem;
|
|
69
|
+
--space-10: 2.5rem;
|
|
70
|
+
--space-12: 3rem;
|
|
71
|
+
--space-14: 3.5rem;
|
|
72
|
+
--space-16: 4rem;
|
|
73
|
+
--space-18: 4.5rem;
|
|
74
|
+
|
|
75
|
+
--radius-small: 0.25rem;
|
|
76
|
+
--radius-medium: 0.5rem;
|
|
77
|
+
--radius-large: 1.25rem;
|
|
78
|
+
--radius-full: 9999px;
|
|
79
|
+
|
|
80
|
+
--bar-height: 0.5rem;
|
|
81
|
+
|
|
82
|
+
--font-sans: system-ui, -apple-system, sans-serif;
|
|
83
|
+
--font-mono: ui-monospace, "SF Mono", Consolas, monospace;
|
|
84
|
+
|
|
85
|
+
--text-1: clamp(1.75rem, 1.5rem + 1.1vw, 2.25rem);
|
|
86
|
+
--text-2: clamp(1.5rem, 1.3rem + 0.8vw, 1.875rem);
|
|
87
|
+
--text-3: clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem);
|
|
88
|
+
--text-4: clamp(1.125rem, 1.05rem + 0.3vw, 1.25rem);
|
|
89
|
+
--text-5: 1.125rem;
|
|
90
|
+
--text-6: 1rem;
|
|
91
|
+
--text-7: 0.875rem;
|
|
92
|
+
--text-8: 0.75rem;
|
|
93
|
+
--text-regular: var(--text-6);
|
|
94
|
+
|
|
95
|
+
--leading-normal: 1.6;
|
|
96
|
+
|
|
97
|
+
--font-normal: 400;
|
|
98
|
+
--font-medium: 500;
|
|
99
|
+
--font-semibold: 600;
|
|
100
|
+
--font-bold: 600;
|
|
101
|
+
|
|
102
|
+
--shadow-small: light-dark(
|
|
103
|
+
0 1px 4px rgb(0 0 0 / 0.03), 0 0.5px 1px rgb(0 0 0 / 0.02),
|
|
104
|
+
0 1px 4px rgb(0 0 0 / 0.2), 0 0.5px 1px rgb(0 0 0 / 0.15)
|
|
105
|
+
);
|
|
106
|
+
--shadow-medium: light-dark(
|
|
107
|
+
0 4px 20px -4px rgb(0 0 0 / 0.06), 0 1px 4px rgb(0 0 0 / 0.03),
|
|
108
|
+
0 4px 20px -4px rgb(0 0 0 / 0.35), 0 1px 4px rgb(0 0 0 / 0.2)
|
|
109
|
+
);
|
|
110
|
+
--shadow-large: light-dark(
|
|
111
|
+
0 16px 48px -8px rgb(0 0 0 / 0.07), 0 4px 16px -4px rgb(0 0 0 / 0.03),
|
|
112
|
+
0 16px 48px -8px rgb(0 0 0 / 0.45), 0 4px 16px -4px rgb(0 0 0 / 0.2)
|
|
113
|
+
);
|
|
114
|
+
--shadow-glow: light-dark(
|
|
115
|
+
0 0 0 0.5px rgb(0 0 0 / 0.02), 0 4px 24px -4px rgb(0 0 0 / 0.05),
|
|
116
|
+
0 0 0 0.5px rgb(255 255 255 / 0.05), 0 4px 28px -4px rgb(0 0 0 / 0.4)
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
--transition-fast: 120ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
120
|
+
--transition: 200ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
121
|
+
--transition-spring: 500ms cubic-bezier(0.175, 0.885, 0.32, 1.1);
|
|
122
|
+
|
|
123
|
+
--z-dropdown: 50;
|
|
124
|
+
--z-modal: 200;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
128
|
+
:root {
|
|
129
|
+
--glass-blur: 0px;
|
|
130
|
+
--glass-saturate: 100%;
|
|
131
|
+
--card: light-dark(rgb(243 244 246 / 0.95), rgb(17 24 39 / 0.95));
|
|
132
|
+
--secondary: light-dark(rgb(229 231 235 / 0.95), rgb(31 41 55 / 0.92));
|
|
133
|
+
--muted: light-dark(rgb(229 231 235 / 0.92), rgb(31 41 55 / 0.88));
|
|
134
|
+
--faint: light-dark(rgb(243 244 246 / 0.9), rgb(17 24 39 / 0.85));
|
|
135
|
+
--accent: light-dark(rgb(229 231 235 / 0.95), rgb(31 41 55 / 0.92));
|
|
136
|
+
--glass-highlight: none;
|
|
137
|
+
--glass-edge: none;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
*,
|
|
141
|
+
*::before,
|
|
142
|
+
*::after,
|
|
143
|
+
*::backdrop {
|
|
144
|
+
backdrop-filter: none !important;
|
|
145
|
+
-webkit-backdrop-filter: none !important;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
details {
|
|
3
|
+
border: 1px solid var(--glass-border);
|
|
4
|
+
border-radius: var(--radius-medium);
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
background-color: light-dark(rgb(255 255 255 / 0.35), rgb(255 255 255 / 0.02));
|
|
7
|
+
background-image: var(--glass-highlight);
|
|
8
|
+
box-shadow: var(--glass-edge);
|
|
9
|
+
contain: paint;
|
|
10
|
+
content-visibility: auto;
|
|
11
|
+
|
|
12
|
+
& + details {
|
|
13
|
+
margin-top: -1px;
|
|
14
|
+
border-start-start-radius: 0;
|
|
15
|
+
border-start-end-radius: 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
&:has(+ details) {
|
|
19
|
+
border-end-start-radius: 0;
|
|
20
|
+
border-end-end-radius: 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&[open] summary {
|
|
24
|
+
border-bottom: 1px solid var(--border);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
summary {
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: center;
|
|
31
|
+
justify-content: space-between;
|
|
32
|
+
gap: var(--space-2);
|
|
33
|
+
padding: var(--space-4);
|
|
34
|
+
font-weight: var(--font-medium);
|
|
35
|
+
cursor: pointer;
|
|
36
|
+
user-select: none;
|
|
37
|
+
transition: background-color var(--transition-fast);
|
|
38
|
+
|
|
39
|
+
&:hover {
|
|
40
|
+
background-color: var(--accent);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&::-webkit-details-marker, &::marker {
|
|
44
|
+
display: none;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
&::after {
|
|
48
|
+
content: "";
|
|
49
|
+
width: 1em;
|
|
50
|
+
height: 1em;
|
|
51
|
+
flex-shrink: 0;
|
|
52
|
+
background-color: currentColor;
|
|
53
|
+
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
|
|
54
|
+
mask-size: contain;
|
|
55
|
+
mask-repeat: no-repeat;
|
|
56
|
+
transition: transform var(--transition-fast);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
details[open] &::after {
|
|
60
|
+
transform: rotate(180deg);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
details > *:not(summary) {
|
|
65
|
+
margin: var(--space-4);
|
|
66
|
+
}
|
|
67
|
+
}
|
package/css/alert.css
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
[role="alert"] {
|
|
3
|
+
position: relative;
|
|
4
|
+
display: flex;
|
|
5
|
+
gap: var(--space-3);
|
|
6
|
+
padding: var(--space-4) var(--space-6);
|
|
7
|
+
background-color: light-dark(rgb(255 255 255 / 0.4), rgb(255 255 255 / 0.03));
|
|
8
|
+
background-image: var(--glass-highlight);
|
|
9
|
+
border: 1px solid var(--glass-border);
|
|
10
|
+
border-radius: var(--radius-medium);
|
|
11
|
+
font-size: var(--text-7);
|
|
12
|
+
box-shadow: var(--glass-edge);
|
|
13
|
+
contain: paint;
|
|
14
|
+
|
|
15
|
+
&[data-variant] {
|
|
16
|
+
border: none;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
&[data-variant="error"],
|
|
20
|
+
&[data-variant="danger"] {
|
|
21
|
+
color: var(--danger);
|
|
22
|
+
background-color: light-dark(
|
|
23
|
+
color-mix(in srgb, var(--danger) 6%, rgb(255 255 255 / 0.35)),
|
|
24
|
+
color-mix(in srgb, var(--danger) 12%, rgb(0 0 0 / 0.25))
|
|
25
|
+
);
|
|
26
|
+
border: 1px solid light-dark(
|
|
27
|
+
rgb(from var(--danger) r g b / 0.15),
|
|
28
|
+
rgb(from var(--danger) r g b / 0.2)
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
& a {
|
|
32
|
+
color: var(--danger);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&[data-variant="success"] {
|
|
37
|
+
color: var(--success);
|
|
38
|
+
background-color: light-dark(
|
|
39
|
+
color-mix(in srgb, var(--success) 6%, rgb(255 255 255 / 0.35)),
|
|
40
|
+
color-mix(in srgb, var(--success) 12%, rgb(0 0 0 / 0.25))
|
|
41
|
+
);
|
|
42
|
+
border: 1px solid light-dark(
|
|
43
|
+
rgb(from var(--success) r g b / 0.15),
|
|
44
|
+
rgb(from var(--success) r g b / 0.2)
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
& a {
|
|
48
|
+
color: var(--success);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
&[data-variant="warning"] {
|
|
53
|
+
color: var(--warning);
|
|
54
|
+
background-color: light-dark(
|
|
55
|
+
color-mix(in srgb, var(--warning) 6%, rgb(255 255 255 / 0.35)),
|
|
56
|
+
color-mix(in srgb, var(--warning) 12%, rgb(0 0 0 / 0.25))
|
|
57
|
+
);
|
|
58
|
+
border: 1px solid light-dark(
|
|
59
|
+
rgb(from var(--warning) r g b / 0.15),
|
|
60
|
+
rgb(from var(--warning) r g b / 0.2)
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
& a {
|
|
64
|
+
color: var(--warning);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
@layer animations {
|
|
2
|
+
/* Pop-in animation for modals/overlays - swings from above */
|
|
3
|
+
.animate-pop-in {
|
|
4
|
+
opacity: 1;
|
|
5
|
+
transform: perspective(1000px) rotateX(0deg) translateZ(0);
|
|
6
|
+
will-change: transform, opacity;
|
|
7
|
+
transition:
|
|
8
|
+
opacity 250ms cubic-bezier(0.175, 0.885, 0.32, 1.075),
|
|
9
|
+
transform 250ms cubic-bezier(0.175, 0.885, 0.32, 1.075),
|
|
10
|
+
overlay 250ms cubic-bezier(0.175, 0.885, 0.32, 1.075) allow-discrete,
|
|
11
|
+
display 250ms cubic-bezier(0.175, 0.885, 0.32, 1.075) allow-discrete;
|
|
12
|
+
|
|
13
|
+
/* Entry - where to animate FROM */
|
|
14
|
+
@starting-style {
|
|
15
|
+
opacity: 0;
|
|
16
|
+
transform: perspective(1000px) rotateX(-12deg) translateZ(-60px);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Exit - where to animate TO when closing */
|
|
20
|
+
&[data-state="closing"] {
|
|
21
|
+
opacity: 0;
|
|
22
|
+
transform: perspective(1000px) rotateX(-12deg) translateZ(-60px);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
&[data-state="closing"]::backdrop {
|
|
26
|
+
opacity: 0;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Backdrop animation for dialogs */
|
|
31
|
+
dialog::backdrop {
|
|
32
|
+
opacity: 1;
|
|
33
|
+
transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
34
|
+
|
|
35
|
+
@starting-style {
|
|
36
|
+
opacity: 0;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Slide-in animation for toasts */
|
|
41
|
+
.animate-slide-in {
|
|
42
|
+
opacity: 1;
|
|
43
|
+
transform: translateX(0) scale(1);
|
|
44
|
+
will-change: transform, opacity;
|
|
45
|
+
transition:
|
|
46
|
+
opacity 300ms cubic-bezier(0.175, 0.885, 0.32, 1.075),
|
|
47
|
+
transform 300ms cubic-bezier(0.175, 0.885, 0.32, 1.075);
|
|
48
|
+
|
|
49
|
+
/* Entry - slide in from right */
|
|
50
|
+
@starting-style {
|
|
51
|
+
opacity: 0;
|
|
52
|
+
transform: translateX(100%) scale(0.95);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Exit - slide out to right */
|
|
56
|
+
&[data-state="closing"] {
|
|
57
|
+
opacity: 0;
|
|
58
|
+
transform: translateX(100%) scale(0.95);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
package/css/avatar.css
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.avatar {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
width: 2.5rem;
|
|
7
|
+
height: 2.5rem;
|
|
8
|
+
border-radius: var(--radius-full);
|
|
9
|
+
background-color: var(--secondary);
|
|
10
|
+
color: var(--secondary-foreground);
|
|
11
|
+
font-size: var(--text-7);
|
|
12
|
+
font-weight: var(--font-medium);
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
flex-shrink: 0;
|
|
15
|
+
vertical-align: middle;
|
|
16
|
+
border: 1.5px solid light-dark(rgb(255 255 255 / 0.08), rgb(255 255 255 / 0.06));
|
|
17
|
+
box-shadow: var(--shadow-small);
|
|
18
|
+
|
|
19
|
+
& > img {
|
|
20
|
+
width: 100%;
|
|
21
|
+
height: 100%;
|
|
22
|
+
object-fit: cover;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
&.small {
|
|
26
|
+
width: 1.75rem;
|
|
27
|
+
height: 1.75rem;
|
|
28
|
+
font-size: var(--text-8);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&.large {
|
|
32
|
+
width: 3.5rem;
|
|
33
|
+
height: 3.5rem;
|
|
34
|
+
font-size: var(--text-5);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.avatar-group {
|
|
39
|
+
display: flex;
|
|
40
|
+
|
|
41
|
+
.avatar {
|
|
42
|
+
border: 2px solid var(--background);
|
|
43
|
+
|
|
44
|
+
&:not(:first-child) {
|
|
45
|
+
margin-inline-start: -0.5rem;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
package/css/badge.css
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.badge {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: var(--space-1);
|
|
6
|
+
padding: var(--space-1) var(--space-4);
|
|
7
|
+
font-size: var(--text-8);
|
|
8
|
+
font-weight: var(--font-medium);
|
|
9
|
+
line-height: var(--leading-normal);
|
|
10
|
+
background-color: var(--primary);
|
|
11
|
+
color: var(--primary-foreground);
|
|
12
|
+
border-radius: var(--radius-full);
|
|
13
|
+
border: 1px solid rgb(from #fff r g b / 0.12);
|
|
14
|
+
box-shadow: var(--shadow-small);
|
|
15
|
+
|
|
16
|
+
&.secondary {
|
|
17
|
+
background-color: var(--secondary);
|
|
18
|
+
color: var(--secondary-foreground);
|
|
19
|
+
border-color: light-dark(rgb(255 255 255 / 0.08), rgb(255 255 255 / 0.06));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
&.outline {
|
|
23
|
+
background-color: transparent;
|
|
24
|
+
color: var(--foreground);
|
|
25
|
+
border: 1px solid var(--border);
|
|
26
|
+
box-shadow: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&.success {
|
|
30
|
+
color: var(--success);
|
|
31
|
+
border-color: light-dark(rgb(from var(--success) r g b / 0.15), rgb(from var(--success) r g b / 0.2));
|
|
32
|
+
background-color: light-dark(
|
|
33
|
+
color-mix(in srgb, var(--success) 8%, rgb(255 255 255 / 0.35)),
|
|
34
|
+
color-mix(in srgb, var(--success) 15%, rgb(0 0 0 / 0.25))
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
&.warning {
|
|
39
|
+
color: var(--warning);
|
|
40
|
+
border-color: light-dark(rgb(from var(--warning) r g b / 0.15), rgb(from var(--warning) r g b / 0.2));
|
|
41
|
+
background-color: light-dark(
|
|
42
|
+
color-mix(in srgb, var(--warning) 8%, rgb(255 255 255 / 0.35)),
|
|
43
|
+
color-mix(in srgb, var(--warning) 15%, rgb(0 0 0 / 0.25))
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
&.danger {
|
|
48
|
+
color: var(--danger);
|
|
49
|
+
border-color: light-dark(rgb(from var(--danger) r g b / 0.15), rgb(from var(--danger) r g b / 0.2));
|
|
50
|
+
background-color: light-dark(
|
|
51
|
+
color-mix(in srgb, var(--danger) 8%, rgb(255 255 255 / 0.35)),
|
|
52
|
+
color-mix(in srgb, var(--danger) 15%, rgb(0 0 0 / 0.25))
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|