@budibase/bbui 1.0.0 → 1.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.
Files changed (128) hide show
  1. package/LICENSE +375 -0
  2. package/README.md +19 -17
  3. package/dist/bbui.es.js +2 -0
  4. package/dist/bbui.es.js.map +1 -0
  5. package/package.json +68 -26
  6. package/src/ActionButton/ActionButton.svelte +83 -0
  7. package/src/ActionGroup/ActionGroup.svelte +26 -0
  8. package/src/ActionMenu/ActionMenu.svelte +43 -0
  9. package/src/Actions/ClickOutside.svench.svx +30 -0
  10. package/src/Actions/PositionDropdown.svench.svx +81 -0
  11. package/src/Actions/autoresize_textarea.js +14 -0
  12. package/src/Actions/click_outside.js +18 -0
  13. package/src/Actions/position_dropdown.js +66 -0
  14. package/src/Avatar/Avatar.svelte +49 -0
  15. package/src/Badge/Badge.svelte +29 -0
  16. package/src/Button/Button.svelte +52 -0
  17. package/src/Button/Button.svench +138 -0
  18. package/src/ButtonGroup/ButtonGroup.svelte +19 -0
  19. package/src/ClearButton/ClearButton.svelte +19 -0
  20. package/src/ColorPicker/ColorPicker.svelte +292 -0
  21. package/src/DetailSummary/DetailSummary.svelte +83 -0
  22. package/src/Divider/Divider.svelte +25 -0
  23. package/src/Drawer/Drawer.svelte +85 -0
  24. package/src/Drawer/Drawer.svench +42 -0
  25. package/src/Drawer/DrawerContent.svelte +46 -0
  26. package/src/Form/Checkbox.svelte +23 -0
  27. package/src/Form/Combobox.svelte +44 -0
  28. package/src/Form/Core/Checkbox.svelte +67 -0
  29. package/src/Form/Core/Combobox.svelte +156 -0
  30. package/src/Form/Core/DatePicker.svelte +183 -0
  31. package/src/Form/Core/Dropzone.svelte +393 -0
  32. package/src/Form/Core/Multiselect.svelte +88 -0
  33. package/src/Form/Core/Picker.svelte +241 -0
  34. package/src/Form/Core/RadioGroup.svelte +47 -0
  35. package/src/Form/Core/Search.svelte +101 -0
  36. package/src/Form/Core/Select.svelte +81 -0
  37. package/src/Form/Core/Stepper.svelte +172 -0
  38. package/src/Form/Core/Switch.svelte +35 -0
  39. package/src/Form/Core/TextArea.svelte +60 -0
  40. package/src/Form/Core/TextField.svelte +104 -0
  41. package/src/Form/Core/index.js +12 -0
  42. package/src/Form/DatePicker.svelte +33 -0
  43. package/src/Form/Dropzone.svelte +34 -0
  44. package/src/Form/Field.svelte +41 -0
  45. package/src/Form/FieldLabel.svelte +27 -0
  46. package/src/Form/Input.svelte +38 -45
  47. package/src/Form/Multiselect.svelte +39 -0
  48. package/src/Form/RadioGroup.svelte +38 -0
  49. package/src/Form/Search.svelte +32 -0
  50. package/src/Form/Select.svelte +45 -43
  51. package/src/Form/Stepper.svelte +45 -0
  52. package/src/Form/TextArea.svelte +25 -44
  53. package/src/Form/Toggle.svelte +23 -0
  54. package/src/Icon/Icon.svelte +47 -0
  55. package/src/InlineAlert/InlineAlert.svelte +56 -0
  56. package/src/Label/Label.svelte +67 -0
  57. package/src/Layout/Layout.svelte +75 -0
  58. package/src/Layout/Page.svelte +25 -0
  59. package/src/Link/Link.svelte +22 -0
  60. package/src/List/Items/DetailSummary.svench +53 -0
  61. package/src/Menu/Item.svelte +45 -0
  62. package/src/Menu/Menu.svelte +7 -0
  63. package/src/Menu/Menu.svench +19 -0
  64. package/src/Menu/Section.svelte +10 -0
  65. package/src/Menu/Separator.svelte +1 -0
  66. package/src/Modal/Content.svelte +6 -0
  67. package/src/Modal/CustomContent.svelte +38 -0
  68. package/src/Modal/Modal.svelte +133 -0
  69. package/src/Modal/Modal.svench +117 -0
  70. package/src/Modal/ModalContent.svelte +139 -0
  71. package/src/Modal/QuizModal.svelte +54 -0
  72. package/src/Notification/Notification.svelte +20 -0
  73. package/src/Notification/NotificationDisplay.svelte +36 -0
  74. package/src/Pagination/Pagination.svelte +57 -0
  75. package/src/Popover/Popover.svelte +52 -0
  76. package/src/Popover/Popover.svench +121 -0
  77. package/src/ProgressBar/ProgressBar.svelte +54 -0
  78. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  79. package/src/SideNavigation/Item.svelte +45 -0
  80. package/src/SideNavigation/Navigation.svelte +12 -0
  81. package/src/StatusLight/StatusLight.svelte +41 -0
  82. package/src/Stores/Notifications.svench.svx +78 -0
  83. package/src/Stores/notifications.js +56 -0
  84. package/src/Table/ArrayRenderer.svelte +17 -0
  85. package/src/Table/AttachmentRenderer.svelte +55 -0
  86. package/src/Table/BooleanRenderer.svelte +42 -0
  87. package/src/Table/CellRenderer.svelte +37 -0
  88. package/src/Table/DateTimeRenderer.svelte +13 -0
  89. package/src/Table/InternalRenderer.svelte +28 -0
  90. package/src/Table/RelationshipRenderer.svelte +40 -0
  91. package/src/Table/SelectEditRenderer.svelte +16 -0
  92. package/src/Table/StringRenderer.svelte +13 -0
  93. package/src/Table/Table.svelte +506 -0
  94. package/src/Table/index.js +1 -0
  95. package/src/Tabs/Tab.svelte +66 -0
  96. package/src/Tabs/Tabs.svelte +105 -0
  97. package/src/Tags/Tag.svelte +43 -0
  98. package/src/Tags/Tags.svelte +7 -0
  99. package/src/Tooltip/Tooltip.svelte +24 -0
  100. package/src/TreeView/Item.svelte +41 -0
  101. package/src/TreeView/Tree.svelte +16 -0
  102. package/src/Typography/Body.svelte +19 -0
  103. package/src/Typography/Code.svelte +10 -0
  104. package/src/Typography/Detail.svelte +15 -0
  105. package/src/Typography/Heading.svelte +16 -0
  106. package/src/bbui.css +96 -0
  107. package/src/context.js +3 -0
  108. package/src/index.js +75 -10
  109. package/src/spectrum-icons-rollup.js +31 -0
  110. package/src/spectrum-icons-vite.js +31 -0
  111. package/src/utils/helpers.js +8 -0
  112. package/dist/bundle.css +0 -6
  113. package/dist/bundle.css.map +0 -18
  114. package/dist/index.js +0 -919
  115. package/dist/index.mjs +0 -906
  116. package/src/Branding/Budibase-logo.svelte +0 -68
  117. package/src/Branding/Logo.svelte +0 -16
  118. package/src/Branding/Logo.svench +0 -8
  119. package/src/Form/Button.svelte +0 -52
  120. package/src/Form/Button.svench +0 -26
  121. package/src/Form/Input.svench +0 -8
  122. package/src/Form/Select.svench +0 -8
  123. package/src/Form/TextArea.svench +0 -8
  124. package/src/Links/Home.svelte +0 -49
  125. package/src/Links/Home.svench +0 -19
  126. package/src/actions/autoresize_textarea.js +0 -14
  127. package/src/icons/Contribution.svelte +0 -14
  128. package/src/index.svench.svx +0 -35
@@ -0,0 +1,42 @@
1
+ <script>
2
+ import { View } from "svench";
3
+ import Button from "../Button/Button.svelte";
4
+ import Drawer from "./Drawer.svelte";
5
+
6
+ let drawer1;
7
+ let drawer2;
8
+ </script>
9
+
10
+ <style>
11
+ .drawer {
12
+ height: 40vh;
13
+ }
14
+ </style>
15
+
16
+ <View name="Basic Bottom Drawer">
17
+ <Button primary on:click={drawer1.show}>Open Drawer</Button>
18
+ <Drawer
19
+ bind:this={drawer1}
20
+ title="A basic Drawer with some text"
21
+ on:close={() => alert('You closed the drawer!')}>
22
+ <p slot="body">
23
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat,
24
+ architecto assumenda! Quia harum hic numquam, soluta maiores facere
25
+ explicabo vero obcaecati voluptas, qui placeat ad, dolorem recusandae
26
+ labore quos? Nisi!
27
+ </p>
28
+ </Drawer>
29
+ </View>
30
+ <View name="Basic Bottom Drawer">
31
+ <Button blue on:click={drawer2.show}>Open Drawer</Button>
32
+ <Drawer
33
+ bind:this={drawer2}
34
+ title={'Actions'}
35
+ on:close={() => alert('You closed the drawer!')}>
36
+ <heading slot="buttons">
37
+ <Button thin blue on:click={drawer2.hide}>Save</Button>
38
+ </heading>
39
+ <div slot="description">This describes the drawer!</div>
40
+ <div class="drawer" slot="body">Some content here</div>
41
+ </Drawer>
42
+ </View>
@@ -0,0 +1,46 @@
1
+ <div class="drawer-contents">
2
+ <div class:no-sidebar={!$$slots.sidebar} class="container">
3
+ {#if $$slots.sidebar}
4
+ <div class="sidebar">
5
+ <slot name="sidebar" />
6
+ </div>
7
+ {/if}
8
+ <div class="main">
9
+ <slot />
10
+ </div>
11
+ </div>
12
+ </div>
13
+
14
+ <style>
15
+ .drawer-contents {
16
+ height: 40vh;
17
+ overflow-y: auto;
18
+ }
19
+ .container {
20
+ height: 100%;
21
+ display: grid;
22
+ grid-template-columns: 320px 1fr;
23
+ }
24
+ .no-sidebar {
25
+ grid-template-columns: 1fr;
26
+ }
27
+ .sidebar {
28
+ border-right: var(--border-light);
29
+ overflow: auto;
30
+ padding: var(--spacing-xl);
31
+ scrollbar-width: none;
32
+ }
33
+ .sidebar::-webkit-scrollbar {
34
+ display: none;
35
+ }
36
+ .main {
37
+ font-family: var(--font-sans);
38
+ padding: var(--spacing-xl);
39
+ }
40
+ .main :global(textarea) {
41
+ min-height: 200px;
42
+ }
43
+ .main :global(p) {
44
+ margin: 0;
45
+ }
46
+ </style>
@@ -0,0 +1,23 @@
1
+ <script>
2
+ import Field from "./Field.svelte"
3
+ import Checkbox from "./Core/Checkbox.svelte"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let value = null
7
+ export let label = null
8
+ export let labelPosition = "above"
9
+ export let text = null
10
+ export let disabled = false
11
+ export let error = null
12
+ export let size = "M"
13
+
14
+ const dispatch = createEventDispatcher()
15
+ const onChange = e => {
16
+ value = e.detail
17
+ dispatch("change", e.detail)
18
+ }
19
+ </script>
20
+
21
+ <Field {label} {labelPosition} {error}>
22
+ <Checkbox {error} {disabled} {text} {value} {size} on:change={onChange} />
23
+ </Field>
@@ -0,0 +1,44 @@
1
+ <script>
2
+ import Field from "./Field.svelte"
3
+ import Combobox from "./Core/Combobox.svelte"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let value = null
7
+ export let label = undefined
8
+ export let disabled = false
9
+ export let readonly = false
10
+ export let labelPosition = "above"
11
+ export let error = null
12
+ export let placeholder = "Choose an option or type"
13
+ export let options = []
14
+ export let getOptionLabel = option => extractProperty(option, "label")
15
+ export let getOptionValue = option => extractProperty(option, "value")
16
+
17
+ const dispatch = createEventDispatcher()
18
+ const onChange = e => {
19
+ value = e.detail
20
+ dispatch("change", e.detail)
21
+ }
22
+ const extractProperty = (value, property) => {
23
+ if (value && typeof value === "object") {
24
+ return value[property]
25
+ }
26
+ return value
27
+ }
28
+ </script>
29
+
30
+ <Field {label} {labelPosition} {error}>
31
+ <Combobox
32
+ {error}
33
+ {disabled}
34
+ {value}
35
+ {options}
36
+ {placeholder}
37
+ {readonly}
38
+ {getOptionLabel}
39
+ {getOptionValue}
40
+ on:change={onChange}
41
+ on:pick
42
+ on:type
43
+ />
44
+ </Field>
@@ -0,0 +1,67 @@
1
+ <script>
2
+ import "@spectrum-css/checkbox/dist/index-vars.css"
3
+ import "@spectrum-css/fieldgroup/dist/index-vars.css"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let value = false
7
+ export let error = null
8
+ export let id = null
9
+ export let text = null
10
+ export let disabled = false
11
+ export let size
12
+
13
+ const dispatch = createEventDispatcher()
14
+ const onChange = event => {
15
+ dispatch("change", event.target.checked)
16
+ }
17
+
18
+ $: sizeClass = `spectrum-Checkbox--size${size || "M"}`
19
+ </script>
20
+
21
+ <label
22
+ class="spectrum-Checkbox spectrum-Checkbox--emphasized {sizeClass}"
23
+ class:is-invalid={!!error}
24
+ class:checked={value}
25
+ >
26
+ <input
27
+ checked={value}
28
+ {disabled}
29
+ on:change={onChange}
30
+ type="checkbox"
31
+ class="spectrum-Checkbox-input"
32
+ {id}
33
+ />
34
+ <span class="spectrum-Checkbox-box">
35
+ <svg
36
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Checkbox-checkmark"
37
+ focusable="false"
38
+ aria-hidden="true"
39
+ >
40
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
41
+ </svg>
42
+ <svg
43
+ class="spectrum-Icon spectrum-UIIcon-Dash100 spectrum-Checkbox-partialCheckmark"
44
+ focusable="false"
45
+ aria-hidden="true"
46
+ >
47
+ <use xlink:href="#spectrum-css-icon-Dash100" />
48
+ </svg>
49
+ </span>
50
+ <span class="spectrum-Checkbox-label">{text || ""}</span>
51
+ </label>
52
+
53
+ <style>
54
+ .spectrum-Checkbox--sizeL .spectrum-Checkbox-checkmark {
55
+ transform: scale(1.1);
56
+ left: 55%;
57
+ top: 55%;
58
+ }
59
+ .spectrum-Checkbox--sizeXL .spectrum-Checkbox-checkmark {
60
+ transform: scale(1.2);
61
+ left: 60%;
62
+ top: 60%;
63
+ }
64
+ .spectrum-Checkbox-input {
65
+ opacity: 0;
66
+ }
67
+ </style>
@@ -0,0 +1,156 @@
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
+ $: fieldText = getFieldText(value, options, placeholder)
22
+
23
+ const getFieldText = (value, options, placeholder) => {
24
+ // Always use placeholder if no value
25
+ if (value == null || value === "") {
26
+ return placeholder || "Choose an option or type"
27
+ }
28
+
29
+ // Wait for options to load if there is a value but no options
30
+ if (!options?.length) {
31
+ return ""
32
+ }
33
+
34
+ // Render the label if the selected option is found, otherwise raw value
35
+ const selected = options.find(option => getOptionValue(option) === value)
36
+ return selected ? getOptionLabel(selected) : value
37
+ }
38
+
39
+ const selectOption = value => {
40
+ dispatch("change", value)
41
+ open = false
42
+ }
43
+
44
+ const onType = e => {
45
+ const value = e.target.value
46
+ dispatch("type", value)
47
+ selectOption(value)
48
+ }
49
+
50
+ const onPick = value => {
51
+ dispatch("pick", value)
52
+ selectOption(value)
53
+ }
54
+ </script>
55
+
56
+ <div
57
+ class="spectrum-InputGroup"
58
+ class:is-focused={open || focus}
59
+ class:is-invalid={!!error}
60
+ class:is-disabled={disabled}
61
+ >
62
+ <div
63
+ class="spectrum-Textfield spectrum-InputGroup-textfield"
64
+ class:is-invalid={!!error}
65
+ class:is-disabled={disabled}
66
+ class:is-focused={open || focus}
67
+ >
68
+ <input
69
+ {id}
70
+ type="text"
71
+ on:focus={() => (focus = true)}
72
+ on:blur={() => (focus = false)}
73
+ on:change={onType}
74
+ value={value || ""}
75
+ placeholder={placeholder || ""}
76
+ {disabled}
77
+ {readonly}
78
+ class="spectrum-Textfield-input spectrum-InputGroup-input"
79
+ />
80
+ </div>
81
+ <button
82
+ class="spectrum-Picker spectrum-Picker--sizeM spectrum-InputGroup-button"
83
+ tabindex="-1"
84
+ aria-haspopup="true"
85
+ {disabled}
86
+ on:click={() => (open = true)}
87
+ >
88
+ <svg
89
+ class="spectrum-Icon spectrum-UIIcon-ChevronDown100 spectrum-Picker-menuIcon spectrum-InputGroup-icon"
90
+ focusable="false"
91
+ aria-hidden="true"
92
+ >
93
+ <use xlink:href="#spectrum-css-icon-Chevron100" />
94
+ </svg>
95
+ </button>
96
+ {#if open}
97
+ <div class="overlay" on:mousedown|self={() => (open = false)} />
98
+ <div
99
+ transition:fly={{ y: -20, duration: 200 }}
100
+ class="spectrum-Popover spectrum-Popover--bottom is-open"
101
+ >
102
+ <ul class="spectrum-Menu" role="listbox">
103
+ {#if options && Array.isArray(options)}
104
+ {#each options as option}
105
+ <li
106
+ class="spectrum-Menu-item"
107
+ class:is-selected={getOptionValue(option) === value}
108
+ role="option"
109
+ aria-selected="true"
110
+ tabindex="0"
111
+ on:click={() => onPick(getOptionValue(option))}
112
+ >
113
+ <span class="spectrum-Menu-itemLabel"
114
+ >{getOptionLabel(option)}</span
115
+ >
116
+ <svg
117
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
118
+ focusable="false"
119
+ aria-hidden="true"
120
+ >
121
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
122
+ </svg>
123
+ </li>
124
+ {/each}
125
+ {/if}
126
+ </ul>
127
+ </div>
128
+ {/if}
129
+ </div>
130
+
131
+ <style>
132
+ .spectrum-InputGroup {
133
+ min-width: 0;
134
+ width: 100%;
135
+ }
136
+ .spectrum-Textfield {
137
+ width: 100%;
138
+ }
139
+ .spectrum-Textfield-input {
140
+ width: 0;
141
+ }
142
+ .overlay {
143
+ position: fixed;
144
+ top: 0;
145
+ left: 0;
146
+ width: 100vw;
147
+ height: 100vh;
148
+ z-index: 999;
149
+ }
150
+ .spectrum-Popover {
151
+ max-height: 240px;
152
+ width: 100%;
153
+ z-index: 999;
154
+ top: 100%;
155
+ }
156
+ </style>
@@ -0,0 +1,183 @@
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 { generateID } from "../../utils/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
+
18
+ const dispatch = createEventDispatcher()
19
+ const flatpickrId = `${generateID()}-wrapper`
20
+ let open = false
21
+ let flatpickr
22
+ $: flatpickrOptions = {
23
+ element: `#${flatpickrId}`,
24
+ enableTime: enableTime || false,
25
+ altInput: true,
26
+ altFormat: enableTime ? "F j Y, H:i" : "F j, Y",
27
+ wrap: true,
28
+ appendTo,
29
+ disableMobile: "true",
30
+ }
31
+
32
+ const handleChange = event => {
33
+ const [dates] = event.detail
34
+ let newValue = dates[0]
35
+ if (newValue) {
36
+ newValue = newValue.toISOString()
37
+ }
38
+ dispatch("change", newValue)
39
+ }
40
+
41
+ const clearDateOnBackspace = event => {
42
+ if (["Backspace", "Clear", "Delete"].includes(event.key)) {
43
+ dispatch("change", null)
44
+ flatpickr.close()
45
+ }
46
+ }
47
+
48
+ const onOpen = () => {
49
+ open = true
50
+ document.addEventListener("keyup", clearDateOnBackspace)
51
+ }
52
+
53
+ const onClose = () => {
54
+ open = false
55
+ document.removeEventListener("keyup", clearDateOnBackspace)
56
+
57
+ // Manually blur all input fields since flatpickr creates a second
58
+ // duplicate input field.
59
+ // We need to blur both because the focus styling does not get properly
60
+ // applied.
61
+ const els = document.querySelectorAll(`#${flatpickrId} input`)
62
+ els.forEach(el => el.blur())
63
+ }
64
+
65
+ const parseDate = val => {
66
+ if (!val) {
67
+ return null
68
+ }
69
+ let date
70
+ if (val instanceof Date) {
71
+ // Use real date obj if already parsed
72
+ date = val
73
+ } else if (isNaN(val)) {
74
+ // Treat as date string of some sort
75
+ date = new Date(val)
76
+ } else {
77
+ // Treat as numerical timestamp
78
+ date = new Date(parseInt(val))
79
+ }
80
+ const time = date.getTime()
81
+ if (isNaN(time)) {
82
+ return null
83
+ }
84
+ // By rounding to the nearest second we avoid locking up in an endless
85
+ // loop in the builder, caused by potentially enriching {{ now }} to every
86
+ // millisecond.
87
+ return new Date(Math.floor(time / 1000) * 1000)
88
+ }
89
+ </script>
90
+
91
+ <Flatpickr
92
+ bind:flatpickr
93
+ value={parseDate(value)}
94
+ on:open={onOpen}
95
+ on:close={onClose}
96
+ options={flatpickrOptions}
97
+ on:change={handleChange}
98
+ element={`#${flatpickrId}`}
99
+ >
100
+ <div
101
+ id={flatpickrId}
102
+ class:is-disabled={disabled}
103
+ class:is-invalid={!!error}
104
+ class="flatpickr spectrum-InputGroup spectrum-Datepicker"
105
+ class:is-focused={open}
106
+ aria-readonly="false"
107
+ aria-required="false"
108
+ aria-haspopup="true"
109
+ >
110
+ <div
111
+ on:click={flatpickr?.open}
112
+ class="spectrum-Textfield spectrum-InputGroup-textfield"
113
+ class:is-disabled={disabled}
114
+ class:is-invalid={!!error}
115
+ >
116
+ {#if !!error}
117
+ <svg
118
+ class="spectrum-Icon spectrum-Icon--sizeM spectrum-Textfield-validationIcon"
119
+ focusable="false"
120
+ aria-hidden="true"
121
+ >
122
+ <use xlink:href="#spectrum-icon-18-Alert" />
123
+ </svg>
124
+ {/if}
125
+ <input
126
+ data-input
127
+ type="text"
128
+ {disabled}
129
+ class="spectrum-Textfield-input spectrum-InputGroup-input"
130
+ {placeholder}
131
+ {id}
132
+ {value}
133
+ />
134
+ </div>
135
+ <button
136
+ type="button"
137
+ class="spectrum-Picker spectrum-Picker--sizeM spectrum-InputGroup-button"
138
+ tabindex="-1"
139
+ {disabled}
140
+ class:is-invalid={!!error}
141
+ on:click={flatpickr?.open}
142
+ >
143
+ <svg
144
+ class="spectrum-Icon spectrum-Icon--sizeM"
145
+ focusable="false"
146
+ aria-hidden="true"
147
+ aria-label="Calendar"
148
+ >
149
+ <use xlink:href="#spectrum-icon-18-Calendar" />
150
+ </svg>
151
+ </button>
152
+ </div>
153
+ </Flatpickr>
154
+ {#if open}
155
+ <div class="overlay" on:mousedown|self={flatpickr?.close} />
156
+ {/if}
157
+
158
+ <style>
159
+ .spectrum-Textfield-input {
160
+ pointer-events: none;
161
+ }
162
+ .spectrum-Textfield:not(.is-disabled):hover {
163
+ cursor: pointer;
164
+ }
165
+ .flatpickr {
166
+ width: 100%;
167
+ overflow: hidden;
168
+ }
169
+ .flatpickr .spectrum-Textfield {
170
+ width: 100%;
171
+ }
172
+ .overlay {
173
+ position: fixed;
174
+ top: 0;
175
+ left: 0;
176
+ width: 100vw;
177
+ height: 100vh;
178
+ z-index: 999;
179
+ }
180
+ :global(.flatpickr-calendar) {
181
+ font-family: "Source Sans Pro", sans-serif;
182
+ }
183
+ </style>