@streamscloud/kit 0.86.0 → 0.88.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/dist/styles/_mixins.scss +71 -17
- package/dist/styles/reset.css +19 -12
- package/dist/ui/ai-panel/cmp.ai-panel.svelte +27 -0
- package/dist/ui/date-picker/cmp.date-time-picker.svelte +67 -8
- package/dist/ui/date-picker/cmp.date-time-picker.svelte.d.ts +8 -5
- package/dist/ui/date-picker/cmp.time-picker.svelte +3 -2
- package/dist/ui/date-picker/cmp.time-picker.svelte.d.ts +2 -0
- package/dist/ui/dialog/cmp.dialog-container.svelte +19 -12
- package/dist/ui/dialog/cmp.dialog.svelte +19 -12
- package/dist/ui/dialog/layout/cmp.stepper-dialog.svelte +54 -0
- package/dist/ui/emoji-picker/cmp.emoji-panel.svelte +19 -12
- package/dist/ui/file-uploader/cmp.upload-progress-toaster.svelte +20 -11
- package/dist/ui/grouped-sidebar/cmp.grouped-sidebar.svelte +20 -11
- package/dist/ui/navigation/cmp.nav-menu.svelte +20 -11
- package/dist/ui/page-layout/cmp.page-layout.svelte +38 -24
- package/dist/ui/page-layout/cmp.page-panel-sidebars.svelte +40 -22
- package/dist/ui/page-layout/cmp.page-panel.svelte +20 -11
- package/dist/ui/popover/cmp.popover.svelte +19 -12
- package/dist/ui/select/cmp.input-suggest.svelte +1 -0
- package/dist/ui/select/cmp.singleselect-async.svelte +1 -0
- package/dist/ui/select/multiselect-base.svelte +1 -0
- package/dist/ui/select/select-core.svelte.js +41 -11
- package/dist/ui/select/select-listbox.svelte +42 -19
- package/dist/ui/select/select-listbox.svelte.d.ts +5 -3
- package/dist/ui/table/table-core.svelte +19 -12
- package/dist/ui/textarea/cmp.textarea.svelte +20 -11
- package/package.json +6 -6
package/dist/styles/_mixins.scss
CHANGED
|
@@ -82,14 +82,24 @@
|
|
|
82
82
|
max-height: 100%;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
@mixin scrollbar(
|
|
85
|
+
@mixin scrollbar(
|
|
86
|
+
$thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563)),
|
|
87
|
+
$track-color: var(--scrollbar--track-color, transparent),
|
|
88
|
+
$size: 6px,
|
|
89
|
+
$symmetric: null
|
|
90
|
+
) {
|
|
86
91
|
--_cross-browser-scrollbar--thumb-color: #{$thumb-color};
|
|
87
92
|
--_cross-browser-scrollbar--track-color: #{$track-color};
|
|
88
93
|
|
|
89
|
-
@include _cross-browser-scrollbar;
|
|
94
|
+
@include _cross-browser-scrollbar($size, $symmetric);
|
|
90
95
|
}
|
|
91
96
|
|
|
92
|
-
@mixin scrollbar-on-hover(
|
|
97
|
+
@mixin scrollbar-on-hover(
|
|
98
|
+
$thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563)),
|
|
99
|
+
$track-color: var(--scrollbar--track-color, transparent),
|
|
100
|
+
$size: 6px,
|
|
101
|
+
$symmetric: null
|
|
102
|
+
) {
|
|
93
103
|
--_cross-browser-scrollbar--thumb-color: transparent;
|
|
94
104
|
--_cross-browser-scrollbar--track-color: transparent;
|
|
95
105
|
|
|
@@ -98,29 +108,73 @@
|
|
|
98
108
|
--_cross-browser-scrollbar--track-color: #{$track-color};
|
|
99
109
|
}
|
|
100
110
|
|
|
101
|
-
@include _cross-browser-scrollbar;
|
|
111
|
+
@include _cross-browser-scrollbar($size, $symmetric);
|
|
102
112
|
}
|
|
103
113
|
|
|
104
|
-
@mixin _cross-browser-scrollbar {
|
|
105
|
-
|
|
106
|
-
width: 6px;
|
|
107
|
-
height: 6px;
|
|
108
|
-
}
|
|
114
|
+
@mixin _cross-browser-scrollbar($size, $symmetric) {
|
|
115
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
109
116
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
117
|
+
// a non-auto scrollbar-color / scrollbar-width (own or inherited) makes WebKit / Blink drop the 6px pseudo-element bar for the wider platform one
|
|
118
|
+
@include when-scrollbar-sizable {
|
|
119
|
+
scrollbar-color: auto;
|
|
120
|
+
scrollbar-width: auto;
|
|
121
|
+
|
|
122
|
+
&::-webkit-scrollbar {
|
|
123
|
+
width: $size;
|
|
124
|
+
height: $size;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
&::-webkit-scrollbar-track {
|
|
128
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
129
|
+
border-radius: 100vw;
|
|
130
|
+
}
|
|
114
131
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
132
|
+
&::-webkit-scrollbar-thumb {
|
|
133
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
134
|
+
border-radius: 100vw;
|
|
135
|
+
}
|
|
118
136
|
}
|
|
119
137
|
|
|
120
|
-
@
|
|
138
|
+
@include when-scrollbar-unsizable {
|
|
121
139
|
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
122
140
|
scrollbar-width: thin;
|
|
123
141
|
}
|
|
142
|
+
|
|
143
|
+
// not scrollbar-gutter: both-edges here — Safari reserves both gutters on the end side
|
|
144
|
+
@if $symmetric {
|
|
145
|
+
@include when-scrollbar-sizable {
|
|
146
|
+
--_cross-browser-scrollbar--gutter: #{$size};
|
|
147
|
+
|
|
148
|
+
overflow-y: scroll;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@if $symmetric == all {
|
|
153
|
+
@include when-scrollbar-unsizable {
|
|
154
|
+
scrollbar-gutter: stable both-edges;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@mixin when-scrollbar-sizable {
|
|
160
|
+
@supports selector(::-webkit-scrollbar) {
|
|
161
|
+
@content;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// room to reserve for the platform scrollbar where its width can't be set (~11px thin bar + 1px); never subtract it — overlay scrollbars take 0
|
|
166
|
+
$unsizable-scrollbar-allowance: 12px;
|
|
167
|
+
|
|
168
|
+
// no ::-webkit-scrollbar (Firefox): the platform bar can't shrink into a panel padding, so a box sized for the 4–6px bar clips its content unless it adds the allowance here
|
|
169
|
+
@mixin when-scrollbar-unsizable {
|
|
170
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
171
|
+
@content;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@mixin scrollbar-padding-inline($padding) {
|
|
176
|
+
padding-inline-start: max(#{$padding}, var(--_cross-browser-scrollbar--gutter, 0px));
|
|
177
|
+
padding-inline-end: max(0px, calc(#{$padding} - var(--_cross-browser-scrollbar--gutter, 0px)));
|
|
124
178
|
}
|
|
125
179
|
|
|
126
180
|
@mixin fade-in-animation($duration: 5s) {
|
package/dist/styles/reset.css
CHANGED
|
@@ -123,20 +123,27 @@ textarea {
|
|
|
123
123
|
resize: vertical;
|
|
124
124
|
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
125
125
|
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
126
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
126
127
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
128
|
+
@supports selector(::-webkit-scrollbar) {
|
|
129
|
+
textarea {
|
|
130
|
+
scrollbar-color: auto;
|
|
131
|
+
scrollbar-width: auto;
|
|
132
|
+
}
|
|
133
|
+
textarea::-webkit-scrollbar {
|
|
134
|
+
width: 6px;
|
|
135
|
+
height: 6px;
|
|
136
|
+
}
|
|
137
|
+
textarea::-webkit-scrollbar-track {
|
|
138
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
139
|
+
border-radius: 100vw;
|
|
140
|
+
}
|
|
141
|
+
textarea::-webkit-scrollbar-thumb {
|
|
142
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
143
|
+
border-radius: 100vw;
|
|
144
|
+
}
|
|
138
145
|
}
|
|
139
|
-
@supports (scrollbar
|
|
146
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
140
147
|
textarea {
|
|
141
148
|
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
142
149
|
scrollbar-width: thin;
|
|
@@ -69,6 +69,33 @@ layout's concern. User-facing copy (placeholder, Generate label) is consumer-sup
|
|
|
69
69
|
background: var(--_ai-panel--surface);
|
|
70
70
|
border-radius: var(--_ai-panel--surface-radius);
|
|
71
71
|
overflow-y: auto;
|
|
72
|
+
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
73
|
+
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
74
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
75
|
+
}
|
|
76
|
+
@supports selector(::-webkit-scrollbar) {
|
|
77
|
+
.ai-panel__body {
|
|
78
|
+
scrollbar-color: auto;
|
|
79
|
+
scrollbar-width: auto;
|
|
80
|
+
}
|
|
81
|
+
.ai-panel__body::-webkit-scrollbar {
|
|
82
|
+
width: 6px;
|
|
83
|
+
height: 6px;
|
|
84
|
+
}
|
|
85
|
+
.ai-panel__body::-webkit-scrollbar-track {
|
|
86
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
87
|
+
border-radius: 100vw;
|
|
88
|
+
}
|
|
89
|
+
.ai-panel__body::-webkit-scrollbar-thumb {
|
|
90
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
91
|
+
border-radius: 100vw;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
95
|
+
.ai-panel__body {
|
|
96
|
+
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
97
|
+
scrollbar-width: thin;
|
|
98
|
+
}
|
|
72
99
|
}
|
|
73
100
|
.ai-panel__composer {
|
|
74
101
|
position: relative;
|
|
@@ -2,10 +2,47 @@
|
|
|
2
2
|
import TimePicker from './cmp.time-picker.svelte';
|
|
3
3
|
const { value, size = 'md', datePlaceholder = '', min, step = 30, on } = $props();
|
|
4
4
|
const DEFAULT_TIME = '12:00';
|
|
5
|
+
const MINUTES_PER_DAY = 24 * 60;
|
|
6
|
+
const AFTER_LAST_SLOT = '24:00';
|
|
5
7
|
const pad = (n) => n.toString().padStart(2, '0');
|
|
6
8
|
const toTimeValue = (date) => `${pad(date.getHours())}:${pad(date.getMinutes())}`;
|
|
9
|
+
const minutesToTimeValue = (minutes) => `${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;
|
|
10
|
+
const isSameDay = (a, b) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
7
11
|
const currentDate = $derived(value ? new Date(value) : null);
|
|
8
12
|
const timeValue = $derived(currentDate ? toTimeValue(currentDate) : DEFAULT_TIME);
|
|
13
|
+
const minDate = $derived.by(() => {
|
|
14
|
+
if (min === undefined) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const date = new Date(min);
|
|
18
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
19
|
+
});
|
|
20
|
+
const minSlotMinutes = $derived.by(() => {
|
|
21
|
+
if (!minDate) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const elapsed = minDate.getHours() * 60 + minDate.getMinutes() + minDate.getSeconds() / 60 + minDate.getMilliseconds() / 60_000;
|
|
25
|
+
const slot = Math.ceil(elapsed / step) * step;
|
|
26
|
+
return slot < MINUTES_PER_DAY ? slot : null;
|
|
27
|
+
});
|
|
28
|
+
const firstAllowedDate = $derived.by(() => {
|
|
29
|
+
if (!minDate) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (minSlotMinutes === null) {
|
|
33
|
+
return new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate() + 1);
|
|
34
|
+
}
|
|
35
|
+
return new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), Math.floor(minSlotMinutes / 60), minSlotMinutes % 60);
|
|
36
|
+
});
|
|
37
|
+
const timeMin = $derived.by(() => {
|
|
38
|
+
if (!currentDate || !firstAllowedDate) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (isSameDay(currentDate, firstAllowedDate)) {
|
|
42
|
+
return minutesToTimeValue(firstAllowedDate.getHours() * 60 + firstAllowedDate.getMinutes());
|
|
43
|
+
}
|
|
44
|
+
return currentDate < firstAllowedDate ? AFTER_LAST_SLOT : undefined;
|
|
45
|
+
});
|
|
9
46
|
const onDateChange = (next) => {
|
|
10
47
|
if (!next) {
|
|
11
48
|
on?.change?.(null);
|
|
@@ -18,6 +55,9 @@ const onDateChange = (next) => {
|
|
|
18
55
|
combined.setHours(hours, minutes, 0, 0);
|
|
19
56
|
}
|
|
20
57
|
combined.setFullYear(picked.getFullYear(), picked.getMonth(), picked.getDate());
|
|
58
|
+
if (minDate && minSlotMinutes !== null && combined < minDate) {
|
|
59
|
+
combined.setHours(Math.floor(minSlotMinutes / 60), minSlotMinutes % 60, 0, 0);
|
|
60
|
+
}
|
|
21
61
|
on?.change?.(combined.toISOString());
|
|
22
62
|
};
|
|
23
63
|
const onTimeChange = (next) => {
|
|
@@ -31,35 +71,54 @@ const onTimeChange = (next) => {
|
|
|
31
71
|
};
|
|
32
72
|
</script>
|
|
33
73
|
|
|
34
|
-
<div class="date-time" class:date-time--date-only={!currentDate}>
|
|
35
|
-
<DatePicker clearable size={size} value={value} placeholder={datePlaceholder} min={
|
|
74
|
+
<div class="date-time date-time--{size}" class:date-time--date-only={!currentDate}>
|
|
75
|
+
<DatePicker clearable size={size} value={value} placeholder={datePlaceholder} min={firstAllowedDate ?? undefined} on={{ change: onDateChange }} />
|
|
36
76
|
{#if currentDate}
|
|
37
|
-
<TimePicker clearable={false} size={size} step={step} value={timeValue} on={{ change: onTimeChange }} />
|
|
77
|
+
<TimePicker clearable={false} size={size} step={step} min={timeMin} value={timeValue} on={{ change: onTimeChange }} />
|
|
38
78
|
{/if}
|
|
39
79
|
</div>
|
|
40
80
|
|
|
41
81
|
<!--
|
|
42
82
|
@component
|
|
43
|
-
DateTimePicker — composes `DatePicker` + `TimePicker` into one ISO date-time field
|
|
44
|
-
|
|
45
|
-
Emits an ISO 8601 string — or `null` when the date is cleared — via `on.change`.
|
|
83
|
+
DateTimePicker — composes `DatePicker` + `TimePicker` into one ISO 8601 date-time field whose time row appears
|
|
84
|
+
once a date is picked (defaulting to `12:00`). Emits the ISO string — or `null` when the date is cleared — via `on.change`.
|
|
46
85
|
|
|
47
86
|
### CSS Custom Properties
|
|
48
87
|
| Property | Description | Default |
|
|
49
88
|
|---|---|---|
|
|
50
|
-
| `--sc-kit--date-time-picker--time-width` | Width of the time column | `
|
|
89
|
+
| `--sc-kit--date-time-picker--time-width` | Width of the time column | per size — `sm` 5.75rem, `md` 6.25rem, `lg` 6.75rem (+0.75rem without `::-webkit-scrollbar`, e.g. Firefox) |
|
|
51
90
|
| `--sc-kit--date-time-picker--gap` | Gap between the date and time fields | `var(--sc-kit--space--2)` |
|
|
52
91
|
-->
|
|
53
92
|
|
|
54
93
|
<style>.date-time {
|
|
55
|
-
--_dtp--
|
|
94
|
+
--_dtp--scrollbar-allowance: 0px;
|
|
95
|
+
--_dtp--time-width: var(
|
|
96
|
+
--sc-kit--date-time-picker--time-width,
|
|
97
|
+
calc(var(--_dtp--size-time-width, 6.25rem) + var(--_dtp--scrollbar-allowance))
|
|
98
|
+
);
|
|
56
99
|
--_dtp--gap: var(--sc-kit--date-time-picker--gap, var(--sc-kit--space--2));
|
|
100
|
+
}
|
|
101
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
102
|
+
.date-time {
|
|
103
|
+
--_dtp--scrollbar-allowance: 12px;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
.date-time {
|
|
57
107
|
display: grid;
|
|
58
108
|
grid-template-columns: minmax(0, 1fr) var(--_dtp--time-width);
|
|
59
109
|
gap: var(--_dtp--gap);
|
|
60
110
|
width: 100%;
|
|
61
111
|
max-width: 100%;
|
|
62
112
|
}
|
|
113
|
+
.date-time--sm {
|
|
114
|
+
--_dtp--size-time-width: 5.75rem;
|
|
115
|
+
}
|
|
116
|
+
.date-time--md {
|
|
117
|
+
--_dtp--size-time-width: 6.25rem;
|
|
118
|
+
}
|
|
119
|
+
.date-time--lg {
|
|
120
|
+
--_dtp--size-time-width: 6.75rem;
|
|
121
|
+
}
|
|
63
122
|
.date-time--date-only {
|
|
64
123
|
grid-template-columns: minmax(0, 1fr);
|
|
65
124
|
}</style>
|
|
@@ -4,7 +4,11 @@ type Props = {
|
|
|
4
4
|
/** @default 'md' */
|
|
5
5
|
size?: 'sm' | 'md' | 'lg';
|
|
6
6
|
datePlaceholder?: string;
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Earliest selectable date-time (inclusive). On its day only the `step` slots at or after it are offered and an
|
|
9
|
+
* earlier time is raised to the first of them; a day with no slot left is not selectable. A `value` before the first
|
|
10
|
+
* allowed day still renders, but its time list is empty — only picking an allowed date changes it.
|
|
11
|
+
*/
|
|
8
12
|
min?: LikeDate;
|
|
9
13
|
/** Minute interval for the time list. @default 30 */
|
|
10
14
|
step?: number;
|
|
@@ -13,14 +17,13 @@ type Props = {
|
|
|
13
17
|
};
|
|
14
18
|
};
|
|
15
19
|
/**
|
|
16
|
-
* DateTimePicker — composes `DatePicker` + `TimePicker` into one ISO date-time field
|
|
17
|
-
*
|
|
18
|
-
* Emits an ISO 8601 string — or `null` when the date is cleared — via `on.change`.
|
|
20
|
+
* DateTimePicker — composes `DatePicker` + `TimePicker` into one ISO 8601 date-time field whose time row appears
|
|
21
|
+
* once a date is picked (defaulting to `12:00`). Emits the ISO string — or `null` when the date is cleared — via `on.change`.
|
|
19
22
|
*
|
|
20
23
|
* ### CSS Custom Properties
|
|
21
24
|
* | Property | Description | Default |
|
|
22
25
|
* |---|---|---|
|
|
23
|
-
* | `--sc-kit--date-time-picker--time-width` | Width of the time column | `
|
|
26
|
+
* | `--sc-kit--date-time-picker--time-width` | Width of the time column | per size — `sm` 5.75rem, `md` 6.25rem, `lg` 6.75rem (+0.75rem without `::-webkit-scrollbar`, e.g. Firefox) |
|
|
24
27
|
* | `--sc-kit--date-time-picker--gap` | Gap between the date and time fields | `var(--sc-kit--space--2)` |
|
|
25
28
|
*/
|
|
26
29
|
declare const Cmp: import("svelte").Component<Props, {}, "">;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
<script lang="ts">import { Singleselect } from '../select';
|
|
2
|
-
const { size = 'md', step = 30, placeholder = '', disabled = false, readonly = false, inert = false, error = false, borderless = false, id, name, 'aria-label': ariaLabel, 'aria-describedby': ariaDescribedby, 'aria-required': ariaRequired, ...mode } = $props();
|
|
2
|
+
const { size = 'md', step = 30, min, placeholder = '', disabled = false, readonly = false, inert = false, error = false, borderless = false, id, name, 'aria-label': ariaLabel, 'aria-describedby': ariaDescribedby, 'aria-required': ariaRequired, ...mode } = $props();
|
|
3
3
|
const MINUTES_PER_DAY = 24 * 60;
|
|
4
4
|
const pad = (n) => n.toString().padStart(2, '0');
|
|
5
5
|
const stepOptions = $derived.by(() => {
|
|
6
6
|
const count = Math.max(1, Math.floor(MINUTES_PER_DAY / step));
|
|
7
|
-
|
|
7
|
+
const grid = Array.from({ length: count }, (_, i) => {
|
|
8
8
|
const total = i * step;
|
|
9
9
|
const label = `${pad(Math.floor(total / 60))}:${pad(total % 60)}`;
|
|
10
10
|
return { label, value: label };
|
|
11
11
|
});
|
|
12
|
+
return min ? grid.filter((option) => option.value >= min) : grid;
|
|
12
13
|
});
|
|
13
14
|
const options = $derived.by(() => {
|
|
14
15
|
const current = mode.value;
|
|
@@ -3,6 +3,8 @@ type BaseProps = {
|
|
|
3
3
|
size?: 'sm' | 'md' | 'lg';
|
|
4
4
|
/** Minute interval between generated options. @default 30 */
|
|
5
5
|
step?: number;
|
|
6
|
+
/** Earliest selectable time (`'HH:mm'`, inclusive) — earlier grid slots are hidden; an earlier `value` still renders. */
|
|
7
|
+
min?: string;
|
|
6
8
|
placeholder?: string;
|
|
7
9
|
disabled?: boolean;
|
|
8
10
|
/** Focusable, value visible, but selection cannot change. */
|
|
@@ -140,20 +140,27 @@ DialogContainer — wraps the native `<dialog>` element with sizing, positioning
|
|
|
140
140
|
padding: var(--_dialog-container--padding);
|
|
141
141
|
--_cross-browser-scrollbar--thumb-color: var(--sc-kit--color--border--strong);
|
|
142
142
|
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
143
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
143
144
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
145
|
+
@supports selector(::-webkit-scrollbar) {
|
|
146
|
+
.dialog-container {
|
|
147
|
+
scrollbar-color: auto;
|
|
148
|
+
scrollbar-width: auto;
|
|
149
|
+
}
|
|
150
|
+
.dialog-container::-webkit-scrollbar {
|
|
151
|
+
width: 6px;
|
|
152
|
+
height: 6px;
|
|
153
|
+
}
|
|
154
|
+
.dialog-container::-webkit-scrollbar-track {
|
|
155
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
156
|
+
border-radius: 100vw;
|
|
157
|
+
}
|
|
158
|
+
.dialog-container::-webkit-scrollbar-thumb {
|
|
159
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
160
|
+
border-radius: 100vw;
|
|
161
|
+
}
|
|
155
162
|
}
|
|
156
|
-
@supports (scrollbar
|
|
163
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
157
164
|
.dialog-container {
|
|
158
165
|
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
159
166
|
scrollbar-width: thin;
|
|
@@ -136,20 +136,27 @@ A structured dialog panel with header (title + close button), scrollable body, a
|
|
|
136
136
|
padding: var(--_--dialog--body--padding-block) var(--_--dialog--body--padding-inline);
|
|
137
137
|
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
138
138
|
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
139
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
139
140
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
141
|
+
@supports selector(::-webkit-scrollbar) {
|
|
142
|
+
.dialog__body {
|
|
143
|
+
scrollbar-color: auto;
|
|
144
|
+
scrollbar-width: auto;
|
|
145
|
+
}
|
|
146
|
+
.dialog__body::-webkit-scrollbar {
|
|
147
|
+
width: 6px;
|
|
148
|
+
height: 6px;
|
|
149
|
+
}
|
|
150
|
+
.dialog__body::-webkit-scrollbar-track {
|
|
151
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
152
|
+
border-radius: 100vw;
|
|
153
|
+
}
|
|
154
|
+
.dialog__body::-webkit-scrollbar-thumb {
|
|
155
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
156
|
+
border-radius: 100vw;
|
|
157
|
+
}
|
|
151
158
|
}
|
|
152
|
-
@supports (scrollbar
|
|
159
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
153
160
|
.dialog__body {
|
|
154
161
|
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
155
162
|
scrollbar-width: thin;
|
|
@@ -174,6 +174,33 @@ Header, body and sidebar block padding follow `Dialog`'s header / body padding v
|
|
|
174
174
|
border-inline-end: 1px solid var(--sc-kit--color--border);
|
|
175
175
|
overflow-y: auto;
|
|
176
176
|
min-block-size: 0;
|
|
177
|
+
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
178
|
+
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
179
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
180
|
+
}
|
|
181
|
+
@supports selector(::-webkit-scrollbar) {
|
|
182
|
+
.stepper-dialog__sidebar {
|
|
183
|
+
scrollbar-color: auto;
|
|
184
|
+
scrollbar-width: auto;
|
|
185
|
+
}
|
|
186
|
+
.stepper-dialog__sidebar::-webkit-scrollbar {
|
|
187
|
+
width: 6px;
|
|
188
|
+
height: 6px;
|
|
189
|
+
}
|
|
190
|
+
.stepper-dialog__sidebar::-webkit-scrollbar-track {
|
|
191
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
192
|
+
border-radius: 100vw;
|
|
193
|
+
}
|
|
194
|
+
.stepper-dialog__sidebar::-webkit-scrollbar-thumb {
|
|
195
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
196
|
+
border-radius: 100vw;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
200
|
+
.stepper-dialog__sidebar {
|
|
201
|
+
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
202
|
+
scrollbar-width: thin;
|
|
203
|
+
}
|
|
177
204
|
}
|
|
178
205
|
@media screen and (max-width: 768px) {
|
|
179
206
|
.stepper-dialog__sidebar {
|
|
@@ -194,4 +221,31 @@ Header, body and sidebar block padding follow `Dialog`'s header / body padding v
|
|
|
194
221
|
min-block-size: 0;
|
|
195
222
|
overflow-y: auto;
|
|
196
223
|
padding: var(--_--dialog--body--padding-block) var(--_--dialog--body--padding-inline);
|
|
224
|
+
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
225
|
+
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
226
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
227
|
+
}
|
|
228
|
+
@supports selector(::-webkit-scrollbar) {
|
|
229
|
+
.stepper-dialog__body {
|
|
230
|
+
scrollbar-color: auto;
|
|
231
|
+
scrollbar-width: auto;
|
|
232
|
+
}
|
|
233
|
+
.stepper-dialog__body::-webkit-scrollbar {
|
|
234
|
+
width: 6px;
|
|
235
|
+
height: 6px;
|
|
236
|
+
}
|
|
237
|
+
.stepper-dialog__body::-webkit-scrollbar-track {
|
|
238
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
239
|
+
border-radius: 100vw;
|
|
240
|
+
}
|
|
241
|
+
.stepper-dialog__body::-webkit-scrollbar-thumb {
|
|
242
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
243
|
+
border-radius: 100vw;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
247
|
+
.stepper-dialog__body {
|
|
248
|
+
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
249
|
+
scrollbar-width: thin;
|
|
250
|
+
}
|
|
197
251
|
}</style>
|
|
@@ -148,20 +148,27 @@ can be embedded directly by input components.
|
|
|
148
148
|
overflow-y: auto;
|
|
149
149
|
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
150
150
|
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
151
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
151
152
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
153
|
+
@supports selector(::-webkit-scrollbar) {
|
|
154
|
+
.emoji-panel__categories {
|
|
155
|
+
scrollbar-color: auto;
|
|
156
|
+
scrollbar-width: auto;
|
|
157
|
+
}
|
|
158
|
+
.emoji-panel__categories::-webkit-scrollbar {
|
|
159
|
+
width: 6px;
|
|
160
|
+
height: 6px;
|
|
161
|
+
}
|
|
162
|
+
.emoji-panel__categories::-webkit-scrollbar-track {
|
|
163
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
164
|
+
border-radius: 100vw;
|
|
165
|
+
}
|
|
166
|
+
.emoji-panel__categories::-webkit-scrollbar-thumb {
|
|
167
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
168
|
+
border-radius: 100vw;
|
|
169
|
+
}
|
|
163
170
|
}
|
|
164
|
-
@supports (scrollbar
|
|
171
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
165
172
|
.emoji-panel__categories {
|
|
166
173
|
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
167
174
|
scrollbar-width: thin;
|
|
@@ -112,19 +112,28 @@ at the store's default concurrency of 20 can never push the toast off screen.
|
|
|
112
112
|
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
113
113
|
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
114
114
|
}
|
|
115
|
-
.upload-progress-toaster__files
|
|
116
|
-
|
|
117
|
-
height: 6px;
|
|
118
|
-
}
|
|
119
|
-
.upload-progress-toaster__files::-webkit-scrollbar-track {
|
|
120
|
-
background: var(--_cross-browser-scrollbar--track-color);
|
|
121
|
-
border-radius: 100vw;
|
|
115
|
+
.upload-progress-toaster__files {
|
|
116
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
122
117
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
118
|
+
@supports selector(::-webkit-scrollbar) {
|
|
119
|
+
.upload-progress-toaster__files {
|
|
120
|
+
scrollbar-color: auto;
|
|
121
|
+
scrollbar-width: auto;
|
|
122
|
+
}
|
|
123
|
+
.upload-progress-toaster__files::-webkit-scrollbar {
|
|
124
|
+
width: 6px;
|
|
125
|
+
height: 6px;
|
|
126
|
+
}
|
|
127
|
+
.upload-progress-toaster__files::-webkit-scrollbar-track {
|
|
128
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
129
|
+
border-radius: 100vw;
|
|
130
|
+
}
|
|
131
|
+
.upload-progress-toaster__files::-webkit-scrollbar-thumb {
|
|
132
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
133
|
+
border-radius: 100vw;
|
|
134
|
+
}
|
|
126
135
|
}
|
|
127
|
-
@supports (scrollbar
|
|
136
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
128
137
|
.upload-progress-toaster__files {
|
|
129
138
|
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
130
139
|
scrollbar-width: thin;
|
|
@@ -111,19 +111,28 @@ dummy-placeholder + post-init bind needed:
|
|
|
111
111
|
--_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
|
|
112
112
|
--_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
|
|
113
113
|
}
|
|
114
|
-
.grouped-sidebar__sections
|
|
115
|
-
|
|
116
|
-
height: 6px;
|
|
117
|
-
}
|
|
118
|
-
.grouped-sidebar__sections::-webkit-scrollbar-track {
|
|
119
|
-
background: var(--_cross-browser-scrollbar--track-color);
|
|
120
|
-
border-radius: 100vw;
|
|
114
|
+
.grouped-sidebar__sections {
|
|
115
|
+
--_cross-browser-scrollbar--gutter: 0px;
|
|
121
116
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
117
|
+
@supports selector(::-webkit-scrollbar) {
|
|
118
|
+
.grouped-sidebar__sections {
|
|
119
|
+
scrollbar-color: auto;
|
|
120
|
+
scrollbar-width: auto;
|
|
121
|
+
}
|
|
122
|
+
.grouped-sidebar__sections::-webkit-scrollbar {
|
|
123
|
+
width: 6px;
|
|
124
|
+
height: 6px;
|
|
125
|
+
}
|
|
126
|
+
.grouped-sidebar__sections::-webkit-scrollbar-track {
|
|
127
|
+
background: var(--_cross-browser-scrollbar--track-color);
|
|
128
|
+
border-radius: 100vw;
|
|
129
|
+
}
|
|
130
|
+
.grouped-sidebar__sections::-webkit-scrollbar-thumb {
|
|
131
|
+
background: var(--_cross-browser-scrollbar--thumb-color);
|
|
132
|
+
border-radius: 100vw;
|
|
133
|
+
}
|
|
125
134
|
}
|
|
126
|
-
@supports (scrollbar
|
|
135
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
127
136
|
.grouped-sidebar__sections {
|
|
128
137
|
scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
|
|
129
138
|
scrollbar-width: thin;
|