@yuva-devlab/ui 1.0.1 → 1.2.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 (70) hide show
  1. package/README.md +29 -14
  2. package/dist/common.css +158 -0
  3. package/dist/components/accordion/accordion.css +49 -0
  4. package/dist/components/alert/alert.css +41 -0
  5. package/dist/components/alert-dialog/alert-dialog.css +78 -0
  6. package/dist/components/avatar/avatar.css +26 -0
  7. package/dist/components/badge/badge.css +76 -0
  8. package/dist/components/breadcrumb/breadcrumb.css +63 -0
  9. package/dist/components/button/button.css +106 -0
  10. package/dist/components/card/card.css +30 -0
  11. package/dist/components/carousel/carousel.css +67 -0
  12. package/dist/components/chart/chart.css +38 -0
  13. package/dist/components/checkbox/checkbox.css +27 -0
  14. package/dist/components/command/command.css +125 -0
  15. package/dist/components/context-menu/context-menu.css +19 -0
  16. package/dist/components/date-picker/date-picker.css +30 -0
  17. package/dist/components/dialog/dialog.css +78 -0
  18. package/dist/components/drawer/drawer.css +64 -0
  19. package/dist/components/dropdown-menu/dropdown-menu.css +82 -0
  20. package/dist/components/form/form.css +17 -0
  21. package/dist/components/hover-card/hover-card.css +23 -0
  22. package/dist/components/input/input.css +89 -0
  23. package/dist/components/input-otp/input-otp.css +70 -0
  24. package/dist/components/label/label.css +9 -0
  25. package/dist/components/loading-state/loading-state.css +26 -0
  26. package/dist/components/menubar/menubar.css +36 -0
  27. package/dist/components/navigation-menu/navigation-menu.css +137 -0
  28. package/dist/components/pagination/pagination.css +43 -0
  29. package/dist/components/panel/panel.css +24 -0
  30. package/dist/components/popover/popover.css +17 -0
  31. package/dist/components/progress/progress.css +15 -0
  32. package/dist/components/radio-group/radio-group.css +37 -0
  33. package/dist/components/resizable/resizable.css +67 -0
  34. package/dist/components/scroll-area/scroll-area.css +32 -0
  35. package/dist/components/searchable-select/searchable-select.css +128 -0
  36. package/dist/components/select/select.css +97 -0
  37. package/dist/components/separator/separator.css +14 -0
  38. package/dist/components/sheet/sheet.css +83 -0
  39. package/dist/components/sidebar/sidebar.css +18 -0
  40. package/dist/components/skeleton/skeleton.css +5 -0
  41. package/dist/components/slider/slider.css +37 -0
  42. package/dist/components/sonner/sonner.css +25 -0
  43. package/dist/components/status-badge/status-badge.css +53 -0
  44. package/dist/components/status-chip/status-chip.css +44 -0
  45. package/dist/components/switch/switch.css +45 -0
  46. package/dist/components/table/table.css +46 -0
  47. package/dist/components/tabs/tabs.css +46 -0
  48. package/dist/components/textarea/textarea.css +30 -0
  49. package/dist/components/toggle/toggle.css +91 -0
  50. package/dist/components/tooltip/tooltip.css +17 -0
  51. package/dist/components.css +2523 -0
  52. package/dist/index.cjs +1606 -1963
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.cts +1805 -209
  55. package/dist/index.d.ts +1805 -209
  56. package/dist/index.js +1470 -1834
  57. package/dist/index.js.map +1 -1
  58. package/dist/preset.css +8 -0
  59. package/dist/root.css +1 -0
  60. package/dist/styles/common.css +158 -0
  61. package/dist/styles/components.css +2523 -0
  62. package/dist/styles/preset.css +8 -0
  63. package/dist/styles/root.css +1 -0
  64. package/dist/styles/styles.css +18 -0
  65. package/dist/styles/themes/finai.css +1 -0
  66. package/dist/styles/themes/orchestrai.css +1 -0
  67. package/dist/styles.css +18 -0
  68. package/dist/themes/finai.css +1 -0
  69. package/dist/themes/orchestrai.css +1 -0
  70. package/package.json +19 -6
package/README.md CHANGED
@@ -139,22 +139,42 @@ import { Container, Stack, Flex, Box } from "@yuva-devlab/ui";
139
139
  </Container>;
140
140
  ```
141
141
 
142
- ## Styling
142
+ ## Styling & Brand Theming
143
143
 
144
- This library uses Vanilla Extract for type-safe, zero-runtime CSS. All styles
145
- are compiled at build time.
144
+ ### 1. Global Styles Setup
146
145
 
147
- ### Importing Styles
146
+ Import the UI stylesheet in your root layout:
148
147
 
149
148
  ```tsx
150
- // Import global styles once in your app entry point
151
149
  import "@yuva-devlab/ui/styles.css";
152
150
  ```
153
151
 
154
- ### Theming
152
+ Or import specific brand themes directly:
155
153
 
156
- The library includes a natural theme by default. Custom theming support coming
157
- soon.
154
+ ```css
155
+ @import "@yuva-devlab/ui/styles.css";
156
+ @import "@yuva-devlab/ui/themes/finai.css";
157
+ ```
158
+
159
+ ### 2. Brand & Theme Provider (`ConfigProvider`)
160
+
161
+ Wrap your application with `ConfigProvider` (or `ThemeProvider`) and pass your `brand`:
162
+
163
+ ```tsx
164
+ import { ConfigProvider } from "@yuva-devlab/ui";
165
+
166
+ export function RootLayout({ children }: { children: React.ReactNode }) {
167
+ return (
168
+ <ConfigProvider brand="finai" defaultTheme="system">
169
+ {children}
170
+ </ConfigProvider>
171
+ );
172
+ }
173
+ ```
174
+
175
+ The provider sets the appropriate `data-brand` and `data-theme` attributes on `<html>`, instantly activating the scoped design tokens for that brand without loading or exposing styles of other brands!
176
+
177
+ ---
158
178
 
159
179
  ## Development
160
180
 
@@ -169,18 +189,13 @@ pnpm --filter @yuva-devlab/ui build
169
189
  pnpm --filter @yuva-devlab/ui test
170
190
 
171
191
  # Type check
172
- pnpm --filter @yuva-devlab/ui type-check
192
+ pnpm --filter @yuva-devlab/ui typecheck
173
193
  ```
174
194
 
175
195
  ## Documentation
176
196
 
177
197
  - **Storybook**: Run `pnpm dev:docs` to view interactive component documentation
178
198
  - **Playground**: Run `pnpm dev:playground` to test components in a live
179
- environment
180
-
181
- ## Related Packages
182
-
183
- - [@yuva-devlab/tokens](../tokens) - Tailwind CSS 4 preset and design token theme bridge
184
199
 
185
200
  ## License
186
201
 
@@ -0,0 +1,158 @@
1
+ /**
2
+ * @file src/styles/common.css
3
+ * @description Shared keyframes, animations, feedback states, and surface utilities.
4
+ */
5
+
6
+ /* ── Keyframe Animations ─────────────────────────────────────────────────── */
7
+ @keyframes dl-fade-in {
8
+ from {
9
+ opacity: 0;
10
+ }
11
+ to {
12
+ opacity: 1;
13
+ }
14
+ }
15
+ @keyframes dl-fade-out {
16
+ from {
17
+ opacity: 1;
18
+ }
19
+ to {
20
+ opacity: 0;
21
+ }
22
+ }
23
+ @keyframes dl-zoom-in {
24
+ from {
25
+ opacity: 0;
26
+ transform: translate(-50%, -50%) scale(0.95);
27
+ }
28
+ to {
29
+ opacity: 1;
30
+ transform: translate(-50%, -50%) scale(1);
31
+ }
32
+ }
33
+ @keyframes dl-zoom-out {
34
+ from {
35
+ opacity: 1;
36
+ transform: translate(-50%, -50%) scale(1);
37
+ }
38
+ to {
39
+ opacity: 0;
40
+ transform: translate(-50%, -50%) scale(0.95);
41
+ }
42
+ }
43
+ @keyframes dl-pulse {
44
+ 0%,
45
+ 100% {
46
+ opacity: 1;
47
+ }
48
+ 50% {
49
+ opacity: 0.5;
50
+ }
51
+ }
52
+ @keyframes dl-spin {
53
+ from {
54
+ transform: rotate(0deg);
55
+ }
56
+ to {
57
+ transform: rotate(360deg);
58
+ }
59
+ }
60
+ @keyframes dl-slide-in-right {
61
+ from {
62
+ transform: translateX(100%);
63
+ }
64
+ to {
65
+ transform: translateX(0);
66
+ }
67
+ }
68
+ @keyframes dl-slide-out-right {
69
+ from {
70
+ transform: translateX(0);
71
+ }
72
+ to {
73
+ transform: translateX(100%);
74
+ }
75
+ }
76
+ @keyframes dl-slide-in-left {
77
+ from {
78
+ transform: translateX(-100%);
79
+ }
80
+ to {
81
+ transform: translateX(0);
82
+ }
83
+ }
84
+ @keyframes dl-slide-out-left {
85
+ from {
86
+ transform: translateX(0);
87
+ }
88
+ to {
89
+ transform: translateX(-100%);
90
+ }
91
+ }
92
+ @keyframes dl-accordion-down {
93
+ from {
94
+ height: 0;
95
+ }
96
+ to {
97
+ height: var(--radix-accordion-content-height);
98
+ }
99
+ }
100
+ @keyframes dl-accordion-up {
101
+ from {
102
+ height: var(--radix-accordion-content-height);
103
+ }
104
+ to {
105
+ height: 0;
106
+ }
107
+ }
108
+
109
+ @keyframes dl-spin {
110
+ from {
111
+ transform: rotate(0deg);
112
+ }
113
+ to {
114
+ transform: rotate(360deg);
115
+ }
116
+ }
117
+
118
+ /* ── Sonner Toast Semantic Feedback ──────────────────────────────────────── */
119
+ [data-sonner-toaster] [data-sonner-toast] {
120
+ border-radius: var(--radius-md, 0.375rem);
121
+ }
122
+ [data-sonner-toaster] [data-sonner-toast][data-type="success"] {
123
+ border-color: color-mix(in oklch, var(--success) 35%, transparent);
124
+ }
125
+ [data-sonner-toaster] [data-sonner-toast][data-type="success"] [data-icon] {
126
+ color: var(--success);
127
+ }
128
+ [data-sonner-toaster] [data-sonner-toast][data-type="error"],
129
+ [data-sonner-toaster] [data-sonner-toast][data-type="destructive"] {
130
+ border-color: color-mix(in oklch, var(--destructive) 35%, transparent);
131
+ }
132
+ [data-sonner-toaster] [data-sonner-toast][data-type="error"] [data-icon],
133
+ [data-sonner-toaster] [data-sonner-toast][data-type="destructive"] [data-icon] {
134
+ color: var(--destructive);
135
+ }
136
+ [data-sonner-toaster] [data-sonner-toast][data-type="warning"] {
137
+ border-color: color-mix(in oklch, var(--warning) 35%, transparent);
138
+ }
139
+ [data-sonner-toaster] [data-sonner-toast][data-type="warning"] [data-icon] {
140
+ color: var(--warning);
141
+ }
142
+ [data-sonner-toaster] [data-sonner-toast][data-type="info"] {
143
+ border-color: color-mix(in oklch, var(--info) 35%, transparent);
144
+ }
145
+ [data-sonner-toaster] [data-sonner-toast][data-type="info"] [data-icon] {
146
+ color: var(--info);
147
+ }
148
+
149
+ /* ── Shared Glass & Surface Utilities ────────────────────────────────────── */
150
+ .dl-glass {
151
+ background-color: var(
152
+ --surface,
153
+ color-mix(in oklch, var(--card) 80%, transparent)
154
+ );
155
+ backdrop-filter: blur(16px) saturate(140%);
156
+ -webkit-backdrop-filter: blur(16px) saturate(140%);
157
+ border: 1px solid var(--border);
158
+ }
@@ -0,0 +1,49 @@
1
+ .dl-accordion-item {
2
+ border-bottom: 1px solid var(--border);
3
+ }
4
+ .dl-accordion-header {
5
+ display: flex;
6
+ }
7
+ .dl-accordion-trigger {
8
+ display: flex;
9
+ flex: 1;
10
+ width: 100%;
11
+ align-items: center;
12
+ justify-content: space-between;
13
+ padding: 1rem 0;
14
+ font-size: 0.875rem;
15
+ font-weight: 500;
16
+ cursor: pointer;
17
+ background: transparent;
18
+ border: none;
19
+ text-align: left;
20
+ font-family: inherit;
21
+ transition: color 0.15s ease;
22
+ }
23
+ .dl-accordion-trigger:hover {
24
+ text-decoration: underline;
25
+ }
26
+ .dl-accordion-trigger svg {
27
+ height: 1rem;
28
+ width: 1rem;
29
+ flex-shrink: 0;
30
+ color: var(--muted-foreground);
31
+ transition: transform 0.2s ease;
32
+ }
33
+ .dl-accordion-trigger[data-state="open"] svg {
34
+ transform: rotate(180deg);
35
+ }
36
+ .dl-accordion-content {
37
+ overflow: hidden;
38
+ font-size: 0.875rem;
39
+ }
40
+ .dl-accordion-content[data-state="open"] {
41
+ animation: dl-accordion-down 200ms ease;
42
+ }
43
+ .dl-accordion-content[data-state="closed"] {
44
+ animation: dl-accordion-up 200ms ease;
45
+ }
46
+ .dl-accordion-content__inner {
47
+ padding-bottom: 1rem;
48
+ padding-top: 0;
49
+ }
@@ -0,0 +1,41 @@
1
+ .dl-alert {
2
+ position: relative;
3
+ width: 100%;
4
+ border-radius: var(--radius-lg, 0.5rem);
5
+ border: 1px solid var(--border);
6
+ padding: 1rem;
7
+ font-size: 0.875rem;
8
+ display: grid;
9
+ grid-template-columns: auto 1fr;
10
+ gap: 0 0.75rem;
11
+ align-items: start;
12
+ }
13
+ .dl-alert svg {
14
+ width: 1rem;
15
+ height: 1rem;
16
+ margin-top: 0.125rem;
17
+ }
18
+ .dl-alert--default {
19
+ background-color: var(--background);
20
+ color: var(--foreground);
21
+ }
22
+ .dl-alert--destructive {
23
+ border-color: color-mix(in oklch, var(--destructive) 50%, transparent);
24
+ color: var(--destructive);
25
+ background-color: color-mix(
26
+ in oklch,
27
+ var(--destructive) 6%,
28
+ var(--background)
29
+ );
30
+ }
31
+ .dl-alert__title {
32
+ font-weight: 600;
33
+ line-height: 1;
34
+ letter-spacing: -0.01em;
35
+ margin-bottom: 0.25rem;
36
+ }
37
+ .dl-alert__desc {
38
+ font-size: 0.875rem;
39
+ color: var(--muted-foreground);
40
+ line-height: 1.5;
41
+ }
@@ -0,0 +1,78 @@
1
+ .dl-alert-dialog-overlay {
2
+ position: fixed;
3
+ inset: 0;
4
+ z-index: 50;
5
+ background-color: rgb(0 0 0 / 0.8);
6
+ }
7
+
8
+ .dl-alert-dialog-overlay[data-state="open"] {
9
+ animation: dl-fade-in 150ms ease;
10
+ }
11
+
12
+ .dl-alert-dialog-overlay[data-state="closed"] {
13
+ animation: dl-fade-out 150ms ease;
14
+ }
15
+
16
+ .dl-alert-dialog-content {
17
+ position: fixed;
18
+ left: 50%;
19
+ top: 50%;
20
+ transform: translate(-50%, -50%);
21
+ z-index: 50;
22
+ display: grid;
23
+ width: 100%;
24
+ max-width: 32rem;
25
+ gap: 1rem;
26
+ border: 1px solid var(--border);
27
+ background-color: var(--background);
28
+ padding: 1.5rem;
29
+ box-shadow: 0 8px 32px rgb(0 0 0 / 0.2);
30
+ border-radius: var(--radius-lg, 0.5rem);
31
+ }
32
+
33
+ .dl-alert-dialog-content[data-state="open"] {
34
+ animation: dl-zoom-in 150ms ease;
35
+ }
36
+
37
+ .dl-alert-dialog-content[data-state="closed"] {
38
+ animation: dl-zoom-out 150ms ease;
39
+ }
40
+
41
+ .dl-alert-dialog-header {
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: 0.5rem;
45
+ text-align: center;
46
+ }
47
+
48
+ @media (min-width: 640px) {
49
+ .dl-alert-dialog-header {
50
+ text-align: left;
51
+ }
52
+ }
53
+
54
+ .dl-alert-dialog-footer {
55
+ display: flex;
56
+ flex-direction: column-reverse;
57
+ gap: 0.5rem;
58
+ }
59
+
60
+ @media (min-width: 640px) {
61
+ .dl-alert-dialog-footer {
62
+ flex-direction: row;
63
+ justify-content: flex-end;
64
+ }
65
+ }
66
+
67
+ .dl-alert-dialog-title {
68
+ font-size: 1.125rem;
69
+ font-weight: 600;
70
+ line-height: 1.25;
71
+ color: var(--foreground);
72
+ }
73
+
74
+ .dl-alert-dialog-desc {
75
+ font-size: 0.875rem;
76
+ color: var(--muted-foreground);
77
+ line-height: 1.5;
78
+ }
@@ -0,0 +1,26 @@
1
+ .dl-avatar {
2
+ position: relative;
3
+ display: flex;
4
+ height: 2.5rem;
5
+ width: 2.5rem;
6
+ flex-shrink: 0;
7
+ overflow: hidden;
8
+ border-radius: 9999px;
9
+ }
10
+ .dl-avatar__img {
11
+ aspect-ratio: 1;
12
+ width: 100%;
13
+ height: 100%;
14
+ object-fit: cover;
15
+ }
16
+ .dl-avatar__fallback {
17
+ display: flex;
18
+ height: 100%;
19
+ width: 100%;
20
+ align-items: center;
21
+ justify-content: center;
22
+ border-radius: 9999px;
23
+ background-color: var(--muted);
24
+ font-size: 0.875rem;
25
+ font-weight: 500;
26
+ }
@@ -0,0 +1,76 @@
1
+ .dl-badge {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ border-radius: 0.375rem;
5
+ border: 1px solid transparent;
6
+ padding: 0.125rem 0.625rem;
7
+ font-size: 0.75rem;
8
+ font-weight: 600;
9
+ transition: background-color 0.15s ease;
10
+ }
11
+ .dl-badge--default {
12
+ background-color: var(--primary);
13
+ color: var(--primary-foreground);
14
+ box-shadow: 0 1px 2px rgb(0 0 0/0.08);
15
+ }
16
+ .dl-badge--secondary {
17
+ background-color: var(--secondary);
18
+ color: var(--secondary-foreground);
19
+ }
20
+ .dl-badge--destructive {
21
+ background-color: var(--destructive);
22
+ color: var(--destructive-foreground);
23
+ box-shadow: 0 1px 2px rgb(0 0 0/0.08);
24
+ }
25
+ .dl-badge--success {
26
+ background-color: var(--success);
27
+ color: var(--success-foreground);
28
+ }
29
+ .dl-badge--warning {
30
+ background-color: var(--warning);
31
+ color: var(--warning-foreground);
32
+ }
33
+ .dl-badge--info {
34
+ background-color: var(--info);
35
+ color: var(--info-foreground);
36
+ }
37
+ .dl-badge--outline {
38
+ color: var(--foreground);
39
+ border-color: var(--border);
40
+ }
41
+
42
+ .dl-status-badge {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ gap: 0.375rem;
46
+ border-radius: 9999px;
47
+ padding: 0.25rem 0.625rem;
48
+ font-size: 0.75rem;
49
+ font-weight: 500;
50
+ }
51
+ .dl-status-badge__dot {
52
+ width: 0.5rem;
53
+ height: 0.5rem;
54
+ border-radius: 9999px;
55
+ flex-shrink: 0;
56
+ }
57
+ .dl-status-badge--success {
58
+ background-color: color-mix(in oklch, var(--success) 15%, transparent);
59
+ color: var(--success);
60
+ }
61
+ .dl-status-badge--destructive {
62
+ background-color: color-mix(in oklch, var(--destructive) 15%, transparent);
63
+ color: var(--destructive);
64
+ }
65
+ .dl-status-badge--warning {
66
+ background-color: color-mix(in oklch, var(--warning) 15%, transparent);
67
+ color: var(--warning);
68
+ }
69
+ .dl-status-badge--info {
70
+ background-color: color-mix(in oklch, var(--info) 15%, transparent);
71
+ color: var(--info);
72
+ }
73
+ .dl-status-badge--muted {
74
+ background-color: var(--muted);
75
+ color: var(--muted-foreground);
76
+ }
@@ -0,0 +1,63 @@
1
+ .dl-breadcrumb-list {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ align-items: center;
5
+ gap: 0.375rem;
6
+ overflow-wrap: break-word;
7
+ font-size: 0.875rem;
8
+ color: var(--muted-foreground);
9
+ list-style: none;
10
+ margin: 0;
11
+ padding: 0;
12
+ }
13
+
14
+ @media (min-width: 640px) {
15
+ .dl-breadcrumb-list {
16
+ gap: 0.625rem;
17
+ }
18
+ }
19
+
20
+ .dl-breadcrumb-item {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ gap: 0.375rem;
24
+ }
25
+
26
+ .dl-breadcrumb-link {
27
+ cursor: pointer;
28
+ color: inherit;
29
+ text-decoration: none;
30
+ transition: color 0.15s ease;
31
+ }
32
+
33
+ .dl-breadcrumb-link:hover {
34
+ color: var(--foreground);
35
+ }
36
+
37
+ .dl-breadcrumb-page {
38
+ font-weight: 400;
39
+ color: var(--foreground);
40
+ }
41
+
42
+ .dl-breadcrumb-separator {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ }
46
+
47
+ .dl-breadcrumb-separator svg {
48
+ width: 0.875rem;
49
+ height: 0.875rem;
50
+ }
51
+
52
+ .dl-breadcrumb-ellipsis {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ width: 2.25rem;
57
+ height: 2.25rem;
58
+ }
59
+
60
+ .dl-breadcrumb-ellipsis svg {
61
+ width: 1rem;
62
+ height: 1rem;
63
+ }
@@ -0,0 +1,106 @@
1
+ .dl-btn {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ gap: 0.5rem;
6
+ white-space: nowrap;
7
+ border-radius: var(--radius-md, 0.375rem);
8
+ font-size: 0.875rem;
9
+ font-weight: 500;
10
+ cursor: pointer;
11
+ transition:
12
+ background-color 0.15s ease,
13
+ opacity 0.15s ease,
14
+ color 0.15s ease;
15
+ border: none;
16
+ text-decoration: none;
17
+ font-family: inherit;
18
+ }
19
+ .dl-btn:focus-visible {
20
+ outline: 2px solid var(--ring);
21
+ outline-offset: 2px;
22
+ }
23
+ .dl-btn:disabled,
24
+ .dl-btn[aria-disabled="true"] {
25
+ pointer-events: none;
26
+ opacity: 0.5;
27
+ cursor: not-allowed;
28
+ }
29
+ .dl-btn svg {
30
+ pointer-events: none;
31
+ width: 1rem;
32
+ height: 1rem;
33
+ flex-shrink: 0;
34
+ }
35
+
36
+ /* Sizes */
37
+ .dl-btn--sm {
38
+ height: 2rem;
39
+ padding: 0 0.75rem;
40
+ font-size: 0.75rem;
41
+ }
42
+ .dl-btn--md {
43
+ height: 2.25rem;
44
+ padding: 0 1rem;
45
+ }
46
+ .dl-btn--lg {
47
+ height: 2.5rem;
48
+ padding: 0 2rem;
49
+ }
50
+ .dl-btn--icon {
51
+ width: 2.25rem;
52
+ height: 2.25rem;
53
+ padding: 0;
54
+ }
55
+
56
+ /* Variants */
57
+ .dl-btn--default {
58
+ background-color: var(--primary);
59
+ color: var(--primary-foreground);
60
+ box-shadow: 0 1px 2px rgb(0 0 0/0.08);
61
+ }
62
+ .dl-btn--default:hover {
63
+ background-color: color-mix(in oklch, var(--primary) 88%, black);
64
+ }
65
+ .dl-btn--destructive {
66
+ background-color: var(--destructive);
67
+ color: var(--destructive-foreground);
68
+ box-shadow: 0 1px 2px rgb(0 0 0/0.08);
69
+ }
70
+ .dl-btn--destructive:hover {
71
+ background-color: color-mix(in oklch, var(--destructive) 88%, black);
72
+ }
73
+ .dl-btn--outline {
74
+ background-color: var(--background);
75
+ border: 1px solid var(--input);
76
+ color: var(--foreground);
77
+ box-shadow: 0 1px 2px rgb(0 0 0/0.05);
78
+ }
79
+ .dl-btn--outline:hover {
80
+ background-color: var(--accent);
81
+ color: var(--accent-foreground);
82
+ }
83
+ .dl-btn--secondary {
84
+ background-color: var(--secondary);
85
+ color: var(--secondary-foreground);
86
+ box-shadow: 0 1px 2px rgb(0 0 0/0.05);
87
+ }
88
+ .dl-btn--secondary:hover {
89
+ background-color: color-mix(in oklch, var(--secondary) 80%, black);
90
+ }
91
+ .dl-btn--ghost {
92
+ background-color: transparent;
93
+ color: var(--foreground);
94
+ }
95
+ .dl-btn--ghost:hover {
96
+ background-color: var(--accent);
97
+ color: var(--accent-foreground);
98
+ }
99
+ .dl-btn--link {
100
+ background-color: transparent;
101
+ color: var(--primary);
102
+ text-underline-offset: 4px;
103
+ }
104
+ .dl-btn--link:hover {
105
+ text-decoration: underline;
106
+ }
@@ -0,0 +1,30 @@
1
+ .dl-card {
2
+ border-radius: var(--radius-lg, 0.5rem);
3
+ border: 1px solid var(--border);
4
+ background-color: var(--card);
5
+ color: var(--card-foreground);
6
+ box-shadow: 0 1px 3px rgb(0 0 0/0.08);
7
+ }
8
+ .dl-card__header {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: 0.375rem;
12
+ padding: 1.5rem;
13
+ }
14
+ .dl-card__title {
15
+ font-weight: 600;
16
+ line-height: 1;
17
+ letter-spacing: -0.01em;
18
+ }
19
+ .dl-card__desc {
20
+ font-size: 0.875rem;
21
+ color: var(--muted-foreground);
22
+ }
23
+ .dl-card__content {
24
+ padding: 1.5rem;
25
+ }
26
+ .dl-card__footer {
27
+ display: flex;
28
+ align-items: center;
29
+ padding: 1.5rem;
30
+ }