@zeyos/zx 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +15 -0
- package/dist/types/compat/base.d.ts +156 -0
- package/dist/types/compat/globals.d.ts +20 -0
- package/dist/types/compat/index.d.ts +128 -0
- package/dist/types/compat/map/basic.d.ts +175 -0
- package/dist/types/compat/map/data.d.ts +102 -0
- package/dist/types/compat/map/date-time.d.ts +80 -0
- package/dist/types/compat/map/factory.d.ts +9 -0
- package/dist/types/compat/map/form.d.ts +98 -0
- package/dist/types/compat/map/helpers.d.ts +12 -0
- package/dist/types/compat/map/http.d.ts +36 -0
- package/dist/types/compat/map/layout.d.ts +106 -0
- package/dist/types/compat/map/options.d.ts +80 -0
- package/dist/types/compat/map/select.d.ts +95 -0
- package/dist/types/compat/map/stubs.d.ts +32 -0
- package/dist/types/compat/map/utilities.d.ts +37 -0
- package/dist/types/compat-entry.d.ts +5 -0
- package/dist/types/components/badge/badge.d.ts +46 -0
- package/dist/types/components/breadcrumb/breadcrumb.d.ts +200 -0
- package/dist/types/components/button/button.d.ts +42 -0
- package/dist/types/components/check-button/check-button.d.ts +98 -0
- package/dist/types/components/checklist/checklist.d.ts +143 -0
- package/dist/types/components/checklist/field-adapter.d.ts +5 -0
- package/dist/types/components/context-menu/context-menu.d.ts +130 -0
- package/dist/types/components/copy/copy-button.d.ts +48 -0
- package/dist/types/components/copy/copy-input.d.ts +91 -0
- package/dist/types/components/data-filter/data-filter.d.ts +250 -0
- package/dist/types/components/data-filter/filter-core.d.ts +52 -0
- package/dist/types/components/date-picker/date-picker.d.ts +137 -0
- package/dist/types/components/date-picker/date-range-picker.d.ts +350 -0
- package/dist/types/components/date-picker/field-adapter.d.ts +6 -0
- package/dist/types/components/date-picker/month-picker.d.ts +75 -0
- package/dist/types/components/date-picker/range-field-adapter.d.ts +7 -0
- package/dist/types/components/date-picker/time-picker.d.ts +127 -0
- package/dist/types/components/datebox/date-range-box.d.ts +218 -0
- package/dist/types/components/datebox/datebox.d.ts +160 -0
- package/dist/types/components/datebox/field-adapter.d.ts +5 -0
- package/dist/types/components/dialog/dialog.d.ts +284 -0
- package/dist/types/components/dropdown/dropdown.d.ts +118 -0
- package/dist/types/components/empty-state/empty-state.d.ts +38 -0
- package/dist/types/components/field/field.d.ts +231 -0
- package/dist/types/components/field-upload/field-adapter.d.ts +5 -0
- package/dist/types/components/field-upload/field-upload.d.ts +213 -0
- package/dist/types/components/fieldset/fieldset.d.ts +125 -0
- package/dist/types/components/finder/finder.d.ts +252 -0
- package/dist/types/components/form/form.d.ts +194 -0
- package/dist/types/components/groupbox/groupbox.d.ts +89 -0
- package/dist/types/components/layout/layout.d.ts +132 -0
- package/dist/types/components/loading/inline-loading.d.ts +86 -0
- package/dist/types/components/loading/progress-bar.d.ts +168 -0
- package/dist/types/components/loading/spinner.d.ts +34 -0
- package/dist/types/components/master-panel/master-panel.d.ts +112 -0
- package/dist/types/components/menu-button/menu-button.d.ts +142 -0
- package/dist/types/components/message/message.d.ts +212 -0
- package/dist/types/components/modal/modal.d.ts +105 -0
- package/dist/types/components/multi-value-editor/field-adapter.d.ts +5 -0
- package/dist/types/components/multi-value-editor/multi-value-editor.d.ts +66 -0
- package/dist/types/components/navigation-bar/navigation-bar.d.ts +229 -0
- package/dist/types/components/number-field/field-adapter.d.ts +5 -0
- package/dist/types/components/number-field/number-field.d.ts +292 -0
- package/dist/types/components/pagination/pagination.d.ts +267 -0
- package/dist/types/components/panel/panel.d.ts +194 -0
- package/dist/types/components/permission/permission.d.ts +93 -0
- package/dist/types/components/rating/field-adapter.d.ts +5 -0
- package/dist/types/components/rating/rating.d.ts +213 -0
- package/dist/types/components/search/search.d.ts +98 -0
- package/dist/types/components/select/field-adapter.d.ts +5 -0
- package/dist/types/components/select/filter.d.ts +11 -0
- package/dist/types/components/select/select.d.ts +235 -0
- package/dist/types/components/skeleton/skeleton.d.ts +97 -0
- package/dist/types/components/slider/field-adapter.d.ts +5 -0
- package/dist/types/components/slider/slider.d.ts +216 -0
- package/dist/types/components/split-view/split-view.d.ts +335 -0
- package/dist/types/components/stepper/stepper.d.ts +314 -0
- package/dist/types/components/stepper/steps.d.ts +131 -0
- package/dist/types/components/tabbox/tabbox.d.ts +230 -0
- package/dist/types/components/table/sort.d.ts +49 -0
- package/dist/types/components/table/table.d.ts +872 -0
- package/dist/types/components/tag-picker/field-adapter.d.ts +5 -0
- package/dist/types/components/tag-picker/tag-picker.d.ts +375 -0
- package/dist/types/components/timebox/field-adapter.d.ts +5 -0
- package/dist/types/components/timebox/timebox.d.ts +121 -0
- package/dist/types/components/toggle/field-adapter.d.ts +5 -0
- package/dist/types/components/toggle/toggle.d.ts +94 -0
- package/dist/types/components/toolbar/toolbar.d.ts +230 -0
- package/dist/types/components/tooltip/tooltip.d.ts +183 -0
- package/dist/types/components/tree/hierarchy.d.ts +113 -0
- package/dist/types/components/tree/tree.d.ts +383 -0
- package/dist/types/components/truncate/truncate.d.ts +61 -0
- package/dist/types/components/value-list/field-adapter.d.ts +5 -0
- package/dist/types/components/value-list/value-list.d.ts +143 -0
- package/dist/types/core/breakpoint.d.ts +68 -0
- package/dist/types/core/component.d.ts +115 -0
- package/dist/types/core/date.d.ts +50 -0
- package/dist/types/core/dom.d.ts +86 -0
- package/dist/types/core/export.d.ts +70 -0
- package/dist/types/core/fontawesome.d.ts +107 -0
- package/dist/types/core/format.d.ts +107 -0
- package/dist/types/core/http.d.ts +122 -0
- package/dist/types/core/i18n.d.ts +35 -0
- package/dist/types/core/icons.d.ts +137 -0
- package/dist/types/core/keyboard.d.ts +72 -0
- package/dist/types/core/position.d.ts +45 -0
- package/dist/types/core/storage.d.ts +46 -0
- package/dist/types/core/util.d.ts +117 -0
- package/dist/types/elements/define.d.ts +73 -0
- package/dist/types/elements/reflect.d.ts +27 -0
- package/dist/types/index.d.ts +79 -0
- package/dist/types/zeyos/connect.d.ts +65 -0
- package/dist/types/zeyos/form.d.ts +140 -0
- package/dist/types/zeyos/icons.d.ts +104 -0
- package/dist/types/zeyos/index.d.ts +12 -0
- package/dist/types/zeyos/modules.d.ts +110 -0
- package/dist/types/zeyos/query.d.ts +157 -0
- package/dist/types/zeyos/schema.d.ts +79 -0
- package/dist/types/zeyos/select.d.ts +167 -0
- package/dist/types/zeyos/table.d.ts +205 -0
- package/dist/zx-compat.esm.js +362 -33
- package/dist/zx-compat.esm.min.js +1 -1
- package/dist/zx-compat.global.js +359 -67
- package/dist/zx-compat.global.min.js +3 -3
- package/dist/zx-zeyos.esm.js +342 -43
- package/dist/zx-zeyos.esm.min.js +1 -1
- package/dist/zx.css +68 -6
- package/dist/zx.esm.js +346 -67
- package/dist/zx.esm.min.js +3 -3
- package/dist/zx.global.js +346 -67
- package/dist/zx.global.min.js +3 -3
- package/dist/zx.min.css +1 -1
- package/docs/api.json +48 -2
- package/docs/llms.md +28 -0
- package/package.json +37 -9
- package/src/compat/base.js +291 -0
- package/src/compat/globals.js +165 -0
- package/src/compat/index.js +84 -0
- package/src/compat/map/basic.js +464 -0
- package/src/compat/map/data.js +232 -0
- package/src/compat/map/date-time.js +177 -0
- package/src/compat/map/factory.js +45 -0
- package/src/compat/map/form.js +330 -0
- package/src/compat/map/helpers.js +46 -0
- package/src/compat/map/http.js +117 -0
- package/src/compat/map/layout.js +256 -0
- package/src/compat/map/options.js +267 -0
- package/src/compat/map/select.js +198 -0
- package/src/compat/map/stubs.js +26 -0
- package/src/compat/map/utilities.js +113 -0
- package/src/compat-entry.js +11 -0
- package/src/components/badge/badge.css +147 -0
- package/src/components/badge/badge.js +92 -0
- package/src/components/breadcrumb/breadcrumb.css +105 -0
- package/src/components/breadcrumb/breadcrumb.js +331 -0
- package/src/components/button/button.css +104 -0
- package/src/components/button/button.js +76 -0
- package/src/components/check-button/check-button.css +66 -0
- package/src/components/check-button/check-button.js +167 -0
- package/src/components/checklist/checklist.css +65 -0
- package/src/components/checklist/checklist.js +282 -0
- package/src/components/checklist/field-adapter.js +46 -0
- package/src/components/context-menu/context-menu.css +54 -0
- package/src/components/context-menu/context-menu.js +334 -0
- package/src/components/copy/copy-button.css +27 -0
- package/src/components/copy/copy-button.js +78 -0
- package/src/components/copy/copy-input.css +59 -0
- package/src/components/copy/copy-input.js +123 -0
- package/src/components/data-filter/data-filter.css +53 -0
- package/src/components/data-filter/data-filter.js +400 -0
- package/src/components/data-filter/filter-core.js +128 -0
- package/src/components/date-picker/date-picker.css +181 -0
- package/src/components/date-picker/date-picker.js +500 -0
- package/src/components/date-picker/date-range-picker.css +264 -0
- package/src/components/date-picker/date-range-picker.js +990 -0
- package/src/components/date-picker/field-adapter.js +36 -0
- package/src/components/date-picker/month-picker.js +223 -0
- package/src/components/date-picker/range-field-adapter.js +31 -0
- package/src/components/date-picker/time-picker.css +191 -0
- package/src/components/date-picker/time-picker.js +406 -0
- package/src/components/datebox/date-range-box.css +128 -0
- package/src/components/datebox/date-range-box.js +492 -0
- package/src/components/datebox/datebox.css +108 -0
- package/src/components/datebox/datebox.js +358 -0
- package/src/components/datebox/field-adapter.js +34 -0
- package/src/components/dialog/dialog.css +74 -0
- package/src/components/dialog/dialog.js +450 -0
- package/src/components/dropdown/dropdown.css +24 -0
- package/src/components/dropdown/dropdown.js +288 -0
- package/src/components/empty-state/empty-state.css +80 -0
- package/src/components/empty-state/empty-state.js +92 -0
- package/src/components/field/field.css +127 -0
- package/src/components/field/field.js +605 -0
- package/src/components/field-upload/field-adapter.js +21 -0
- package/src/components/field-upload/field-upload.css +108 -0
- package/src/components/field-upload/field-upload.js +475 -0
- package/src/components/fieldset/fieldset.css +37 -0
- package/src/components/fieldset/fieldset.js +307 -0
- package/src/components/finder/finder.css +98 -0
- package/src/components/finder/finder.js +509 -0
- package/src/components/form/form.css +32 -0
- package/src/components/form/form.js +302 -0
- package/src/components/groupbox/groupbox.css +51 -0
- package/src/components/groupbox/groupbox.js +199 -0
- package/src/components/layout/layout.css +117 -0
- package/src/components/layout/layout.js +136 -0
- package/src/components/loading/inline-loading.css +34 -0
- package/src/components/loading/inline-loading.js +140 -0
- package/src/components/loading/progress-bar.css +115 -0
- package/src/components/loading/progress-bar.js +259 -0
- package/src/components/loading/spinner.css +58 -0
- package/src/components/loading/spinner.js +57 -0
- package/src/components/master-panel/master-panel.css +51 -0
- package/src/components/master-panel/master-panel.js +203 -0
- package/src/components/menu-button/menu-button.css +49 -0
- package/src/components/menu-button/menu-button.js +294 -0
- package/src/components/message/message.css +122 -0
- package/src/components/message/message.js +499 -0
- package/src/components/modal/modal.css +47 -0
- package/src/components/modal/modal.js +203 -0
- package/src/components/multi-value-editor/field-adapter.js +44 -0
- package/src/components/multi-value-editor/multi-value-editor.css +56 -0
- package/src/components/multi-value-editor/multi-value-editor.js +170 -0
- package/src/components/navigation-bar/navigation-bar.css +130 -0
- package/src/components/navigation-bar/navigation-bar.js +450 -0
- package/src/components/number-field/field-adapter.js +40 -0
- package/src/components/number-field/number-field.css +77 -0
- package/src/components/number-field/number-field.js +545 -0
- package/src/components/pagination/pagination.css +95 -0
- package/src/components/pagination/pagination.js +481 -0
- package/src/components/panel/panel.css +123 -0
- package/src/components/panel/panel.js +336 -0
- package/src/components/permission/permission.css +47 -0
- package/src/components/permission/permission.js +198 -0
- package/src/components/rating/field-adapter.js +34 -0
- package/src/components/rating/rating.css +97 -0
- package/src/components/rating/rating.js +395 -0
- package/src/components/search/search.css +70 -0
- package/src/components/search/search.js +193 -0
- package/src/components/select/field-adapter.js +24 -0
- package/src/components/select/filter.js +39 -0
- package/src/components/select/select.css +180 -0
- package/src/components/select/select.js +663 -0
- package/src/components/skeleton/skeleton.css +76 -0
- package/src/components/skeleton/skeleton.js +139 -0
- package/src/components/slider/field-adapter.js +36 -0
- package/src/components/slider/slider.css +181 -0
- package/src/components/slider/slider.js +399 -0
- package/src/components/split-view/split-view.css +139 -0
- package/src/components/split-view/split-view.js +806 -0
- package/src/components/stepper/stepper.css +234 -0
- package/src/components/stepper/stepper.js +459 -0
- package/src/components/stepper/steps.js +131 -0
- package/src/components/tabbox/tabbox.css +281 -0
- package/src/components/tabbox/tabbox.js +484 -0
- package/src/components/table/sort.js +85 -0
- package/src/components/table/table.css +364 -0
- package/src/components/table/table.js +1693 -0
- package/src/components/tag-picker/field-adapter.js +35 -0
- package/src/components/tag-picker/tag-picker.css +169 -0
- package/src/components/tag-picker/tag-picker.js +837 -0
- package/src/components/timebox/field-adapter.js +24 -0
- package/src/components/timebox/timebox.css +51 -0
- package/src/components/timebox/timebox.js +276 -0
- package/src/components/toggle/field-adapter.js +24 -0
- package/src/components/toggle/toggle.css +66 -0
- package/src/components/toggle/toggle.js +150 -0
- package/src/components/toolbar/toolbar.css +81 -0
- package/src/components/toolbar/toolbar.js +511 -0
- package/src/components/tooltip/tooltip.css +36 -0
- package/src/components/tooltip/tooltip.js +420 -0
- package/src/components/tree/hierarchy.js +151 -0
- package/src/components/tree/tree.css +99 -0
- package/src/components/tree/tree.js +784 -0
- package/src/components/truncate/truncate.css +20 -0
- package/src/components/truncate/truncate.js +92 -0
- package/src/components/value-list/field-adapter.js +24 -0
- package/src/components/value-list/value-list.css +108 -0
- package/src/components/value-list/value-list.js +336 -0
- package/src/core/breakpoint.js +150 -0
- package/src/core/component.js +292 -0
- package/src/core/date.js +216 -0
- package/src/core/dom.js +260 -0
- package/src/core/export.js +204 -0
- package/src/core/fontawesome.js +177 -0
- package/src/core/format.js +283 -0
- package/src/core/http.js +246 -0
- package/src/core/i18n.js +83 -0
- package/src/core/icons.js +283 -0
- package/src/core/keyboard.js +240 -0
- package/src/core/position.js +177 -0
- package/src/core/storage.js +175 -0
- package/src/core/util.js +336 -0
- package/src/elements/define.js +715 -0
- package/src/elements/reflect.js +79 -0
- package/src/index.js +131 -0
- package/src/zeyos/connect.js +142 -0
- package/src/zeyos/form.js +254 -0
- package/src/zeyos/icons.js +92 -0
- package/src/zeyos/index.js +21 -0
- package/src/zeyos/modules.js +269 -0
- package/src/zeyos/query.js +199 -0
- package/src/zeyos/schema.js +474 -0
- package/src/zeyos/select.js +175 -0
- package/src/zeyos/table.js +272 -0
- package/styles/base.css +124 -0
- package/styles/icons.css +34 -0
- package/styles/tokens/dark.css +84 -0
- package/styles/tokens/density.css +9 -0
- package/styles/tokens/global.css +80 -0
- package/styles/tokens/modules.css +109 -0
- package/styles/tokens/semantic.css +49 -0
- package/styles/zx.css +61 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { Component } from '../../core/component.js';
|
|
2
|
+
export type DateRange = {
|
|
3
|
+
start: Date | null;
|
|
4
|
+
end: Date | null;
|
|
5
|
+
};
|
|
6
|
+
export type DateRangeState = 'start' | 'middle' | 'end';
|
|
7
|
+
export type DateRangeBounds = {
|
|
8
|
+
/**
|
|
9
|
+
* Earliest selectable local calendar day.
|
|
10
|
+
*/
|
|
11
|
+
min?: Date | null;
|
|
12
|
+
/**
|
|
13
|
+
* Latest selectable local calendar day.
|
|
14
|
+
*/
|
|
15
|
+
max?: Date | null;
|
|
16
|
+
/**
|
|
17
|
+
* Smallest number of nights a complete range may span.
|
|
18
|
+
*/
|
|
19
|
+
minNights?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Largest number of nights a complete range may span.
|
|
22
|
+
*/
|
|
23
|
+
maxNights?: number | null;
|
|
24
|
+
};
|
|
25
|
+
export type DateRangePreset = {
|
|
26
|
+
/**
|
|
27
|
+
* Stable identifier, emitted on the preset button as `data-preset`.
|
|
28
|
+
*/
|
|
29
|
+
name: string;
|
|
30
|
+
/**
|
|
31
|
+
* Button text.
|
|
32
|
+
*/
|
|
33
|
+
label: string;
|
|
34
|
+
/**
|
|
35
|
+
* Factory returning the range the preset applies.
|
|
36
|
+
*/
|
|
37
|
+
range: () => DateRange;
|
|
38
|
+
};
|
|
39
|
+
export type DateRangePickerOptions = {
|
|
40
|
+
/**
|
|
41
|
+
* Initially selected first day.
|
|
42
|
+
*/
|
|
43
|
+
start?: Date | null;
|
|
44
|
+
/**
|
|
45
|
+
* Initially selected last day.
|
|
46
|
+
*/
|
|
47
|
+
end?: Date | null;
|
|
48
|
+
/**
|
|
49
|
+
* Earliest selectable local calendar day.
|
|
50
|
+
*/
|
|
51
|
+
min?: Date | null;
|
|
52
|
+
/**
|
|
53
|
+
* Latest selectable local calendar day.
|
|
54
|
+
*/
|
|
55
|
+
max?: Date | null;
|
|
56
|
+
/**
|
|
57
|
+
* Month panels to render; narrow containers show only the first.
|
|
58
|
+
*/
|
|
59
|
+
months?: number;
|
|
60
|
+
/**
|
|
61
|
+
* First weekday, from 0 (Sunday) through 6 (Saturday).
|
|
62
|
+
*/
|
|
63
|
+
weekStart?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Show ISO week numbers.
|
|
66
|
+
*/
|
|
67
|
+
showWeekNumbers?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Smallest number of nights a complete range may span.
|
|
70
|
+
*/
|
|
71
|
+
minNights?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Largest number of nights a complete range may span.
|
|
74
|
+
*/
|
|
75
|
+
maxNights?: number | null;
|
|
76
|
+
/**
|
|
77
|
+
* Preset buttons, or `true` for the built-in set.
|
|
78
|
+
*/
|
|
79
|
+
presets?: DateRangePreset[] | boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Disable every control.
|
|
82
|
+
*/
|
|
83
|
+
disabled?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Complete-range listener.
|
|
86
|
+
*/
|
|
87
|
+
onchange?: (event: CustomEvent<DateRange>) => void;
|
|
88
|
+
/**
|
|
89
|
+
* Every-click listener.
|
|
90
|
+
*/
|
|
91
|
+
onselect?: (event: CustomEvent<DateRange>) => void;
|
|
92
|
+
/**
|
|
93
|
+
* Visible-month listener.
|
|
94
|
+
*/
|
|
95
|
+
onmonthchange?: (event: CustomEvent<{
|
|
96
|
+
year: number;
|
|
97
|
+
month: number;
|
|
98
|
+
}>) => void;
|
|
99
|
+
};
|
|
100
|
+
export type DateRangePickerSetOptions = {
|
|
101
|
+
silent?: boolean;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Puts a start/end pair in chronological order at local midnight.
|
|
105
|
+
* Values that are not usable `Date` instances become `null`.
|
|
106
|
+
* @param {unknown} start Range start.
|
|
107
|
+
* @param {unknown} end Range end.
|
|
108
|
+
* @returns {DateRange}
|
|
109
|
+
*/
|
|
110
|
+
export declare function normalizeRange(start: unknown, end: unknown): DateRange;
|
|
111
|
+
/**
|
|
112
|
+
* Counts the nights between two days. The same day spans zero nights, and the count is derived
|
|
113
|
+
* from calendar days so daylight-saving transitions never add or drop a night.
|
|
114
|
+
* @param {unknown} start Range start.
|
|
115
|
+
* @param {unknown} end Range end.
|
|
116
|
+
* @returns {number} Nights, or `0` when the range is incomplete.
|
|
117
|
+
*/
|
|
118
|
+
export declare function rangeNights(start: unknown, end: unknown): number;
|
|
119
|
+
/**
|
|
120
|
+
* Classifies one day against a range. A half-open range only matches its single endpoint, and a
|
|
121
|
+
* one-day range reports `'start'`.
|
|
122
|
+
* @param {unknown} day Day to classify.
|
|
123
|
+
* @param {unknown} start Range start.
|
|
124
|
+
* @param {unknown} end Range end.
|
|
125
|
+
* @returns {DateRangeState|null} The day's role, or `null` when it is outside the range.
|
|
126
|
+
*/
|
|
127
|
+
export declare function rangeStateOf(day: unknown, start: unknown, end: unknown): DateRangeState | null;
|
|
128
|
+
/**
|
|
129
|
+
* Normalizes a range and pulls it inside the configured bounds: endpoints are clamped into
|
|
130
|
+
* `min`/`max`, an over-long range is shortened to `maxNights`, and a too-short one is stretched to
|
|
131
|
+
* `minNights` — moving `end` forward, or `start` backward when `max` blocks the way. When the
|
|
132
|
+
* `min`/`max` window itself is narrower than `minNights` the range cannot be honoured and both
|
|
133
|
+
* endpoints come back `null`.
|
|
134
|
+
* @param {DateRange|null|undefined} range Range to clamp.
|
|
135
|
+
* @param {DateRangeBounds} [bounds={}] Selection bounds.
|
|
136
|
+
* @returns {DateRange} A new range of new `Date` objects.
|
|
137
|
+
*/
|
|
138
|
+
export declare function clampRange(range: DateRange | null | undefined, bounds?: DateRangeBounds): DateRange;
|
|
139
|
+
/**
|
|
140
|
+
* Inline two-month range calendar following the APG date-picker grid pattern. Both grids form a
|
|
141
|
+
* single roving-focus unit, so arrowing off the end of one month continues in the next.
|
|
142
|
+
* @fires DateRangePicker#change
|
|
143
|
+
* @fires DateRangePicker#select
|
|
144
|
+
* @fires DateRangePicker#monthchange
|
|
145
|
+
* @extends {Component<DateRangePickerOptions>}
|
|
146
|
+
*/
|
|
147
|
+
export declare class DateRangePicker extends Component<DateRangePickerOptions> {
|
|
148
|
+
_rootAttributes: Map<string, string>;
|
|
149
|
+
_min: Date;
|
|
150
|
+
_max: Date;
|
|
151
|
+
_minNights: number;
|
|
152
|
+
_maxNights: number;
|
|
153
|
+
_weekStart: number;
|
|
154
|
+
_monthCount: number;
|
|
155
|
+
_presets: DateRangePreset[];
|
|
156
|
+
_disabled: boolean;
|
|
157
|
+
_hover: Date;
|
|
158
|
+
/** @type {{date: Date, cell: HTMLTableCellElement, button: HTMLButtonElement}[]} */
|
|
159
|
+
_dayCells: {
|
|
160
|
+
date: Date;
|
|
161
|
+
cell: HTMLTableCellElement;
|
|
162
|
+
button: HTMLButtonElement;
|
|
163
|
+
}[];
|
|
164
|
+
_start: Date;
|
|
165
|
+
_end: any;
|
|
166
|
+
_picking: boolean;
|
|
167
|
+
_focused: Date;
|
|
168
|
+
_viewYear: any;
|
|
169
|
+
_viewMonth: any;
|
|
170
|
+
_nodes: any[] | HTMLElement[];
|
|
171
|
+
_committedStart: any;
|
|
172
|
+
_committedEnd: any;
|
|
173
|
+
static cssName: string;
|
|
174
|
+
/** @type {DateRangePickerOptions} */
|
|
175
|
+
static defaults: DateRangePickerOptions;
|
|
176
|
+
/** @returns {HTMLElement} */
|
|
177
|
+
render(): HTMLElement;
|
|
178
|
+
/**
|
|
179
|
+
* Returns copies of the selected endpoints; the internal dates are never handed out.
|
|
180
|
+
* @returns {DateRange}
|
|
181
|
+
*/
|
|
182
|
+
get(): DateRange;
|
|
183
|
+
/**
|
|
184
|
+
* Selects a range, clamped to the configured bounds, and scrolls the first visible month to the
|
|
185
|
+
* range start.
|
|
186
|
+
* @param {DateRange|null} [range={}] Range to select; omit either endpoint to clear it.
|
|
187
|
+
* @param {DateRangePickerSetOptions} [options={}] Update behavior.
|
|
188
|
+
* @returns {this}
|
|
189
|
+
* @fires DateRangePicker#change
|
|
190
|
+
* @fires DateRangePicker#monthchange
|
|
191
|
+
*/
|
|
192
|
+
set(range?: DateRange | null, { silent }?: DateRangePickerSetOptions): this;
|
|
193
|
+
/**
|
|
194
|
+
* Clears the selection.
|
|
195
|
+
* @param {DateRangePickerSetOptions} [options={}] Update behavior.
|
|
196
|
+
* @returns {this}
|
|
197
|
+
* @fires DateRangePicker#change
|
|
198
|
+
*/
|
|
199
|
+
clear({ silent }?: DateRangePickerSetOptions): this;
|
|
200
|
+
/**
|
|
201
|
+
* Moves focus to the currently roving calendar day.
|
|
202
|
+
* @returns {this}
|
|
203
|
+
*/
|
|
204
|
+
focus(): this;
|
|
205
|
+
/** Enables every control. @returns {this} */
|
|
206
|
+
enable(): this;
|
|
207
|
+
/** Disables every control. @returns {this} */
|
|
208
|
+
disable(): this;
|
|
209
|
+
/** Removes generated content and restores the host element's attributes. @returns {void} */
|
|
210
|
+
destroy(): void;
|
|
211
|
+
/** @returns {DateRangeBounds} */
|
|
212
|
+
_bounds(): DateRangeBounds;
|
|
213
|
+
/**
|
|
214
|
+
* Reports whether a day may be clicked. Days before the pending start always may — they restart
|
|
215
|
+
* the range there instead of producing an inverted one.
|
|
216
|
+
* @param {Date} date Day to test.
|
|
217
|
+
* @returns {boolean}
|
|
218
|
+
*/
|
|
219
|
+
_selectable(date: Date): boolean;
|
|
220
|
+
/**
|
|
221
|
+
* Applies one day click: the first sets the start, the second the end, and a click on or before
|
|
222
|
+
* the pending start restarts the range there.
|
|
223
|
+
* @param {Date} date Clicked day.
|
|
224
|
+
* @returns {void}
|
|
225
|
+
* @fires DateRangePicker#select
|
|
226
|
+
* @fires DateRangePicker#change
|
|
227
|
+
*/
|
|
228
|
+
_choose(date: Date): void;
|
|
229
|
+
/**
|
|
230
|
+
* Snapshots the selection Escape falls back to. Only a complete range is worth restoring, so a
|
|
231
|
+
* half-open one is remembered as no selection at all.
|
|
232
|
+
* @returns {void}
|
|
233
|
+
*/
|
|
234
|
+
_remember(): void;
|
|
235
|
+
/**
|
|
236
|
+
* Abandons a half-picked range, restoring the last complete selection.
|
|
237
|
+
* @returns {boolean} Whether a half-picked range was discarded.
|
|
238
|
+
* @fires DateRangePicker#select
|
|
239
|
+
*/
|
|
240
|
+
_abandon(): boolean;
|
|
241
|
+
/** @param {Date} date @returns {Date} */
|
|
242
|
+
_clampFocus(date: Date): Date;
|
|
243
|
+
/**
|
|
244
|
+
* Counts the month panels the container query is currently showing, falling back to the
|
|
245
|
+
* configured count while the picker is not rendered.
|
|
246
|
+
* @returns {number}
|
|
247
|
+
*/
|
|
248
|
+
_visibleMonthCount(): number;
|
|
249
|
+
/**
|
|
250
|
+
* Points the first visible month at a date's month.
|
|
251
|
+
* @param {Date} date Day whose month becomes the leftmost panel.
|
|
252
|
+
* @returns {void}
|
|
253
|
+
* @fires DateRangePicker#monthchange
|
|
254
|
+
*/
|
|
255
|
+
_setView(date: Date): void;
|
|
256
|
+
/**
|
|
257
|
+
* Shifts the view by the smallest number of months that brings a date into a visible panel.
|
|
258
|
+
* @param {Date} date Day that must be visible.
|
|
259
|
+
* @returns {boolean} Whether the view moved.
|
|
260
|
+
*/
|
|
261
|
+
_ensureVisible(date: Date): boolean;
|
|
262
|
+
/** @param {number} amount @returns {void} */
|
|
263
|
+
_pageView(amount: number): void;
|
|
264
|
+
/**
|
|
265
|
+
* Keeps the roving tab stop inside the visible panels after the view moved on its own.
|
|
266
|
+
* @param {Date} date Current roving day.
|
|
267
|
+
* @returns {Date}
|
|
268
|
+
*/
|
|
269
|
+
_focusInView(date: Date): Date;
|
|
270
|
+
/** @param {Date} date @returns {void} */
|
|
271
|
+
_moveFocus(date: Date): void;
|
|
272
|
+
/** @returns {void} */
|
|
273
|
+
_emitMonthChange(): void;
|
|
274
|
+
/** @param {Event} event @returns {void} */
|
|
275
|
+
_onPresetClick(event: Event): void;
|
|
276
|
+
/** @param {Event} event @returns {void} */
|
|
277
|
+
_onCalendarClick(event: Event): void;
|
|
278
|
+
/** @param {Event} event @returns {void} */
|
|
279
|
+
_onDayHover(event: Event): void;
|
|
280
|
+
/** @param {Date|null} date @returns {void} */
|
|
281
|
+
_setHover(date: Date | null): void;
|
|
282
|
+
/** @param {KeyboardEvent} event @returns {void} */
|
|
283
|
+
_onDayKeydown(event: KeyboardEvent): void;
|
|
284
|
+
/** @returns {void} */
|
|
285
|
+
_renderCalendars(): void;
|
|
286
|
+
/** @param {Date} first First day of the month to render. @returns {HTMLElement} */
|
|
287
|
+
_renderMonth(first: Date): HTMLElement;
|
|
288
|
+
/** @returns {HTMLTableRowElement} */
|
|
289
|
+
_weekdayRow(): HTMLTableRowElement;
|
|
290
|
+
/**
|
|
291
|
+
* Refreshes every day cell's range, selection, and focus state without rebuilding the grids, so
|
|
292
|
+
* hovering and arrowing never disturb the focused element.
|
|
293
|
+
* @returns {void}
|
|
294
|
+
*/
|
|
295
|
+
_paint(): void;
|
|
296
|
+
/**
|
|
297
|
+
* Resolves how a day should paint: committed endpoints and band, or the live preview while an
|
|
298
|
+
* end date is being picked.
|
|
299
|
+
* @param {Date} date Day to classify.
|
|
300
|
+
* @returns {{range: DateRangeState|'preview'|null, edge: 'start'|'end'|'both'|null}}
|
|
301
|
+
*/
|
|
302
|
+
_dayState(date: Date): {
|
|
303
|
+
range: DateRangeState | 'preview' | null;
|
|
304
|
+
edge: 'start' | 'end' | 'both' | null;
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* The day the range would end at right now — the hovered day, or the roving focus when the
|
|
308
|
+
* pointer is elsewhere.
|
|
309
|
+
* @returns {Date|null}
|
|
310
|
+
*/
|
|
311
|
+
_previewEnd(): Date | null;
|
|
312
|
+
/** @param {Date} date @param {string|null} state @returns {string} */
|
|
313
|
+
_dayLabel(date: Date, state: string | null): string;
|
|
314
|
+
/** @returns {void} */
|
|
315
|
+
_syncDisabled(): void;
|
|
316
|
+
/** Writes the current selection into the visually hidden live region. @returns {void} */
|
|
317
|
+
_announce(): void;
|
|
318
|
+
/** @returns {string} */
|
|
319
|
+
_selectionLabel(): string;
|
|
320
|
+
/** @param {Element|null} target @returns {{date: Date, cell: Element, button: Element}|null} */
|
|
321
|
+
_cellFor(target: Element | null): {
|
|
322
|
+
date: Date;
|
|
323
|
+
cell: Element;
|
|
324
|
+
button: Element;
|
|
325
|
+
} | null;
|
|
326
|
+
/** @param {Date} date @returns {HTMLButtonElement|null} */
|
|
327
|
+
_buttonForDate(date: Date): HTMLButtonElement | null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Fired once a complete range is selected, and when the selection is cleared.
|
|
331
|
+
* @event DateRangePicker#change
|
|
332
|
+
* @type {CustomEvent<DateRange>}
|
|
333
|
+
*/
|
|
334
|
+
/**
|
|
335
|
+
* Fired on every day click and preset, including the half-open state where `end` is still null,
|
|
336
|
+
* and when Escape abandons a half-picked range.
|
|
337
|
+
* @event DateRangePicker#select
|
|
338
|
+
* @type {CustomEvent<DateRange>}
|
|
339
|
+
*/
|
|
340
|
+
/**
|
|
341
|
+
* Fired when the first visible month changes. Month is zero-based.
|
|
342
|
+
* @event DateRangePicker#monthchange
|
|
343
|
+
* @type {CustomEvent<{year: number, month: number}>}
|
|
344
|
+
*/
|
|
345
|
+
/**
|
|
346
|
+
* Builds the shipped preset set: Today, Yesterday, Last 7 days, Last 30 days, This month,
|
|
347
|
+
* Last month, This quarter, This year.
|
|
348
|
+
* @returns {DateRangePreset[]}
|
|
349
|
+
*/
|
|
350
|
+
export declare function defaultDateRangePresets(): DateRangePreset[];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers the MonthPicker-backed `month` field type. Date and datetime fields are registered
|
|
3
|
+
* by the Datebox adapter so those types retain formatted text-input behavior.
|
|
4
|
+
* @returns {void}
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerDatePickerFieldAdapters(): void;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { DatePicker } from './date-picker.js';
|
|
2
|
+
export type MonthPickerOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Initially selected month.
|
|
5
|
+
*/
|
|
6
|
+
value?: Date | null;
|
|
7
|
+
/**
|
|
8
|
+
* Earliest selectable month.
|
|
9
|
+
*/
|
|
10
|
+
min?: Date | null;
|
|
11
|
+
/**
|
|
12
|
+
* Latest selectable month.
|
|
13
|
+
*/
|
|
14
|
+
max?: Date | null;
|
|
15
|
+
/**
|
|
16
|
+
* Change listener.
|
|
17
|
+
*/
|
|
18
|
+
onchange?: (event: CustomEvent<{
|
|
19
|
+
date: Date | null;
|
|
20
|
+
}>) => void;
|
|
21
|
+
};
|
|
22
|
+
export type MonthPickerSetOptions = {
|
|
23
|
+
silent?: boolean;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* @typedef {Object} MonthPickerOptions
|
|
27
|
+
* @property {Date|null} [value=null] Initially selected month.
|
|
28
|
+
* @property {Date|null} [min=null] Earliest selectable month.
|
|
29
|
+
* @property {Date|null} [max=null] Latest selectable month.
|
|
30
|
+
* @property {(event: CustomEvent<{date: Date|null}>) => void} [onchange] Change listener.
|
|
31
|
+
*/
|
|
32
|
+
/** @typedef {{silent?: boolean}} MonthPickerSetOptions */
|
|
33
|
+
/**
|
|
34
|
+
* Twelve-month grid with a year stepper.
|
|
35
|
+
* @fires MonthPicker#change
|
|
36
|
+
*/
|
|
37
|
+
export declare class MonthPicker extends DatePicker {
|
|
38
|
+
_year: number;
|
|
39
|
+
_focusedMonth: number;
|
|
40
|
+
static cssName: string;
|
|
41
|
+
/** @type {MonthPickerOptions} */
|
|
42
|
+
static defaults: MonthPickerOptions;
|
|
43
|
+
/** @returns {HTMLElement} */
|
|
44
|
+
render(): HTMLElement;
|
|
45
|
+
/** @returns {Date|null} */
|
|
46
|
+
get(): Date | null;
|
|
47
|
+
/**
|
|
48
|
+
* Selects the first day of a month.
|
|
49
|
+
* @param {Date|null} date Month to select, or null to clear.
|
|
50
|
+
* @param {MonthPickerSetOptions} [options={}] Update behavior.
|
|
51
|
+
* @returns {this}
|
|
52
|
+
* @fires MonthPicker#change
|
|
53
|
+
*/
|
|
54
|
+
set(date: Date | null, { silent }?: MonthPickerSetOptions): this;
|
|
55
|
+
/** @returns {this} */
|
|
56
|
+
focus(): this;
|
|
57
|
+
/** Removes generated content from an enhanced target. @returns {void} */
|
|
58
|
+
destroy(): void;
|
|
59
|
+
/** @param {Date|null} date @returns {Date|null} */
|
|
60
|
+
_normalizeMonth(date: Date | null): Date | null;
|
|
61
|
+
/** @returns {void} */
|
|
62
|
+
_renderMonths(): void;
|
|
63
|
+
/** @param {number} amount @returns {void} */
|
|
64
|
+
_stepYear(amount: number): void;
|
|
65
|
+
/** @param {Event} event @returns {void} */
|
|
66
|
+
_onMonthClick(event: Event): void;
|
|
67
|
+
/** @param {KeyboardEvent} event @returns {void} */
|
|
68
|
+
_onMonthKeydown(event: KeyboardEvent): void;
|
|
69
|
+
/** @param {number} month @returns {void} */
|
|
70
|
+
_selectMonth(month: number): void;
|
|
71
|
+
/** @param {Date} date @returns {boolean} */
|
|
72
|
+
_inRange(date: Date): boolean;
|
|
73
|
+
/** @param {number} month @returns {HTMLButtonElement|null} */
|
|
74
|
+
_button(month: number): HTMLButtonElement | null;
|
|
75
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers the DateRangeBox-backed `daterange` field type, so a Form field declared as
|
|
3
|
+
* `{ type: 'daterange', label, props: {…} }` renders a formatted range input with an anchored
|
|
4
|
+
* two-month calendar. Field values are `{start, end}` objects of `Date|null`.
|
|
5
|
+
* @returns {void}
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerDateRangeFieldAdapter(): void;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Component } from '../../core/component.js';
|
|
2
|
+
export type TimePickerValue = {
|
|
3
|
+
h: number;
|
|
4
|
+
m: number;
|
|
5
|
+
s: number;
|
|
6
|
+
};
|
|
7
|
+
export type ClockUnit = 'h' | 'm';
|
|
8
|
+
export type TimePickerOptions = {
|
|
9
|
+
/**
|
|
10
|
+
* Initial local time.
|
|
11
|
+
*/
|
|
12
|
+
value?: TimePickerValue | Date | null;
|
|
13
|
+
/**
|
|
14
|
+
* Show the seconds spinbutton.
|
|
15
|
+
*/
|
|
16
|
+
seconds?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Minute increment used by arrow keys.
|
|
19
|
+
*/
|
|
20
|
+
step?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Offer a clock-face dial behind a toggle button.
|
|
23
|
+
*/
|
|
24
|
+
clock?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Change listener.
|
|
27
|
+
*/
|
|
28
|
+
onchange?: (event: CustomEvent<{
|
|
29
|
+
time: TimePickerValue;
|
|
30
|
+
}>) => void;
|
|
31
|
+
};
|
|
32
|
+
export type TimePickerSetOptions = {
|
|
33
|
+
silent?: boolean;
|
|
34
|
+
};
|
|
35
|
+
export type ClockMark = {
|
|
36
|
+
value: number;
|
|
37
|
+
label: string;
|
|
38
|
+
angle: number;
|
|
39
|
+
ring: 'outer' | 'inner';
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Accessible segmented time picker made from spinbutton inputs, with an optional clock face for
|
|
43
|
+
* picking an hour and a minute by eye. The spinbuttons stay the primary control: the dial is a
|
|
44
|
+
* second, visual route to the same value, and every mark is a radio in an APG radio group.
|
|
45
|
+
* @fires TimePicker#change
|
|
46
|
+
* @extends {Component<TimePickerOptions>}
|
|
47
|
+
*/
|
|
48
|
+
export declare class TimePicker extends Component<TimePickerOptions> {
|
|
49
|
+
_value: TimePickerValue | {
|
|
50
|
+
h: number;
|
|
51
|
+
m: number;
|
|
52
|
+
s: number;
|
|
53
|
+
};
|
|
54
|
+
_display: TimePickerValue | {
|
|
55
|
+
h: number;
|
|
56
|
+
m: number;
|
|
57
|
+
s: number;
|
|
58
|
+
};
|
|
59
|
+
_inputs: any[];
|
|
60
|
+
_clockOpen: boolean;
|
|
61
|
+
/** @type {ClockUnit} */
|
|
62
|
+
_clockUnit: ClockUnit;
|
|
63
|
+
_clock: HTMLElement;
|
|
64
|
+
_content: HTMLElement;
|
|
65
|
+
static cssName: string;
|
|
66
|
+
/** @type {TimePickerOptions} */
|
|
67
|
+
static defaults: TimePickerOptions;
|
|
68
|
+
/** @returns {HTMLElement} */
|
|
69
|
+
render(): HTMLElement;
|
|
70
|
+
/**
|
|
71
|
+
* Returns a copy of the selected time, or null when no initial value has been committed.
|
|
72
|
+
* @returns {TimePickerValue|null}
|
|
73
|
+
*/
|
|
74
|
+
get(): TimePickerValue | null;
|
|
75
|
+
/**
|
|
76
|
+
* Sets the displayed local time.
|
|
77
|
+
* @param {TimePickerValue|Date|null} value Time object, Date, or null.
|
|
78
|
+
* @param {TimePickerSetOptions} [options={}] Update behavior.
|
|
79
|
+
* @returns {this}
|
|
80
|
+
* @fires TimePicker#change
|
|
81
|
+
*/
|
|
82
|
+
set(value: TimePickerValue | Date | null, { silent }?: TimePickerSetOptions): this;
|
|
83
|
+
/**
|
|
84
|
+
* Opens the clock face on the given unit.
|
|
85
|
+
* @param {ClockUnit} [unit='h'] Dial to show first.
|
|
86
|
+
* @returns {this}
|
|
87
|
+
*/
|
|
88
|
+
openClock(unit?: ClockUnit): this;
|
|
89
|
+
/** Closes the clock face. @returns {this} */
|
|
90
|
+
closeClock(): this;
|
|
91
|
+
/** Toggles the clock face. @returns {this} */
|
|
92
|
+
toggleClock(): this;
|
|
93
|
+
/** Removes generated content from an enhanced target. @returns {void} */
|
|
94
|
+
destroy(): void;
|
|
95
|
+
/** @param {HTMLElement} parent @param {'h'|'m'|'s'} segment @param {string} label @param {number} max @returns {void} */
|
|
96
|
+
_addSpin(parent: HTMLElement, segment: 'h' | 'm' | 's', label: string, max: number): void;
|
|
97
|
+
/** @param {KeyboardEvent} event @param {'h'|'m'|'s'} segment @param {number} max @returns {void} */
|
|
98
|
+
_onKeydown(event: KeyboardEvent, segment: 'h' | 'm' | 's', max: number): void;
|
|
99
|
+
/** @param {HTMLInputElement} input @param {'h'|'m'|'s'} segment @param {number} max @returns {void} */
|
|
100
|
+
_onInput(input: HTMLInputElement, segment: 'h' | 'm' | 's', max: number): void;
|
|
101
|
+
/** @returns {void} */
|
|
102
|
+
_commitFromInputs(): void;
|
|
103
|
+
/** @returns {void} */
|
|
104
|
+
_writeInputs(): void;
|
|
105
|
+
/**
|
|
106
|
+
* Builds the collapsible clock face: a read-out that doubles as the hour/minute switch, and a
|
|
107
|
+
* dial whose marks are radios.
|
|
108
|
+
* @param {string} id Element id the toggle button controls.
|
|
109
|
+
* @returns {HTMLElement}
|
|
110
|
+
*/
|
|
111
|
+
_buildClock(id: string): HTMLElement;
|
|
112
|
+
/**
|
|
113
|
+
* Applies a mark's value to the active unit, then moves on to the minutes so a whole time can
|
|
114
|
+
* be set with two clicks.
|
|
115
|
+
* @param {number} value Hour or minute the mark stands for.
|
|
116
|
+
* @returns {void}
|
|
117
|
+
*/
|
|
118
|
+
_pick(value: number): void;
|
|
119
|
+
/** @param {KeyboardEvent} event @returns {void} */
|
|
120
|
+
_onDialKeydown(event: KeyboardEvent): void;
|
|
121
|
+
/** Reflects the open state, the active unit, the marks, and the hand. @returns {void} */
|
|
122
|
+
_syncClock(): void;
|
|
123
|
+
/** @param {ClockMark} mark @param {number} selected @returns {HTMLElement} */
|
|
124
|
+
_buildMark(mark: ClockMark, selected: number): HTMLElement;
|
|
125
|
+
/** @param {HTMLElement} element @param {ClockMark} mark @param {number} selected @returns {void} */
|
|
126
|
+
_syncMark(element: HTMLElement, mark: ClockMark, selected: number): void;
|
|
127
|
+
}
|