create-dalila 1.1.13 → 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 (53) hide show
  1. package/package.json +1 -1
  2. package/template/src/components/ui/accordion/accordion.css +90 -0
  3. package/template/src/components/ui/accordion/index.ts +121 -0
  4. package/template/src/components/ui/alert/alert.css +78 -0
  5. package/template/src/components/ui/avatar/avatar.css +45 -0
  6. package/template/src/components/ui/badge/badge.css +71 -0
  7. package/template/src/components/ui/breadcrumb/breadcrumb.css +41 -0
  8. package/template/src/components/ui/button/button.css +135 -0
  9. package/template/src/components/ui/calendar/calendar.css +96 -0
  10. package/template/src/components/ui/calendar/index.ts +157 -0
  11. package/template/src/components/ui/card/card.css +93 -0
  12. package/template/src/components/ui/checkbox/checkbox.css +57 -0
  13. package/template/src/components/ui/chip/chip.css +62 -0
  14. package/template/src/components/ui/collapsible/collapsible.css +61 -0
  15. package/template/src/components/ui/combobox/combobox.css +85 -0
  16. package/template/src/components/ui/combobox/index.ts +181 -0
  17. package/template/src/components/ui/dalila/dalila.css +42 -0
  18. package/template/src/components/ui/dalila-core/dalila-core.css +14 -0
  19. package/template/src/components/ui/dialog/dialog.css +125 -0
  20. package/template/src/components/ui/dialog/index.ts +68 -0
  21. package/template/src/components/ui/drawer/drawer.css +122 -0
  22. package/template/src/components/ui/drawer/index.ts +53 -0
  23. package/template/src/components/ui/dropdown/dropdown.css +87 -0
  24. package/template/src/components/ui/dropdown/index.ts +57 -0
  25. package/template/src/components/ui/dropzone/dropzone.css +47 -0
  26. package/template/src/components/ui/dropzone/index.ts +114 -0
  27. package/template/src/components/ui/empty-state/empty-state.css +33 -0
  28. package/template/src/components/ui/env.ts +4 -0
  29. package/template/src/components/ui/form/form.css +44 -0
  30. package/template/src/components/ui/index.ts +13 -0
  31. package/template/src/components/ui/input/input.css +106 -0
  32. package/template/src/components/ui/layout/layout.css +62 -0
  33. package/template/src/components/ui/pagination/pagination.css +55 -0
  34. package/template/src/components/ui/popover/index.ts +185 -0
  35. package/template/src/components/ui/popover/popover.css +55 -0
  36. package/template/src/components/ui/radio/radio.css +56 -0
  37. package/template/src/components/ui/runtime.ts +514 -0
  38. package/template/src/components/ui/separator/separator.css +38 -0
  39. package/template/src/components/ui/skeleton/skeleton.css +57 -0
  40. package/template/src/components/ui/slider/slider.css +60 -0
  41. package/template/src/components/ui/spinner/spinner.css +38 -0
  42. package/template/src/components/ui/table/table.css +54 -0
  43. package/template/src/components/ui/tabs/index.ts +128 -0
  44. package/template/src/components/ui/tabs/tabs.css +74 -0
  45. package/template/src/components/ui/toast/index.ts +144 -0
  46. package/template/src/components/ui/toast/toast.css +100 -0
  47. package/template/src/components/ui/toggle/toggle.css +90 -0
  48. package/template/src/components/ui/tokens/tokens.css +161 -0
  49. package/template/src/components/ui/tooltip/tooltip.css +53 -0
  50. package/template/src/components/ui/typography/typography.css +81 -0
  51. package/template/src/components/ui/ui-types.ts +238 -0
  52. package/template/src/components/ui/validate.ts +83 -0
  53. package/template/src/style.css +13 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-dalila",
3
- "version": "1.1.13",
3
+ "version": "1.2.0",
4
4
  "description": "Create Dalila apps with one command",
5
5
  "bin": {
6
6
  "create-dalila": "index.js"
@@ -0,0 +1,90 @@
1
+ /* Dalila UI — Accordion */
2
+
3
+ .d-accordion {
4
+ display: flex;
5
+ flex-direction: column;
6
+ border: 1px solid var(--d-border-color);
7
+ border-radius: var(--d-radius-md);
8
+ overflow: hidden;
9
+ }
10
+
11
+ .d-accordion-item {
12
+ border-bottom: 1px solid var(--d-border-color);
13
+ }
14
+
15
+ .d-accordion-item:last-child {
16
+ border-bottom: none;
17
+ }
18
+
19
+ /* Works with <details> or JS-controlled .open class */
20
+ .d-accordion-item > summary,
21
+ .d-accordion-trigger {
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: space-between;
25
+ width: 100%;
26
+ padding: var(--d-space-4);
27
+ font-family: var(--d-font-sans);
28
+ font-size: var(--d-text-base);
29
+ font-weight: var(--d-font-medium);
30
+ color: var(--d-text-primary);
31
+ background: none;
32
+ border: none;
33
+ cursor: pointer;
34
+ text-align: left;
35
+ list-style: none;
36
+ transition: background var(--d-duration-fast) ease;
37
+ }
38
+
39
+ .d-accordion-item > summary::-webkit-details-marker {
40
+ display: none;
41
+ }
42
+
43
+ .d-accordion-item > summary:hover,
44
+ .d-accordion-trigger:hover {
45
+ background: var(--d-surface-raised);
46
+ }
47
+
48
+ .d-accordion-item > summary::after,
49
+ .d-accordion-trigger::after {
50
+ content: "";
51
+ width: 0.5rem;
52
+ height: 0.5rem;
53
+ border-right: 2px solid var(--d-text-muted);
54
+ border-bottom: 2px solid var(--d-text-muted);
55
+ transform: rotate(45deg);
56
+ transition: transform var(--d-duration) var(--d-ease);
57
+ flex-shrink: 0;
58
+ }
59
+
60
+ .d-accordion-item[open] > summary::after,
61
+ .d-accordion-item.open .d-accordion-trigger::after {
62
+ transform: rotate(-135deg);
63
+ }
64
+
65
+ .d-accordion-body {
66
+ display: block;
67
+ max-height: 0;
68
+ opacity: 0;
69
+ overflow: hidden;
70
+ padding: 0 var(--d-space-4);
71
+ transform: translateY(-0.2rem);
72
+ transition:
73
+ max-height var(--d-duration-slow) var(--d-ease),
74
+ opacity var(--d-duration-fast) ease,
75
+ transform var(--d-duration-fast) ease,
76
+ padding var(--d-duration-slow) var(--d-ease);
77
+ font-family: var(--d-font-sans);
78
+ font-size: var(--d-text-sm);
79
+ color: var(--d-text-secondary);
80
+ line-height: var(--d-leading);
81
+ }
82
+
83
+ .d-accordion-item[open] > .d-accordion-body,
84
+ .d-accordion-item.open .d-accordion-body {
85
+ max-height: 40rem;
86
+ opacity: 1;
87
+ transform: translateY(0);
88
+ padding: var(--d-space-2) var(--d-space-4) var(--d-space-4);
89
+ border-top: 1px solid var(--d-border-color);
90
+ }
@@ -0,0 +1,121 @@
1
+ import { signal, computed, type Signal } from "../../../core/signal.js";
2
+ import { getCurrentScope } from "../../../core/scope.js";
3
+ import type { Accordion, AccordionOptions } from "../ui-types.js";
4
+
5
+ export function createAccordion(options: AccordionOptions = {}): Accordion {
6
+ const { single = false, initial = [] } = options;
7
+ const hasInitial = Object.prototype.hasOwnProperty.call(options, "initial");
8
+ const seededInitial = single ? initial.slice(0, 1) : initial;
9
+ const openItems = signal(new Set<string>(seededInitial));
10
+
11
+ const toggle = (itemId: string) => {
12
+ openItems.update((current) => {
13
+ const next = new Set(current);
14
+ if (next.has(itemId)) {
15
+ next.delete(itemId);
16
+ } else {
17
+ if (single) next.clear();
18
+ next.add(itemId);
19
+ }
20
+ return next;
21
+ });
22
+ };
23
+
24
+ const open = (itemId: string) => {
25
+ openItems.update((current) => {
26
+ const next = new Set(current);
27
+ if (single) next.clear();
28
+ next.add(itemId);
29
+ return next;
30
+ });
31
+ };
32
+
33
+ const close = (itemId: string) => {
34
+ openItems.update((current) => {
35
+ const next = new Set(current);
36
+ next.delete(itemId);
37
+ return next;
38
+ });
39
+ };
40
+
41
+ const _isOpenCache = new Map<string, Signal<boolean>>();
42
+
43
+ const isOpen = (itemId: string): Signal<boolean> => {
44
+ let sig = _isOpenCache.get(itemId);
45
+ if (!sig) {
46
+ sig = computed(() => openItems().has(itemId));
47
+ _isOpenCache.set(itemId, sig);
48
+ }
49
+ return sig;
50
+ };
51
+
52
+ const _attachTo = (el: HTMLElement) => {
53
+ const scope = getCurrentScope();
54
+ let syncing = false;
55
+
56
+ const allDetails = () =>
57
+ Array.from(el.querySelectorAll<HTMLDetailsElement>("details[data-accordion]"));
58
+
59
+ const syncDOMFromSignal = (set: Set<string>) => {
60
+ syncing = true;
61
+ for (const details of allDetails()) {
62
+ const itemId = details.dataset.accordion;
63
+ if (!itemId) continue;
64
+ details.open = set.has(itemId);
65
+ }
66
+ syncing = false;
67
+ };
68
+
69
+ const syncSignalFromDOM = () => {
70
+ const next = new Set<string>();
71
+ for (const details of allDetails()) {
72
+ if (!details.open) continue;
73
+ const itemId = details.dataset.accordion;
74
+ if (!itemId) continue;
75
+ if (single) {
76
+ next.clear();
77
+ }
78
+ next.add(itemId);
79
+ }
80
+ openItems.set(next);
81
+ };
82
+
83
+ const onToggle = (ev: Event) => {
84
+ const details = ev.target as HTMLDetailsElement;
85
+ if (syncing) return;
86
+
87
+ const itemId = details.dataset.accordion;
88
+ if (!itemId) return;
89
+
90
+ openItems.update((current) => {
91
+ const next = new Set(current);
92
+ if (details.open) {
93
+ if (single) next.clear();
94
+ next.add(itemId);
95
+ } else {
96
+ next.delete(itemId);
97
+ }
98
+ return next;
99
+ });
100
+ };
101
+
102
+ const unsub = openItems.on((set) => {
103
+ if (!syncing) syncDOMFromSignal(set);
104
+ });
105
+
106
+ // If initial was not provided, respect current DOM open state.
107
+ if (!hasInitial) syncSignalFromDOM();
108
+ else syncDOMFromSignal(openItems());
109
+
110
+ el.addEventListener("toggle", onToggle, true);
111
+
112
+ if (scope) {
113
+ scope.onCleanup(() => {
114
+ unsub();
115
+ el.removeEventListener("toggle", onToggle, true);
116
+ });
117
+ }
118
+ };
119
+
120
+ return { openItems, toggle, open, close, isOpen, _attachTo };
121
+ }
@@ -0,0 +1,78 @@
1
+ /* Dalila UI — Alert */
2
+
3
+ .d-alert {
4
+ position: relative;
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: var(--d-space-1);
8
+
9
+ padding: var(--d-space-4) var(--d-space-5);
10
+
11
+ font-family: var(--d-font-sans);
12
+ font-size: var(--d-text-base);
13
+ color: var(--d-text-primary);
14
+
15
+ background: var(--d-surface-card);
16
+ border: 1px solid var(--d-border-color);
17
+ border-radius: var(--d-radius-md);
18
+ box-shadow: inset 3px 0 0 var(--d-accent);
19
+ }
20
+
21
+ .d-alert-title {
22
+ font-size: var(--d-text-base);
23
+ font-weight: var(--d-font-semibold);
24
+ line-height: 1.3;
25
+ }
26
+
27
+ .d-alert-text {
28
+ margin: 0;
29
+ font-size: var(--d-text-sm);
30
+ color: var(--d-text-secondary);
31
+ line-height: var(--d-leading);
32
+ }
33
+
34
+ .d-alert-success {
35
+ background: var(--d-success-light);
36
+ border-color: transparent;
37
+ box-shadow: inset 3px 0 0 var(--d-success);
38
+ }
39
+
40
+ .d-alert-error {
41
+ background: var(--d-error-light);
42
+ border-color: transparent;
43
+ box-shadow: inset 3px 0 0 var(--d-error);
44
+ }
45
+
46
+ .d-alert-warning {
47
+ background: var(--d-warning-light);
48
+ border-color: transparent;
49
+ box-shadow: inset 3px 0 0 var(--d-warning);
50
+ }
51
+
52
+ .d-alert-info {
53
+ background: var(--d-info-light);
54
+ border-color: transparent;
55
+ box-shadow: inset 3px 0 0 var(--d-info);
56
+ }
57
+
58
+ .d-alert-success .d-alert-title { color: var(--d-success); }
59
+ .d-alert-error .d-alert-title { color: var(--d-error); }
60
+ .d-alert-warning .d-alert-title { color: var(--d-warning); }
61
+ .d-alert-info .d-alert-title { color: var(--d-info); }
62
+
63
+ .d-alert-dismiss {
64
+ position: absolute;
65
+ top: var(--d-space-3);
66
+ right: var(--d-space-3);
67
+ padding: var(--d-space-1);
68
+ background: none;
69
+ border: none;
70
+ color: var(--d-text-muted);
71
+ cursor: pointer;
72
+ border-radius: var(--d-radius-sm);
73
+ transition: color var(--d-duration-fast) ease;
74
+ }
75
+
76
+ .d-alert-dismiss:hover {
77
+ color: var(--d-text-primary);
78
+ }
@@ -0,0 +1,45 @@
1
+ /* Dalila UI — Avatar */
2
+
3
+ .d-avatar {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ width: 2.5rem;
8
+ height: 2.5rem;
9
+ border-radius: 50%;
10
+ overflow: hidden;
11
+ background: var(--d-surface-raised);
12
+ border: 1px solid var(--d-border-color);
13
+ font-family: var(--d-font-sans);
14
+ font-size: var(--d-text-sm);
15
+ font-weight: var(--d-font-semibold);
16
+ color: var(--d-text-muted);
17
+ flex-shrink: 0;
18
+ }
19
+
20
+ .d-avatar img {
21
+ width: 100%;
22
+ height: 100%;
23
+ object-fit: cover;
24
+ }
25
+
26
+ .d-avatar-sm { width: 2rem; height: 2rem; font-size: var(--d-text-xs); }
27
+ .d-avatar-lg { width: 3.5rem; height: 3.5rem; font-size: var(--d-text-lg); }
28
+ .d-avatar-xl { width: 5rem; height: 5rem; font-size: var(--d-text-2xl); }
29
+
30
+ .d-avatar-square {
31
+ border-radius: var(--d-radius-md);
32
+ }
33
+
34
+ .d-avatar-group {
35
+ display: flex;
36
+ }
37
+
38
+ .d-avatar-group .d-avatar {
39
+ margin-left: -0.5rem;
40
+ border: 2px solid var(--d-surface-page);
41
+ }
42
+
43
+ .d-avatar-group .d-avatar:first-child {
44
+ margin-left: 0;
45
+ }
@@ -0,0 +1,71 @@
1
+ /* Dalila UI — Badge */
2
+
3
+ .d-badge {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: var(--d-space-1);
7
+
8
+ padding: 0.2rem 0.6rem;
9
+
10
+ font-family: var(--d-font-sans);
11
+ font-size: 0.7rem;
12
+ font-weight: var(--d-font-semibold);
13
+ line-height: 1.5;
14
+ text-transform: uppercase;
15
+ letter-spacing: 0.05em;
16
+ white-space: nowrap;
17
+ color: var(--d-text-primary);
18
+
19
+ background: var(--d-surface-raised);
20
+ border: 1px solid var(--d-border-color);
21
+ border-radius: 4px;
22
+ }
23
+
24
+ .d-badge-primary {
25
+ color: #ffffff;
26
+ background: var(--d-accent);
27
+ border-color: var(--d-accent);
28
+ }
29
+
30
+ .d-badge-accent {
31
+ color: #ffffff;
32
+ background: var(--d-accent-500);
33
+ border-color: var(--d-accent-500);
34
+ }
35
+
36
+ .d-badge-success {
37
+ color: var(--d-success);
38
+ background: var(--d-success-light);
39
+ border-color: transparent;
40
+ }
41
+
42
+ .d-badge-error {
43
+ color: var(--d-error);
44
+ background: var(--d-error-light);
45
+ border-color: transparent;
46
+ }
47
+
48
+ .d-badge-warning {
49
+ color: var(--d-warning);
50
+ background: var(--d-warning-light);
51
+ border-color: transparent;
52
+ }
53
+
54
+ .d-badge-outline {
55
+ background: transparent;
56
+ }
57
+
58
+ .d-badge-solid {
59
+ color: #ffffff;
60
+ background: var(--d-gradient-brand);
61
+ border-color: transparent;
62
+ }
63
+
64
+ .d-badge-dot::before {
65
+ content: "";
66
+ width: 6px;
67
+ height: 6px;
68
+ border-radius: 50%;
69
+ background: currentColor;
70
+ flex-shrink: 0;
71
+ }
@@ -0,0 +1,41 @@
1
+ /* Dalila UI — Breadcrumb */
2
+
3
+ .d-breadcrumb {
4
+ display: flex;
5
+ align-items: center;
6
+ flex-wrap: wrap;
7
+ gap: var(--d-space-1);
8
+ font-family: var(--d-font-sans);
9
+ font-size: var(--d-text-sm);
10
+ color: var(--d-text-muted);
11
+ list-style: none;
12
+ padding: 0;
13
+ margin: 0;
14
+ }
15
+
16
+ .d-breadcrumb-item {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ gap: var(--d-space-1);
20
+ }
21
+
22
+ .d-breadcrumb-item + .d-breadcrumb-item::before {
23
+ content: "/";
24
+ color: var(--d-text-muted);
25
+ margin: 0 var(--d-space-1);
26
+ }
27
+
28
+ .d-breadcrumb-item a {
29
+ color: var(--d-text-muted);
30
+ text-decoration: none;
31
+ transition: color var(--d-duration-fast) ease;
32
+ }
33
+
34
+ .d-breadcrumb-item a:hover {
35
+ color: var(--d-accent);
36
+ }
37
+
38
+ .d-breadcrumb-item:last-child {
39
+ color: var(--d-text-primary);
40
+ font-weight: var(--d-font-medium);
41
+ }
@@ -0,0 +1,135 @@
1
+ /* Dalila UI — Button */
2
+
3
+ .d-btn {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ gap: var(--d-space-2);
8
+
9
+ padding: var(--d-space-2) var(--d-space-4);
10
+ min-height: 2.25rem;
11
+
12
+ font-family: var(--d-font-sans);
13
+ font-size: var(--d-text-sm);
14
+ font-weight: var(--d-font-medium);
15
+ line-height: 1;
16
+ white-space: nowrap;
17
+ color: var(--d-text-primary);
18
+ text-decoration: none;
19
+
20
+ background: var(--d-surface-raised);
21
+ border: 1px solid var(--d-border-color);
22
+ border-radius: var(--d-radius-md);
23
+
24
+ cursor: pointer;
25
+ user-select: none;
26
+ transition: all var(--d-duration-fast) ease;
27
+ }
28
+
29
+ .d-btn:hover {
30
+ background: var(--d-accent);
31
+ border-color: var(--d-accent);
32
+ color: #fff;
33
+ }
34
+
35
+ .d-btn:active {
36
+ transform: scale(0.98);
37
+ }
38
+
39
+ .d-btn:focus-visible {
40
+ outline: none;
41
+ box-shadow: var(--d-shadow-glow);
42
+ }
43
+
44
+ .d-btn:disabled,
45
+ .d-btn[aria-disabled="true"] {
46
+ opacity: 0.5;
47
+ pointer-events: none;
48
+ }
49
+
50
+ .d-btn-primary {
51
+ color: #ffffff;
52
+ background: var(--d-accent);
53
+ border-color: var(--d-accent);
54
+ }
55
+
56
+ .d-btn-primary:hover {
57
+ background: var(--d-accent-hover);
58
+ border-color: var(--d-accent-hover);
59
+ }
60
+
61
+ .d-btn-accent {
62
+ color: #ffffff;
63
+ background: var(--d-accent-500);
64
+ border-color: var(--d-accent-500);
65
+ }
66
+
67
+ .d-btn-accent:hover {
68
+ background: var(--d-accent-600);
69
+ border-color: var(--d-accent-600);
70
+ }
71
+
72
+ .d-btn-ghost {
73
+ background: transparent;
74
+ border-color: transparent;
75
+ }
76
+
77
+ .d-btn-ghost:hover {
78
+ background: var(--d-surface-raised);
79
+ border-color: var(--d-border-color);
80
+ color: var(--d-text-primary);
81
+ }
82
+
83
+ .d-btn-danger {
84
+ color: #ffffff;
85
+ background: var(--d-error);
86
+ border-color: var(--d-error);
87
+ }
88
+
89
+ .d-btn-danger:hover {
90
+ background: #b91c1c;
91
+ border-color: #b91c1c;
92
+ }
93
+
94
+ .d-btn-sm {
95
+ padding: var(--d-space-1) var(--d-space-3);
96
+ min-height: 1.8rem;
97
+ font-size: var(--d-text-xs);
98
+ }
99
+
100
+ .d-btn-lg {
101
+ padding: var(--d-space-3) var(--d-space-6);
102
+ min-height: 2.7rem;
103
+ font-size: var(--d-text-base);
104
+ }
105
+
106
+ .d-btn-icon {
107
+ padding: var(--d-space-2);
108
+ min-height: auto;
109
+ aspect-ratio: 1;
110
+ }
111
+
112
+ .d-btn-icon svg {
113
+ width: 1.125em;
114
+ height: 1.125em;
115
+ }
116
+
117
+ .d-btn-group {
118
+ display: inline-flex;
119
+ }
120
+
121
+ .d-btn-group .d-btn {
122
+ border-radius: 0;
123
+ }
124
+
125
+ .d-btn-group .d-btn:first-child {
126
+ border-radius: var(--d-radius-md) 0 0 var(--d-radius-md);
127
+ }
128
+
129
+ .d-btn-group .d-btn:last-child {
130
+ border-radius: 0 var(--d-radius-md) var(--d-radius-md) 0;
131
+ }
132
+
133
+ .d-btn-group .d-btn + .d-btn {
134
+ border-left-width: 0;
135
+ }
@@ -0,0 +1,96 @@
1
+ /* Dalila UI — Calendar */
2
+
3
+ .d-calendar {
4
+ font-family: var(--d-font-sans);
5
+ background: var(--d-surface-card);
6
+ border: 1px solid var(--d-border-color);
7
+ border-radius: var(--d-radius-lg);
8
+ padding: var(--d-space-4);
9
+ width: max-content;
10
+ }
11
+
12
+ .d-calendar-header {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: space-between;
16
+ margin-bottom: var(--d-space-3);
17
+ }
18
+
19
+ .d-calendar-title {
20
+ font-size: var(--d-text-sm);
21
+ font-weight: var(--d-font-semibold);
22
+ color: var(--d-text-primary);
23
+ }
24
+
25
+ .d-calendar-nav {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ width: 2rem;
30
+ height: 2rem;
31
+ background: none;
32
+ border: 1px solid var(--d-border-color);
33
+ border-radius: var(--d-radius-sm);
34
+ color: var(--d-text-muted);
35
+ cursor: pointer;
36
+ font-size: var(--d-text-sm);
37
+ transition: all var(--d-duration-fast) ease;
38
+ }
39
+
40
+ .d-calendar-nav:hover {
41
+ background: var(--d-surface-raised);
42
+ color: var(--d-text-primary);
43
+ }
44
+
45
+ .d-calendar-grid {
46
+ display: grid;
47
+ grid-template-columns: repeat(7, 2.25rem);
48
+ gap: 1px;
49
+ text-align: center;
50
+ }
51
+
52
+ .d-calendar-dow {
53
+ font-size: var(--d-text-xs);
54
+ font-weight: var(--d-font-medium);
55
+ color: var(--d-text-muted);
56
+ padding: var(--d-space-2) 0;
57
+ }
58
+
59
+ .d-calendar-day {
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ width: 2.25rem;
64
+ height: 2.25rem;
65
+ font-size: var(--d-text-sm);
66
+ color: var(--d-text-primary);
67
+ background: none;
68
+ border: none;
69
+ border-radius: var(--d-radius-sm);
70
+ cursor: pointer;
71
+ transition: all var(--d-duration-fast) ease;
72
+ }
73
+
74
+ .d-calendar-day:hover {
75
+ background: var(--d-surface-raised);
76
+ }
77
+
78
+ .d-calendar-day.today {
79
+ font-weight: var(--d-font-semibold);
80
+ border: 1px solid var(--d-accent);
81
+ }
82
+
83
+ .d-calendar-day.selected {
84
+ background: var(--d-accent);
85
+ color: #fff;
86
+ }
87
+
88
+ .d-calendar-day.other-month {
89
+ color: var(--d-text-muted);
90
+ opacity: 0.4;
91
+ }
92
+
93
+ .d-calendar-day:disabled {
94
+ opacity: 0.3;
95
+ cursor: not-allowed;
96
+ }