@budibase/bbui 1.58.13 → 2.0.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.
Files changed (181) hide show
  1. package/LICENSE +375 -0
  2. package/dist/bbui.es.js +14 -0
  3. package/dist/bbui.es.js.map +1 -0
  4. package/package.json +68 -32
  5. package/src/ActionButton/ActionButton.svelte +102 -0
  6. package/src/ActionGroup/ActionGroup.svelte +26 -0
  7. package/src/ActionMenu/ActionMenu.svelte +44 -0
  8. package/src/Actions/autoresize_textarea.js +9 -9
  9. package/src/Actions/click_outside.js +5 -5
  10. package/src/Actions/position_dropdown.js +46 -37
  11. package/src/Avatar/Avatar.svelte +62 -0
  12. package/src/Badge/Badge.svelte +29 -0
  13. package/src/Banner/Banner.svelte +72 -0
  14. package/src/Banner/BannerDisplay.svelte +41 -0
  15. package/src/Button/Button.svelte +102 -200
  16. package/src/ButtonGroup/ButtonGroup.svelte +30 -0
  17. package/src/ClearButton/ClearButton.svelte +19 -0
  18. package/src/ColorPicker/ColorPicker.svelte +297 -0
  19. package/src/DetailSummary/DetailSummary.svelte +83 -0
  20. package/src/Divider/Divider.svelte +28 -0
  21. package/src/Drawer/Drawer.svelte +76 -51
  22. package/src/Drawer/DrawerContent.svelte +46 -0
  23. package/src/Form/Checkbox.svelte +21 -132
  24. package/src/Form/Combobox.svelte +45 -0
  25. package/src/Form/Core/Checkbox.svelte +69 -0
  26. package/src/Form/Core/CheckboxGroup.svelte +68 -0
  27. package/src/Form/Core/Combobox.svelte +142 -0
  28. package/src/Form/Core/DatePicker.svelte +257 -0
  29. package/src/Form/Core/Dropzone.svelte +453 -0
  30. package/src/Form/Core/InputDropdown.svelte +228 -0
  31. package/src/Form/Core/Multiselect.svelte +90 -0
  32. package/src/Form/Core/Picker.svelte +259 -0
  33. package/src/Form/Core/PickerDropdown.svelte +415 -0
  34. package/src/Form/Core/RadioGroup.svelte +48 -0
  35. package/src/Form/Core/RichTextField.svelte +42 -0
  36. package/src/Form/Core/Search.svelte +105 -0
  37. package/src/Form/Core/Select.svelte +75 -0
  38. package/src/Form/Core/Slider.svelte +86 -0
  39. package/src/Form/Core/Stepper.svelte +172 -0
  40. package/src/Form/Core/Switch.svelte +37 -0
  41. package/src/Form/Core/TextArea.svelte +78 -0
  42. package/src/Form/Core/TextField.svelte +119 -0
  43. package/src/Form/Core/index.js +15 -0
  44. package/src/Form/DatePicker.svelte +39 -0
  45. package/src/Form/Dropzone.svelte +42 -0
  46. package/src/Form/Field.svelte +42 -0
  47. package/src/Form/FieldLabel.svelte +32 -0
  48. package/src/Form/Input.svelte +41 -187
  49. package/src/Form/InputDropdown.svelte +55 -0
  50. package/src/Form/Multiselect.svelte +36 -320
  51. package/src/Form/PickerDropdown.svelte +132 -0
  52. package/src/Form/RadioGroup.svelte +42 -0
  53. package/src/Form/RichTextField.svelte +36 -0
  54. package/src/Form/Search.svelte +36 -0
  55. package/src/Form/Select.svelte +48 -88
  56. package/src/Form/Slider.svelte +16 -91
  57. package/src/Form/Stepper.svelte +45 -0
  58. package/src/Form/TextArea.svelte +30 -128
  59. package/src/Form/Toggle.svelte +20 -110
  60. package/src/Icon/Icon.svelte +91 -0
  61. package/src/Icon/IconAvatar.svelte +58 -0
  62. package/src/IconPicker/IconPicker.svelte +177 -0
  63. package/src/IconSideNav/IconSideNav.svelte +14 -0
  64. package/src/IconSideNav/IconSideNavItem.svelte +56 -0
  65. package/src/InlineAlert/InlineAlert.svelte +60 -0
  66. package/src/Label/Label.svelte +29 -0
  67. package/src/Layout/Layout.svelte +94 -0
  68. package/src/Layout/Page.svelte +32 -0
  69. package/src/Link/Link.svelte +24 -0
  70. package/src/List/List.svelte +28 -0
  71. package/src/List/ListItem.svelte +90 -0
  72. package/src/Markdown/MarkdownEditor.svelte +60 -0
  73. package/src/Markdown/MarkdownViewer.svelte +70 -0
  74. package/src/Markdown/SpectrumMDE.svelte +184 -0
  75. package/src/Menu/Item.svelte +96 -0
  76. package/src/Menu/Menu.svelte +7 -0
  77. package/src/Menu/Menu.svench +19 -0
  78. package/src/Menu/Section.svelte +10 -0
  79. package/src/Menu/Separator.svelte +1 -0
  80. package/src/Modal/Content.svelte +0 -11
  81. package/src/Modal/CustomContent.svelte +9 -6
  82. package/src/Modal/Modal.svelte +104 -51
  83. package/src/Modal/ModalContent.svelte +131 -73
  84. package/src/Modal/QuizModal.svelte +16 -17
  85. package/src/Notification/Notification.svelte +70 -0
  86. package/src/Notification/NotificationDisplay.svelte +43 -0
  87. package/src/Pagination/Pagination.svelte +57 -0
  88. package/src/Popover/Popover.svelte +43 -33
  89. package/src/ProgressBar/ProgressBar.svelte +67 -0
  90. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  91. package/src/SideNavigation/Item.svelte +61 -0
  92. package/src/SideNavigation/Navigation.svelte +12 -0
  93. package/src/StatusLight/StatusLight.svelte +80 -0
  94. package/src/Stores/Notifications.svench.svx +1 -1
  95. package/src/Stores/banner.js +65 -0
  96. package/src/Stores/notifications.js +75 -38
  97. package/src/Table/ArrayRenderer.svelte +17 -0
  98. package/src/Table/AttachmentRenderer.svelte +73 -0
  99. package/src/Table/BoldRenderer.svelte +15 -0
  100. package/src/Table/BooleanRenderer.svelte +42 -0
  101. package/src/Table/CellRenderer.svelte +69 -0
  102. package/src/Table/CodeRenderer.svelte +14 -0
  103. package/src/Table/DateTimeRenderer.svelte +29 -0
  104. package/src/Table/InternalRenderer.svelte +24 -0
  105. package/src/Table/RelationshipRenderer.svelte +40 -0
  106. package/src/Table/SelectEditRenderer.svelte +28 -0
  107. package/src/Table/StringRenderer.svelte +14 -0
  108. package/src/Table/Table.svelte +635 -0
  109. package/src/Table/index.js +1 -0
  110. package/src/Tabs/Tab.svelte +88 -0
  111. package/src/Tabs/Tabs.svelte +130 -0
  112. package/src/Tags/Tag.svelte +43 -0
  113. package/src/Tags/Tags.svelte +7 -0
  114. package/src/Tooltip/Tooltip.svelte +34 -0
  115. package/src/Tooltip/TooltipWrapper.svelte +60 -0
  116. package/src/TreeView/Item.svelte +41 -0
  117. package/src/TreeView/Tree.svelte +16 -0
  118. package/src/Typography/Body.svelte +21 -0
  119. package/src/Typography/Code.svelte +10 -0
  120. package/src/Typography/Detail.svelte +19 -0
  121. package/src/Typography/Heading.svelte +17 -0
  122. package/{dist → src}/bbui.css +2 -99
  123. package/src/context.js +1 -1
  124. package/src/helpers.js +134 -0
  125. package/src/index.js +95 -40
  126. package/src/spectrum-icons-rollup.js +31 -0
  127. package/src/spectrum-icons-vite.js +31 -0
  128. package/dist/dist/bundle.css +0 -42
  129. package/dist/dist/bundle.css.map +0 -64
  130. package/dist/index.js +0 -36193
  131. package/dist/index.mjs +0 -36147
  132. package/src/Button/Close.svelte +0 -59
  133. package/src/Button/Close.svench +0 -36
  134. package/src/Button/TextButton.svelte +0 -128
  135. package/src/Button/TextButton.svench +0 -69
  136. package/src/DatePicker/DatePicker.svelte +0 -45
  137. package/src/DatePicker/DatePicker.svench +0 -17
  138. package/src/DropdownMenu/DropdownMenu.svelte +0 -77
  139. package/src/DropdownMenu/DropdownMenu.svench +0 -161
  140. package/src/Dropzone/Dropzone.svelte +0 -294
  141. package/src/Dropzone/Dropzone.svench +0 -17
  142. package/src/Dropzone/fileTypes.js +0 -5
  143. package/src/Form/Checkbox.svench.svx +0 -67
  144. package/src/Form/DataList.svelte +0 -158
  145. package/src/Form/DataList.svench +0 -57
  146. package/src/Form/Input.svench +0 -62
  147. package/src/Form/Multiselect.svench +0 -63
  148. package/src/Form/Radio.svelte +0 -133
  149. package/src/Form/Radio.svench.svx +0 -64
  150. package/src/Form/RichText.svelte +0 -61
  151. package/src/Form/RichText.svench.svx +0 -40
  152. package/src/Form/Select.svench +0 -62
  153. package/src/Form/Slider.svench +0 -26
  154. package/src/Form/TextArea.svench +0 -30
  155. package/src/Form/Toggle.svench +0 -21
  156. package/src/Icons/Contribution.svelte +0 -14
  157. package/src/Icons/Icon.svelte +0 -36
  158. package/src/Icons/Icon.svench +0 -109
  159. package/src/Icons/icon-paths.js +0 -136
  160. package/src/Links/Home.svelte +0 -51
  161. package/src/Links/Home.svench +0 -19
  162. package/src/List/Items/DetailSummary.svelte +0 -85
  163. package/src/List/Items/DetailSummary.svench +0 -53
  164. package/src/List/Search.svelte +0 -34
  165. package/src/List/Search.svench +0 -8
  166. package/src/Spacer/Spacer.svelte +0 -50
  167. package/src/Spacer/Spacer.svench +0 -51
  168. package/src/Styleguide/Body.svelte +0 -72
  169. package/src/Styleguide/Borders.svench +0 -175
  170. package/src/Styleguide/Budibase-logo.svelte +0 -68
  171. package/src/Styleguide/Color.svench +0 -201
  172. package/src/Styleguide/Heading.svelte +0 -74
  173. package/src/Styleguide/Label.svelte +0 -70
  174. package/src/Styleguide/Logo.svelte +0 -16
  175. package/src/Styleguide/Logo.svench +0 -8
  176. package/src/Styleguide/Spacing.svench +0 -191
  177. package/src/Styleguide/Typography.svench +0 -227
  178. package/src/Switcher/Switcher.svelte +0 -47
  179. package/src/Switcher/Switcher.svench +0 -27
  180. package/src/index.svench.svx +0 -35
  181. package/src/utils/buildStyle.js +0 -14
@@ -0,0 +1,83 @@
1
+ <script>
2
+ import Icon from "../Icon/Icon.svelte"
3
+ import { createEventDispatcher } from "svelte"
4
+
5
+ export let name
6
+ export let show = false
7
+ export let collapsible = true
8
+
9
+ const dispatch = createEventDispatcher()
10
+ const onHeaderClick = () => {
11
+ if (!collapsible) {
12
+ return
13
+ }
14
+ show = !show
15
+ if (show) {
16
+ dispatch("open")
17
+ }
18
+ }
19
+ </script>
20
+
21
+ <div class="property-group-container">
22
+ <div class="property-group-name" on:click={onHeaderClick}>
23
+ <div class="name">{name}</div>
24
+ {#if collapsible}
25
+ <Icon size="S" name={show ? "Remove" : "Add"} />
26
+ {/if}
27
+ </div>
28
+ <div class="property-panel" class:show={show || !collapsible}>
29
+ <slot />
30
+ </div>
31
+ </div>
32
+
33
+ <style>
34
+ .property-group-container {
35
+ display: flex;
36
+ flex-direction: column;
37
+ justify-content: flex-start;
38
+ align-items: stretch;
39
+ border-bottom: var(--border-light);
40
+ }
41
+
42
+ .property-group-name {
43
+ cursor: pointer;
44
+ display: flex;
45
+ flex-flow: row nowrap;
46
+ flex-direction: row;
47
+ justify-content: space-between;
48
+ align-items: center;
49
+ padding: var(--spacing-m) var(--spacing-xl);
50
+ color: var(--spectrum-global-color-gray-600);
51
+ transition: color 130ms ease-in-out;
52
+ }
53
+ .property-group-name:hover {
54
+ color: var(--spectrum-global-color-gray-900);
55
+ }
56
+
57
+ .name {
58
+ text-align: left;
59
+ font-size: var(--font-size-s);
60
+ font-weight: 600;
61
+ letter-spacing: 0.14px;
62
+ flex: 1 1 auto;
63
+ overflow: hidden;
64
+ text-overflow: ellipsis;
65
+ text-transform: uppercase;
66
+ white-space: nowrap;
67
+ user-select: none;
68
+ }
69
+
70
+ .property-panel {
71
+ display: none;
72
+ padding: var(--spacing-s) var(--spacing-xl) var(--spacing-xl)
73
+ var(--spacing-xl);
74
+ }
75
+
76
+ .show {
77
+ display: flex;
78
+ flex-direction: column;
79
+ justify-content: flex-start;
80
+ align-items: stretch;
81
+ gap: var(--spacing-l);
82
+ }
83
+ </style>
@@ -0,0 +1,28 @@
1
+ <script>
2
+ import "@spectrum-css/divider/dist/index-vars.css"
3
+ export let size = "M"
4
+
5
+ export let vertical = false
6
+ export let noMargin = false
7
+ export let noGrid = false
8
+ </script>
9
+
10
+ <hr
11
+ class:noMargin
12
+ class:noGrid
13
+ class="spectrum-Divider spectrum-Divider--{vertical
14
+ ? 'vertical'
15
+ : 'horizontal'} spectrum-Dialog-divider spectrum-Divider--size{size}"
16
+ />
17
+
18
+ <style>
19
+ hr {
20
+ background: var(--spectrum-global-color-gray-200);
21
+ }
22
+ hr.noMargin {
23
+ margin: 0;
24
+ }
25
+ hr.noGrid {
26
+ grid-area: auto;
27
+ }
28
+ </style>
@@ -1,42 +1,89 @@
1
1
  <script>
2
- import { slide } from "svelte/transition";
3
- import Portal from "svelte-portal";
4
- import clickOutside from "../Actions/click_outside";
2
+ import Portal from "svelte-portal"
3
+ import Button from "../Button/Button.svelte"
4
+ import Body from "../Typography/Body.svelte"
5
+ import Heading from "../Typography/Heading.svelte"
5
6
 
6
- export let title;
7
+ export let title
8
+ export let fillWidth
9
+ export let left = "314px"
10
+ export let width = "calc(100% - 576px)"
7
11
 
8
- let visible = false;
12
+ let visible = false
9
13
 
10
14
  export function show() {
11
15
  if (visible) {
12
- return;
16
+ return
13
17
  }
14
- visible = true;
18
+ visible = true
15
19
  }
16
20
 
17
21
  export function hide() {
18
22
  if (!visible) {
19
- return;
23
+ return
20
24
  }
21
- visible = false;
25
+ visible = false
22
26
  }
23
27
 
24
- function handleKey(e) {
25
- if (visible && e.key === "Escape") {
26
- hide();
28
+ const easeInOutQuad = x => {
29
+ return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2
30
+ }
31
+
32
+ // Use a custom svelte transition here because the built-in slide
33
+ // transition has a horrible overshoot
34
+ const slide = () => {
35
+ return {
36
+ duration: 360,
37
+ css: t => {
38
+ const translation = 100 - Math.round(easeInOutQuad(t) * 100)
39
+ return `transform: translateY(${translation}%);`
40
+ },
27
41
  }
28
42
  }
29
43
  </script>
30
44
 
45
+ {#if visible}
46
+ <Portal>
47
+ <section
48
+ class:fillWidth
49
+ class="drawer"
50
+ transition:slide|local
51
+ style={`width: ${width}; left: ${left};`}
52
+ >
53
+ <header>
54
+ <div class="text">
55
+ <Heading size="XS">{title}</Heading>
56
+ <Body size="S">
57
+ <slot name="description" />
58
+ </Body>
59
+ </div>
60
+ <div class="buttons">
61
+ <Button secondary quiet on:click={hide}>Cancel</Button>
62
+ <slot name="buttons" />
63
+ </div>
64
+ </header>
65
+ <slot name="body" />
66
+ </section>
67
+ </Portal>
68
+ {/if}
69
+
31
70
  <style>
71
+ .buttons {
72
+ display: flex;
73
+ gap: var(--spacing-m);
74
+ }
75
+
32
76
  .drawer {
33
77
  position: absolute;
34
78
  bottom: 0;
35
- left: 260px;
36
- width: calc(100% - 520px);
37
79
  background: var(--background);
38
- border: var(--border-light);
39
- z-index: 2;
80
+ border-top: var(--border-light);
81
+ z-index: 3;
82
+ }
83
+
84
+ .fillWidth {
85
+ left: 260px !important;
86
+ width: calc(100% - 260px) !important;
40
87
  }
41
88
 
42
89
  header {
@@ -44,45 +91,23 @@
44
91
  justify-content: space-between;
45
92
  align-items: center;
46
93
  border-bottom: var(--border-light);
47
- padding: var(--spacing-m);
94
+ padding: var(--spacing-l) var(--spacing-xl);
95
+ gap: var(--spacing-xl);
48
96
  }
49
97
 
50
- .controls {
51
- display: grid;
52
- grid-auto-flow: column;
53
- grid-gap: var(--spacing-m);
54
- align-items: center;
98
+ .text {
99
+ display: flex;
100
+ flex-direction: column;
101
+ justify-content: center;
102
+ align-items: flex-start;
103
+ gap: var(--spacing-xs);
55
104
  }
56
105
 
57
- .close {
58
- font-size: var(--font-size-xl);
59
- cursor: pointer;
60
- }
61
- .title {
62
- font-weight: bold;
63
- margin-right: var(--spacing-m);
64
- }
65
- .text {
106
+ .buttons {
66
107
  display: flex;
108
+ flex-direction: row;
109
+ justify-content: flex-start;
110
+ align-items: center;
111
+ gap: var(--spacing-m);
67
112
  }
68
113
  </style>
69
-
70
- <svelte:window on:keydown={handleKey} />
71
-
72
- {#if visible}
73
- <Portal>
74
- <section class="drawer" transition:slide>
75
- <header>
76
- <div class="text">
77
- <div class="title">{title}</div>
78
- <slot name="description" />
79
- </div>
80
- <div class="controls">
81
- <slot name="buttons" />
82
- <i class="ri-close-fill close" on:click={hide} />
83
- </div>
84
- </header>
85
- <slot name="body" />
86
- </section>
87
- </Portal>
88
- {/if}
@@ -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>
@@ -1,134 +1,23 @@
1
1
  <script>
2
- import { createEventDispatcher } from "svelte"
3
-
4
- const dispatch = createEventDispatcher()
5
-
6
- export let checked = false
7
- export let value;
8
- export let name
9
- export let disabled
10
-
11
- function handleChange() {
12
- if (disabled) return
13
- checked = !checked
14
- dispatch("change", checked)
15
- }
16
- </script>
17
-
18
- <div class="container">
19
- <input {disabled} on:change={handleChange} {value} bind:checked type="checkbox" {name} class="checkbox" id={value} />
20
- <div class="checkbox-container" on:click={handleChange}>
21
- <div class:disabled class="check-div" class:checked>
22
- <div class="tick_mark" />
23
- </div>
24
- </div>
25
- <slot />
26
- </div>
27
-
28
- <style>
29
- .container {
30
- display: flex;
31
- gap: var(--spacing-s);
32
- }
33
- .checkbox-container {
34
- position: relative;
35
- z-index: 0;
36
- }
37
-
38
- .checkbox {
39
- display: none;
40
- }
41
-
42
- .check-div {
43
- position: relative;
44
- width: 20px;
45
- height: 20px;
46
- background-color: var(--grey-2);
47
- cursor: pointer;
48
- transition: 0.2s ease transform, 0.2s ease background-color,
49
- 0.2s ease box-shadow;
50
- overflow: hidden;
51
- border-radius: 4px;
52
- }
53
-
54
- .check-div:before {
55
- content: "";
56
- position: absolute;
57
- top: 50%;
58
- right: 0;
59
- left: 0;
60
- width: 12px;
61
- height: 12px;
62
- margin: 0 auto;
63
- background-color: var(--background);
64
- transform: translateY(-50%);
65
- transition: 0.2s ease width, 0.2s ease height;
66
- border-radius: 2px;
67
- }
68
-
69
- .check-div:active {
70
- transform: translateY(-50%) scale(0.9);
71
- }
72
-
73
- .tick_mark {
74
- position: absolute;
75
- top: 50%;
76
- left: 6px;
77
- width: 5px;
78
- height: 4px;
79
- margin: 0 auto;
80
- transform: rotateZ(-40deg);
81
- }
82
-
83
- .tick_mark:before,
84
- .tick_mark:after {
85
- content: "";
86
- position: absolute;
87
- background-color: var(--ink);
88
- border-radius: 2px;
89
- opacity: 0;
90
- transition: 0.2s ease transform, 0.2s ease opacity;
91
- }
92
-
93
- .tick_mark:before {
94
- left: 0;
95
- bottom: 0;
96
- width: 2px;
97
- height: 6px;
98
- box-shadow: -2px 0 5px rgba(0, 0, 0, 0.23);
99
- transform: translateY(-68px);
100
- }
101
-
102
- .tick_mark:after {
103
- left: 0;
104
- bottom: 0;
105
- width: 12px;
106
- height: 2px;
107
- box-shadow: 0 3px 5px rgba(0, 0, 0, 0.23);
108
- transform: translateX(78px);
109
- }
2
+ import Field from "./Field.svelte"
3
+ import Checkbox from "./Core/Checkbox.svelte"
4
+ import { createEventDispatcher } from "svelte"
110
5
 
111
- .check-div.disabled:active {
112
- transform: none;
113
- }
114
-
115
- .checked {
116
- background-color: var(--grey-2);
117
- }
118
- .checked.disabled {
119
- background-color: var(--grey-5);
120
- }
121
-
122
-
123
- .checked:before {
124
- width: 0;
125
- height: 0;
126
- }
127
-
128
- .checked .tick_mark:before,
129
- .checked .tick_mark:after {
130
- transform: translate(0);
131
- opacity: 1;
132
- }
133
- </style>
134
-
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,45 @@
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
+ on:blur
44
+ />
45
+ </Field>
@@ -0,0 +1,69 @@
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
+ {#if text}
51
+ <span class="spectrum-Checkbox-label">{text}</span>
52
+ {/if}
53
+ </label>
54
+
55
+ <style>
56
+ .spectrum-Checkbox--sizeL .spectrum-Checkbox-checkmark {
57
+ transform: scale(1.1);
58
+ left: 55%;
59
+ top: 55%;
60
+ }
61
+ .spectrum-Checkbox--sizeXL .spectrum-Checkbox-checkmark {
62
+ transform: scale(1.2);
63
+ left: 60%;
64
+ top: 60%;
65
+ }
66
+ .spectrum-Checkbox-input {
67
+ opacity: 0;
68
+ }
69
+ </style>
@@ -0,0 +1,68 @@
1
+ <script>
2
+ import "@spectrum-css/fieldgroup/dist/index-vars.css"
3
+ import "@spectrum-css/radio/dist/index-vars.css"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let direction = "vertical"
7
+ export let value = []
8
+ export let options = []
9
+ export let error = null
10
+ export let disabled = false
11
+ export let getOptionLabel = option => option
12
+ export let getOptionValue = option => option
13
+
14
+ const dispatch = createEventDispatcher()
15
+ const onChange = e => {
16
+ let tempValue = value
17
+ let isChecked = e.target.checked
18
+ if (!tempValue.includes(e.target.value) && isChecked) {
19
+ tempValue.push(e.target.value)
20
+ }
21
+ value = tempValue
22
+ dispatch(
23
+ "change",
24
+ tempValue.filter(val => val !== e.target.value || isChecked)
25
+ )
26
+ }
27
+ </script>
28
+
29
+ <div class={`spectrum-FieldGroup spectrum-FieldGroup--${direction}`}>
30
+ {#if options && Array.isArray(options)}
31
+ {#each options as option}
32
+ <div
33
+ title={getOptionLabel(option)}
34
+ class="spectrum-Checkbox spectrum-FieldGroup-item"
35
+ class:is-invalid={!!error}
36
+ >
37
+ <label
38
+ class="spectrum-Checkbox spectrum-Checkbox--sizeM spectrum-FieldGroup-item"
39
+ >
40
+ <input
41
+ on:change={onChange}
42
+ value={getOptionValue(option)}
43
+ type="checkbox"
44
+ class="spectrum-Checkbox-input"
45
+ {disabled}
46
+ checked={value.includes(getOptionValue(option))}
47
+ />
48
+ <span class="spectrum-Checkbox-box">
49
+ <svg
50
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Checkbox-checkmark"
51
+ focusable="false"
52
+ aria-hidden="true"
53
+ >
54
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
55
+ </svg>
56
+ </span>
57
+ <span class="spectrum-Checkbox-label">{getOptionLabel(option)}</span>
58
+ </label>
59
+ </div>
60
+ {/each}
61
+ {/if}
62
+ </div>
63
+
64
+ <style>
65
+ .spectrum-Checkbox-input {
66
+ opacity: 0;
67
+ }
68
+ </style>