daftcss 1.3.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,132 @@
1
+ /**
2
+ * Accordion styles
3
+ * Uses semantic <details> and <summary> elements
4
+ */
5
+
6
+ details {
7
+ margin-bottom: var(--spacing-sm);
8
+ border-bottom: var(--border-width) solid var(--border);
9
+ }
10
+
11
+ details:last-child {
12
+ margin-bottom: 0;
13
+ }
14
+
15
+ summary {
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: space-between;
19
+ padding: var(--spacing) 0;
20
+ font-weight: var(--font-medium);
21
+ cursor: pointer;
22
+ user-select: none;
23
+ list-style: none;
24
+ transition: color var(--transition-default);
25
+
26
+ &::-webkit-details-marker {
27
+ display: none;
28
+ }
29
+
30
+ /* Chevron icon */
31
+ &::after {
32
+ content: "";
33
+ width: var(--icon-size);
34
+ height: var(--icon-size);
35
+ flex-shrink: 0;
36
+ margin-left: var(--spacing-sm);
37
+ background-color: currentColor;
38
+ mask-image: var(--icon-chevron);
39
+ mask-repeat: no-repeat;
40
+ mask-position: center;
41
+ mask-size: contain;
42
+ transition: transform var(--transition-default);
43
+ }
44
+
45
+ &:hover {
46
+ color: var(--primary);
47
+ }
48
+
49
+ &:focus-visible {
50
+ outline: var(--outline-width) solid var(--ring);
51
+ outline-offset: var(--outline-offset);
52
+ border-radius: var(--radius-sm);
53
+ }
54
+ }
55
+
56
+ /* Open state */
57
+ details[open] > summary:not([role="button"]) {
58
+ color: var(--primary);
59
+ }
60
+
61
+ details[open] > summary {
62
+ &::after {
63
+ transform: rotate(180deg);
64
+ }
65
+ }
66
+
67
+ /* Accordion content */
68
+ details > *:not(summary) {
69
+ padding-bottom: var(--spacing-md);
70
+ }
71
+
72
+ details > p:last-child {
73
+ margin-bottom: 0;
74
+ }
75
+
76
+ /* Button-styled summary */
77
+ summary[role="button"] {
78
+ display: flex;
79
+ width: 100%;
80
+ align-items: center;
81
+ justify-content: space-between;
82
+ gap: var(--spacing-sm);
83
+ height: var(--button-height);
84
+ padding: var(--spacing-sm) var(--spacing);
85
+ font-size: var(--text-sm);
86
+ font-weight: var(--font-medium);
87
+ color: var(--primary-foreground);
88
+ background-color: var(--primary);
89
+ border-radius: var(--radius-md);
90
+ box-shadow: var(--button-shadow);
91
+ transition: background-color var(--transition-default);
92
+
93
+ &:hover {
94
+ background-color: color-mix(in oklch, var(--primary) var(--hover-opacity), transparent);
95
+ }
96
+ }
97
+
98
+ /* Button variants */
99
+ summary[role="button"].secondary {
100
+ color: var(--foreground);
101
+ background-color: var(--accent);
102
+
103
+ &:hover {
104
+ background-color: color-mix(in oklch, var(--accent) 80%, var(--foreground) 5%);
105
+ }
106
+ }
107
+
108
+ summary[role="button"].outline {
109
+ color: var(--primary);
110
+ background-color: var(--background);
111
+ border: var(--border-width) solid var(--primary);
112
+
113
+ &:hover {
114
+ background-color: var(--primary);
115
+ color: var(--primary-foreground);
116
+ }
117
+ }
118
+
119
+ summary[role="button"].destructive {
120
+ color: var(--destructive-foreground);
121
+ background-color: var(--destructive);
122
+
123
+ &:hover {
124
+ background-color: color-mix(in oklch, var(--destructive) var(--hover-opacity), transparent);
125
+ }
126
+ }
127
+
128
+ /* Button accordion wrapper */
129
+ details:has(> summary[role="button"]) {
130
+ border-bottom: none;
131
+ margin-bottom: var(--spacing);
132
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Badge/Pill styles
3
+ * Small status indicators with color variants
4
+ */
5
+
6
+ /* Base badge styles */
7
+ .badge {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: var(--spacing-xs);
11
+ padding: var(--spacing-xs) var(--spacing-sm);
12
+ font-size: var(--text-xs);
13
+ font-weight: var(--font-medium);
14
+ font-variant-numeric: tabular-nums;
15
+ line-height: 1;
16
+ white-space: nowrap;
17
+ border: var(--border-width) solid transparent;
18
+ border-radius: var(--badge-radius);
19
+
20
+ /* Primary variant (default) */
21
+ color: var(--primary-foreground);
22
+ background-color: var(--primary);
23
+ }
24
+
25
+ /* Secondary variant */
26
+ .badge.secondary {
27
+ color: var(--foreground);
28
+ background-color: var(--accent);
29
+ }
30
+
31
+ /* Destructive variant */
32
+ .badge.destructive {
33
+ color: var(--destructive-foreground);
34
+ background-color: var(--destructive);
35
+ }
36
+
37
+ /* Status variants */
38
+ .badge.success {
39
+ color: var(--success-foreground);
40
+ background-color: var(--success);
41
+ }
42
+
43
+ .badge.warning {
44
+ color: var(--warning-foreground);
45
+ background-color: var(--warning);
46
+ }
47
+
48
+ /* Outline variant */
49
+ .badge.outline {
50
+ color: var(--primary);
51
+ background-color: transparent;
52
+ border-color: var(--primary);
53
+ }
54
+
55
+ .badge.outline.secondary {
56
+ color: var(--foreground);
57
+ border-color: var(--border);
58
+ }
59
+
60
+ .badge.outline.destructive {
61
+ color: var(--destructive);
62
+ border-color: var(--destructive);
63
+ }
64
+
65
+ .badge.outline.success {
66
+ color: var(--success);
67
+ border-color: var(--success);
68
+ }
69
+
70
+ .badge.outline.warning {
71
+ color: var(--warning);
72
+ border-color: var(--warning);
73
+ }
74
+
75
+ /* Size variants */
76
+ .badge.small {
77
+ padding: 0 var(--spacing-xs);
78
+ }
79
+
80
+ .badge.large {
81
+ padding: var(--spacing-sm) var(--spacing-md);
82
+ }
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Button styles
3
+ * Primary, secondary, outline, ghost, and link variants
4
+ */
5
+
6
+ /* Base button styles */
7
+ :is(button, [type="submit"], [type="reset"], [type="button"], [role="button"]) {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ gap: var(--spacing-sm);
12
+ height: var(--button-height);
13
+ padding: var(--spacing-sm) var(--spacing);
14
+ font-family: inherit;
15
+ font-size: var(--text-sm);
16
+ font-weight: var(--font-medium);
17
+ line-height: calc(var(--button-height) - 2 * var(--border-width) - 2 * var(--spacing-sm));
18
+ text-align: center;
19
+ text-decoration: none;
20
+ white-space: nowrap;
21
+ vertical-align: middle;
22
+ cursor: pointer;
23
+ user-select: none;
24
+ border: var(--border-width) solid transparent;
25
+ border-radius: var(--button-radius);
26
+ transition: color var(--transition-default),
27
+ background-color var(--transition-default),
28
+ border-color var(--transition-default),
29
+ box-shadow var(--transition-default);
30
+
31
+ /* Primary variant (default) */
32
+ color: var(--primary-foreground);
33
+ background-color: var(--primary);
34
+ box-shadow: var(--button-shadow);
35
+
36
+ &:hover {
37
+ background-color: color-mix(in oklch, var(--primary) var(--hover-opacity), transparent);
38
+ }
39
+
40
+ &:active {
41
+ background-color: color-mix(in oklch, var(--primary) var(--active-opacity), transparent);
42
+ }
43
+
44
+ &:focus-visible {
45
+ outline: none;
46
+ box-shadow: var(--button-shadow), 0 0 0 var(--focus-ring-width) color-mix(in oklch, var(--ring) var(--focus-ring-opacity), transparent);
47
+ }
48
+
49
+ &:disabled,
50
+ &[aria-disabled="true"] {
51
+ pointer-events: none;
52
+ opacity: var(--disabled-opacity);
53
+ cursor: not-allowed;
54
+ }
55
+
56
+ /* Icon sizing */
57
+ & > svg {
58
+ width: var(--icon-size);
59
+ height: var(--icon-size);
60
+ flex-shrink: 0;
61
+ }
62
+ }
63
+
64
+ /* Reset button defaults to a secondary look. */
65
+ [type="reset"] {
66
+ color: var(--foreground);
67
+ background-color: var(--accent);
68
+
69
+ &:hover {
70
+ background-color: color-mix(in oklch, var(--accent) 80%, var(--foreground) 5%);
71
+ }
72
+ }
73
+
74
+ /* Link as button */
75
+ a[role="button"] {
76
+ text-decoration: none;
77
+ }
78
+
79
+ /* Secondary variant */
80
+ :is(button, [type="submit"], [type="button"], [role="button"]).secondary {
81
+ color: var(--foreground);
82
+ background-color: var(--accent);
83
+
84
+ &:hover {
85
+ background-color: color-mix(in oklch, var(--accent) 80%, var(--foreground) 5%);
86
+ }
87
+
88
+ &:active {
89
+ background-color: color-mix(in oklch, var(--accent) 70%, var(--foreground) 10%);
90
+ }
91
+ }
92
+
93
+ /* Destructive variant */
94
+ :is(button, [role="button"]).destructive {
95
+ color: var(--destructive-foreground);
96
+ background-color: var(--destructive);
97
+
98
+ &:hover {
99
+ background-color: color-mix(in oklch, var(--destructive) var(--hover-opacity), transparent);
100
+ }
101
+
102
+ &:active {
103
+ background-color: color-mix(in oklch, var(--destructive) var(--active-opacity), transparent);
104
+ }
105
+
106
+ &:focus-visible {
107
+ box-shadow: var(--button-shadow), 0 0 0 var(--focus-ring-width) color-mix(in oklch, var(--destructive) var(--focus-ring-opacity), transparent);
108
+ }
109
+ }
110
+
111
+ /* Outline variant */
112
+ :is(button, [type="submit"], [type="button"], [role="button"]).outline {
113
+ color: var(--primary);
114
+ background-color: var(--background);
115
+ border-color: var(--primary);
116
+
117
+ &:hover {
118
+ background-color: var(--primary);
119
+ color: var(--primary-foreground);
120
+ }
121
+
122
+ &:focus-visible {
123
+ box-shadow: var(--button-shadow), 0 0 0 var(--focus-ring-width) color-mix(in oklch, var(--primary) var(--focus-ring-opacity), transparent);
124
+ }
125
+ }
126
+
127
+ /* Outline secondary */
128
+ :is(button, [role="button"]).outline.secondary {
129
+ color: var(--foreground);
130
+ border-color: var(--border);
131
+
132
+ &:hover {
133
+ background-color: var(--accent);
134
+ }
135
+ }
136
+
137
+ /* Ghost variant (no background) */
138
+ :is(button, [role="button"]).ghost {
139
+ color: var(--foreground);
140
+ background-color: transparent;
141
+ box-shadow: none;
142
+
143
+ &:hover {
144
+ background-color: var(--accent);
145
+ color: var(--accent-foreground);
146
+ }
147
+ }
148
+
149
+ /* Link variant (looks like a link) */
150
+ :is(button, [role="button"]).link {
151
+ color: var(--primary);
152
+ background-color: transparent;
153
+ box-shadow: none;
154
+ text-underline-offset: 4px;
155
+
156
+ &:hover {
157
+ text-decoration: underline;
158
+ }
159
+ }
160
+
161
+ /* Active/current variant (e.g., selected item in a group) */
162
+ :is(button, [role="button"])[aria-current="true"] {
163
+ background-color: var(--primary);
164
+ color: var(--primary-foreground);
165
+ border-color: var(--primary);
166
+
167
+ &:hover {
168
+ background-color: color-mix(in oklch, var(--primary) var(--hover-opacity), transparent);
169
+ }
170
+ }
171
+
172
+ /* Small button */
173
+ :is(button, [role="button"]).small {
174
+ height: var(--button-height-sm);
175
+ padding: var(--spacing-xs) var(--spacing-md);
176
+ line-height: calc(var(--button-height-sm) - 2 * var(--border-width) - 2 * var(--spacing-xs));
177
+ }
178
+
179
+ /* Large button */
180
+ :is(button, [role="button"]).large {
181
+ height: var(--button-height-lg);
182
+ padding: var(--spacing-sm) var(--spacing-xl);
183
+ line-height: calc(var(--button-height-lg) - 2 * var(--border-width) - 2 * var(--spacing-sm));
184
+ }
185
+
186
+ /* Icon-only button */
187
+ :is(button, [role="button"]).icon {
188
+ width: var(--button-height);
189
+ padding: 0;
190
+ }
191
+
192
+ :is(button, [role="button"]).icon.small {
193
+ width: var(--button-height-sm);
194
+ }
195
+
196
+ :is(button, [role="button"]).icon.large {
197
+ width: var(--button-height-lg);
198
+ }
199
+
200
+ /* Full width button */
201
+ :is(button, [role="button"]).full-width {
202
+ width: 100%;
203
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Card styles
3
+ * Uses semantic <article> element
4
+ */
5
+
6
+ article {
7
+ padding: var(--spacing-lg);
8
+ background-color: var(--card);
9
+ color: var(--card-foreground);
10
+ border: var(--border-width) solid var(--border);
11
+ border-radius: var(--card-radius);
12
+ box-shadow: var(--card-shadow);
13
+ margin-bottom: var(--spacing);
14
+ }
15
+
16
+ article:last-child {
17
+ margin-bottom: 0;
18
+ }
19
+
20
+ /* Card header */
21
+ article > header {
22
+ padding: 0;
23
+ margin-bottom: var(--spacing);
24
+
25
+ &:last-child {
26
+ margin-bottom: 0;
27
+ }
28
+ }
29
+
30
+ /* Card header with title styling */
31
+ article > header > strong,
32
+ article > header > h1,
33
+ article > header > h2,
34
+ article > header > h3,
35
+ article > header > h4,
36
+ article > header > h5,
37
+ article > header > h6 {
38
+ margin-bottom: var(--spacing-xs);
39
+ font-size: var(--text-lg);
40
+ font-weight: var(--font-semibold);
41
+ line-height: var(--line-height-sm);
42
+ }
43
+
44
+ article > header > small,
45
+ article > header > p {
46
+ color: var(--muted-foreground);
47
+ font-size: var(--text-sm);
48
+ margin-bottom: 0;
49
+ }
50
+
51
+ /* Card footer */
52
+ article > footer {
53
+ padding: 0;
54
+ margin-top: var(--spacing);
55
+ display: flex;
56
+ align-items: center;
57
+ gap: var(--spacing-sm);
58
+
59
+ &:first-child {
60
+ margin-top: 0;
61
+ }
62
+ }
63
+
64
+ /* Nested articles have different styling */
65
+ article article {
66
+ background-color: var(--muted);
67
+ border: none;
68
+ box-shadow: none;
69
+ }
70
+
71
+ /* Card inside grid */
72
+ .grid > article {
73
+ margin-bottom: 0;
74
+ }
75
+
76
+ /* Clickable card (when wrapped in anchor) */
77
+ a:has(> article) {
78
+ display: block;
79
+ text-decoration: none;
80
+ color: inherit;
81
+ border-radius: var(--card-radius);
82
+ transition: box-shadow var(--transition-default);
83
+
84
+ &:hover > article {
85
+ border-color: color-mix(in oklch, var(--border) 80%, var(--foreground));
86
+ }
87
+
88
+ &:focus-visible {
89
+ outline: var(--outline-width) solid var(--ring);
90
+ outline-offset: var(--outline-offset);
91
+ }
92
+ }
93
+
94
+ /* Card with loading state */
95
+ article[aria-busy="true"] {
96
+ min-height: 8rem;
97
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Dropdown styles
3
+ * Uses <details class="dropdown"> with <summary> and <ul>
4
+ */
5
+
6
+ details.dropdown {
7
+ position: relative;
8
+ display: inline-block;
9
+ margin-bottom: 0;
10
+ border-bottom: none;
11
+ }
12
+
13
+ details.dropdown > summary {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: space-between;
17
+ gap: var(--spacing-sm);
18
+ height: var(--input-height);
19
+ padding: var(--spacing-sm) var(--spacing-md);
20
+ font-size: var(--text-sm);
21
+ font-weight: var(--font-medium);
22
+ color: var(--foreground);
23
+ background-color: var(--background);
24
+ border: var(--border-width) solid var(--input);
25
+ border-radius: var(--dropdown-radius);
26
+ cursor: pointer;
27
+ transition: border-color var(--transition-default),
28
+ background-color var(--transition-default);
29
+
30
+ &::after {
31
+ content: "";
32
+ width: var(--icon-size);
33
+ height: var(--icon-size);
34
+ background-color: currentColor;
35
+ mask-image: var(--icon-chevron);
36
+ mask-repeat: no-repeat;
37
+ mask-position: center;
38
+ mask-size: contain;
39
+ transition: transform var(--transition-default);
40
+ }
41
+
42
+ &:hover {
43
+ border-color: var(--ring);
44
+ }
45
+ }
46
+
47
+ details.dropdown[open] > summary {
48
+ border-color: var(--ring);
49
+
50
+ &::after {
51
+ transform: rotate(180deg);
52
+ }
53
+ }
54
+
55
+ /* Dropdown menu */
56
+ details.dropdown > ul {
57
+ position: absolute;
58
+ z-index: 50;
59
+ min-width: 10rem;
60
+ margin: 0;
61
+ margin-top: var(--spacing-xs);
62
+ padding: var(--spacing-xs);
63
+ list-style: none;
64
+ background-color: var(--popover);
65
+ border: var(--border-width) solid var(--border);
66
+ border-radius: var(--dropdown-radius);
67
+ box-shadow: var(--dropdown-shadow);
68
+ opacity: 0;
69
+ transform: translateY(-0.5rem);
70
+ animation: dropdown-in var(--transition-default) forwards;
71
+ }
72
+
73
+ @keyframes dropdown-in {
74
+ to {
75
+ opacity: 1;
76
+ transform: translateY(0);
77
+ }
78
+ }
79
+
80
+ details.dropdown > ul > li {
81
+ margin: 0;
82
+ }
83
+
84
+ details.dropdown > ul > li > a,
85
+ details.dropdown > ul > li > label {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: var(--spacing-sm);
89
+ padding: var(--spacing-sm) var(--spacing-md);
90
+ font-size: var(--text-sm);
91
+ color: var(--popover-foreground);
92
+ text-decoration: none;
93
+ border-radius: var(--radius-sm);
94
+ cursor: pointer;
95
+ transition: background-color var(--transition-default);
96
+
97
+ &:hover {
98
+ background-color: var(--accent);
99
+ color: var(--accent-foreground);
100
+ }
101
+ }
102
+
103
+ /* Right-aligned dropdown (RTL trick) */
104
+ details.dropdown > ul[dir="rtl"] {
105
+ right: 0;
106
+ text-align: left;
107
+ direction: ltr;
108
+ }
109
+
110
+ /* Button-styled dropdown - inherits colors from button.css */
111
+ details.dropdown > summary[role="button"] {
112
+ border-color: transparent;
113
+ }
114
+
115
+ /* Dropdown with checkboxes/radios */
116
+ details.dropdown > ul label:has(input[type="checkbox"]),
117
+ details.dropdown > ul label:has(input[type="radio"]) {
118
+ margin-bottom: 0;
119
+ }
120
+