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.
- package/README.md +383 -0
- package/dist/daft.css +3022 -0
- package/dist/daft.min.css +1 -0
- package/package.json +26 -0
- package/src/base/document.css +57 -0
- package/src/base/reset.css +116 -0
- package/src/base/root.css +24 -0
- package/src/base/variables.css +210 -0
- package/src/components/accordion.css +132 -0
- package/src/components/badge.css +82 -0
- package/src/components/button.css +203 -0
- package/src/components/card.css +97 -0
- package/src/components/dropdown.css +120 -0
- package/src/components/group.css +119 -0
- package/src/components/loading.css +105 -0
- package/src/components/modal.css +182 -0
- package/src/components/nav.css +131 -0
- package/src/components/progress.css +160 -0
- package/src/components/table.css +111 -0
- package/src/components/tooltip.css +77 -0
- package/src/content/code.css +99 -0
- package/src/content/embedded.css +85 -0
- package/src/content/typography.css +241 -0
- package/src/daft.css +51 -0
- package/src/forms/checkbox.css +173 -0
- package/src/forms/input.css +248 -0
- package/src/forms/range.css +112 -0
- package/src/forms/validation.css +79 -0
- package/src/layout/container.css +68 -0
- package/src/layout/grid.css +67 -0
- package/src/layout/landmarks.css +53 -0
- package/src/layout/overflow.css +24 -0
- package/src/layout/sidebar.css +178 -0
- package/src/utilities/helpers.css +351 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grid layout
|
|
3
|
+
* Auto-layout columns that collapse on small screens
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.grid {
|
|
7
|
+
display: grid;
|
|
8
|
+
grid-template-columns: 1fr;
|
|
9
|
+
gap: var(--spacing);
|
|
10
|
+
margin-bottom: var(--spacing);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.grid:last-child {
|
|
14
|
+
margin-bottom: 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Auto-layout columns on larger screens */
|
|
18
|
+
@media (min-width: 768px) {
|
|
19
|
+
.grid {
|
|
20
|
+
grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Explicit column counts when children are present */
|
|
24
|
+
.grid:has(> :nth-child(2):last-child) {
|
|
25
|
+
grid-template-columns: repeat(2, 1fr);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.grid:has(> :nth-child(3):last-child) {
|
|
29
|
+
grid-template-columns: repeat(3, 1fr);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.grid:has(> :nth-child(4):last-child) {
|
|
33
|
+
grid-template-columns: repeat(4, 1fr);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.grid:has(> :nth-child(5):last-child) {
|
|
37
|
+
grid-template-columns: repeat(5, 1fr);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.grid:has(> :nth-child(6):last-child) {
|
|
41
|
+
grid-template-columns: repeat(6, 1fr);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Grid items */
|
|
46
|
+
.grid > * {
|
|
47
|
+
min-width: 0; /* Prevent overflow */
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Full-width grid items */
|
|
51
|
+
.grid > [data-span="full"] {
|
|
52
|
+
grid-column: 1 / -1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Column span utilities */
|
|
56
|
+
.grid > .span-2 {
|
|
57
|
+
grid-column: span 2;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.grid > .span-3 {
|
|
61
|
+
grid-column: span 3;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.grid > .span-4 {
|
|
65
|
+
grid-column: span 4;
|
|
66
|
+
}
|
|
67
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Landmark styles
|
|
3
|
+
* Semantic HTML structure elements: header, main, footer, section, aside, article
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* Main content area */
|
|
7
|
+
main {
|
|
8
|
+
display: block;
|
|
9
|
+
min-height: 1px;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/* Header landmark */
|
|
13
|
+
body > header,
|
|
14
|
+
main > header,
|
|
15
|
+
.container > header {
|
|
16
|
+
padding-block: var(--spacing);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Footer landmark */
|
|
20
|
+
body > footer,
|
|
21
|
+
main > footer,
|
|
22
|
+
.container > footer {
|
|
23
|
+
padding-block: var(--spacing);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* Section with spacing */
|
|
27
|
+
section {
|
|
28
|
+
margin-bottom: var(--spacing-xl);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
section:last-child {
|
|
32
|
+
margin-bottom: 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Nested sections have less spacing */
|
|
36
|
+
section section {
|
|
37
|
+
margin-bottom: var(--spacing);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Article spacing when used as a direct child */
|
|
41
|
+
body > article,
|
|
42
|
+
main > article,
|
|
43
|
+
section > article,
|
|
44
|
+
.container > article {
|
|
45
|
+
margin-bottom: var(--spacing);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Responsive section spacing */
|
|
49
|
+
@media (min-width: 768px) {
|
|
50
|
+
section {
|
|
51
|
+
margin-bottom: calc(var(--spacing-xl) * 1.5);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Overflow utilities
|
|
3
|
+
* Horizontal scrolling for wide content
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.overflow-auto {
|
|
7
|
+
overflow-x: auto;
|
|
8
|
+
-webkit-overflow-scrolling: touch;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Ensure tables inside overflow containers display properly */
|
|
12
|
+
.overflow-auto > table {
|
|
13
|
+
margin-bottom: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Add fade indicators for scroll containers */
|
|
17
|
+
.overflow-auto {
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Scrollable code blocks already handle overflow */
|
|
22
|
+
pre.overflow-auto {
|
|
23
|
+
overflow-x: auto;
|
|
24
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sidebar
|
|
3
|
+
*
|
|
4
|
+
* <aside class="sidebar"> as a direct child of <main> is an app-dashboard
|
|
5
|
+
* sidebar:
|
|
6
|
+
* - Desktop (≥ 768px): position-fixed full viewport height on the left.
|
|
7
|
+
* Body gets padding-left so header / main / footer flow in the column
|
|
8
|
+
* to the right of it.
|
|
9
|
+
* - Mobile (< 768px): hidden by default. Add the popover attribute and a
|
|
10
|
+
* <button class="sidebar-toggle" popovertarget="sidebar"> to slide it
|
|
11
|
+
* out as a drawer.
|
|
12
|
+
*
|
|
13
|
+
* Plain <aside> (no .sidebar class) keeps normal document flow — useful
|
|
14
|
+
* for pullquotes, callouts, and other tangential content.
|
|
15
|
+
*
|
|
16
|
+
* Customization: override --aside-width for column width, override
|
|
17
|
+
* background-color on the selector below for surface color.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/* Surface (applies on all viewports — hidden on mobile via media query) */
|
|
21
|
+
main > aside.sidebar {
|
|
22
|
+
background-color: var(--muted);
|
|
23
|
+
color: inherit;
|
|
24
|
+
border: none;
|
|
25
|
+
padding: var(--spacing-lg);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* ============================================================
|
|
29
|
+
Desktop: fixed full-height column
|
|
30
|
+
============================================================ */
|
|
31
|
+
|
|
32
|
+
@media (min-width: 768px) {
|
|
33
|
+
/* display + height overrides fight the UA popover styles, which set
|
|
34
|
+
display: none on closed popovers and height: fit-content always. */
|
|
35
|
+
main > aside.sidebar {
|
|
36
|
+
display: block;
|
|
37
|
+
position: fixed;
|
|
38
|
+
inset: 0 auto 0 0;
|
|
39
|
+
width: var(--aside-width);
|
|
40
|
+
height: 100dvh;
|
|
41
|
+
overflow-y: auto;
|
|
42
|
+
z-index: 10;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Make room for the fixed sidebar by padding the body */
|
|
46
|
+
body:has(> main > aside.sidebar) {
|
|
47
|
+
padding-left: var(--aside-width);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Disable any grid layout on main (the aside is out of normal flow now) */
|
|
51
|
+
main:has(> aside.sidebar) {
|
|
52
|
+
display: block;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* ============================================================
|
|
57
|
+
Mobile: hidden by default, slide-out drawer when popover-open
|
|
58
|
+
============================================================ */
|
|
59
|
+
|
|
60
|
+
@media (max-width: 767.98px) {
|
|
61
|
+
main > aside.sidebar {
|
|
62
|
+
display: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
main > aside.sidebar[popover]:popover-open {
|
|
66
|
+
display: block;
|
|
67
|
+
position: fixed;
|
|
68
|
+
inset: 0 auto 0 0;
|
|
69
|
+
width: min(var(--aside-width), 85vw);
|
|
70
|
+
height: 100dvh;
|
|
71
|
+
z-index: 100;
|
|
72
|
+
overflow-y: auto;
|
|
73
|
+
transform: translateX(0);
|
|
74
|
+
transition: transform var(--transition-slow) var(--ease-default),
|
|
75
|
+
overlay var(--transition-slow) var(--ease-default) allow-discrete,
|
|
76
|
+
display var(--transition-slow) var(--ease-default) allow-discrete;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
main > aside.sidebar[popover]::backdrop {
|
|
80
|
+
background-color: var(--modal-overlay);
|
|
81
|
+
backdrop-filter: blur(4px);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@starting-style {
|
|
85
|
+
main > aside.sidebar[popover]:popover-open {
|
|
86
|
+
transform: translateX(-100%);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* ============================================================
|
|
92
|
+
Aside nav (vertical link list)
|
|
93
|
+
============================================================ */
|
|
94
|
+
|
|
95
|
+
main > aside.sidebar > nav {
|
|
96
|
+
display: flex;
|
|
97
|
+
flex-direction: column;
|
|
98
|
+
flex-wrap: nowrap;
|
|
99
|
+
align-items: stretch;
|
|
100
|
+
justify-content: flex-start;
|
|
101
|
+
gap: var(--spacing-sm);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
main > aside.sidebar > nav > ul {
|
|
105
|
+
display: flex;
|
|
106
|
+
flex-direction: column;
|
|
107
|
+
flex-wrap: nowrap;
|
|
108
|
+
align-items: stretch;
|
|
109
|
+
gap: var(--spacing-xs);
|
|
110
|
+
margin: 0;
|
|
111
|
+
padding: 0;
|
|
112
|
+
list-style: none;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
main > aside.sidebar > nav > ul > li {
|
|
116
|
+
margin: 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* Section labels */
|
|
120
|
+
main > aside.sidebar > nav > ul > li > strong {
|
|
121
|
+
display: block;
|
|
122
|
+
padding: var(--spacing-sm) var(--spacing);
|
|
123
|
+
margin-top: var(--spacing);
|
|
124
|
+
font-size: var(--text-xs);
|
|
125
|
+
font-weight: var(--font-semibold);
|
|
126
|
+
color: var(--muted-foreground);
|
|
127
|
+
text-transform: uppercase;
|
|
128
|
+
letter-spacing: 0.05em;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
main > aside.sidebar > nav > ul > li:first-child > strong {
|
|
132
|
+
margin-top: 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Sidebar links */
|
|
136
|
+
main > aside.sidebar > nav > ul > li > a {
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
gap: var(--spacing-sm);
|
|
140
|
+
width: 100%;
|
|
141
|
+
padding: var(--spacing-sm) var(--spacing);
|
|
142
|
+
font-size: var(--text-sm);
|
|
143
|
+
font-weight: var(--font-medium);
|
|
144
|
+
color: var(--foreground);
|
|
145
|
+
text-decoration: none;
|
|
146
|
+
border-radius: var(--radius-md);
|
|
147
|
+
overflow: hidden;
|
|
148
|
+
text-overflow: ellipsis;
|
|
149
|
+
white-space: nowrap;
|
|
150
|
+
transition: background-color var(--transition-default),
|
|
151
|
+
color var(--transition-default);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* Hover/active: a subtle shade darker than --muted in light mode, lighter
|
|
155
|
+
in dark mode — matches shadcn's sidebar-accent pattern of a quiet hover
|
|
156
|
+
that stays within the sidebar's tonal range. */
|
|
157
|
+
main > aside.sidebar > nav > ul > li > a:hover,
|
|
158
|
+
main > aside.sidebar > nav > ul > li > a[aria-current="page"],
|
|
159
|
+
main > aside.sidebar > nav > ul > li > a[aria-current="true"] {
|
|
160
|
+
background-color: color-mix(in oklch, var(--muted) 88%, var(--foreground));
|
|
161
|
+
color: var(--foreground);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* ============================================================
|
|
165
|
+
Hamburger toggle (mobile-only)
|
|
166
|
+
============================================================
|
|
167
|
+
.sidebar-toggle is a behavior-only class: it hides the button on desktop.
|
|
168
|
+
For the visual look, pair it with .ghost and .icon (or any button variant
|
|
169
|
+
you prefer). Example:
|
|
170
|
+
<button class="ghost icon sidebar-toggle" popovertarget="sidebar">☰</button>
|
|
171
|
+
*/
|
|
172
|
+
|
|
173
|
+
@media (min-width: 768px) {
|
|
174
|
+
.sidebar-toggle,
|
|
175
|
+
li:has(> .sidebar-toggle) {
|
|
176
|
+
display: none;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility/helper classes
|
|
3
|
+
* Color modifiers, visibility, and other helpers
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* ===== COLOR MODIFIERS (text colors) ===== */
|
|
7
|
+
|
|
8
|
+
/* Secondary color - for links and text */
|
|
9
|
+
a.secondary {
|
|
10
|
+
color: var(--muted-foreground);
|
|
11
|
+
|
|
12
|
+
&:hover {
|
|
13
|
+
color: var(--foreground);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Muted text */
|
|
18
|
+
.muted {
|
|
19
|
+
color: var(--muted-foreground);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
:where(:not(.badge):not(button):not([role="button"]):not(progress)).primary {
|
|
23
|
+
color: var(--primary);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:where(:not(.badge):not(button):not([role="button"]):not(progress)).destructive {
|
|
27
|
+
color: var(--destructive);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
:where(:not(.badge):not(button):not([role="button"]):not(progress)).success {
|
|
31
|
+
color: var(--success);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:where(:not(.badge):not(button):not([role="button"]):not(progress)).warning {
|
|
35
|
+
color: var(--warning);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* ===== VISIBILITY ===== */
|
|
39
|
+
|
|
40
|
+
/* Screen reader only - visually hidden but accessible */
|
|
41
|
+
.sr-only {
|
|
42
|
+
position: absolute;
|
|
43
|
+
width: 1px;
|
|
44
|
+
height: 1px;
|
|
45
|
+
padding: 0;
|
|
46
|
+
margin: -1px;
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
clip: rect(0, 0, 0, 0);
|
|
49
|
+
white-space: nowrap;
|
|
50
|
+
border: 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Hidden completely */
|
|
54
|
+
.hidden {
|
|
55
|
+
display: none !important;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Invisible but takes up space */
|
|
59
|
+
.invisible {
|
|
60
|
+
visibility: hidden;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* ===== TEXT UTILITIES ===== */
|
|
64
|
+
|
|
65
|
+
/* Text alignment */
|
|
66
|
+
.text-left {
|
|
67
|
+
text-align: left;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.text-center {
|
|
71
|
+
text-align: center;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.text-right {
|
|
75
|
+
text-align: right;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Font weight */
|
|
79
|
+
.font-normal {
|
|
80
|
+
font-weight: var(--font-normal);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.font-medium {
|
|
84
|
+
font-weight: var(--font-medium);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.font-semibold {
|
|
88
|
+
font-weight: var(--font-semibold);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.font-bold {
|
|
92
|
+
font-weight: var(--font-bold);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Font size */
|
|
96
|
+
.text-xs {
|
|
97
|
+
font-size: var(--text-xs);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.text-sm {
|
|
101
|
+
font-size: var(--text-sm);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.text-base {
|
|
105
|
+
font-size: var(--text-base);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.text-lg {
|
|
109
|
+
font-size: var(--text-lg);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.text-xl {
|
|
113
|
+
font-size: var(--text-xl);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.text-2xl {
|
|
117
|
+
font-size: var(--text-2xl);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.text-3xl {
|
|
121
|
+
font-size: var(--text-3xl);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.text-4xl {
|
|
125
|
+
font-size: var(--text-4xl);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* ===== LAYOUT UTILITIES ===== */
|
|
129
|
+
|
|
130
|
+
/* Sticky positioning - useful for headers/navs */
|
|
131
|
+
.sticky {
|
|
132
|
+
position: sticky;
|
|
133
|
+
top: 0;
|
|
134
|
+
z-index: 40;
|
|
135
|
+
background-color: var(--background);
|
|
136
|
+
border-bottom: var(--border-width) solid var(--border);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* Flexbox */
|
|
140
|
+
.flex {
|
|
141
|
+
display: flex;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.flex-col {
|
|
145
|
+
flex-direction: column;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.items-center {
|
|
149
|
+
align-items: center;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.justify-center {
|
|
153
|
+
justify-content: center;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.justify-between {
|
|
157
|
+
justify-content: space-between;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.justify-end {
|
|
161
|
+
justify-content: flex-end;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.gap-2 {
|
|
165
|
+
gap: var(--spacing-sm);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.gap-4 {
|
|
169
|
+
gap: var(--spacing);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Full width */
|
|
173
|
+
.w-full {
|
|
174
|
+
width: 100%;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Margin utilities */
|
|
178
|
+
.m-0 {
|
|
179
|
+
margin: 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.mx-auto {
|
|
183
|
+
margin-inline: auto;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.mt-4 {
|
|
187
|
+
margin-top: var(--spacing);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.mb-4 {
|
|
191
|
+
margin-bottom: var(--spacing);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.my-4 {
|
|
195
|
+
margin-top: var(--spacing);
|
|
196
|
+
margin-bottom: var(--spacing);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* Padding utilities */
|
|
200
|
+
.p-0 {
|
|
201
|
+
padding: 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.p-4 {
|
|
205
|
+
padding: var(--spacing);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.p-6 {
|
|
209
|
+
padding: var(--spacing-lg);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* ===== OVERFLOW & TRUNCATION ===== */
|
|
213
|
+
|
|
214
|
+
.overflow-auto {
|
|
215
|
+
overflow: auto;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.overflow-hidden {
|
|
219
|
+
overflow: hidden;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.truncate {
|
|
223
|
+
overflow: hidden;
|
|
224
|
+
text-overflow: ellipsis;
|
|
225
|
+
white-space: nowrap;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* ===== BORDER UTILITIES ===== */
|
|
229
|
+
|
|
230
|
+
.rounded-none {
|
|
231
|
+
border-radius: 0;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.rounded-sm {
|
|
235
|
+
border-radius: var(--radius-sm);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.rounded {
|
|
239
|
+
border-radius: var(--radius-md);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.rounded-lg {
|
|
243
|
+
border-radius: var(--radius-lg);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.rounded-xl {
|
|
247
|
+
border-radius: var(--radius-xl);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.rounded-full {
|
|
251
|
+
border-radius: var(--radius-full);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.border {
|
|
255
|
+
border: var(--border-width) solid var(--border);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.border-none {
|
|
259
|
+
border: none;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* ===== BACKGROUND UTILITIES ===== */
|
|
263
|
+
|
|
264
|
+
.bg-muted {
|
|
265
|
+
background-color: var(--muted);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.bg-card {
|
|
269
|
+
background-color: var(--card);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.bg-transparent {
|
|
273
|
+
background-color: transparent;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* ===== SHADOW UTILITIES ===== */
|
|
277
|
+
|
|
278
|
+
.shadow-none {
|
|
279
|
+
box-shadow: none;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.shadow-sm {
|
|
283
|
+
box-shadow: var(--shadow-sm);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.shadow {
|
|
287
|
+
box-shadow: var(--shadow-sm);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.shadow-md {
|
|
291
|
+
box-shadow: var(--shadow-md);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.shadow-lg {
|
|
295
|
+
box-shadow: var(--shadow-lg);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* ===== INTERACTION UTILITIES ===== */
|
|
299
|
+
|
|
300
|
+
.cursor-pointer {
|
|
301
|
+
cursor: pointer;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.cursor-not-allowed {
|
|
305
|
+
cursor: not-allowed;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.pointer-events-none {
|
|
309
|
+
pointer-events: none;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.select-none {
|
|
313
|
+
user-select: none;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/* ===== TRANSITION UTILITIES ===== */
|
|
317
|
+
|
|
318
|
+
.transition {
|
|
319
|
+
transition: all var(--transition-default);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.transition-none {
|
|
323
|
+
transition: none;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/* ===== ANIMATION UTILITIES ===== */
|
|
327
|
+
|
|
328
|
+
.animate-spin {
|
|
329
|
+
animation: spin 1s linear infinite;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.animate-pulse {
|
|
333
|
+
animation: pulse 2s ease-in-out infinite;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
@keyframes pulse {
|
|
337
|
+
0%, 100% {
|
|
338
|
+
opacity: 1;
|
|
339
|
+
}
|
|
340
|
+
50% {
|
|
341
|
+
opacity: 0.5;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/* ===== PRINT UTILITIES ===== */
|
|
346
|
+
|
|
347
|
+
@media print {
|
|
348
|
+
.no-print {
|
|
349
|
+
display: none !important;
|
|
350
|
+
}
|
|
351
|
+
}
|