@budibase/bbui 1.58.13 → 2.0.1
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/LICENSE +375 -0
- package/dist/bbui.es.js +14 -0
- package/dist/bbui.es.js.map +1 -0
- package/package.json +68 -32
- package/src/ActionButton/ActionButton.svelte +102 -0
- package/src/ActionGroup/ActionGroup.svelte +26 -0
- package/src/ActionMenu/ActionMenu.svelte +44 -0
- package/src/Actions/autoresize_textarea.js +9 -9
- package/src/Actions/click_outside.js +5 -5
- package/src/Actions/position_dropdown.js +46 -37
- package/src/Avatar/Avatar.svelte +62 -0
- package/src/Badge/Badge.svelte +29 -0
- package/src/Banner/Banner.svelte +72 -0
- package/src/Banner/BannerDisplay.svelte +41 -0
- package/src/Button/Button.svelte +102 -200
- package/src/ButtonGroup/ButtonGroup.svelte +30 -0
- package/src/ClearButton/ClearButton.svelte +19 -0
- package/src/ColorPicker/ColorPicker.svelte +297 -0
- package/src/DetailSummary/DetailSummary.svelte +83 -0
- package/src/Divider/Divider.svelte +28 -0
- package/src/Drawer/Drawer.svelte +76 -51
- package/src/Drawer/DrawerContent.svelte +46 -0
- package/src/Form/Checkbox.svelte +21 -132
- package/src/Form/Combobox.svelte +45 -0
- package/src/Form/Core/Checkbox.svelte +69 -0
- package/src/Form/Core/CheckboxGroup.svelte +68 -0
- package/src/Form/Core/Combobox.svelte +142 -0
- package/src/Form/Core/DatePicker.svelte +257 -0
- package/src/Form/Core/Dropzone.svelte +453 -0
- package/src/Form/Core/InputDropdown.svelte +228 -0
- package/src/Form/Core/Multiselect.svelte +90 -0
- package/src/Form/Core/Picker.svelte +259 -0
- package/src/Form/Core/PickerDropdown.svelte +415 -0
- package/src/Form/Core/RadioGroup.svelte +48 -0
- package/src/Form/Core/RichTextField.svelte +42 -0
- package/src/Form/Core/Search.svelte +105 -0
- package/src/Form/Core/Select.svelte +75 -0
- package/src/Form/Core/Slider.svelte +86 -0
- package/src/Form/Core/Stepper.svelte +172 -0
- package/src/Form/Core/Switch.svelte +37 -0
- package/src/Form/Core/TextArea.svelte +78 -0
- package/src/Form/Core/TextField.svelte +119 -0
- package/src/Form/Core/index.js +15 -0
- package/src/Form/DatePicker.svelte +39 -0
- package/src/Form/Dropzone.svelte +42 -0
- package/src/Form/Field.svelte +42 -0
- package/src/Form/FieldLabel.svelte +32 -0
- package/src/Form/Input.svelte +41 -187
- package/src/Form/InputDropdown.svelte +55 -0
- package/src/Form/Multiselect.svelte +36 -320
- package/src/Form/PickerDropdown.svelte +132 -0
- package/src/Form/RadioGroup.svelte +42 -0
- package/src/Form/RichTextField.svelte +36 -0
- package/src/Form/Search.svelte +36 -0
- package/src/Form/Select.svelte +48 -88
- package/src/Form/Slider.svelte +16 -91
- package/src/Form/Stepper.svelte +45 -0
- package/src/Form/TextArea.svelte +30 -128
- package/src/Form/Toggle.svelte +20 -110
- package/src/Icon/Icon.svelte +91 -0
- package/src/Icon/IconAvatar.svelte +58 -0
- package/src/IconPicker/IconPicker.svelte +177 -0
- package/src/IconSideNav/IconSideNav.svelte +14 -0
- package/src/IconSideNav/IconSideNavItem.svelte +56 -0
- package/src/InlineAlert/InlineAlert.svelte +60 -0
- package/src/Label/Label.svelte +29 -0
- package/src/Layout/Layout.svelte +94 -0
- package/src/Layout/Page.svelte +32 -0
- package/src/Link/Link.svelte +24 -0
- package/src/List/List.svelte +28 -0
- package/src/List/ListItem.svelte +90 -0
- package/src/Markdown/MarkdownEditor.svelte +60 -0
- package/src/Markdown/MarkdownViewer.svelte +70 -0
- package/src/Markdown/SpectrumMDE.svelte +184 -0
- package/src/Menu/Item.svelte +96 -0
- package/src/Menu/Menu.svelte +7 -0
- package/src/Menu/Menu.svench +19 -0
- package/src/Menu/Section.svelte +10 -0
- package/src/Menu/Separator.svelte +1 -0
- package/src/Modal/Content.svelte +0 -11
- package/src/Modal/CustomContent.svelte +9 -6
- package/src/Modal/Modal.svelte +104 -51
- package/src/Modal/ModalContent.svelte +131 -73
- package/src/Modal/QuizModal.svelte +16 -17
- package/src/Notification/Notification.svelte +70 -0
- package/src/Notification/NotificationDisplay.svelte +43 -0
- package/src/Pagination/Pagination.svelte +57 -0
- package/src/Popover/Popover.svelte +43 -33
- package/src/ProgressBar/ProgressBar.svelte +67 -0
- package/src/ProgressCircle/ProgressCircle.svelte +62 -0
- package/src/SideNavigation/Item.svelte +61 -0
- package/src/SideNavigation/Navigation.svelte +12 -0
- package/src/StatusLight/StatusLight.svelte +80 -0
- package/src/Stores/Notifications.svench.svx +1 -1
- package/src/Stores/banner.js +65 -0
- package/src/Stores/notifications.js +75 -38
- package/src/Table/ArrayRenderer.svelte +17 -0
- package/src/Table/AttachmentRenderer.svelte +73 -0
- package/src/Table/BoldRenderer.svelte +15 -0
- package/src/Table/BooleanRenderer.svelte +42 -0
- package/src/Table/CellRenderer.svelte +69 -0
- package/src/Table/CodeRenderer.svelte +14 -0
- package/src/Table/DateTimeRenderer.svelte +29 -0
- package/src/Table/InternalRenderer.svelte +24 -0
- package/src/Table/RelationshipRenderer.svelte +40 -0
- package/src/Table/SelectEditRenderer.svelte +28 -0
- package/src/Table/StringRenderer.svelte +14 -0
- package/src/Table/Table.svelte +635 -0
- package/src/Table/index.js +1 -0
- package/src/Tabs/Tab.svelte +88 -0
- package/src/Tabs/Tabs.svelte +130 -0
- package/src/Tags/Tag.svelte +43 -0
- package/src/Tags/Tags.svelte +7 -0
- package/src/Tooltip/Tooltip.svelte +34 -0
- package/src/Tooltip/TooltipWrapper.svelte +60 -0
- package/src/TreeView/Item.svelte +41 -0
- package/src/TreeView/Tree.svelte +16 -0
- package/src/Typography/Body.svelte +21 -0
- package/src/Typography/Code.svelte +10 -0
- package/src/Typography/Detail.svelte +19 -0
- package/src/Typography/Heading.svelte +17 -0
- package/{dist → src}/bbui.css +2 -99
- package/src/context.js +1 -1
- package/src/helpers.js +134 -0
- package/src/index.js +95 -40
- package/src/spectrum-icons-rollup.js +31 -0
- package/src/spectrum-icons-vite.js +31 -0
- package/dist/dist/bundle.css +0 -42
- package/dist/dist/bundle.css.map +0 -64
- package/dist/index.js +0 -36193
- package/dist/index.mjs +0 -36147
- package/src/Button/Close.svelte +0 -59
- package/src/Button/Close.svench +0 -36
- package/src/Button/TextButton.svelte +0 -128
- package/src/Button/TextButton.svench +0 -69
- package/src/DatePicker/DatePicker.svelte +0 -45
- package/src/DatePicker/DatePicker.svench +0 -17
- package/src/DropdownMenu/DropdownMenu.svelte +0 -77
- package/src/DropdownMenu/DropdownMenu.svench +0 -161
- package/src/Dropzone/Dropzone.svelte +0 -294
- package/src/Dropzone/Dropzone.svench +0 -17
- package/src/Dropzone/fileTypes.js +0 -5
- package/src/Form/Checkbox.svench.svx +0 -67
- package/src/Form/DataList.svelte +0 -158
- package/src/Form/DataList.svench +0 -57
- package/src/Form/Input.svench +0 -62
- package/src/Form/Multiselect.svench +0 -63
- package/src/Form/Radio.svelte +0 -133
- package/src/Form/Radio.svench.svx +0 -64
- package/src/Form/RichText.svelte +0 -61
- package/src/Form/RichText.svench.svx +0 -40
- package/src/Form/Select.svench +0 -62
- package/src/Form/Slider.svench +0 -26
- package/src/Form/TextArea.svench +0 -30
- package/src/Form/Toggle.svench +0 -21
- package/src/Icons/Contribution.svelte +0 -14
- package/src/Icons/Icon.svelte +0 -36
- package/src/Icons/Icon.svench +0 -109
- package/src/Icons/icon-paths.js +0 -136
- package/src/Links/Home.svelte +0 -51
- package/src/Links/Home.svench +0 -19
- package/src/List/Items/DetailSummary.svelte +0 -85
- package/src/List/Items/DetailSummary.svench +0 -53
- package/src/List/Search.svelte +0 -34
- package/src/List/Search.svench +0 -8
- package/src/Spacer/Spacer.svelte +0 -50
- package/src/Spacer/Spacer.svench +0 -51
- package/src/Styleguide/Body.svelte +0 -72
- package/src/Styleguide/Borders.svench +0 -175
- package/src/Styleguide/Budibase-logo.svelte +0 -68
- package/src/Styleguide/Color.svench +0 -201
- package/src/Styleguide/Heading.svelte +0 -74
- package/src/Styleguide/Label.svelte +0 -70
- package/src/Styleguide/Logo.svelte +0 -16
- package/src/Styleguide/Logo.svench +0 -8
- package/src/Styleguide/Spacing.svench +0 -191
- package/src/Styleguide/Typography.svench +0 -227
- package/src/Switcher/Switcher.svelte +0 -47
- package/src/Switcher/Switcher.svench +0 -27
- package/src/index.svench.svx +0 -35
- package/src/utils/buildStyle.js +0 -14
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import "@spectrum-css/inputgroup/dist/index-vars.css"
|
|
3
|
+
import "@spectrum-css/popover/dist/index-vars.css"
|
|
4
|
+
import "@spectrum-css/menu/dist/index-vars.css"
|
|
5
|
+
import { fly } from "svelte/transition"
|
|
6
|
+
import { createEventDispatcher } from "svelte"
|
|
7
|
+
|
|
8
|
+
export let value = null
|
|
9
|
+
export let id = null
|
|
10
|
+
export let placeholder = "Choose an option or type"
|
|
11
|
+
export let disabled = false
|
|
12
|
+
export let readonly = false
|
|
13
|
+
export let error = null
|
|
14
|
+
export let options = []
|
|
15
|
+
export let getOptionLabel = option => option
|
|
16
|
+
export let getOptionValue = option => option
|
|
17
|
+
|
|
18
|
+
const dispatch = createEventDispatcher()
|
|
19
|
+
let open = false
|
|
20
|
+
let focus = false
|
|
21
|
+
|
|
22
|
+
const selectOption = value => {
|
|
23
|
+
dispatch("change", value)
|
|
24
|
+
open = false
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const onType = e => {
|
|
28
|
+
const value = e.target.value
|
|
29
|
+
dispatch("type", value)
|
|
30
|
+
selectOption(value)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const onPick = value => {
|
|
34
|
+
dispatch("pick", value)
|
|
35
|
+
selectOption(value)
|
|
36
|
+
}
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<div
|
|
40
|
+
class="spectrum-InputGroup"
|
|
41
|
+
class:is-focused={open || focus}
|
|
42
|
+
class:is-invalid={!!error}
|
|
43
|
+
class:is-disabled={disabled}
|
|
44
|
+
>
|
|
45
|
+
<div
|
|
46
|
+
class="spectrum-Textfield spectrum-InputGroup-textfield"
|
|
47
|
+
class:is-invalid={!!error}
|
|
48
|
+
class:is-disabled={disabled}
|
|
49
|
+
class:is-focused={open || focus}
|
|
50
|
+
>
|
|
51
|
+
<input
|
|
52
|
+
{id}
|
|
53
|
+
type="text"
|
|
54
|
+
on:focus={() => (focus = true)}
|
|
55
|
+
on:blur={() => {
|
|
56
|
+
focus = false
|
|
57
|
+
dispatch("blur")
|
|
58
|
+
}}
|
|
59
|
+
on:change={onType}
|
|
60
|
+
value={value || ""}
|
|
61
|
+
placeholder={placeholder || ""}
|
|
62
|
+
{disabled}
|
|
63
|
+
{readonly}
|
|
64
|
+
class="spectrum-Textfield-input spectrum-InputGroup-input"
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
<button
|
|
68
|
+
class="spectrum-Picker spectrum-Picker--sizeM spectrum-InputGroup-button"
|
|
69
|
+
tabindex="-1"
|
|
70
|
+
aria-haspopup="true"
|
|
71
|
+
{disabled}
|
|
72
|
+
on:click={() => (open = true)}
|
|
73
|
+
>
|
|
74
|
+
<svg
|
|
75
|
+
class="spectrum-Icon spectrum-UIIcon-ChevronDown100 spectrum-Picker-menuIcon spectrum-InputGroup-icon"
|
|
76
|
+
focusable="false"
|
|
77
|
+
aria-hidden="true"
|
|
78
|
+
>
|
|
79
|
+
<use xlink:href="#spectrum-css-icon-Chevron100" />
|
|
80
|
+
</svg>
|
|
81
|
+
</button>
|
|
82
|
+
{#if open}
|
|
83
|
+
<div class="overlay" on:mousedown|self={() => (open = false)} />
|
|
84
|
+
<div
|
|
85
|
+
transition:fly={{ y: -20, duration: 200 }}
|
|
86
|
+
class="spectrum-Popover spectrum-Popover--bottom is-open"
|
|
87
|
+
>
|
|
88
|
+
<ul class="spectrum-Menu" role="listbox">
|
|
89
|
+
{#if options && Array.isArray(options)}
|
|
90
|
+
{#each options as option}
|
|
91
|
+
<li
|
|
92
|
+
class="spectrum-Menu-item"
|
|
93
|
+
class:is-selected={getOptionValue(option) === value}
|
|
94
|
+
role="option"
|
|
95
|
+
aria-selected="true"
|
|
96
|
+
tabindex="0"
|
|
97
|
+
on:click={() => onPick(getOptionValue(option))}
|
|
98
|
+
>
|
|
99
|
+
<span class="spectrum-Menu-itemLabel"
|
|
100
|
+
>{getOptionLabel(option)}</span
|
|
101
|
+
>
|
|
102
|
+
<svg
|
|
103
|
+
class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
|
|
104
|
+
focusable="false"
|
|
105
|
+
aria-hidden="true"
|
|
106
|
+
>
|
|
107
|
+
<use xlink:href="#spectrum-css-icon-Checkmark100" />
|
|
108
|
+
</svg>
|
|
109
|
+
</li>
|
|
110
|
+
{/each}
|
|
111
|
+
{/if}
|
|
112
|
+
</ul>
|
|
113
|
+
</div>
|
|
114
|
+
{/if}
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<style>
|
|
118
|
+
.spectrum-InputGroup {
|
|
119
|
+
min-width: 0;
|
|
120
|
+
width: 100%;
|
|
121
|
+
}
|
|
122
|
+
.spectrum-Textfield {
|
|
123
|
+
width: 100%;
|
|
124
|
+
}
|
|
125
|
+
.spectrum-Textfield-input {
|
|
126
|
+
width: 0;
|
|
127
|
+
}
|
|
128
|
+
.overlay {
|
|
129
|
+
position: fixed;
|
|
130
|
+
top: 0;
|
|
131
|
+
left: 0;
|
|
132
|
+
width: 100vw;
|
|
133
|
+
height: 100vh;
|
|
134
|
+
z-index: 999;
|
|
135
|
+
}
|
|
136
|
+
.spectrum-Popover {
|
|
137
|
+
max-height: 240px;
|
|
138
|
+
width: 100%;
|
|
139
|
+
z-index: 999;
|
|
140
|
+
top: 100%;
|
|
141
|
+
}
|
|
142
|
+
</style>
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Flatpickr from "svelte-flatpickr"
|
|
3
|
+
import "flatpickr/dist/flatpickr.css"
|
|
4
|
+
import "@spectrum-css/inputgroup/dist/index-vars.css"
|
|
5
|
+
import "@spectrum-css/textfield/dist/index-vars.css"
|
|
6
|
+
import "@spectrum-css/picker/dist/index-vars.css"
|
|
7
|
+
import { createEventDispatcher } from "svelte"
|
|
8
|
+
import { uuid } from "../../helpers"
|
|
9
|
+
|
|
10
|
+
export let id = null
|
|
11
|
+
export let disabled = false
|
|
12
|
+
export let error = null
|
|
13
|
+
export let enableTime = true
|
|
14
|
+
export let value = null
|
|
15
|
+
export let placeholder = null
|
|
16
|
+
export let appendTo = undefined
|
|
17
|
+
export let timeOnly = false
|
|
18
|
+
export let ignoreTimezones = false
|
|
19
|
+
export let time24hr = false
|
|
20
|
+
|
|
21
|
+
const dispatch = createEventDispatcher()
|
|
22
|
+
const flatpickrId = `${uuid()}-wrapper`
|
|
23
|
+
let open = false
|
|
24
|
+
let flatpickr, flatpickrOptions
|
|
25
|
+
|
|
26
|
+
const resolveTimeStamp = timestamp => {
|
|
27
|
+
let maskedDate = new Date(`0-${timestamp}`)
|
|
28
|
+
|
|
29
|
+
if (maskedDate instanceof Date && !isNaN(maskedDate.getTime())) {
|
|
30
|
+
return maskedDate
|
|
31
|
+
} else {
|
|
32
|
+
return null
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
$: flatpickrOptions = {
|
|
37
|
+
element: `#${flatpickrId}`,
|
|
38
|
+
enableTime: timeOnly || enableTime || false,
|
|
39
|
+
noCalendar: timeOnly || false,
|
|
40
|
+
altInput: true,
|
|
41
|
+
time_24hr: time24hr || false,
|
|
42
|
+
altFormat: timeOnly ? "H:i" : enableTime ? "F j Y, H:i" : "F j, Y",
|
|
43
|
+
wrap: true,
|
|
44
|
+
appendTo,
|
|
45
|
+
disableMobile: "true",
|
|
46
|
+
onReady: () => {
|
|
47
|
+
let timestamp = resolveTimeStamp(value)
|
|
48
|
+
if (timeOnly && timestamp) {
|
|
49
|
+
dispatch("change", timestamp.toISOString())
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
$: redrawOptions = {
|
|
55
|
+
timeOnly,
|
|
56
|
+
enableTime,
|
|
57
|
+
time24hr,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const handleChange = event => {
|
|
61
|
+
const [dates] = event.detail
|
|
62
|
+
const noTimezone = enableTime && !timeOnly && ignoreTimezones
|
|
63
|
+
let newValue = dates[0]
|
|
64
|
+
if (newValue) {
|
|
65
|
+
newValue = newValue.toISOString()
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// If time only set date component to 2000-01-01
|
|
69
|
+
if (timeOnly) {
|
|
70
|
+
// Classic flackpickr causing issues.
|
|
71
|
+
// When selecting a value for the first time for a "time only" field,
|
|
72
|
+
// the time is always offset by 1 hour for some reason (regardless of time
|
|
73
|
+
// zone) so we need to correct it.
|
|
74
|
+
if (!value && newValue) {
|
|
75
|
+
newValue = new Date(dates[0].getTime() + 60 * 60 * 1000).toISOString()
|
|
76
|
+
}
|
|
77
|
+
newValue = `2000-01-01T${newValue.split("T")[1]}`
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// For date-only fields, construct a manual timestamp string without a time
|
|
81
|
+
// or time zone
|
|
82
|
+
else if (!enableTime) {
|
|
83
|
+
const year = dates[0].getFullYear()
|
|
84
|
+
const month = `${dates[0].getMonth() + 1}`.padStart(2, "0")
|
|
85
|
+
const day = `${dates[0].getDate()}`.padStart(2, "0")
|
|
86
|
+
newValue = `${year}-${month}-${day}T00:00:00.000`
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// For non-timezone-aware fields, create an ISO 8601 timestamp of the exact
|
|
90
|
+
// time picked, without timezone
|
|
91
|
+
else if (noTimezone) {
|
|
92
|
+
const offset = dates[0].getTimezoneOffset() * 60000
|
|
93
|
+
newValue = new Date(dates[0].getTime() - offset)
|
|
94
|
+
.toISOString()
|
|
95
|
+
.slice(0, -1)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
dispatch("change", newValue)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const clearDateOnBackspace = event => {
|
|
102
|
+
if (["Backspace", "Clear", "Delete"].includes(event.key)) {
|
|
103
|
+
dispatch("change", null)
|
|
104
|
+
flatpickr.close()
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const onOpen = () => {
|
|
109
|
+
open = true
|
|
110
|
+
document.addEventListener("keyup", clearDateOnBackspace)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const onClose = () => {
|
|
114
|
+
open = false
|
|
115
|
+
document.removeEventListener("keyup", clearDateOnBackspace)
|
|
116
|
+
|
|
117
|
+
// Manually blur all input fields since flatpickr creates a second
|
|
118
|
+
// duplicate input field.
|
|
119
|
+
// We need to blur both because the focus styling does not get properly
|
|
120
|
+
// applied.
|
|
121
|
+
const els = document.querySelectorAll(`#${flatpickrId} input`)
|
|
122
|
+
els.forEach(el => el.blur())
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const parseDate = val => {
|
|
126
|
+
if (!val) {
|
|
127
|
+
return null
|
|
128
|
+
}
|
|
129
|
+
let date
|
|
130
|
+
let time
|
|
131
|
+
|
|
132
|
+
// it is a string like 00:00:00, just time
|
|
133
|
+
let ts = resolveTimeStamp(val)
|
|
134
|
+
|
|
135
|
+
if (timeOnly && ts) {
|
|
136
|
+
date = ts
|
|
137
|
+
} else if (val instanceof Date) {
|
|
138
|
+
// Use real date obj if already parsed
|
|
139
|
+
date = val
|
|
140
|
+
} else if (isNaN(val)) {
|
|
141
|
+
// Treat as date string of some sort
|
|
142
|
+
date = new Date(val)
|
|
143
|
+
} else {
|
|
144
|
+
// Treat as numerical timestamp
|
|
145
|
+
date = new Date(parseInt(val))
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
time = date.getTime()
|
|
149
|
+
if (isNaN(time)) {
|
|
150
|
+
return null
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// By rounding to the nearest second we avoid locking up in an endless
|
|
154
|
+
// loop in the builder, caused by potentially enriching {{ now }} to every
|
|
155
|
+
// millisecond.
|
|
156
|
+
return new Date(Math.floor(time / 1000) * 1000)
|
|
157
|
+
}
|
|
158
|
+
</script>
|
|
159
|
+
|
|
160
|
+
{#key redrawOptions}
|
|
161
|
+
<Flatpickr
|
|
162
|
+
bind:flatpickr
|
|
163
|
+
value={parseDate(value)}
|
|
164
|
+
on:open={onOpen}
|
|
165
|
+
on:close={onClose}
|
|
166
|
+
options={flatpickrOptions}
|
|
167
|
+
on:change={handleChange}
|
|
168
|
+
element={`#${flatpickrId}`}
|
|
169
|
+
>
|
|
170
|
+
<div
|
|
171
|
+
id={flatpickrId}
|
|
172
|
+
class:is-disabled={disabled}
|
|
173
|
+
class:is-invalid={!!error}
|
|
174
|
+
class="flatpickr spectrum-InputGroup spectrum-Datepicker"
|
|
175
|
+
class:is-focused={open}
|
|
176
|
+
aria-readonly="false"
|
|
177
|
+
aria-required="false"
|
|
178
|
+
aria-haspopup="true"
|
|
179
|
+
>
|
|
180
|
+
<div
|
|
181
|
+
on:click={flatpickr?.open}
|
|
182
|
+
class="spectrum-Textfield spectrum-InputGroup-textfield"
|
|
183
|
+
class:is-disabled={disabled}
|
|
184
|
+
class:is-invalid={!!error}
|
|
185
|
+
>
|
|
186
|
+
{#if !!error}
|
|
187
|
+
<svg
|
|
188
|
+
class="spectrum-Icon spectrum-Icon--sizeM spectrum-Textfield-validationIcon"
|
|
189
|
+
focusable="false"
|
|
190
|
+
aria-hidden="true"
|
|
191
|
+
>
|
|
192
|
+
<use xlink:href="#spectrum-icon-18-Alert" />
|
|
193
|
+
</svg>
|
|
194
|
+
{/if}
|
|
195
|
+
<input
|
|
196
|
+
data-input
|
|
197
|
+
type="text"
|
|
198
|
+
class="spectrum-Textfield-input spectrum-InputGroup-input"
|
|
199
|
+
class:is-disabled={disabled}
|
|
200
|
+
{placeholder}
|
|
201
|
+
{id}
|
|
202
|
+
{value}
|
|
203
|
+
/>
|
|
204
|
+
</div>
|
|
205
|
+
<button
|
|
206
|
+
type="button"
|
|
207
|
+
class="spectrum-Picker spectrum-Picker--sizeM spectrum-InputGroup-button"
|
|
208
|
+
tabindex="-1"
|
|
209
|
+
class:is-disabled={disabled}
|
|
210
|
+
class:is-invalid={!!error}
|
|
211
|
+
on:click={flatpickr?.open}
|
|
212
|
+
>
|
|
213
|
+
<svg
|
|
214
|
+
class="spectrum-Icon spectrum-Icon--sizeM"
|
|
215
|
+
focusable="false"
|
|
216
|
+
aria-hidden="true"
|
|
217
|
+
aria-label="Calendar"
|
|
218
|
+
>
|
|
219
|
+
<use xlink:href="#spectrum-icon-18-Calendar" />
|
|
220
|
+
</svg>
|
|
221
|
+
</button>
|
|
222
|
+
</div>
|
|
223
|
+
</Flatpickr>
|
|
224
|
+
{/key}
|
|
225
|
+
{#if open}
|
|
226
|
+
<div class="overlay" on:mousedown|self={flatpickr?.close} />
|
|
227
|
+
{/if}
|
|
228
|
+
|
|
229
|
+
<style>
|
|
230
|
+
.spectrum-Textfield-input {
|
|
231
|
+
pointer-events: none;
|
|
232
|
+
}
|
|
233
|
+
.spectrum-Textfield:not(.is-disabled):hover {
|
|
234
|
+
cursor: pointer;
|
|
235
|
+
}
|
|
236
|
+
.flatpickr {
|
|
237
|
+
width: 100%;
|
|
238
|
+
overflow: hidden;
|
|
239
|
+
}
|
|
240
|
+
.flatpickr .spectrum-Textfield {
|
|
241
|
+
width: 100%;
|
|
242
|
+
}
|
|
243
|
+
.overlay {
|
|
244
|
+
position: fixed;
|
|
245
|
+
top: 0;
|
|
246
|
+
left: 0;
|
|
247
|
+
width: 100vw;
|
|
248
|
+
height: 100vh;
|
|
249
|
+
z-index: 999;
|
|
250
|
+
}
|
|
251
|
+
:global(.flatpickr-calendar) {
|
|
252
|
+
font-family: "Source Sans Pro", sans-serif;
|
|
253
|
+
}
|
|
254
|
+
.is-disabled {
|
|
255
|
+
pointer-events: none !important;
|
|
256
|
+
}
|
|
257
|
+
</style>
|