@knadh/oat 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.
@@ -0,0 +1,177 @@
1
+ @layer theme, base, components, animations, utilities;
2
+
3
+ @layer base {
4
+ *, *::before, *::after {
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ * {
9
+ margin: 0;
10
+ }
11
+
12
+ html {
13
+ tab-size: 4;
14
+ }
15
+
16
+ /* Top-layer elements don't inherit from body. Set explicitly. */
17
+ body, dialog, [popover] {
18
+ font-family: var(--font-sans);
19
+ font-size: var(--text-regular);
20
+ line-height: var(--leading-normal);
21
+ color: var(--foreground);
22
+ }
23
+
24
+ body {
25
+ background-color: var(--background);
26
+ color: var(--foreground);
27
+ -webkit-font-smoothing: antialiased;
28
+ }
29
+
30
+ img, picture, video, canvas, svg {
31
+ max-width: 100%;
32
+ }
33
+
34
+ p, h1, h2, h3, h4, h5, h6 {
35
+ overflow-wrap: break-word;
36
+ }
37
+
38
+ h1, h2, h3, h4, h5, h6 {
39
+ font-weight: var(--font-semibold);
40
+ line-height: 1.25;
41
+
42
+ &:first-child {
43
+ margin-top: 0;
44
+ }
45
+ }
46
+
47
+ h1 {
48
+ font-size: 2.25rem;
49
+ margin: var(--space-10) 0 var(--space-6);
50
+ }
51
+
52
+ h2 {
53
+ font-size: 1.875rem;
54
+ margin: var(--space-8) 0 var(--space-5);
55
+ }
56
+
57
+ h3 {
58
+ font-size: 1.5rem;
59
+ margin: var(--space-6) 0 var(--space-4);
60
+ }
61
+
62
+ h4 {
63
+ font-size: 1.25rem;
64
+ margin: var(--space-5) 0 var(--space-3);
65
+ }
66
+
67
+ h5 {
68
+ font-size: 1.125rem;
69
+ margin: var(--space-4) 0 var(--space-2);
70
+ }
71
+
72
+ h6 {
73
+ font-size: var(--text-regular);
74
+ margin: var(--space-4) 0 var(--space-2);
75
+ }
76
+
77
+ p {
78
+ margin-bottom: var(--space-4);
79
+
80
+ &:last-child {
81
+ margin-bottom: 0;
82
+ }
83
+ }
84
+
85
+ a {
86
+ color: var(--primary);
87
+ text-decoration: underline;
88
+ text-underline-offset: 2px;
89
+ transition: color var(--transition-fast);
90
+
91
+ &:hover {
92
+ color: rgb(from var(--primary) r g b / 0.8);
93
+ }
94
+ }
95
+
96
+ strong, b {
97
+ font-weight: var(--font-semibold);
98
+ }
99
+
100
+ em, i {
101
+ font-style: italic;
102
+ }
103
+
104
+ small {
105
+ font-size: var(--text-7);
106
+ }
107
+
108
+ code {
109
+ font-family: var(--font-mono);
110
+ font-size: 0.875em;
111
+ padding: 0.125rem 0.25rem;
112
+ background-color: var(--faint);
113
+ border-radius: var(--radius-small);
114
+ }
115
+
116
+ pre {
117
+ font-family: var(--font-mono);
118
+ padding: var(--space-4);
119
+ background-color: var(--faint);
120
+ border-radius: var(--radius-medium);
121
+ overflow-x: auto;
122
+ margin-bottom: var(--space-4);
123
+
124
+ code {
125
+ padding: 0;
126
+ background: none;
127
+ border-radius: 0;
128
+ }
129
+ }
130
+
131
+ blockquote {
132
+ border-left: 4px solid var(--border);
133
+ padding-left: var(--space-4);
134
+ margin: var(--space-4) 0;
135
+ color: var(--muted-foreground);
136
+ font-style: italic;
137
+ }
138
+
139
+ hr {
140
+ border: none;
141
+ border-top: 1px solid var(--border);
142
+ margin: var(--space-8) 0;
143
+ }
144
+
145
+ ul, ol {
146
+ padding-left: var(--space-6);
147
+ margin-bottom: var(--space-4);
148
+ }
149
+
150
+ ul {
151
+ list-style-type: disc;
152
+ }
153
+
154
+ ol {
155
+ list-style-type: decimal;
156
+ }
157
+
158
+ li {
159
+ margin-bottom: var(--space-1);
160
+ }
161
+
162
+ mark {
163
+ background-color: rgb(from var(--warning) r g b / 0.3);
164
+ padding: 0.125rem 0.25rem;
165
+ border-radius: var(--radius-small);
166
+ }
167
+
168
+ :focus-visible {
169
+ outline: 2px solid var(--ring);
170
+ outline-offset: 2px;
171
+ }
172
+
173
+ :disabled {
174
+ opacity: 0.5;
175
+ cursor: not-allowed;
176
+ }
177
+ }
@@ -0,0 +1,98 @@
1
+ @layer theme {
2
+ :root {
3
+ /* Default light theme variables */
4
+ --background: #fff;
5
+ --foreground: #09090b;
6
+ --card: #fff;
7
+ --card-foreground: #09090b;
8
+ --primary: #574747;
9
+ --primary-foreground: #fafafa;
10
+ --secondary: #f4f4f5;
11
+ --secondary-foreground: #574747;
12
+ --muted: #f4f4f5;
13
+ --muted-foreground: #71717a;
14
+ --faint: #fafafa;
15
+ --accent: #f4f4f5;
16
+ --danger: #df514c;
17
+ --danger-foreground: #fafafa;
18
+ --success: #4caf50;
19
+ --success-foreground: #fafafa;
20
+ --warning: #ff8c00;
21
+ --warning-foreground: #09090b;
22
+ --border: #d4d4d8;
23
+ --input: #d4d4d8;
24
+ --ring: #574747;
25
+
26
+ /* ==================== */
27
+ --space-1: 0.25rem;
28
+ --space-2: 0.5rem;
29
+ --space-3: 0.75rem;
30
+ --space-4: 1rem;
31
+ --space-5: 1.25rem;
32
+ --space-6: 1.5rem;
33
+ --space-8: 2rem;
34
+ --space-10: 2.5rem;
35
+ --space-12: 3rem;
36
+ --space-14: 3.5rem;
37
+ --space-16: 4rem;
38
+ --space-18: 4.5rem;
39
+
40
+ --radius-small: 0.125rem;
41
+ --radius-medium: 0.375rem;
42
+ --radius-large: 0.75rem;
43
+ --radius-full: 9999px;
44
+
45
+ --bar-height: 0.5rem;
46
+
47
+ --font-sans: system-ui, sans-serif;
48
+ --font-mono: ui-monospace, Consolas, monospace;
49
+
50
+ --text-1: 3rem;
51
+ --text-2: 2.25rem;
52
+ --text-3: 1.875rem;
53
+ --text-4: 1.5rem;
54
+ --text-5: 1.25rem;
55
+ --text-6: 1rem;
56
+ --text-7: 0.875rem;
57
+ --text-8: 0.75rem;
58
+ --text-regular: var(--text-6);
59
+
60
+ --leading-normal: 1.5;
61
+
62
+ --font-normal: 400;
63
+ --font-medium: 500;
64
+ --font-semibold: 600;
65
+ --font-bold: 600;
66
+
67
+ --shadow-small: 0 1px 2px 0 rgb(0 0 0 / 0.05);
68
+ --shadow-medium: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
69
+ --shadow-large: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
70
+
71
+ --transition-fast: 120ms cubic-bezier(0.4, 0, 0.2, 1);
72
+ --transition: 200ms cubic-bezier(0.4, 0, 0.2, 1);
73
+
74
+ --z-dropdown: 50;
75
+ --z-modal: 200;
76
+ }
77
+
78
+ [data-theme="dark"] {
79
+ --background: #09090b;
80
+ --foreground: #fafafa;
81
+ --card: #18181b;
82
+ --card-foreground: #fafafa;
83
+ --primary: #fafafa;
84
+ --primary-foreground: #18181b;
85
+ --secondary: #27272a;
86
+ --secondary-foreground: #fafafa;
87
+ --muted: #27272a;
88
+ --muted-foreground: #a1a1aa;
89
+ --faint: #1e1e21;
90
+ --accent: #27272a;
91
+ --danger-foreground: #fafafa;
92
+ --success-foreground: #fafafa;
93
+ --warning-foreground: #09090b;
94
+ --border: #52525b;
95
+ --input: #52525b;
96
+ --ring: #d4d4d8;
97
+ }
98
+ }
@@ -0,0 +1,60 @@
1
+ @layer components {
2
+ details {
3
+ border: 1px solid var(--border);
4
+ border-radius: var(--radius-medium);
5
+ overflow: hidden;
6
+
7
+ & + details {
8
+ margin-top: -1px;
9
+ border-start-start-radius: 0;
10
+ border-start-end-radius: 0;
11
+ }
12
+
13
+ &:has(+ details) {
14
+ border-end-start-radius: 0;
15
+ border-end-end-radius: 0;
16
+ }
17
+
18
+ &[open] summary {
19
+ border-bottom: 1px solid var(--border);
20
+ }
21
+ }
22
+
23
+ summary {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ gap: var(--space-2);
28
+ padding: var(--space-4);
29
+ font-weight: var(--font-medium);
30
+ cursor: pointer;
31
+ user-select: none;
32
+ transition: background-color var(--transition-fast);
33
+
34
+ &:hover {
35
+ background-color: var(--muted);
36
+ }
37
+
38
+ &::-webkit-details-marker, &::marker {
39
+ display: none;
40
+ }
41
+
42
+ &::after {
43
+ content: "";
44
+ width: 1rem;
45
+ height: 1rem;
46
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' 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");
47
+ background-size: contain;
48
+ background-repeat: no-repeat;
49
+ transition: transform var(--transition-fast);
50
+ }
51
+
52
+ details[open] &::after {
53
+ transform: rotate(180deg);
54
+ }
55
+ }
56
+
57
+ details > *:not(summary) {
58
+ padding: var(--space-4);
59
+ }
60
+ }
package/css/alert.css ADDED
@@ -0,0 +1,57 @@
1
+ @layer components {
2
+ [role="alert"] {
3
+ position: relative;
4
+ display: flex;
5
+ gap: var(--space-3);
6
+ padding: var(--space-4);
7
+ background-color: var(--background);
8
+ border: 1px solid var(--border);
9
+ border-radius: var(--radius-medium);
10
+ font-size: var(--text-7);
11
+
12
+ &[data-variant] {
13
+ border: none;
14
+ }
15
+
16
+ &[data-variant="error"], &[data-variant="danger"] {
17
+ color: var(--danger);
18
+ background-color: color-mix(in srgb, var(--danger) 8%, white);
19
+
20
+ & a {
21
+ color: var(--danger);
22
+ }
23
+ }
24
+
25
+ &[data-variant="success"] {
26
+ color: var(--success);
27
+ background-color: color-mix(in srgb, var(--success) 8%, white);
28
+
29
+ & a {
30
+ color: var(--success);
31
+ }
32
+ }
33
+
34
+ &[data-variant="warning"] {
35
+ color: var(--warning);
36
+ background-color: color-mix(in srgb, var(--warning) 8%, white);
37
+
38
+ & a {
39
+ color: var(--warning);
40
+ }
41
+ }
42
+
43
+ [data-theme="dark"] & {
44
+ &[data-variant="error"], &[data-variant="danger"] {
45
+ background-color: color-mix(in srgb, var(--danger) 20%, black);
46
+ }
47
+
48
+ &[data-variant="success"] {
49
+ background-color: color-mix(in srgb, var(--success) 20%, black);
50
+ }
51
+
52
+ &[data-variant="warning"] {
53
+ background-color: color-mix(in srgb, var(--warning) 20%, black);
54
+ }
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,59 @@
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
+ transition:
7
+ opacity 150ms cubic-bezier(0.4, 0, 0.2, 1),
8
+ transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
9
+ overlay 150ms cubic-bezier(0.4, 0, 0.2, 1) allow-discrete,
10
+ display 150ms cubic-bezier(0.4, 0, 0.2, 1) allow-discrete;
11
+
12
+ /* Entry - where to animate FROM */
13
+ @starting-style {
14
+ opacity: 0;
15
+ transform: perspective(1000px) rotateX(-15deg) translateZ(-80px);
16
+ }
17
+
18
+ /* Exit - where to animate TO when closing */
19
+ &[data-state="closing"] {
20
+ opacity: 0;
21
+ transform: perspective(1000px) rotateX(-15deg) translateZ(-80px);
22
+ }
23
+
24
+ &[data-state="closing"]::backdrop {
25
+ opacity: 0;
26
+ }
27
+ }
28
+
29
+ /* Backdrop animation for dialogs */
30
+ dialog::backdrop {
31
+ opacity: 1;
32
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
33
+
34
+ @starting-style {
35
+ opacity: 0;
36
+ }
37
+ }
38
+
39
+ /* Slide-in animation for toasts */
40
+ .animate-slide-in {
41
+ opacity: 1;
42
+ transform: translateX(0);
43
+ transition:
44
+ opacity 150ms cubic-bezier(0.16, 1, 0.3, 1),
45
+ transform 150ms cubic-bezier(0.16, 1, 0.3, 1);
46
+
47
+ /* Entry - slide in from right */
48
+ @starting-style {
49
+ opacity: 0;
50
+ transform: translateX(100%);
51
+ }
52
+
53
+ /* Exit - slide out to right */
54
+ &[data-state="closing"] {
55
+ opacity: 0;
56
+ transform: translateX(100%);
57
+ }
58
+ }
59
+ }
package/css/badge.css ADDED
@@ -0,0 +1,54 @@
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
+
14
+ &.secondary {
15
+ background-color: var(--secondary);
16
+ color: var(--secondary-foreground);
17
+ }
18
+
19
+ &.outline {
20
+ background-color: transparent;
21
+ color: var(--foreground);
22
+ border: 1px solid var(--border);
23
+ }
24
+
25
+ &.success {
26
+ color: var(--success);
27
+ background-color: color-mix(in srgb, var(--success) 12%, white);
28
+ }
29
+
30
+ &.warning {
31
+ color: var(--warning);
32
+ background-color: color-mix(in srgb, var(--warning) 12%, white);
33
+ }
34
+
35
+ &.danger {
36
+ color: var(--danger);
37
+ background-color: color-mix(in srgb, var(--danger) 15%, white);
38
+ }
39
+
40
+ [data-theme="dark"] & {
41
+ &.success {
42
+ background-color: color-mix(in srgb, var(--success) 40%, black);
43
+ }
44
+
45
+ &.warning {
46
+ background-color: color-mix(in srgb, var(--warning) 40%, black);
47
+ }
48
+
49
+ &.danger {
50
+ background-color: color-mix(in srgb, var(--danger) 40%, black);
51
+ }
52
+ }
53
+ }
54
+ }
package/css/button.css ADDED
@@ -0,0 +1,118 @@
1
+ @layer base {
2
+ :is(button, [type=submit], [type=reset], [type=button], a.button) {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ gap: var(--space-2);
7
+ /* height: 2.5rem; */
8
+ padding: var(--space-2) var(--space-4);
9
+ font-size: var(--text-7);
10
+ font-weight: var(--font-medium);
11
+ line-height: var(--leading-normal);
12
+ white-space: nowrap;
13
+ text-decoration: none;
14
+ background-color: var(--primary);
15
+ color: var(--primary-foreground);
16
+ border-radius: var(--radius-medium);
17
+ border: 1px solid;
18
+ border-color: rgb(from #fff r g b / 0.15) rgb(from #000 r g b / 0.2) rgb(from #000 r g b / 0.2) rgb(from #fff r g b / 0.15);
19
+ transition: background-color var(--transition-fast), opacity var(--transition-fast), transform var(--transition-fast);
20
+ cursor: pointer;
21
+
22
+ &:hover:not(:disabled) {
23
+ background-color: color-mix(in srgb, var(--primary), white 25%);
24
+ }
25
+
26
+ &:active:not(:disabled) {
27
+ transform: translate(1px, 1px);
28
+ }
29
+
30
+ &.secondary {
31
+ background-color: var(--secondary);
32
+ color: var(--secondary-foreground);
33
+ border-color: rgb(from #fff r g b / 0.5) rgb(from #000 r g b / 0.1) rgb(from #000 r g b / 0.1) rgb(from #fff r g b / 0.5);
34
+
35
+ &:hover:not(:disabled) {
36
+ background-color: color-mix(in srgb, var(--secondary), black 10%);
37
+ }
38
+ }
39
+
40
+ &.outline {
41
+ background-color: transparent;
42
+ color: var(--foreground);
43
+ border-color: var(--border);
44
+
45
+ &:hover:not(:disabled) {
46
+ background-color: var(--accent);
47
+ }
48
+ }
49
+
50
+ &.ghost {
51
+ background-color: transparent;
52
+ color: var(--foreground);
53
+ border-color: transparent;
54
+
55
+ &:hover:not(:disabled) {
56
+ background-color: var(--accent);
57
+ }
58
+ }
59
+
60
+ &.danger {
61
+ background-color: var(--danger);
62
+ color: var(--danger-foreground);
63
+
64
+ &:hover:not(:disabled) {
65
+ background-color: color-mix(in srgb, var(--danger), black 15%);
66
+ }
67
+ }
68
+
69
+ &.small {
70
+ padding: var(--space-1) var(--space-3);
71
+ font-size: var(--text-8);
72
+ }
73
+
74
+ &.large {
75
+ height: 3rem;
76
+ padding: 0 var(--space-6);
77
+ font-size: var(--text-regular);
78
+ }
79
+
80
+ &.icon {
81
+ width: 2.5rem;
82
+ padding: 0;
83
+
84
+ &.small {
85
+ width: 2rem;
86
+ }
87
+
88
+ &.large {
89
+ width: 3rem;
90
+ }
91
+ }
92
+ }
93
+ }
94
+
95
+ @layer components {
96
+ menu.buttons {
97
+ padding-left: 0;
98
+ display: inline-flex;
99
+
100
+ & > :is(button, [type=button], [type=submit], [type=reset], a.button) {
101
+ border-radius: 0;
102
+
103
+ &:first-child {
104
+ border-start-start-radius: var(--radius-medium);
105
+ border-end-start-radius: var(--radius-medium);
106
+ }
107
+
108
+ &:last-child {
109
+ border-start-end-radius: var(--radius-medium);
110
+ border-end-end-radius: var(--radius-medium);
111
+ }
112
+
113
+ &:not(:last-child) {
114
+ border-inline-end: 1px solid rgb(from var(--primary-foreground) r g b / 0.2);
115
+ }
116
+ }
117
+ }
118
+ }
package/css/card.css ADDED
@@ -0,0 +1,11 @@
1
+ @layer components {
2
+ .card {
3
+ background-color: var(--card);
4
+ color: var(--card-foreground);
5
+ border: 1px solid var(--border);
6
+ border-radius: var(--radius-medium);
7
+ box-shadow: var(--shadow-small);
8
+ padding: var(--space-6);
9
+ overflow: hidden;
10
+ }
11
+ }