soltana-ui 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.
Files changed (104) hide show
  1. package/README.md +158 -0
  2. package/dist/config/index.d.ts +3 -0
  3. package/dist/config/index.js +7 -0
  4. package/dist/config/register.d.ts +27 -0
  5. package/dist/config/stylesheet.d.ts +13 -0
  6. package/dist/config/types.d.ts +177 -0
  7. package/dist/config/types.js +7 -0
  8. package/dist/config/validation.d.ts +29 -0
  9. package/dist/config/validation.js +59 -0
  10. package/dist/enhancers/accordion.d.ts +19 -0
  11. package/dist/enhancers/carousel.d.ts +21 -0
  12. package/dist/enhancers/collapsible.d.ts +14 -0
  13. package/dist/enhancers/color-picker.d.ts +20 -0
  14. package/dist/enhancers/combobox.d.ts +17 -0
  15. package/dist/enhancers/context-menu.d.ts +19 -0
  16. package/dist/enhancers/date-picker.d.ts +8 -0
  17. package/dist/enhancers/drawer.d.ts +11 -0
  18. package/dist/enhancers/dropdown.d.ts +17 -0
  19. package/dist/enhancers/hover-card.d.ts +15 -0
  20. package/dist/enhancers/index.d.ts +42 -0
  21. package/dist/enhancers/modal.d.ts +16 -0
  22. package/dist/enhancers/scroll-area.d.ts +14 -0
  23. package/dist/enhancers/tabs.d.ts +26 -0
  24. package/dist/enhancers/test-helpers.d.ts +20 -0
  25. package/dist/enhancers/test-utils.d.ts +10 -0
  26. package/dist/enhancers/toast.d.ts +24 -0
  27. package/dist/enhancers/tooltip.d.ts +15 -0
  28. package/dist/enhancers/tree.d.ts +24 -0
  29. package/dist/enhancers/utils/click-away.d.ts +7 -0
  30. package/dist/enhancers/utils/create-overlay-enhancer.d.ts +14 -0
  31. package/dist/enhancers/utils/focus-trap.d.ts +9 -0
  32. package/dist/enhancers/utils/generate-id.d.ts +6 -0
  33. package/dist/enhancers/utils/keyboard-nav.d.ts +21 -0
  34. package/dist/enhancers/utils/position.d.ts +30 -0
  35. package/dist/fonts/index.d.ts +20 -0
  36. package/dist/index.d.ts +9 -0
  37. package/dist/init.d.ts +16 -0
  38. package/dist/plugins/index.d.ts +2 -0
  39. package/dist/plugins/index.js +1 -0
  40. package/dist/plugins/postcss-soltana-treeshake.d.ts +10 -0
  41. package/dist/plugins/postcss-soltana-treeshake.js +149 -0
  42. package/dist/plugins/types.d.ts +9 -0
  43. package/dist/plugins/types.js +4 -0
  44. package/dist/soltana-ui.css +1 -0
  45. package/dist/soltana-ui.js +1702 -0
  46. package/dist/soltana-ui.umd.cjs +1 -0
  47. package/package.json +90 -0
  48. package/src/styles/_variables.scss +348 -0
  49. package/src/styles/base/_accessibility.scss +146 -0
  50. package/src/styles/base/_index.scss +12 -0
  51. package/src/styles/base/_register.scss +84 -0
  52. package/src/styles/base/_relief-system.scss +53 -0
  53. package/src/styles/base/_scrollbar.scss +40 -0
  54. package/src/styles/base/_transitions.scss +75 -0
  55. package/src/styles/base/_typography.scss +442 -0
  56. package/src/styles/components/_alert-dialogs.scss +75 -0
  57. package/src/styles/components/_badges.scss +215 -0
  58. package/src/styles/components/_buttons.scss +293 -0
  59. package/src/styles/components/_callouts.scss +99 -0
  60. package/src/styles/components/_cards.scss +97 -0
  61. package/src/styles/components/_carousels.scss +108 -0
  62. package/src/styles/components/_closes.scss +63 -0
  63. package/src/styles/components/_code.scss +75 -0
  64. package/src/styles/components/_collapsibles.scss +61 -0
  65. package/src/styles/components/_color-pickers.scss +211 -0
  66. package/src/styles/components/_comboboxes.scss +88 -0
  67. package/src/styles/components/_context-menus.scss +82 -0
  68. package/src/styles/components/_date-pickers.scss +165 -0
  69. package/src/styles/components/_feedback.scss +354 -0
  70. package/src/styles/components/_figures.scss +52 -0
  71. package/src/styles/components/_heros.scss +83 -0
  72. package/src/styles/components/_hover-cards.scss +55 -0
  73. package/src/styles/components/_images.scss +71 -0
  74. package/src/styles/components/_index.scss +41 -0
  75. package/src/styles/components/_indicators.scss +403 -0
  76. package/src/styles/components/_inputs.scss +409 -0
  77. package/src/styles/components/_layouts.scss +139 -0
  78. package/src/styles/components/_lists.scss +135 -0
  79. package/src/styles/components/_menus.scss +195 -0
  80. package/src/styles/components/_navigation.scss +325 -0
  81. package/src/styles/components/_overlays.scss +233 -0
  82. package/src/styles/components/_scroll-areas.scss +53 -0
  83. package/src/styles/components/_segmented-controls.scss +75 -0
  84. package/src/styles/components/_tables.scss +137 -0
  85. package/src/styles/components/_toasts.scss +111 -0
  86. package/src/styles/components/_toggles.scss +57 -0
  87. package/src/styles/components/_trees.scss +123 -0
  88. package/src/styles/decorative/_classical.scss +196 -0
  89. package/src/styles/decorative/_index.scss +7 -0
  90. package/src/styles/finishes/_index.scss +55 -0
  91. package/src/styles/index.scss +30 -0
  92. package/src/styles/reliefs/_index.scss +66 -0
  93. package/src/styles/reliefs/_neumorphic-tables.scss +92 -0
  94. package/src/styles/themes/_dark.scss +130 -0
  95. package/src/styles/themes/_index.scss +3 -0
  96. package/src/styles/themes/_light.scss +122 -0
  97. package/src/styles/themes/_sepia.scss +121 -0
  98. package/src/styles/utilities/_index.scss +13 -0
  99. package/src/styles/utilities/_layout.scss +100 -0
  100. package/src/styles/utilities/_mixins.scss +410 -0
  101. package/src/styles/utilities/_responsive.scss +46 -0
  102. package/src/styles/utilities/_sizing.scss +62 -0
  103. package/src/styles/utilities/_spacing.scss +12 -0
  104. package/src/styles/utilities/_visual.scss +436 -0
@@ -0,0 +1,75 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Code Components
3
+ // ---------------------------------------------------------------------------
4
+ // Styled inline code spans and preformatted code blocks.
5
+ // Complements the base `code` and `pre` element styles in _typography.scss.
6
+ // Uses --relief-* and --finish-* variables for tier integration.
7
+ // ---------------------------------------------------------------------------
8
+
9
+ @use '../base/register' as *;
10
+
11
+ // ============================================================================
12
+ // INLINE CODE
13
+ // ============================================================================
14
+
15
+ .code {
16
+ font-family: var(--font-mono);
17
+ font-size: 0.875em;
18
+ padding: 0.125em 0.375em;
19
+ border-radius: var(--radius-md);
20
+ background: var(--code-bg);
21
+ border: 1px solid var(--border-default);
22
+ color: var(--text-primary);
23
+ white-space: nowrap;
24
+ }
25
+
26
+ // ============================================================================
27
+ // CODE BLOCK
28
+ // ============================================================================
29
+
30
+ .code-block {
31
+ font-family: var(--font-mono);
32
+ font-size: var(--text-sm);
33
+ line-height: 1.65;
34
+ overflow-x: auto;
35
+ padding: 1rem 1.25rem;
36
+ border-radius: var(--radius-lg);
37
+ @include relief-container(var(--relief-shadow-inset));
38
+ @include finish-surface(var(--code-bg));
39
+ color: var(--text-primary);
40
+ tab-size: 4;
41
+
42
+ code {
43
+ padding: 0;
44
+ background: none;
45
+ border: none;
46
+ white-space: pre;
47
+ }
48
+ }
49
+
50
+ // ============================================================================
51
+ // VARIANTS
52
+ // ============================================================================
53
+
54
+ .code-block-sm {
55
+ padding: 0.625rem 0.875rem;
56
+ font-size: var(--text-xs);
57
+ }
58
+
59
+ .code-block-numbered {
60
+ counter-reset: line;
61
+
62
+ .code-line {
63
+ counter-increment: line;
64
+
65
+ &::before {
66
+ content: counter(line);
67
+ display: inline-block;
68
+ width: 2.5em;
69
+ margin-right: 1em;
70
+ text-align: right;
71
+ color: var(--text-muted);
72
+ user-select: none;
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,61 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Collapsible Component
3
+ // ---------------------------------------------------------------------------
4
+ // Single-panel expand/collapse. Simpler than accordion — no item grouping.
5
+ // Uses --relief-* and --finish-* variables for tier integration.
6
+ // ---------------------------------------------------------------------------
7
+
8
+ @use '../base/register' as *;
9
+ @use '../base/transitions' as *;
10
+
11
+ .collapsible {
12
+ border-radius: var(--radius-lg);
13
+ }
14
+
15
+ .collapsible-bordered {
16
+ @include relief-container;
17
+ border-radius: var(--radius-lg);
18
+ }
19
+
20
+ .collapsible-trigger {
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: space-between;
24
+ width: 100%;
25
+ padding: 0.75rem 1rem;
26
+ font-family: var(--font-sans);
27
+ font-size: var(--text-sm);
28
+ font-weight: var(--font-semibold);
29
+ color: var(--text-primary);
30
+ background: none;
31
+ border: none;
32
+ cursor: pointer;
33
+ text-align: left;
34
+ letter-spacing: var(--tracking-elegant);
35
+
36
+ &::after {
37
+ content: '';
38
+ display: inline-block;
39
+ width: 0.5em;
40
+ height: 0.5em;
41
+ border-right: 2px solid currentcolor;
42
+ border-bottom: 2px solid currentcolor;
43
+ transform: rotate(45deg);
44
+ @include transition-property(transform);
45
+ }
46
+
47
+ &[aria-expanded='true']::after {
48
+ transform: rotate(-135deg);
49
+ }
50
+ }
51
+
52
+ .collapsible-content {
53
+ overflow: hidden;
54
+ max-height: var(--collapsible-height, 0);
55
+ @include transition-property(max-height, var(--transition-slow));
56
+ padding: 0 1rem;
57
+
58
+ &[aria-hidden='false'] {
59
+ padding-bottom: 0.75rem;
60
+ }
61
+ }
@@ -0,0 +1,211 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Color Picker Component
3
+ // ---------------------------------------------------------------------------
4
+ // HSV color selection with 2D area, hue slider, optional alpha, and swatches.
5
+ // Uses --relief-* and --finish-* variables for tier integration.
6
+ // ---------------------------------------------------------------------------
7
+
8
+ @use '../base/register' as *;
9
+ @use '../base/accessibility' as *;
10
+ @use '../base/transitions' as *;
11
+
12
+ // ============================================================================
13
+ // CONTAINER
14
+ // ============================================================================
15
+
16
+ .color-picker {
17
+ position: relative;
18
+ display: inline-block;
19
+ }
20
+
21
+ // ============================================================================
22
+ // TRIGGER SWATCH
23
+ // ============================================================================
24
+
25
+ .color-picker-trigger {
26
+ display: inline-flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ width: 2.25rem;
30
+ height: 2.25rem;
31
+ border-radius: var(--radius-md);
32
+ border: 2px solid var(--border-default);
33
+ background-color: var(--cp-trigger-bg);
34
+ cursor: pointer;
35
+ @include transition-interactive(var(--transition-normal));
36
+
37
+ &:hover {
38
+ border-color: var(--border-strong);
39
+ }
40
+
41
+ &:focus-visible {
42
+ @include focus-ring-outline;
43
+ }
44
+ }
45
+
46
+ // ============================================================================
47
+ // POPUP
48
+ // ============================================================================
49
+
50
+ .color-picker-popup {
51
+ position: absolute;
52
+ top: calc(100% + 0.5rem);
53
+ left: 0;
54
+ z-index: var(--z-dropdown);
55
+ width: 14rem;
56
+ padding: 0.75rem;
57
+ border-radius: var(--radius-xl);
58
+ @include relief-container;
59
+ @include finish-surface(var(--popover-bg));
60
+ opacity: 0;
61
+ pointer-events: none;
62
+ transform: translateY(-0.25rem);
63
+ transition:
64
+ opacity var(--transition-normal) var(--easing-in-out),
65
+ transform var(--transition-normal) var(--easing-in-out);
66
+
67
+ &.active {
68
+ opacity: 1;
69
+ pointer-events: auto;
70
+ transform: translateY(0);
71
+ }
72
+ }
73
+
74
+ // ============================================================================
75
+ // 2D SATURATION/BRIGHTNESS AREA
76
+ // ============================================================================
77
+
78
+ .color-picker-area {
79
+ position: relative;
80
+ width: 100%;
81
+ aspect-ratio: 1;
82
+ border-radius: var(--radius-md);
83
+ background-color: var(--cp-area-bg);
84
+ background-image:
85
+ linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, transparent);
86
+ cursor: crosshair;
87
+ margin-bottom: 0.5rem;
88
+ }
89
+
90
+ .color-picker-area-thumb {
91
+ position: absolute;
92
+ left: var(--cp-thumb-x, 0%);
93
+ top: var(--cp-thumb-y, 0%);
94
+ width: 0.875rem;
95
+ height: 0.875rem;
96
+ border-radius: var(--radius-full);
97
+ border: 2px solid var(--color-white);
98
+ background-color: var(--cp-thumb-bg);
99
+ box-shadow: 0 0 2px rgb(var(--shadow-color) / 50%);
100
+ transform: translate(-50%, -50%);
101
+ pointer-events: none;
102
+ }
103
+
104
+ // ============================================================================
105
+ // SLIDERS (HUE / ALPHA)
106
+ // ============================================================================
107
+
108
+ .color-picker-hue,
109
+ .color-picker-alpha {
110
+ position: relative;
111
+ width: 100%;
112
+ height: 0.75rem;
113
+ border-radius: var(--radius-full);
114
+ cursor: pointer;
115
+ margin-bottom: 0.5rem;
116
+ }
117
+
118
+ .color-picker-hue {
119
+ background: linear-gradient(
120
+ to right,
121
+ #f00 0%,
122
+ #ff0 17%,
123
+ #0f0 33%,
124
+ #0ff 50%,
125
+ #00f 67%,
126
+ #f0f 83%,
127
+ #f00 100%
128
+ );
129
+ }
130
+
131
+ .color-picker-alpha {
132
+ // Checkerboard under the alpha gradient
133
+ background-image:
134
+ linear-gradient(45deg, var(--surface-3) 25%, transparent 25%),
135
+ linear-gradient(-45deg, var(--surface-3) 25%, transparent 25%),
136
+ linear-gradient(45deg, transparent 75%, var(--surface-3) 75%),
137
+ linear-gradient(-45deg, transparent 75%, var(--surface-3) 75%);
138
+ background-size: 0.5rem 0.5rem;
139
+ background-position:
140
+ 0 0,
141
+ 0 0.25rem,
142
+ 0.25rem -0.25rem,
143
+ -0.25rem 0;
144
+ }
145
+
146
+ .color-picker-slider-thumb {
147
+ position: absolute;
148
+ left: var(--cp-hue-x, 0%);
149
+ top: 50%;
150
+ width: 0.875rem;
151
+ height: 0.875rem;
152
+ border-radius: var(--radius-full);
153
+ border: 2px solid var(--color-white);
154
+ box-shadow: 0 0 2px rgb(var(--shadow-color) / 50%);
155
+ transform: translate(-50%, -50%);
156
+ pointer-events: none;
157
+ }
158
+
159
+ // ============================================================================
160
+ // PREVIEW + INPUT
161
+ // ============================================================================
162
+
163
+ .color-picker-preview {
164
+ width: 1.5rem;
165
+ height: 1.5rem;
166
+ border-radius: var(--radius-md);
167
+ border: 1px solid var(--border-default);
168
+ flex-shrink: 0;
169
+ }
170
+
171
+ .color-picker-input {
172
+ width: 100%;
173
+ font-family: var(--font-mono);
174
+ font-size: var(--text-xs);
175
+ text-align: center;
176
+ margin-bottom: 0.5rem;
177
+ }
178
+
179
+ // ============================================================================
180
+ // PREDEFINED SWATCHES
181
+ // ============================================================================
182
+
183
+ .color-picker-swatches {
184
+ display: grid;
185
+ grid-template-columns: repeat(auto-fill, 1.5rem);
186
+ gap: 0.375rem;
187
+ }
188
+
189
+ .color-picker-swatch {
190
+ width: 1.5rem;
191
+ height: 1.5rem;
192
+ border-radius: var(--radius-sm);
193
+ border: 1px solid var(--border-subtle);
194
+ background-color: var(--cp-swatch-bg);
195
+ cursor: pointer;
196
+ padding: 0;
197
+ @include transition-interactive(var(--transition-normal));
198
+
199
+ &:hover {
200
+ border-color: var(--border-strong);
201
+ transform: scale(1.1);
202
+ }
203
+
204
+ &:focus-visible {
205
+ @include focus-ring-outline;
206
+ }
207
+
208
+ &.selected {
209
+ box-shadow: 0 0 0 2px var(--accent-primary);
210
+ }
211
+ }
@@ -0,0 +1,88 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Combobox / Autocomplete Component
3
+ // ---------------------------------------------------------------------------
4
+ // Text input with filterable dropdown list. Tier-aware surfaces for the
5
+ // dropdown popup.
6
+ // Uses --relief-* and --finish-* variables for tier integration.
7
+ // ---------------------------------------------------------------------------
8
+
9
+ @use '../base/register' as *;
10
+ @use '../base/accessibility' as *;
11
+ @use '../base/transitions' as *;
12
+
13
+ .combobox {
14
+ position: relative;
15
+ display: inline-block;
16
+ width: 100%;
17
+ }
18
+
19
+ .combobox-input {
20
+ width: 100%;
21
+ }
22
+
23
+ .combobox-listbox {
24
+ position: absolute;
25
+ top: calc(100% + 0.25rem);
26
+ left: 0;
27
+ right: 0;
28
+ z-index: var(--z-dropdown);
29
+ max-height: 16rem;
30
+ overflow-y: auto;
31
+ padding: 0.375rem 0;
32
+ margin: 0;
33
+ list-style: none;
34
+ border-radius: var(--radius-xl);
35
+ border: 1px solid var(--border-default);
36
+ box-shadow: var(--relief-shadow-lg);
37
+ @include finish-surface(var(--surface-1));
38
+ opacity: 0;
39
+ pointer-events: none;
40
+ transform: translateY(-0.25rem);
41
+ transition:
42
+ opacity var(--transition-normal) var(--easing-in-out),
43
+ transform var(--transition-normal) var(--easing-in-out);
44
+
45
+ &.active {
46
+ opacity: 1;
47
+ pointer-events: auto;
48
+ transform: translateY(0);
49
+ }
50
+ }
51
+
52
+ .combobox-option {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 0.5rem;
56
+ padding: 0.5rem 1rem;
57
+ font-size: var(--text-sm);
58
+ font-family: var(--font-sans);
59
+ color: var(--text-primary);
60
+ cursor: pointer;
61
+ @include transition-interactive(var(--transition-normal));
62
+
63
+ @include hover-state {
64
+ color: var(--accent-primary);
65
+ }
66
+
67
+ &:focus-visible {
68
+ @include focus-ring-outline($inset: true);
69
+ }
70
+
71
+ &.active {
72
+ background-color: var(--state-hover);
73
+ color: var(--accent-primary);
74
+ }
75
+
76
+ &.selected {
77
+ background-color: var(--state-active);
78
+ color: var(--accent-primary);
79
+ font-weight: var(--font-medium);
80
+ }
81
+ }
82
+
83
+ .combobox-empty {
84
+ padding: 0.75rem 1rem;
85
+ font-size: var(--text-sm);
86
+ color: var(--text-muted);
87
+ text-align: center;
88
+ }
@@ -0,0 +1,82 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Context Menu Component
3
+ // ---------------------------------------------------------------------------
4
+ // Right-click triggered menu, reusing dropdown-menu visual patterns.
5
+ // Uses --relief-* and --finish-* variables for tier integration.
6
+ // ---------------------------------------------------------------------------
7
+
8
+ @use '../base/register' as *;
9
+ @use '../base/accessibility' as *;
10
+ @use '../base/transitions' as *;
11
+
12
+ .context-menu {
13
+ position: fixed;
14
+ top: var(--context-menu-top, 0);
15
+ left: var(--context-menu-left, 0);
16
+ z-index: var(--z-dropdown);
17
+ min-width: 10rem;
18
+ padding: 0.375rem 0;
19
+ border-radius: var(--radius-xl);
20
+ border: 1px solid var(--border-default);
21
+ box-shadow: var(--relief-shadow-lg);
22
+ @include finish-surface(var(--surface-1));
23
+ opacity: 0;
24
+ pointer-events: none;
25
+ @include transition-property(opacity);
26
+
27
+ &.active {
28
+ opacity: 1;
29
+ pointer-events: auto;
30
+ }
31
+ }
32
+
33
+ .context-menu-item {
34
+ display: flex;
35
+ align-items: center;
36
+ gap: 0.5rem;
37
+ width: 100%;
38
+ padding: 0.5rem 1rem;
39
+ font-size: var(--text-sm);
40
+ font-family: var(--font-sans);
41
+ color: var(--text-primary);
42
+ background: none;
43
+ border: none;
44
+ cursor: pointer;
45
+ text-align: left;
46
+ white-space: nowrap;
47
+ @include transition-interactive(var(--transition-normal));
48
+
49
+ @include hover-state {
50
+ color: var(--accent-primary);
51
+ }
52
+
53
+ &:focus-visible {
54
+ @include focus-ring-outline($inset: true);
55
+ }
56
+
57
+ &.active {
58
+ color: var(--accent-primary);
59
+ background-color: var(--state-active);
60
+ }
61
+
62
+ &:disabled,
63
+ &.disabled {
64
+ color: var(--state-disabled-text);
65
+ pointer-events: none;
66
+ }
67
+ }
68
+
69
+ .context-menu-divider {
70
+ border: none;
71
+ border-top: 1px solid var(--border-subtle);
72
+ margin: 0.25rem 0;
73
+ }
74
+
75
+ .context-menu-header {
76
+ padding: 0.375rem 1rem;
77
+ font-size: var(--text-xs);
78
+ font-weight: var(--font-semibold);
79
+ color: var(--text-muted);
80
+ letter-spacing: var(--tracking-display);
81
+ text-transform: uppercase;
82
+ }
@@ -0,0 +1,165 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Date Picker Component
3
+ // ---------------------------------------------------------------------------
4
+ // Calendar-based date selection with input and popup.
5
+ // Uses --relief-* and --finish-* variables for tier integration.
6
+ // ---------------------------------------------------------------------------
7
+
8
+ @use '../base/register' as *;
9
+ @use '../base/accessibility' as *;
10
+ @use '../base/transitions' as *;
11
+
12
+ // ============================================================================
13
+ // CONTAINER
14
+ // ============================================================================
15
+
16
+ .date-picker {
17
+ position: relative;
18
+ display: inline-block;
19
+ }
20
+
21
+ .date-picker-input {
22
+ width: 100%;
23
+ cursor: pointer;
24
+ }
25
+
26
+ // ============================================================================
27
+ // POPUP
28
+ // ============================================================================
29
+
30
+ .date-picker-popup {
31
+ position: absolute;
32
+ top: calc(100% + 0.5rem);
33
+ left: 0;
34
+ z-index: var(--z-dropdown);
35
+ width: 18rem;
36
+ padding: 1rem;
37
+ border-radius: var(--radius-xl);
38
+ @include relief-container;
39
+ @include finish-surface(var(--popover-bg));
40
+ opacity: 0;
41
+ pointer-events: none;
42
+ transform: translateY(-0.25rem);
43
+ transition:
44
+ opacity var(--transition-normal) var(--easing-in-out),
45
+ transform var(--transition-normal) var(--easing-in-out);
46
+
47
+ &.active {
48
+ opacity: 1;
49
+ pointer-events: auto;
50
+ transform: translateY(0);
51
+ }
52
+ }
53
+
54
+ // ============================================================================
55
+ // HEADER (month/year navigation)
56
+ // ============================================================================
57
+
58
+ .date-picker-header {
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: space-between;
62
+ margin-bottom: 0.75rem;
63
+ }
64
+
65
+ .date-picker-title {
66
+ font-size: var(--text-sm);
67
+ font-weight: var(--font-semibold);
68
+ color: var(--text-primary);
69
+ letter-spacing: var(--tracking-elegant);
70
+ }
71
+
72
+ .date-picker-nav {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ width: 1.75rem;
77
+ height: 1.75rem;
78
+ border-radius: var(--radius-md);
79
+ border: none;
80
+ background: none;
81
+ color: var(--text-secondary);
82
+ cursor: pointer;
83
+ font-size: var(--text-sm);
84
+ @include transition-interactive(var(--transition-normal));
85
+
86
+ @include hover-state {
87
+ color: var(--text-primary);
88
+ }
89
+
90
+ &:focus-visible {
91
+ @include focus-ring-outline;
92
+ }
93
+ }
94
+
95
+ // ============================================================================
96
+ // CALENDAR GRID
97
+ // ============================================================================
98
+
99
+ .date-picker-grid {
100
+ display: grid;
101
+ grid-template-columns: repeat(7, 1fr);
102
+ gap: 0.125rem;
103
+ text-align: center;
104
+ }
105
+
106
+ .date-picker-weekday {
107
+ font-size: var(--text-xs);
108
+ font-weight: var(--font-semibold);
109
+ color: var(--text-muted);
110
+ padding: 0.25rem 0;
111
+ text-transform: uppercase;
112
+ letter-spacing: var(--tracking-display);
113
+ }
114
+
115
+ // ============================================================================
116
+ // DAY CELLS
117
+ // ============================================================================
118
+
119
+ .date-picker-cell {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ width: 2rem;
124
+ height: 2rem;
125
+ margin: auto;
126
+ border-radius: var(--radius-md);
127
+ border: none;
128
+ background: none;
129
+ color: var(--text-primary);
130
+ font-size: var(--text-sm);
131
+ font-family: var(--font-sans);
132
+ cursor: pointer;
133
+ @include transition-interactive(var(--transition-normal));
134
+
135
+ @include hover-state;
136
+
137
+ &:focus-visible {
138
+ @include focus-ring-outline;
139
+ }
140
+
141
+ &.today {
142
+ box-shadow: inset 0 0 0 1px var(--border-decorative);
143
+ }
144
+
145
+ &.selected {
146
+ background-color: var(--accent-primary);
147
+ color: var(--text-inverse);
148
+ box-shadow: none;
149
+ }
150
+
151
+ &.in-range {
152
+ background-color: color-mix(in srgb, var(--accent-primary) 12%, transparent);
153
+ border-radius: 0;
154
+ }
155
+
156
+ &.disabled {
157
+ color: var(--state-disabled-text);
158
+ pointer-events: none;
159
+ }
160
+ }
161
+
162
+ .date-picker-cell-other {
163
+ color: var(--text-muted);
164
+ opacity: 0.5;
165
+ }