@dryui/ui 0.1.2 → 0.1.3

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.
@@ -1,6 +1,9 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements';
4
+ import { getButtonGroupCtx } from '../button-group/context.svelte.js';
5
+
6
+ const groupCtx = getButtonGroupCtx();
4
7
 
5
8
  interface Props extends HTMLButtonAttributes {
6
9
  variant?: 'solid' | 'outline' | 'ghost' | 'soft' | 'secondary' | 'link' | 'bare';
@@ -47,7 +50,7 @@
47
50
  }
48
51
  </script>
49
52
 
50
- <span class="wrapper">
53
+ <span class="wrapper" data-in-group={groupCtx ? '' : undefined} data-group-orientation={groupCtx?.orientation}>
51
54
  {#if href !== undefined}
52
55
  <a
53
56
  {...rest as AnchorRest}
@@ -357,4 +360,51 @@
357
360
  --dry-btn-radius: var(--dry-radius-lg);
358
361
  --dry-btn-font-size: var(--dry-type-heading-4-size, var(--dry-text-base-size));
359
362
  }
363
+
364
+ /* ── Button-group integration ─────────────────────────────────────── */
365
+
366
+ .wrapper[data-in-group] :is(a, button) {
367
+ border-radius: 0;
368
+ }
369
+
370
+ /* Horizontal: first child gets left radii */
371
+ .wrapper[data-in-group][data-group-orientation='horizontal']:first-child :is(a, button) {
372
+ border-top-left-radius: var(--dry-button-group-radius);
373
+ border-bottom-left-radius: var(--dry-button-group-radius);
374
+ }
375
+
376
+ /* Horizontal: last child gets right radii */
377
+ .wrapper[data-in-group][data-group-orientation='horizontal']:last-child :is(a, button) {
378
+ border-top-right-radius: var(--dry-button-group-radius);
379
+ border-bottom-right-radius: var(--dry-button-group-radius);
380
+ }
381
+
382
+ /* Horizontal: non-first child removes inline-start border */
383
+ .wrapper[data-in-group][data-group-orientation='horizontal']:not(:first-child) :is(a, button) {
384
+ border-inline-start: 0;
385
+ }
386
+
387
+ /* Vertical: first child gets top radii */
388
+ .wrapper[data-in-group][data-group-orientation='vertical']:first-child :is(a, button) {
389
+ border-top-left-radius: var(--dry-button-group-radius);
390
+ border-top-right-radius: var(--dry-button-group-radius);
391
+ }
392
+
393
+ /* Vertical: last child gets bottom radii */
394
+ .wrapper[data-in-group][data-group-orientation='vertical']:last-child :is(a, button) {
395
+ border-bottom-left-radius: var(--dry-button-group-radius);
396
+ border-bottom-right-radius: var(--dry-button-group-radius);
397
+ }
398
+
399
+ /* Vertical: non-first child removes block-start border */
400
+ .wrapper[data-in-group][data-group-orientation='vertical']:not(:first-child) :is(a, button) {
401
+ border-block-start: 0;
402
+ }
403
+
404
+ /* Hover/focus z-index for grouped buttons */
405
+ .wrapper[data-in-group]:hover :is(a, button),
406
+ .wrapper[data-in-group]:focus-within :is(a, button) {
407
+ z-index: var(--dry-button-group-hover-z-index);
408
+ position: relative;
409
+ }
360
410
  </style>
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
+ import { setButtonGroupCtx } from './context.svelte.js';
4
5
 
5
6
  interface Props extends HTMLAttributes<HTMLDivElement> {
6
7
  orientation?: 'horizontal' | 'vertical';
@@ -15,6 +16,12 @@
15
16
  children,
16
17
  ...rest
17
18
  }: Props = $props();
19
+
20
+ setButtonGroupCtx({
21
+ get orientation() {
22
+ return orientation;
23
+ }
24
+ });
18
25
  </script>
19
26
 
20
27
  <div
@@ -39,68 +46,6 @@
39
46
 
40
47
  [data-button-group][data-orientation='horizontal'] {
41
48
  grid-auto-flow: column;
42
-
43
- & > :where(button, a, span),
44
- & > :where(span) > :where(button, a) {
45
- border-radius: 0;
46
- }
47
-
48
- & > :where(button, a):first-child,
49
- & > :where(span):first-child > :where(button, a) {
50
- border-top-left-radius: var(--dry-button-group-radius);
51
- border-bottom-left-radius: var(--dry-button-group-radius);
52
- }
53
-
54
- & > :where(button, a):last-child,
55
- & > :where(span):last-child > :where(button, a) {
56
- border-top-right-radius: var(--dry-button-group-radius);
57
- border-bottom-right-radius: var(--dry-button-group-radius);
58
- }
59
-
60
- & > :where(button, a):not(:first-child),
61
- & > :where(span):not(:first-child) > :where(button, a) {
62
- border-inline-start: 0;
63
- }
64
-
65
- & > :where(button, a):hover,
66
- & > :where(button, a):focus-visible,
67
- & > :where(span):hover > :where(button, a),
68
- & > :where(span):focus-within > :where(button, a) {
69
- z-index: var(--dry-button-group-hover-z-index);
70
- position: relative;
71
- }
72
- }
73
-
74
- [data-button-group][data-orientation='vertical'] {
75
- & > :where(button, a, span),
76
- & > :where(span) > :where(button, a) {
77
- border-radius: 0;
78
- }
79
-
80
- & > :where(button, a):first-child,
81
- & > :where(span):first-child > :where(button, a) {
82
- border-top-left-radius: var(--dry-button-group-radius);
83
- border-top-right-radius: var(--dry-button-group-radius);
84
- }
85
-
86
- & > :where(button, a):last-child,
87
- & > :where(span):last-child > :where(button, a) {
88
- border-bottom-left-radius: var(--dry-button-group-radius);
89
- border-bottom-right-radius: var(--dry-button-group-radius);
90
- }
91
-
92
- & > :where(button, a):not(:first-child),
93
- & > :where(span):not(:first-child) > :where(button, a) {
94
- border-block-start: 0;
95
- }
96
-
97
- & > :where(button, a):hover,
98
- & > :where(button, a):focus-visible,
99
- & > :where(span):hover > :where(button, a),
100
- & > :where(span):focus-within > :where(button, a) {
101
- z-index: var(--dry-button-group-hover-z-index);
102
- position: relative;
103
- }
104
49
  }
105
50
 
106
51
  [data-button-group][data-size='sm'] {
@@ -0,0 +1,5 @@
1
+ export interface ButtonGroupContext {
2
+ readonly orientation: 'horizontal' | 'vertical';
3
+ }
4
+ export declare function setButtonGroupCtx(ctx: ButtonGroupContext): ButtonGroupContext;
5
+ export declare function getButtonGroupCtx(): ButtonGroupContext | undefined;
@@ -0,0 +1,11 @@
1
+ import { getContext, setContext, hasContext } from 'svelte';
2
+ const KEY = Symbol('button-group');
3
+ export function setButtonGroupCtx(ctx) {
4
+ setContext(KEY, ctx);
5
+ return ctx;
6
+ }
7
+ export function getButtonGroupCtx() {
8
+ if (!hasContext(KEY))
9
+ return undefined;
10
+ return getContext(KEY);
11
+ }
@@ -27,7 +27,7 @@
27
27
  letter-spacing: 0.05em;
28
28
  }
29
29
 
30
- [data-combobox-group] + [data-combobox-group] {
30
+ [data-combobox-group]:not(:first-of-type) {
31
31
  border-top: 1px solid var(--dry-color-stroke-weak);
32
32
  margin-top: var(--dry-space-1);
33
33
  padding-top: var(--dry-space-1);
@@ -150,9 +150,3 @@
150
150
  </script>
151
151
 
152
152
  {@render children()}
153
-
154
- <style>
155
- [data-drp-root] {
156
- display: contents;
157
- }
158
- </style>
@@ -142,8 +142,4 @@
142
142
  overflow: hidden;
143
143
  }
144
144
 
145
- [data-file-upload] {
146
- container-type: inline-size;
147
- display: grid;
148
- }
149
145
  </style>
@@ -12,3 +12,11 @@
12
12
  <div data-list-item-icon class={className} {...rest}>
13
13
  {@render children()}
14
14
  </div>
15
+
16
+ <style>
17
+ [data-list-item-icon] {
18
+ display: inline-grid;
19
+ place-items: center;
20
+ color: var(--dry-list-item-icon-color);
21
+ }
22
+ </style>
@@ -21,3 +21,22 @@
21
21
  <span data-list-item-secondary>{@render secondary()}</span>
22
22
  {/if}
23
23
  </div>
24
+
25
+ <style>
26
+ [data-list-item-text] {
27
+ display: grid;
28
+ grid-template-columns: minmax(0, 1fr);
29
+ gap: var(--dry-space-0_5);
30
+ }
31
+
32
+ [data-list-item-text] > [data-list-item-primary] {
33
+ font-size: var(--dry-list-primary-size);
34
+ line-height: 1.5;
35
+ }
36
+
37
+ [data-list-item-text] > [data-list-item-secondary] {
38
+ font-size: var(--dry-list-secondary-size);
39
+ color: var(--dry-list-secondary-color);
40
+ line-height: 1.4;
41
+ }
42
+ </style>
@@ -47,3 +47,45 @@
47
47
  >
48
48
  {@render children()}
49
49
  </li>
50
+
51
+ <style>
52
+ [data-list-item] {
53
+ display: grid;
54
+ grid-template-columns: auto minmax(0, 1fr);
55
+ align-items: start;
56
+ gap: var(--dry-list-item-gap);
57
+ padding: var(--dry-list-item-padding);
58
+ border-radius: var(--dry-list-item-radius);
59
+ transition:
60
+ background var(--dry-duration-fast) var(--dry-ease-default),
61
+ color var(--dry-duration-fast) var(--dry-ease-default);
62
+ }
63
+
64
+ [data-list-item][data-interactive='true'] {
65
+ cursor: pointer;
66
+ }
67
+
68
+ [data-list-item][data-interactive='true']:hover,
69
+ [data-list-item][data-interactive='true']:focus-visible {
70
+ background: var(--dry-list-item-hover-bg);
71
+ }
72
+
73
+ [data-list-item][data-interactive='true']:active {
74
+ background: var(--dry-list-item-active-bg);
75
+ }
76
+
77
+ [data-list-item][data-interactive='true']:focus-visible {
78
+ outline: 2px solid var(--dry-color-focus-ring);
79
+ outline-offset: -2px;
80
+ }
81
+
82
+ [data-list-item][data-disabled='true'] {
83
+ opacity: 0.5;
84
+ cursor: not-allowed;
85
+ pointer-events: none;
86
+ }
87
+
88
+ [data-list-item][data-dense='true'] {
89
+ --dry-list-item-padding: var(--dry-space-1_5) var(--dry-space-2);
90
+ }
91
+ </style>
@@ -66,75 +66,4 @@
66
66
  --dry-list-padding: 0;
67
67
  }
68
68
 
69
- [data-list-item] {
70
- display: grid;
71
- grid-template-columns: auto minmax(0, 1fr);
72
- align-items: start;
73
- gap: var(--dry-list-item-gap);
74
- padding: var(--dry-list-item-padding);
75
- border-radius: var(--dry-list-item-radius);
76
- transition:
77
- background var(--dry-duration-fast) var(--dry-ease-default),
78
- color var(--dry-duration-fast) var(--dry-ease-default);
79
- }
80
-
81
- [data-list-item][data-interactive='true'] {
82
- cursor: pointer;
83
- }
84
-
85
- [data-list-item][data-interactive='true']:hover,
86
- [data-list-item][data-interactive='true']:focus-visible {
87
- background: var(--dry-list-item-hover-bg);
88
- }
89
-
90
- [data-list-item][data-interactive='true']:active {
91
- background: var(--dry-list-item-active-bg);
92
- }
93
-
94
- [data-list-item][data-interactive='true']:focus-visible {
95
- outline: 2px solid var(--dry-color-focus-ring);
96
- outline-offset: -2px;
97
- }
98
-
99
- [data-list-item][data-disabled='true'] {
100
- opacity: 0.5;
101
- cursor: not-allowed;
102
- pointer-events: none;
103
- }
104
-
105
- [data-list-item][data-dense='true'] {
106
- --dry-list-item-padding: var(--dry-space-1_5) var(--dry-space-2);
107
- }
108
-
109
- [data-list-item-icon] {
110
- display: inline-grid;
111
- place-items: center;
112
- color: var(--dry-list-item-icon-color);
113
- }
114
-
115
- [data-list-item-text] {
116
- display: grid;
117
- grid-template-columns: minmax(0, 1fr);
118
- gap: var(--dry-space-0_5);
119
- }
120
-
121
- [data-list-item-text] > [data-list-item-primary] {
122
- font-size: var(--dry-list-primary-size);
123
- line-height: 1.5;
124
- }
125
-
126
- [data-list-item-text] > [data-list-item-secondary] {
127
- font-size: var(--dry-list-secondary-size);
128
- color: var(--dry-list-secondary-color);
129
- line-height: 1.4;
130
- }
131
-
132
- [data-list-subheader] {
133
- padding: var(--dry-space-1_5) var(--dry-space-3) var(--dry-space-1);
134
- font-size: var(--dry-list-secondary-size);
135
- font-weight: 600;
136
- letter-spacing: 0.04em;
137
- text-transform: uppercase;
138
- color: var(--dry-list-subheader-color);
139
- }
140
69
  </style>
@@ -12,3 +12,14 @@
12
12
  <li role="presentation" data-list-subheader class={className} {...rest}>
13
13
  {@render children()}
14
14
  </li>
15
+
16
+ <style>
17
+ [data-list-subheader] {
18
+ padding: var(--dry-space-1_5) var(--dry-space-3) var(--dry-space-1);
19
+ font-size: var(--dry-list-secondary-size);
20
+ font-weight: 600;
21
+ letter-spacing: 0.04em;
22
+ text-transform: uppercase;
23
+ color: var(--dry-list-subheader-color);
24
+ }
25
+ </style>
@@ -70,3 +70,13 @@
70
70
  {@render children()}
71
71
  </div>
72
72
  {/if}
73
+
74
+ <style>
75
+ [data-part='marker-content'] {
76
+ background: var(--dry-color-bg-raised, #ffffff);
77
+ border-radius: var(--dry-radius-md, 0.375rem);
78
+ box-shadow: var(--dry-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, 0.1));
79
+ padding: var(--dry-space-2, 0.5rem);
80
+ cursor: pointer;
81
+ }
82
+ </style>
@@ -61,3 +61,10 @@
61
61
  <div bind:this={contentEl} data-part="popup-content">
62
62
  {@render children()}
63
63
  </div>
64
+
65
+ <style>
66
+ [data-part='popup-content'] {
67
+ display: grid;
68
+ grid-template-columns: minmax(0, 20rem);
69
+ }
70
+ </style>
@@ -223,36 +223,6 @@
223
223
  height: 400px;
224
224
  }
225
225
 
226
- [data-map-root] [data-map-mapboxgl]-canvas,
227
- [data-map-root] [data-map-maplibregl]-canvas {
228
- border-radius: var(--dry-map-radius);
229
- }
230
-
231
- [data-map-marker] {
232
- cursor: pointer;
233
- }
234
-
235
- [data-map-marker] [data-part='marker-content'] {
236
- background: var(--dry-color-bg-raised, #ffffff);
237
- border-radius: var(--dry-radius-md, 0.375rem);
238
- box-shadow: var(--dry-shadow-md, 0 4px 6px -1px rgba(0, 0, 0, 0.1));
239
- padding: var(--dry-space-2, 0.5rem);
240
- }
241
-
242
- [data-map-popup] {
243
- display: grid;
244
- grid-template-columns: minmax(0, 20rem);
245
- }
246
-
247
- [data-map-popup] [data-map-mapboxgl]-popup-content,
248
- [data-map-popup] [data-map-maplibregl]-popup-content {
249
- background: var(--dry-color-bg-raised, #ffffff);
250
- border-radius: var(--dry-radius-lg, 0.5rem);
251
- box-shadow: var(--dry-shadow-lg);
252
- padding: var(--dry-space-4, 1rem);
253
- border: 1px solid var(--dry-color-stroke-weak, #e2e8f0);
254
- }
255
-
256
226
  [data-part='map-error'] {
257
227
  display: grid;
258
228
  place-items: center;
@@ -25,7 +25,7 @@
25
25
  letter-spacing: 0.05em;
26
26
  }
27
27
 
28
- [data-multi-select-group] + [data-multi-select-group] {
28
+ [data-multi-select-group]:not(:first-of-type) {
29
29
  border-top: 1px solid var(--dry-color-stroke-weak);
30
30
  margin-top: var(--dry-space-1);
31
31
  padding-top: var(--dry-space-1);
@@ -44,3 +44,93 @@
44
44
  {@render children()}
45
45
  {/if}
46
46
  </label>
47
+
48
+ <style>
49
+ [data-radio-group-item] {
50
+ display: inline-grid;
51
+ grid-auto-flow: column;
52
+ grid-template-columns: var(--dry-space-8);
53
+ grid-auto-columns: max-content;
54
+ align-items: center;
55
+ gap: var(--dry-space-3);
56
+ cursor: pointer;
57
+ font-size: var(--dry-type-small-size, var(--dry-text-sm-size));
58
+ line-height: var(--dry-type-small-leading, var(--dry-text-sm-leading));
59
+ font-family: var(--dry-font-sans);
60
+ color: var(--dry-color-text-strong);
61
+ padding: var(--dry-space-1) 0;
62
+ min-height: 48px;
63
+ user-select: none;
64
+
65
+ &[data-disabled] {
66
+ color: var(--dry-color-text-disabled);
67
+ opacity: 1;
68
+ cursor: not-allowed;
69
+ }
70
+ }
71
+
72
+ [data-radio-group-item] input[type='radio'] {
73
+ appearance: none;
74
+ -webkit-appearance: none;
75
+ height: var(--dry-space-8);
76
+ min-height: var(--dry-space-8);
77
+ border: 2px solid var(--dry-color-stroke-strong);
78
+ border-radius: var(--dry-radius-full);
79
+ background: var(--dry-color-bg-raised);
80
+ margin: 0;
81
+ cursor: pointer;
82
+ position: relative;
83
+ transition:
84
+ border-color var(--dry-duration-fast) var(--dry-ease-default),
85
+ background-color var(--dry-duration-fast) var(--dry-ease-default),
86
+ transform var(--dry-duration-fast) var(--dry-ease-default);
87
+ }
88
+
89
+ [data-radio-group-item] input[type='radio']::after {
90
+ content: '';
91
+ position: absolute;
92
+ top: 50%;
93
+ left: 50%;
94
+ transform: translate(-50%, -50%) scale(0);
95
+ height: 8px;
96
+ aspect-ratio: 1;
97
+ border-radius: var(--dry-radius-full);
98
+ background: var(--dry-color-on-brand);
99
+ transition: transform var(--dry-duration-fast) var(--dry-ease-default);
100
+ }
101
+
102
+ [data-radio-group-item] input[type='radio']:hover:not(:disabled) {
103
+ border-color: var(--dry-color-stroke-selected);
104
+ }
105
+
106
+ [data-radio-group-item] input[type='radio']:active:not(:disabled) {
107
+ transform: scale(0.96);
108
+ }
109
+
110
+ [data-radio-group-item] input[type='radio']:focus-visible {
111
+ outline: 2px solid var(--dry-color-stroke-focus);
112
+ outline-offset: 2px;
113
+ }
114
+
115
+ [data-radio-group-item] input[type='radio']:checked {
116
+ background: var(--dry-color-fill-selected);
117
+ border-color: var(--dry-color-stroke-selected);
118
+ box-shadow: inset 0 0 0 1px var(--dry-color-stroke-selected);
119
+ }
120
+
121
+ [data-radio-group-item] input[type='radio']:checked::after {
122
+ transform: translate(-50%, -50%) scale(1);
123
+ }
124
+
125
+ [data-radio-group-item] input[type='radio']:checked:hover:not(:disabled) {
126
+ background: var(--dry-color-fill-selected);
127
+ border-color: var(--dry-color-stroke-selected);
128
+ }
129
+
130
+ [data-radio-group-item] input[type='radio']:disabled {
131
+ background: var(--dry-color-fill-disabled);
132
+ border-color: var(--dry-color-stroke-disabled);
133
+ opacity: 1;
134
+ cursor: not-allowed;
135
+ }
136
+ </style>
@@ -115,93 +115,4 @@
115
115
  }
116
116
  }
117
117
 
118
- [data-radio-group-item] {
119
- /* Label styling */
120
- display: inline-grid;
121
- grid-auto-flow: column;
122
- grid-template-columns: var(--dry-space-8);
123
- grid-auto-columns: max-content;
124
- align-items: center;
125
- gap: var(--dry-space-3);
126
- cursor: pointer;
127
- font-size: var(--dry-type-small-size, var(--dry-text-sm-size));
128
- line-height: var(--dry-type-small-leading, var(--dry-text-sm-leading));
129
- font-family: var(--dry-font-sans);
130
- color: var(--dry-color-text-strong);
131
- padding: var(--dry-space-1) 0;
132
- min-height: 48px;
133
- user-select: none;
134
-
135
- &[data-disabled] {
136
- color: var(--dry-color-text-disabled);
137
- opacity: 1;
138
- cursor: not-allowed;
139
- }
140
-
141
- /* Custom radio input */
142
- & input[type='radio'] {
143
- appearance: none;
144
- -webkit-appearance: none;
145
- height: var(--dry-space-8);
146
- min-height: var(--dry-space-8);
147
- border: 2px solid var(--dry-color-stroke-strong);
148
- border-radius: var(--dry-radius-full);
149
- background: var(--dry-color-bg-raised);
150
- margin: 0;
151
- cursor: pointer;
152
- position: relative;
153
- transition:
154
- border-color var(--dry-duration-fast) var(--dry-ease-default),
155
- background-color var(--dry-duration-fast) var(--dry-ease-default),
156
- transform var(--dry-duration-fast) var(--dry-ease-default);
157
-
158
- &::after {
159
- content: '';
160
- position: absolute;
161
- top: 50%;
162
- left: 50%;
163
- transform: translate(-50%, -50%) scale(0);
164
- height: 8px;
165
- aspect-ratio: 1;
166
- border-radius: var(--dry-radius-full);
167
- background: var(--dry-color-on-brand);
168
- transition: transform var(--dry-duration-fast) var(--dry-ease-default);
169
- }
170
-
171
- &:hover:not(:disabled) {
172
- border-color: var(--dry-color-stroke-selected);
173
- }
174
-
175
- &:active:not(:disabled) {
176
- transform: scale(0.96);
177
- }
178
-
179
- &:focus-visible {
180
- outline: 2px solid var(--dry-color-stroke-focus);
181
- outline-offset: 2px;
182
- }
183
-
184
- &:checked {
185
- background: var(--dry-color-fill-selected);
186
- border-color: var(--dry-color-stroke-selected);
187
- box-shadow: inset 0 0 0 1px var(--dry-color-stroke-selected);
188
-
189
- &::after {
190
- transform: translate(-50%, -50%) scale(1);
191
- }
192
-
193
- &:hover:not(:disabled) {
194
- background: var(--dry-color-fill-selected);
195
- border-color: var(--dry-color-stroke-selected);
196
- }
197
- }
198
-
199
- &:disabled {
200
- background: var(--dry-color-fill-disabled);
201
- border-color: var(--dry-color-stroke-disabled);
202
- opacity: 1;
203
- cursor: not-allowed;
204
- }
205
- }
206
- }
207
118
  </style>
@@ -157,9 +157,8 @@
157
157
  {@const disabled = isDayDisabled(day)}
158
158
  {@const focused = isSameDay(day, ctx.focusedDate)}
159
159
  {@const isoStr = getDayISOString(day)}
160
- <div>
160
+ <div role="gridcell" aria-selected={inRange || undefined}>
161
161
  <button
162
- role="gridcell"
163
162
  type="button"
164
163
  tabindex={focused ? 0 : -1}
165
164
  aria-label={formatDate(day, ctx.locale, {
@@ -167,7 +166,6 @@
167
166
  month: 'long',
168
167
  day: 'numeric'
169
168
  })}
170
- aria-selected={inRange || undefined}
171
169
  aria-disabled={disabled}
172
170
  data-calendar-day={isoStr}
173
171
  data-today={today ? '' : undefined}
@@ -292,18 +290,20 @@
292
290
  outline-offset: 1px;
293
291
  }
294
292
 
295
- [role='gridcell'] button[data-today]:not([data-selected]) {
293
+ [role='gridcell'] button[data-today]:not([data-range-start]):not([data-range-end]) {
296
294
  color: var(--dry-range-calendar-today-color);
297
295
  font-weight: 600;
298
296
  }
299
297
 
300
- [role='gridcell'] button[data-selected] {
298
+ [role='gridcell'] button[data-range-start],
299
+ [role='gridcell'] button[data-range-end] {
301
300
  background: var(--dry-range-calendar-selected-bg);
302
301
  color: var(--dry-range-calendar-selected-color);
303
302
  font-weight: 600;
304
303
  }
305
304
 
306
- [role='gridcell'] button[data-selected]:hover:not([data-disabled]) {
305
+ [role='gridcell'] button[data-range-start]:hover:not([data-disabled]),
306
+ [role='gridcell'] button[data-range-end]:hover:not([data-disabled]) {
307
307
  background: var(--dry-range-calendar-selected-hover-bg);
308
308
  }
309
309