@svgrid/grid 1.2.23 → 1.2.24
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/SvAutoComplete.svelte +23 -34
- package/dist/SvCalendar.svelte +74 -334
- package/dist/SvCalendar.svelte.d.ts +5 -23
- package/dist/SvCheckBox.svelte +11 -10
- package/dist/SvColorInput.svelte +31 -58
- package/dist/SvComboBox.svelte +32 -54
- package/dist/SvCountryInput.svelte +31 -29
- package/dist/SvDateTimePicker.svelte +53 -110
- package/dist/SvDateTimePicker.svelte.d.ts +4 -3
- package/dist/SvDropDownList.svelte +31 -54
- package/dist/SvGauge.svelte +21 -23
- package/dist/SvGauge.svelte.d.ts +0 -5
- package/dist/SvListBox.svelte +25 -58
- package/dist/SvListBox.svelte.d.ts +3 -0
- package/dist/SvMaskedInput.svelte +0 -0
- package/dist/SvNumberInput.svelte +0 -0
- package/dist/SvNumberInput.svelte.d.ts +2 -6
- package/dist/SvPasswordInput.svelte +18 -28
- package/dist/SvPasswordInput.svelte.d.ts +0 -4
- package/dist/SvPhoneInput.svelte +0 -0
- package/dist/SvRadioGroup.svelte +14 -37
- package/dist/SvRadioGroup.svelte.d.ts +6 -9
- package/dist/SvRating.svelte +22 -42
- package/dist/SvRating.svelte.d.ts +3 -5
- package/dist/SvSlider.svelte +30 -57
- package/dist/SvSlider.svelte.d.ts +0 -5
- package/dist/SvSwitchButton.svelte +10 -17
- package/dist/SvSwitchButton.svelte.d.ts +0 -5
- package/dist/SvTabs.svelte +26 -39
- package/dist/SvTabs.svelte.d.ts +5 -5
- package/dist/SvTagsInput.svelte +17 -28
- package/dist/SvTagsInput.svelte.d.ts +0 -5
- package/dist/SvTimePicker.svelte +52 -210
- package/dist/SvTimePicker.svelte.d.ts +11 -8
- package/dist/SvToggleButton.svelte +9 -9
- package/dist/SvTree.svelte +30 -109
- package/dist/SvTree.svelte.d.ts +9 -11
- package/dist/cdn/svgrid.js +7488 -5839
- package/dist/cdn/svgrid.svelte-external.js +4691 -3028
- package/dist/createAutocomplete.svelte.d.ts +77 -0
- package/dist/createAutocomplete.svelte.js +100 -0
- package/dist/createCalendar.svelte.d.ts +192 -0
- package/dist/createCalendar.svelte.js +402 -0
- package/dist/createCheckbox.svelte.d.ts +45 -0
- package/dist/createCheckbox.svelte.js +26 -0
- package/dist/createColorInput.svelte.d.ts +67 -0
- package/dist/createColorInput.svelte.js +100 -0
- package/dist/createCombobox.svelte.d.ts +102 -0
- package/dist/createCombobox.svelte.js +171 -0
- package/dist/createCountryInput.svelte.d.ts +86 -0
- package/dist/createCountryInput.svelte.js +126 -0
- package/dist/createDateTimePicker.svelte.d.ts +83 -0
- package/dist/createDateTimePicker.svelte.js +202 -0
- package/dist/createDropdownList.svelte.d.ts +78 -0
- package/dist/createDropdownList.svelte.js +117 -0
- package/dist/createGauge.svelte.d.ts +56 -0
- package/dist/createGauge.svelte.js +49 -0
- package/dist/createListbox.svelte.d.ts +79 -0
- package/dist/createListbox.svelte.js +117 -0
- package/dist/createMaskedInput.svelte.d.ts +30 -0
- package/dist/createMaskedInput.svelte.js +62 -0
- package/dist/createNumberInput.svelte.d.ts +72 -0
- package/dist/createNumberInput.svelte.js +167 -0
- package/dist/createPasswordInput.svelte.d.ts +60 -0
- package/dist/createPasswordInput.svelte.js +72 -0
- package/dist/createPhoneInput.svelte.d.ts +46 -0
- package/dist/createPhoneInput.svelte.js +105 -0
- package/dist/createRadioGroup.svelte.d.ts +64 -0
- package/dist/createRadioGroup.svelte.js +73 -0
- package/dist/createRating.svelte.d.ts +70 -0
- package/dist/createRating.svelte.js +85 -0
- package/dist/createSlider.svelte.d.ts +71 -0
- package/dist/createSlider.svelte.js +123 -0
- package/dist/createSwitch.svelte.d.ts +43 -0
- package/dist/createSwitch.svelte.js +41 -0
- package/dist/createTabs.svelte.d.ts +78 -0
- package/dist/createTabs.svelte.js +92 -0
- package/dist/createTagsInput.svelte.d.ts +65 -0
- package/dist/createTagsInput.svelte.js +93 -0
- package/dist/createTimePicker.svelte.d.ts +106 -0
- package/dist/createTimePicker.svelte.js +248 -0
- package/dist/createToggle.svelte.d.ts +43 -0
- package/dist/createToggle.svelte.js +39 -0
- package/dist/createTree.svelte.d.ts +96 -0
- package/dist/createTree.svelte.js +194 -0
- package/dist/editor-contract.d.ts +48 -0
- package/dist/editor-contract.js +26 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +31 -0
- package/package.json +1 -1
- package/src/SvAutoComplete.svelte +23 -34
- package/src/SvCalendar.svelte +74 -334
- package/src/SvCheckBox.svelte +11 -10
- package/src/SvColorInput.svelte +31 -58
- package/src/SvComboBox.svelte +32 -54
- package/src/SvCountryInput.svelte +31 -29
- package/src/SvDateTimePicker.svelte +53 -110
- package/src/SvDropDownList.svelte +31 -54
- package/src/SvGauge.svelte +21 -23
- package/src/SvListBox.svelte +25 -58
- package/src/SvMaskedInput.svelte +0 -0
- package/src/SvNumberInput.svelte +0 -0
- package/src/SvPasswordInput.svelte +18 -28
- package/src/SvPhoneInput.svelte +0 -0
- package/src/SvRadioGroup.svelte +14 -37
- package/src/SvRating.svelte +22 -42
- package/src/SvSlider.svelte +30 -57
- package/src/SvSwitchButton.svelte +10 -17
- package/src/SvTabs.svelte +26 -39
- package/src/SvTagsInput.svelte +17 -28
- package/src/SvTimePicker.svelte +52 -210
- package/src/SvToggleButton.svelte +9 -9
- package/src/SvTree.svelte +30 -109
- package/src/createAutocomplete.svelte.ts +104 -0
- package/src/createCalendar.svelte.ts +488 -0
- package/src/createCheckbox.svelte.ts +74 -0
- package/src/createColorInput.svelte.ts +115 -0
- package/src/createCombobox.svelte.ts +158 -0
- package/src/createCountryInput.svelte.ts +126 -0
- package/src/createDateTimePicker.svelte.ts +216 -0
- package/src/createDropdownList.svelte.ts +125 -0
- package/src/createGauge.svelte.ts +86 -0
- package/src/createListbox.svelte.ts +186 -0
- package/src/createMaskedInput.svelte.ts +81 -0
- package/src/createNumberInput.svelte.ts +193 -0
- package/src/createPasswordInput.svelte.ts +87 -0
- package/src/createPhoneInput.svelte.ts +119 -0
- package/src/createRadioGroup.svelte.ts +132 -0
- package/src/createRating.svelte.ts +145 -0
- package/src/createSlider.svelte.ts +160 -0
- package/src/createSwitch.svelte.ts +78 -0
- package/src/createTabs.svelte.ts +129 -0
- package/src/createTagsInput.svelte.ts +98 -0
- package/src/createTimePicker.svelte.ts +289 -0
- package/src/createToggle.svelte.ts +69 -0
- package/src/createTree.svelte.ts +216 -0
- package/src/editor-contract.test.ts +32 -0
- package/src/editor-contract.ts +60 -0
- package/src/index.ts +39 -0
- package/src/ui-inputs.test.ts +26 -0
- package/src/ui-selection.test.ts +13 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createAutocomplete - the HEADLESS core behind <SvAutoComplete>: a free-text
|
|
3
|
+
* field with a live-filtered suggestion list (accepts ANY typed value; the
|
|
4
|
+
* suggestions are shortcuts). Roving active index + keyboard, exposed as
|
|
5
|
+
* **prop-getters** you spread onto YOUR OWN markup. No styles/DOM/portal - those
|
|
6
|
+
* stay in the styled component.
|
|
7
|
+
*
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script lang="ts">
|
|
10
|
+
* import { createAutocomplete } from '@svgrid/grid'
|
|
11
|
+
* let value = $state('')
|
|
12
|
+
* const ac = createAutocomplete({ value: () => value, suggestions: () => list, onChange: (v) => (value = v) })
|
|
13
|
+
* </script>
|
|
14
|
+
* <input {...ac.inputProps()} />
|
|
15
|
+
* {#if ac.open}
|
|
16
|
+
* <ul {...ac.listboxProps()}>
|
|
17
|
+
* {#each ac.filtered as opt, i (opt.value)}<li {...ac.optionProps(i)}>{opt.label}</li>{/each}
|
|
18
|
+
* </ul>
|
|
19
|
+
* {/if}
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { type ListOption } from './list-option';
|
|
23
|
+
/** Reactive inputs are passed as getters so the core tracks live prop changes. */
|
|
24
|
+
export type AutocompleteConfig = {
|
|
25
|
+
value: () => string;
|
|
26
|
+
onChange?: (value: string) => void;
|
|
27
|
+
/** Suggestions - strings or {value,label} (label shown, value inserted). */
|
|
28
|
+
suggestions: () => ReadonlyArray<string | ListOption>;
|
|
29
|
+
minChars?: () => number;
|
|
30
|
+
disabled?: () => boolean;
|
|
31
|
+
ariaLabel?: () => string | undefined;
|
|
32
|
+
/** DOM focus hook provided by the renderer; the core never touches the DOM. */
|
|
33
|
+
focusInput?: () => void;
|
|
34
|
+
};
|
|
35
|
+
export declare function createAutocomplete(config: AutocompleteConfig): {
|
|
36
|
+
/** Panel open state. */
|
|
37
|
+
readonly open: boolean;
|
|
38
|
+
/** Highlighted suggestion index into `filtered`. */
|
|
39
|
+
readonly activeIndex: number;
|
|
40
|
+
/** Suggestions after the live substring filter (capped at 10). */
|
|
41
|
+
readonly filtered: ListOption[];
|
|
42
|
+
/** Controlled text value. */
|
|
43
|
+
readonly value: string;
|
|
44
|
+
isActive: (i: number) => boolean;
|
|
45
|
+
setActive: (i: number) => void;
|
|
46
|
+
maybeOpen: () => void;
|
|
47
|
+
close: () => void;
|
|
48
|
+
pick: (o: ListOption | undefined) => void;
|
|
49
|
+
onInput: (e: Event) => void;
|
|
50
|
+
onKeydown: (e: KeyboardEvent) => void;
|
|
51
|
+
/** Spread onto the text <input>. */
|
|
52
|
+
inputProps: () => {
|
|
53
|
+
role: "combobox";
|
|
54
|
+
'aria-expanded': boolean;
|
|
55
|
+
'aria-autocomplete': "list";
|
|
56
|
+
'aria-label': string | undefined;
|
|
57
|
+
value: string;
|
|
58
|
+
disabled: boolean;
|
|
59
|
+
oninput: (e: Event) => void;
|
|
60
|
+
onfocus: () => void;
|
|
61
|
+
onkeydown: (e: KeyboardEvent) => void;
|
|
62
|
+
};
|
|
63
|
+
/** Spread onto the listbox container. */
|
|
64
|
+
listboxProps: () => {
|
|
65
|
+
role: "listbox";
|
|
66
|
+
};
|
|
67
|
+
/** Spread onto the suggestion at `index` (index into `filtered`). */
|
|
68
|
+
optionProps: (index: number) => {
|
|
69
|
+
role: "option";
|
|
70
|
+
tabindex: number;
|
|
71
|
+
'aria-selected': boolean;
|
|
72
|
+
'data-idx': number;
|
|
73
|
+
onclick: () => void;
|
|
74
|
+
onpointermove: () => void;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
export type Autocomplete = ReturnType<typeof createAutocomplete>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createAutocomplete - the HEADLESS core behind <SvAutoComplete>: a free-text
|
|
3
|
+
* field with a live-filtered suggestion list (accepts ANY typed value; the
|
|
4
|
+
* suggestions are shortcuts). Roving active index + keyboard, exposed as
|
|
5
|
+
* **prop-getters** you spread onto YOUR OWN markup. No styles/DOM/portal - those
|
|
6
|
+
* stay in the styled component.
|
|
7
|
+
*
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script lang="ts">
|
|
10
|
+
* import { createAutocomplete } from '@svgrid/grid'
|
|
11
|
+
* let value = $state('')
|
|
12
|
+
* const ac = createAutocomplete({ value: () => value, suggestions: () => list, onChange: (v) => (value = v) })
|
|
13
|
+
* </script>
|
|
14
|
+
* <input {...ac.inputProps()} />
|
|
15
|
+
* {#if ac.open}
|
|
16
|
+
* <ul {...ac.listboxProps()}>
|
|
17
|
+
* {#each ac.filtered as opt, i (opt.value)}<li {...ac.optionProps(i)}>{opt.label}</li>{/each}
|
|
18
|
+
* </ul>
|
|
19
|
+
* {/if}
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { filterOptions } from './list-option';
|
|
23
|
+
export function createAutocomplete(config) {
|
|
24
|
+
const minChars = () => config.minChars?.() ?? 1;
|
|
25
|
+
let open = $state(false);
|
|
26
|
+
let active = $state(0);
|
|
27
|
+
const asOptions = $derived(config.suggestions().map((s) => (typeof s === 'string' ? { value: s, label: s } : s)));
|
|
28
|
+
const filtered = $derived(config.value().length >= minChars() ? filterOptions(asOptions, config.value()).slice(0, 10) : []);
|
|
29
|
+
function maybeOpen() { open = filtered.length > 0; if (open)
|
|
30
|
+
active = 0; }
|
|
31
|
+
function pick(o) { if (!o)
|
|
32
|
+
return; config.onChange?.(String(o.value)); open = false; config.focusInput?.(); }
|
|
33
|
+
function close() { open = false; }
|
|
34
|
+
function onInput(e) { config.onChange?.(e.currentTarget.value); queueMicrotask(maybeOpen); }
|
|
35
|
+
function onKeydown(e) {
|
|
36
|
+
if (!open) {
|
|
37
|
+
if (e.key === 'ArrowDown') {
|
|
38
|
+
queueMicrotask(maybeOpen);
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (e.key === 'ArrowDown') {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
active = Math.min(active + 1, filtered.length - 1);
|
|
45
|
+
}
|
|
46
|
+
else if (e.key === 'ArrowUp') {
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
active = Math.max(active - 1, 0);
|
|
49
|
+
}
|
|
50
|
+
else if (e.key === 'Enter') {
|
|
51
|
+
e.preventDefault();
|
|
52
|
+
pick(filtered[active]);
|
|
53
|
+
}
|
|
54
|
+
else if (e.key === 'Escape') {
|
|
55
|
+
close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
/** Panel open state. */
|
|
60
|
+
get open() { return open; },
|
|
61
|
+
/** Highlighted suggestion index into `filtered`. */
|
|
62
|
+
get activeIndex() { return active; },
|
|
63
|
+
/** Suggestions after the live substring filter (capped at 10). */
|
|
64
|
+
get filtered() { return filtered; },
|
|
65
|
+
/** Controlled text value. */
|
|
66
|
+
get value() { return config.value(); },
|
|
67
|
+
isActive: (i) => i === active,
|
|
68
|
+
setActive: (i) => { active = i; },
|
|
69
|
+
maybeOpen,
|
|
70
|
+
close,
|
|
71
|
+
pick,
|
|
72
|
+
onInput,
|
|
73
|
+
onKeydown,
|
|
74
|
+
/** Spread onto the text <input>. */
|
|
75
|
+
inputProps: () => ({
|
|
76
|
+
role: 'combobox',
|
|
77
|
+
'aria-expanded': open,
|
|
78
|
+
'aria-autocomplete': 'list',
|
|
79
|
+
'aria-label': config.ariaLabel?.(),
|
|
80
|
+
value: config.value(),
|
|
81
|
+
disabled: config.disabled?.() ?? false,
|
|
82
|
+
oninput: onInput,
|
|
83
|
+
onfocus: maybeOpen,
|
|
84
|
+
onkeydown: onKeydown,
|
|
85
|
+
}),
|
|
86
|
+
/** Spread onto the listbox container. */
|
|
87
|
+
listboxProps: () => ({
|
|
88
|
+
role: 'listbox',
|
|
89
|
+
}),
|
|
90
|
+
/** Spread onto the suggestion at `index` (index into `filtered`). */
|
|
91
|
+
optionProps: (index) => ({
|
|
92
|
+
role: 'option',
|
|
93
|
+
tabindex: -1,
|
|
94
|
+
'aria-selected': index === active,
|
|
95
|
+
'data-idx': index,
|
|
96
|
+
onclick: () => pick(filtered[index]),
|
|
97
|
+
onpointermove: () => { active = index; },
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createCalendar - the HEADLESS core behind <SvCalendar>, in the same spirit as
|
|
3
|
+
* `createListbox` / `createSvGrid`: a runes-based state machine (view page +
|
|
4
|
+
* drill level, roving focus, every Smart `selectionMode`, range hover preview,
|
|
5
|
+
* full keyboard) with **prop-getters** you spread onto YOUR OWN markup. No
|
|
6
|
+
* styles, no DOM assumptions. It reuses the framework-free date engine in
|
|
7
|
+
* ./datetime for all the actual date math / selection / restriction, so this
|
|
8
|
+
* file only owns the reactive component-level state + interaction wiring.
|
|
9
|
+
*
|
|
10
|
+
* ```svelte
|
|
11
|
+
* <script lang="ts">
|
|
12
|
+
* import { createCalendar } from '@svgrid/grid'
|
|
13
|
+
* let value = $state<Date | null>(new Date())
|
|
14
|
+
* const cal = createCalendar({ value: () => value, onChange: (d) => (value = d[0] ?? null) })
|
|
15
|
+
* </script>
|
|
16
|
+
* <div {...cal.gridProps()}>
|
|
17
|
+
* {#each cal.panels[0].matrix as week}
|
|
18
|
+
* {#each week as cell}
|
|
19
|
+
* <button {...cal.dayProps(cell, cal.panels[0].month)}>{cell.date.getDate()}</button>
|
|
20
|
+
* {/each}
|
|
21
|
+
* {/each}
|
|
22
|
+
* </div>
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* The styled <SvCalendar> is one renderer over this core; it keeps the render-only
|
|
26
|
+
* concerns (WAAPI view-change animation, mouse-wheel navigation, DOM refs) itself.
|
|
27
|
+
*/
|
|
28
|
+
import { type DateLike, type MonthMatrixCell } from './datetime/date-core';
|
|
29
|
+
import { type SelectionMode } from './datetime/date-selection';
|
|
30
|
+
import { type RestrictOptions } from './datetime/date-restrict';
|
|
31
|
+
export type DisplayMode = 'month' | 'year' | 'decade';
|
|
32
|
+
export type CalendarNameFormat = 'narrow' | 'short' | 'long';
|
|
33
|
+
/** Selected value(s). Single Date for one/zeroOrOne, array for multi modes. */
|
|
34
|
+
export type CalendarValue = Date | number | string | ReadonlyArray<Date | number | string> | null;
|
|
35
|
+
/** A one-click shortcut shown in the presets rail. `value` is a single date
|
|
36
|
+
* (or an [start, end] range for range mode); pass a function for "today"-
|
|
37
|
+
* relative shortcuts that resolve at click time. */
|
|
38
|
+
export type CalendarPreset = {
|
|
39
|
+
label: string;
|
|
40
|
+
value: Date | number | string | readonly [Date | number | string, Date | number | string] | (() => Date | number | string | readonly [Date | number | string, Date | number | string]);
|
|
41
|
+
};
|
|
42
|
+
/** How the calendar animates a navigation / drill (a render concern the styled
|
|
43
|
+
* component acts on; the core only reports the direction). */
|
|
44
|
+
export type CalendarAnimation = 'slide' | 'fade' | 'none';
|
|
45
|
+
/** Why the visible view last changed - drives the styled component's animation. */
|
|
46
|
+
export type CalendarNavDir = 'next' | 'prev' | 'drillDown' | 'drillUp' | 'fade';
|
|
47
|
+
/** Per-day interaction/visual state (booleans the renderer maps to classes). */
|
|
48
|
+
export type CalendarDayState = {
|
|
49
|
+
disabled: boolean;
|
|
50
|
+
selected: boolean;
|
|
51
|
+
important: boolean;
|
|
52
|
+
today: boolean;
|
|
53
|
+
outside: boolean;
|
|
54
|
+
focused: boolean;
|
|
55
|
+
preview: boolean;
|
|
56
|
+
};
|
|
57
|
+
/** Reactive inputs are passed as getters so the core tracks live prop changes;
|
|
58
|
+
* callbacks are plain closures. */
|
|
59
|
+
export type CalendarConfig = {
|
|
60
|
+
value: () => CalendarValue;
|
|
61
|
+
onChange?: (dates: Date[]) => void;
|
|
62
|
+
onNavigate?: (viewDate: Date, displayMode: DisplayMode) => void;
|
|
63
|
+
selectionMode?: () => SelectionMode;
|
|
64
|
+
min?: () => DateLike | null;
|
|
65
|
+
max?: () => DateLike | null;
|
|
66
|
+
restrictedDates?: () => RestrictOptions['restrictedDates'];
|
|
67
|
+
importantDates?: () => ReadonlyArray<DateLike> | ((d: Date) => boolean) | null;
|
|
68
|
+
firstDayOfWeek?: () => number;
|
|
69
|
+
weeks?: () => number;
|
|
70
|
+
months?: () => number;
|
|
71
|
+
displayMode?: () => DisplayMode;
|
|
72
|
+
disabled?: () => boolean;
|
|
73
|
+
readonly?: () => boolean;
|
|
74
|
+
locale?: () => string;
|
|
75
|
+
dayNameFormat?: () => CalendarNameFormat;
|
|
76
|
+
monthNameFormat?: () => CalendarNameFormat;
|
|
77
|
+
dateTooltip?: () => ((date: Date) => string | null | undefined) | undefined;
|
|
78
|
+
};
|
|
79
|
+
/** Normalize a calendar value to an ordered day-midnight list (pure). */
|
|
80
|
+
export declare function normalizeCalendarValue(v: CalendarValue): Date[];
|
|
81
|
+
export declare function createCalendar(config: CalendarConfig): {
|
|
82
|
+
readonly view: Date;
|
|
83
|
+
readonly mode: DisplayMode;
|
|
84
|
+
readonly title: string;
|
|
85
|
+
readonly panels: {
|
|
86
|
+
month: Date;
|
|
87
|
+
title: string;
|
|
88
|
+
matrix: MonthMatrixCell[][];
|
|
89
|
+
}[];
|
|
90
|
+
readonly weekdayHeaders: {
|
|
91
|
+
label: string;
|
|
92
|
+
weekday: number;
|
|
93
|
+
}[];
|
|
94
|
+
readonly yearCells: {
|
|
95
|
+
index: number;
|
|
96
|
+
label: string;
|
|
97
|
+
current: boolean;
|
|
98
|
+
selected: boolean;
|
|
99
|
+
}[];
|
|
100
|
+
readonly decadeCells: {
|
|
101
|
+
year: number;
|
|
102
|
+
outside: boolean;
|
|
103
|
+
current: boolean;
|
|
104
|
+
selected: boolean;
|
|
105
|
+
}[];
|
|
106
|
+
readonly selectedDates: Date[];
|
|
107
|
+
readonly previewRange: Date[] | null;
|
|
108
|
+
readonly focusDate: Date;
|
|
109
|
+
readonly hoverDate: Date | null;
|
|
110
|
+
readonly canClear: boolean;
|
|
111
|
+
readonly isInteractive: boolean;
|
|
112
|
+
/** Increments on every view/drill change; the styled component watches it to
|
|
113
|
+
* replay its WAAPI animation on the updated DOM. */
|
|
114
|
+
readonly navToken: number;
|
|
115
|
+
/** Why the view last changed (read untracked from the animation effect). */
|
|
116
|
+
readonly navDir: CalendarNavDir;
|
|
117
|
+
dayState: (d: Date, panelMonth: Date) => CalendarDayState;
|
|
118
|
+
inPreview: (d: Date) => boolean;
|
|
119
|
+
formatFullDate: (d: Date) => string;
|
|
120
|
+
formatMonthTitle: (d: Date) => string;
|
|
121
|
+
pickDay: (d: Date, e?: {
|
|
122
|
+
ctrlKey?: boolean;
|
|
123
|
+
metaKey?: boolean;
|
|
124
|
+
shiftKey?: boolean;
|
|
125
|
+
}) => void;
|
|
126
|
+
step: (dir: -1 | 1) => void;
|
|
127
|
+
drillUp: () => void;
|
|
128
|
+
pickMonth: (monthIndex: number) => void;
|
|
129
|
+
pickYear: (year: number) => void;
|
|
130
|
+
goToday: () => void;
|
|
131
|
+
applyPreset: (p: CalendarPreset) => void;
|
|
132
|
+
clearSelection: () => void;
|
|
133
|
+
setHover: (d: Date | null) => Date | null;
|
|
134
|
+
onKeydown: (e: KeyboardEvent) => void;
|
|
135
|
+
/** Previous / Next navigation button. */
|
|
136
|
+
navProps(dir: -1 | 1): {
|
|
137
|
+
type: "button";
|
|
138
|
+
disabled: boolean;
|
|
139
|
+
'aria-label': string;
|
|
140
|
+
onclick: () => void;
|
|
141
|
+
};
|
|
142
|
+
/** The centered title button that drills up (month -> year -> decade). */
|
|
143
|
+
titleProps(): {
|
|
144
|
+
type: "button";
|
|
145
|
+
disabled: boolean;
|
|
146
|
+
'aria-live': "polite";
|
|
147
|
+
onclick: () => void;
|
|
148
|
+
};
|
|
149
|
+
/** The grid container: keyboard + ARIA. Works for month, year and decade
|
|
150
|
+
* modes (the handler dispatches on the current mode). */
|
|
151
|
+
gridProps(): {
|
|
152
|
+
role: "grid";
|
|
153
|
+
'aria-label': string;
|
|
154
|
+
tabindex: number;
|
|
155
|
+
onkeydown: (e: KeyboardEvent) => void;
|
|
156
|
+
};
|
|
157
|
+
/** A single day button in the month grid. Combine with `dayState` for the
|
|
158
|
+
* visual class flags. */
|
|
159
|
+
dayProps(cell: MonthMatrixCell, panelMonth: Date): {
|
|
160
|
+
type: "button";
|
|
161
|
+
role: "gridcell";
|
|
162
|
+
'aria-selected': boolean;
|
|
163
|
+
'aria-disabled': boolean;
|
|
164
|
+
'aria-current': "date" | undefined;
|
|
165
|
+
'aria-label': string;
|
|
166
|
+
title: string | undefined;
|
|
167
|
+
tabindex: number;
|
|
168
|
+
disabled: boolean;
|
|
169
|
+
onclick: (e: MouseEvent) => void;
|
|
170
|
+
onpointerenter: () => Date | null;
|
|
171
|
+
onpointerleave: () => Date | null;
|
|
172
|
+
};
|
|
173
|
+
/** A month cell in year mode. */
|
|
174
|
+
monthCellProps(monthIndex: number): {
|
|
175
|
+
type: "button";
|
|
176
|
+
disabled: boolean;
|
|
177
|
+
onclick: () => void;
|
|
178
|
+
};
|
|
179
|
+
/** A year cell in decade mode. */
|
|
180
|
+
yearCellProps(year: number): {
|
|
181
|
+
type: "button";
|
|
182
|
+
disabled: boolean;
|
|
183
|
+
onclick: () => void;
|
|
184
|
+
};
|
|
185
|
+
/** A preset shortcut button. */
|
|
186
|
+
presetProps(preset: CalendarPreset): {
|
|
187
|
+
type: "button";
|
|
188
|
+
disabled: boolean;
|
|
189
|
+
onclick: () => void;
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
export type Calendar = ReturnType<typeof createCalendar>;
|