@budibase/bbui 1.3.0 → 1.3.3

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 (152) hide show
  1. package/LICENSE +375 -0
  2. package/README.md +19 -17
  3. package/dist/bbui.es.js +210 -0
  4. package/dist/bbui.es.js.map +1 -0
  5. package/package.json +71 -26
  6. package/src/ActionButton/ActionButton.svelte +102 -0
  7. package/src/ActionGroup/ActionGroup.svelte +26 -0
  8. package/src/ActionMenu/ActionMenu.svelte +44 -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 +62 -0
  15. package/src/Badge/Badge.svelte +29 -0
  16. package/src/Banner/Banner.svelte +72 -0
  17. package/src/Banner/BannerDisplay.svelte +31 -0
  18. package/src/Button/Button.svelte +114 -0
  19. package/src/Button/Button.svench +138 -0
  20. package/src/ButtonGroup/ButtonGroup.svelte +30 -0
  21. package/src/ClearButton/ClearButton.svelte +19 -0
  22. package/src/ColorPicker/ColorPicker.svelte +297 -0
  23. package/src/DetailSummary/DetailSummary.svelte +83 -0
  24. package/src/Divider/Divider.svelte +28 -0
  25. package/src/Drawer/Drawer.svelte +113 -0
  26. package/src/Drawer/Drawer.svench +42 -0
  27. package/src/Drawer/DrawerContent.svelte +46 -0
  28. package/src/Form/Checkbox.svelte +23 -0
  29. package/src/Form/Combobox.svelte +45 -0
  30. package/src/Form/Core/Checkbox.svelte +69 -0
  31. package/src/Form/Core/CheckboxGroup.svelte +68 -0
  32. package/src/Form/Core/Combobox.svelte +142 -0
  33. package/src/Form/Core/DatePicker.svelte +257 -0
  34. package/src/Form/Core/Dropzone.svelte +450 -0
  35. package/src/Form/Core/InputDropdown.svelte +228 -0
  36. package/src/Form/Core/Multiselect.svelte +90 -0
  37. package/src/Form/Core/Picker.svelte +259 -0
  38. package/src/Form/Core/PickerDropdown.svelte +436 -0
  39. package/src/Form/Core/RadioGroup.svelte +48 -0
  40. package/src/Form/Core/RichTextField.svelte +42 -0
  41. package/src/Form/Core/Search.svelte +105 -0
  42. package/src/Form/Core/Select.svelte +75 -0
  43. package/src/Form/Core/Slider.svelte +86 -0
  44. package/src/Form/Core/Stepper.svelte +172 -0
  45. package/src/Form/Core/Switch.svelte +37 -0
  46. package/src/Form/Core/TextArea.svelte +78 -0
  47. package/src/Form/Core/TextField.svelte +119 -0
  48. package/src/Form/Core/index.js +15 -0
  49. package/src/Form/DatePicker.svelte +39 -0
  50. package/src/Form/Dropzone.svelte +42 -0
  51. package/src/Form/Field.svelte +42 -0
  52. package/src/Form/FieldLabel.svelte +32 -0
  53. package/src/Form/Input.svelte +40 -45
  54. package/src/Form/InputDropdown.svelte +55 -0
  55. package/src/Form/Multiselect.svelte +40 -0
  56. package/src/Form/PickerDropdown.svelte +134 -0
  57. package/src/Form/RadioGroup.svelte +42 -0
  58. package/src/Form/RichTextField.svelte +36 -0
  59. package/src/Form/Search.svelte +36 -0
  60. package/src/Form/Select.svelte +48 -43
  61. package/src/Form/Slider.svelte +24 -0
  62. package/src/Form/Stepper.svelte +45 -0
  63. package/src/Form/TextArea.svelte +29 -44
  64. package/src/Form/Toggle.svelte +23 -0
  65. package/src/Icon/Icon.svelte +91 -0
  66. package/src/IconPicker/IconPicker.svelte +177 -0
  67. package/src/IconSideNav/IconSideNav.svelte +14 -0
  68. package/src/IconSideNav/IconSideNavItem.svelte +56 -0
  69. package/src/InlineAlert/InlineAlert.svelte +56 -0
  70. package/src/Label/Label.svelte +20 -0
  71. package/src/Layout/Layout.svelte +94 -0
  72. package/src/Layout/Page.svelte +32 -0
  73. package/src/Link/Link.svelte +24 -0
  74. package/src/List/List.svelte +28 -0
  75. package/src/List/ListItem.svelte +98 -0
  76. package/src/Markdown/MarkdownEditor.svelte +60 -0
  77. package/src/Markdown/MarkdownViewer.svelte +70 -0
  78. package/src/Markdown/SpectrumMDE.svelte +184 -0
  79. package/src/Menu/Item.svelte +96 -0
  80. package/src/Menu/Menu.svelte +7 -0
  81. package/src/Menu/Menu.svench +19 -0
  82. package/src/Menu/Section.svelte +10 -0
  83. package/src/Menu/Separator.svelte +1 -0
  84. package/src/Modal/Content.svelte +6 -0
  85. package/src/Modal/CustomContent.svelte +38 -0
  86. package/src/Modal/Modal.svelte +165 -0
  87. package/src/Modal/Modal.svench +117 -0
  88. package/src/Modal/ModalContent.svelte +192 -0
  89. package/src/Modal/QuizModal.svelte +54 -0
  90. package/src/Notification/Notification.svelte +70 -0
  91. package/src/Notification/NotificationDisplay.svelte +43 -0
  92. package/src/Pagination/Pagination.svelte +57 -0
  93. package/src/Popover/Popover.svelte +77 -0
  94. package/src/Popover/Popover.svench +121 -0
  95. package/src/ProgressBar/ProgressBar.svelte +54 -0
  96. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  97. package/src/SideNavigation/Item.svelte +47 -0
  98. package/src/SideNavigation/Navigation.svelte +12 -0
  99. package/src/StatusLight/StatusLight.svelte +80 -0
  100. package/src/Stores/Notifications.svench.svx +78 -0
  101. package/src/Stores/banner.js +37 -0
  102. package/src/Stores/notifications.js +84 -0
  103. package/src/Table/ArrayRenderer.svelte +17 -0
  104. package/src/Table/AttachmentRenderer.svelte +67 -0
  105. package/src/Table/BoldRenderer.svelte +15 -0
  106. package/src/Table/BooleanRenderer.svelte +42 -0
  107. package/src/Table/CellRenderer.svelte +69 -0
  108. package/src/Table/CodeRenderer.svelte +14 -0
  109. package/src/Table/DateTimeRenderer.svelte +29 -0
  110. package/src/Table/InternalRenderer.svelte +24 -0
  111. package/src/Table/RelationshipRenderer.svelte +40 -0
  112. package/src/Table/SelectEditRenderer.svelte +28 -0
  113. package/src/Table/StringRenderer.svelte +14 -0
  114. package/src/Table/Table.svelte +635 -0
  115. package/src/Table/index.js +1 -0
  116. package/src/Tabs/Tab.svelte +88 -0
  117. package/src/Tabs/Tabs.svelte +125 -0
  118. package/src/Tags/Tag.svelte +43 -0
  119. package/src/Tags/Tags.svelte +7 -0
  120. package/src/Tooltip/Tooltip.svelte +34 -0
  121. package/src/Tooltip/TooltipWrapper.svelte +60 -0
  122. package/src/TreeView/Item.svelte +41 -0
  123. package/src/TreeView/Tree.svelte +16 -0
  124. package/src/Typography/Body.svelte +21 -0
  125. package/src/Typography/Code.svelte +10 -0
  126. package/src/Typography/Detail.svelte +19 -0
  127. package/src/Typography/Heading.svelte +17 -0
  128. package/src/bbui.css +96 -0
  129. package/src/context.js +3 -0
  130. package/src/helpers.js +134 -0
  131. package/src/index.js +97 -11
  132. package/src/spectrum-icons-rollup.js +31 -0
  133. package/src/spectrum-icons-vite.js +31 -0
  134. package/dist/bundle.css +0 -7
  135. package/dist/bundle.css.map +0 -20
  136. package/dist/index.js +0 -1100
  137. package/dist/index.mjs +0 -1086
  138. package/src/Branding/Budibase-logo.svelte +0 -68
  139. package/src/Branding/Logo.svelte +0 -16
  140. package/src/Branding/Logo.svench +0 -8
  141. package/src/Form/Button.svelte +0 -131
  142. package/src/Form/Button.svench +0 -49
  143. package/src/Form/Input.svench +0 -8
  144. package/src/Form/Select.svench +0 -8
  145. package/src/Form/TextArea.svench +0 -8
  146. package/src/Links/Home.svelte +0 -49
  147. package/src/Links/Home.svench +0 -19
  148. package/src/List/Items/DetailSummary.svelte +0 -66
  149. package/src/List/Items/DetailSummary.svench +0 -15
  150. package/src/actions/autoresize_textarea.js +0 -14
  151. package/src/icons/Contribution.svelte +0 -14
  152. package/src/index.svench.svx +0 -35
package/package.json CHANGED
@@ -1,35 +1,33 @@
1
1
  {
2
2
  "name": "@budibase/bbui",
3
3
  "description": "A UI solution used in the different Budibase projects.",
4
- "version": "1.3.0",
4
+ "version": "1.3.3",
5
+ "license": "MPL-2.0",
5
6
  "svelte": "src/index.js",
6
- "module": "dist/index.mjs",
7
- "main": "dist/index.js",
7
+ "module": "dist/bbui.es.js",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/bbui.es.js"
11
+ },
12
+ "./package.json": "./package.json",
13
+ "./spectrum-icons-rollup.js": "./src/spectrum-icons-rollup.js",
14
+ "./spectrum-icons-vite.js": "./src/spectrum-icons-vite.js"
15
+ },
8
16
  "scripts": {
9
- "start": "sirv public",
10
- "build": "rollup --config",
11
- "dev": "rollup --config --watch",
12
- "prepublishOnly": "npm run build",
13
- "svench": "cross-env SVENCH=1 rollup -cw",
14
- "svench:nollup": "cross-env SVENCH=1 nollup --hot --port 42421 --virtual-write public --watch src --watch '.svench/*' --watch node_modules/svench/tmp --config",
15
- "svench:nollup:dev": "yarn svench:nollup --watch ../svench/src --watch ../svench/*.js",
16
- "build:svench": "cross-env SVENCH=1 rollup -c",
17
- "test": "echo TODO"
17
+ "build": "rollup -c"
18
18
  },
19
19
  "devDependencies": {
20
- "@rollup/plugin-commonjs": "11.0.2",
21
- "@rollup/plugin-node-resolve": "^6.0.0",
20
+ "@rollup/plugin-commonjs": "^16.0.0",
21
+ "@rollup/plugin-json": "^4.1.0",
22
+ "@rollup/plugin-node-resolve": "^11.2.1",
22
23
  "cross-env": "^7.0.2",
23
- "nollup": "rixo/nollup#next",
24
- "rehype-add-classes": "^1.0.0",
25
- "rollup": "^2.10.9",
26
- "rollup-plugin-delete": "^1.2.0",
27
- "rollup-plugin-hot": "^0.0.25",
28
- "rollup-plugin-postcss-hot": "^0.0.5",
29
- "rollup-plugin-svelte-hot": "^0.8.0",
30
- "semantic-release": "^17.0.8",
31
- "svelte": "^3.22.0",
32
- "svench": "^0.0.9-10"
24
+ "nollup": "^0.14.1",
25
+ "postcss": "^8.2.9",
26
+ "rollup": "^2.45.2",
27
+ "rollup-plugin-postcss": "^4.0.0",
28
+ "rollup-plugin-svelte": "^7.1.0",
29
+ "rollup-plugin-terser": "^7.0.2",
30
+ "svelte": "^3.38.2"
33
31
  },
34
32
  "keywords": [
35
33
  "svelte"
@@ -39,6 +37,53 @@
39
37
  "dist"
40
38
  ],
41
39
  "dependencies": {
42
- "sirv-cli": "^0.4.6"
43
- }
40
+ "@adobe/spectrum-css-workflow-icons": "^1.2.1",
41
+ "@budibase/string-templates": "^1.3.3",
42
+ "@spectrum-css/actionbutton": "^1.0.1",
43
+ "@spectrum-css/actiongroup": "^1.0.1",
44
+ "@spectrum-css/avatar": "^3.0.2",
45
+ "@spectrum-css/button": "^3.0.1",
46
+ "@spectrum-css/buttongroup": "^3.0.2",
47
+ "@spectrum-css/checkbox": "^3.0.2",
48
+ "@spectrum-css/dialog": "^3.0.1",
49
+ "@spectrum-css/divider": "^1.0.3",
50
+ "@spectrum-css/dropzone": "^3.0.2",
51
+ "@spectrum-css/fieldgroup": "^3.0.2",
52
+ "@spectrum-css/fieldlabel": "^3.0.1",
53
+ "@spectrum-css/icon": "^3.0.1",
54
+ "@spectrum-css/illustratedmessage": "^3.0.2",
55
+ "@spectrum-css/inlinealert": "^2.0.1",
56
+ "@spectrum-css/inputgroup": "^3.0.2",
57
+ "@spectrum-css/label": "^2.0.10",
58
+ "@spectrum-css/link": "^3.1.1",
59
+ "@spectrum-css/menu": "^3.0.1",
60
+ "@spectrum-css/modal": "^3.0.1",
61
+ "@spectrum-css/pagination": "^3.0.3",
62
+ "@spectrum-css/picker": "^1.0.1",
63
+ "@spectrum-css/popover": "^3.0.1",
64
+ "@spectrum-css/progressbar": "^1.0.2",
65
+ "@spectrum-css/progresscircle": "^1.0.2",
66
+ "@spectrum-css/radio": "^3.0.2",
67
+ "@spectrum-css/search": "^3.0.2",
68
+ "@spectrum-css/sidenav": "^3.0.2",
69
+ "@spectrum-css/slider": "3.0.1",
70
+ "@spectrum-css/statuslight": "^3.0.2",
71
+ "@spectrum-css/stepper": "^3.0.3",
72
+ "@spectrum-css/switch": "^1.0.2",
73
+ "@spectrum-css/table": "^3.0.1",
74
+ "@spectrum-css/tabs": "^3.2.12",
75
+ "@spectrum-css/tags": "^3.0.2",
76
+ "@spectrum-css/textfield": "^3.0.1",
77
+ "@spectrum-css/toast": "^3.0.1",
78
+ "@spectrum-css/tooltip": "^3.0.3",
79
+ "@spectrum-css/treeview": "^3.0.2",
80
+ "@spectrum-css/typography": "^3.0.1",
81
+ "@spectrum-css/underlay": "^2.0.9",
82
+ "@spectrum-css/vars": "^3.0.1",
83
+ "dayjs": "^1.10.4",
84
+ "easymde": "^2.16.1",
85
+ "svelte-flatpickr": "^3.2.3",
86
+ "svelte-portal": "^1.0.0"
87
+ },
88
+ "gitHead": "6f8f76a76420f70ed3f365909daa6b3427eac46f"
44
89
  }
@@ -0,0 +1,102 @@
1
+ <script>
2
+ import "@spectrum-css/actionbutton/dist/index-vars.css"
3
+ import { createEventDispatcher } from "svelte"
4
+ const dispatch = createEventDispatcher()
5
+
6
+ export let quiet = false
7
+ export let emphasized = false
8
+ export let selected = false
9
+ export let longPressable = false
10
+ export let disabled = false
11
+ export let icon = ""
12
+ export let dataCy = null
13
+ export let size = "M"
14
+ export let active = false
15
+ export let fullWidth = false
16
+ export let noPadding = false
17
+
18
+ function longPress(element) {
19
+ if (!longPressable) return
20
+ let timer
21
+
22
+ const listener = () => {
23
+ timer = setTimeout(() => {
24
+ dispatch("longpress")
25
+ }, 700)
26
+ }
27
+
28
+ element.addEventListener("pointerdown", listener)
29
+
30
+ return {
31
+ destroy() {
32
+ clearTimeout(timer)
33
+ element.removeEventListener("pointerdown", longPress)
34
+ },
35
+ }
36
+ }
37
+ </script>
38
+
39
+ <button
40
+ data-cy={dataCy}
41
+ use:longPress
42
+ class:spectrum-ActionButton--quiet={quiet}
43
+ class:spectrum-ActionButton--emphasized={emphasized}
44
+ class:is-selected={selected}
45
+ class:noPadding
46
+ class:fullWidth
47
+ class="spectrum-ActionButton spectrum-ActionButton--size{size}"
48
+ class:active
49
+ {disabled}
50
+ on:longPress
51
+ on:click|preventDefault
52
+ >
53
+ {#if longPressable}
54
+ <svg
55
+ class="spectrum-Icon spectrum-UIIcon-CornerTriangle100 spectrum-ActionButton-hold"
56
+ focusable="false"
57
+ aria-hidden="true"
58
+ >
59
+ <use xlink:href="#spectrum-css-icon-CornerTriangle100" />
60
+ </svg>
61
+ {/if}
62
+ {#if icon}
63
+ <svg
64
+ class="spectrum-Icon spectrum-Icon--size{size}"
65
+ focusable="false"
66
+ aria-hidden="true"
67
+ aria-label={icon}
68
+ >
69
+ <use xlink:href="#spectrum-icon-18-{icon}" />
70
+ </svg>
71
+ {/if}
72
+ {#if $$slots}
73
+ <span class="spectrum-ActionButton-label"><slot /></span>
74
+ {/if}
75
+ </button>
76
+
77
+ <style>
78
+ .fullWidth {
79
+ width: 100%;
80
+ }
81
+ .active,
82
+ .active svg {
83
+ color: var(--spectrum-global-color-blue-600);
84
+ }
85
+ :global([dir="ltr"] .spectrum-ActionButton .spectrum-Icon) {
86
+ margin-left: 0;
87
+ transition: color ease-out 130ms;
88
+ }
89
+ .is-selected:not(.spectrum-ActionButton--emphasized) {
90
+ background: var(--spectrum-global-color-gray-300);
91
+ }
92
+ .noPadding {
93
+ padding: 0;
94
+ min-width: 0;
95
+ }
96
+ .spectrum-ActionButton--quiet {
97
+ padding: 0 8px;
98
+ }
99
+ .is-selected:not(.emphasized) .spectrum-Icon {
100
+ color: var(--spectrum-global-color-gray-900);
101
+ }
102
+ </style>
@@ -0,0 +1,26 @@
1
+ <script>
2
+ import "@spectrum-css/actiongroup/dist/index-vars.css"
3
+ export let vertical = false
4
+ export let justified = false
5
+ export let quiet = false
6
+ export let compact = false
7
+
8
+ // Attaches a spectrum-ActionGroup-item class to buttons inside the div
9
+ function group(element) {
10
+ const buttons = Array.from(element.getElementsByTagName("button"))
11
+ buttons.forEach(button => {
12
+ button.classList.add("spectrum-ActionGroup-item")
13
+ })
14
+ }
15
+ </script>
16
+
17
+ <div
18
+ use:group
19
+ class:spectrum-ActionGroup--vertical={vertical}
20
+ class:spectrum-ActionGroup--justified={justified}
21
+ class:spectrum-ActionGroup--quiet={quiet}
22
+ class:spectrum-ActionGroup--compact={compact}
23
+ class="spectrum-ActionGroup"
24
+ >
25
+ <slot />
26
+ </div>
@@ -0,0 +1,44 @@
1
+ <script>
2
+ import { setContext } from "svelte"
3
+ import Popover from "../Popover/Popover.svelte"
4
+ import Menu from "../Menu/Menu.svelte"
5
+
6
+ export let disabled = false
7
+ export let align = "left"
8
+ export let portalTarget
9
+ export let dataCy
10
+
11
+ let anchor
12
+ let dropdown
13
+
14
+ // This is needed because display: contents is considered "invisible".
15
+ // It should only ever be an action button, so should be fine.
16
+ function getAnchor(node) {
17
+ anchor = node.firstChild
18
+ }
19
+
20
+ export const hide = () => {
21
+ dropdown.hide()
22
+ }
23
+ export const show = () => {
24
+ dropdown.show()
25
+ }
26
+
27
+ const openMenu = event => {
28
+ if (!disabled) {
29
+ event.stopPropagation()
30
+ show()
31
+ }
32
+ }
33
+
34
+ setContext("actionMenu", { show, hide })
35
+ </script>
36
+
37
+ <div use:getAnchor on:click={openMenu}>
38
+ <slot name="control" />
39
+ </div>
40
+ <Popover bind:this={dropdown} {anchor} {align} {portalTarget} {dataCy}>
41
+ <Menu>
42
+ <slot />
43
+ </Menu>
44
+ </Popover>
@@ -0,0 +1,30 @@
1
+ <script>
2
+ import { View } from "svench";
3
+ import Multiselect from "../Form/Multiselect.svelte";
4
+ import DropdownMenu from "../DropdownMenu/DropdownMenu.svelte";
5
+ import Button from "../Button/Button.svelte";
6
+ import Icon from "../Icons/Icon.svelte";
7
+
8
+ const options = ["Red", "Blue", "Yellow", "Green", "Pink", "Very long color name to show text wrapping"];
9
+
10
+ let anchorLeft;
11
+ let dropdownLeft;
12
+ </script>
13
+
14
+ ### Click Outside Action
15
+
16
+ This action can be used to listen for when you want to call a function whenever a user clicks outside of the element it is applied toString.
17
+
18
+
19
+ ```html
20
+ <script>
21
+ import { clickOutside } from '@budibase/bbui'
22
+ const someFunction = () => {
23
+ // Some logic to close a dropdown or stop the user from doing something without saving?
24
+ }
25
+ </script>
26
+
27
+ <button use:clickOutside={someFunction} class="multiselect" bind:this={anchor}>
28
+ Clicking this opens the
29
+ </button>
30
+ ```
@@ -0,0 +1,81 @@
1
+ <script>
2
+ import { View } from "svench";
3
+ import Multiselect from "../Form/Multiselect.svelte";
4
+ import DropdownMenu from "../DropdownMenu/DropdownMenu.svelte";
5
+ import Button from "../Button/Button.svelte";
6
+ import Icon from "../Icons/Icon.svelte";
7
+
8
+ const options = ["Red", "Blue", "Yellow", "Green", "Pink", "Very long color name to show text wrapping"];
9
+
10
+ let anchorLeft;
11
+ let dropdownLeft;
12
+ </script>
13
+
14
+ ### Position Dropdown Action
15
+
16
+ This action positions an element close to it's anchor, either above or below it, depending on the amount of space that exists. There's also an option to align the dropdown to the right instead of the left of the anchor. An example of how to use it follows:
17
+
18
+ ```html
19
+ <script>
20
+ let visible = false;
21
+ let anchor;
22
+ let align = 'right';
23
+ </script>
24
+
25
+ <button on:click={() => visible = !visible} class="multiselect" bind:this={anchor}>
26
+ Clicking this opens the
27
+ </button>
28
+
29
+ {#if visible}
30
+ <Portal>
31
+ <div use:positionDropdown={{anchor, align}}>
32
+ Some content here.
33
+ </div>
34
+ </Portal>
35
+ {/if}
36
+ ```
37
+
38
+ Here are some components that currently use this action:
39
+
40
+ <View name="Multiselect Example">
41
+ <Multiselect name="Test" label="Colours" placeholder="Choose some colours">
42
+ {#each options as option}
43
+ <option value={option}>{option}</option>
44
+ {/each}
45
+ </Multiselect>
46
+ </View>
47
+
48
+ <View name="Dropdown on close event example">
49
+ <div bind:this={anchorLeft}>
50
+ <Button primary on:click={dropdownLeft.show}>
51
+ Field Name
52
+ <Icon name="arrowdown" />
53
+ </Button>
54
+ </div>
55
+ <DropdownMenu
56
+ on:close={() => alert('Closed!')}
57
+ bind:this={dropdownLeft}
58
+ width="175px"
59
+ borderColor="#d1d1d1ff"
60
+ anchor={anchorLeft}
61
+ align="left">
62
+ <ul>
63
+ <li>
64
+ <Icon name="edit" />
65
+ Edit
66
+ </li>
67
+ <li>
68
+ <Icon name="delete" />
69
+ Delete
70
+ </li>
71
+ <li>
72
+ <Icon name="sortascending" />
73
+ Sort A - Z
74
+ </li>
75
+ <li>
76
+ <Icon name="sortdescending" />
77
+ Sort Z - A
78
+ </li>
79
+ </ul>
80
+ </DropdownMenu>
81
+ </View>
@@ -0,0 +1,14 @@
1
+ function resize({ target }) {
2
+ target.style.height = "1px"
3
+ target.style.height = +target.scrollHeight + "px"
4
+ }
5
+
6
+ export default function text_area_resize(el) {
7
+ resize({ target: el })
8
+ el.style.overflow = "hidden"
9
+ el.addEventListener("input", resize)
10
+
11
+ return {
12
+ destroy: () => el.removeEventListener("input", resize),
13
+ }
14
+ }
@@ -0,0 +1,18 @@
1
+ export default function clickOutside(element, callbackFunction) {
2
+ function onClick(event) {
3
+ if (!element.contains(event.target)) {
4
+ callbackFunction()
5
+ }
6
+ }
7
+
8
+ document.body.addEventListener("mousedown", onClick, true)
9
+
10
+ return {
11
+ update(newCallbackFunction) {
12
+ callbackFunction = newCallbackFunction
13
+ },
14
+ destroy() {
15
+ document.body.removeEventListener("mousedown", onClick, true)
16
+ },
17
+ }
18
+ }
@@ -0,0 +1,66 @@
1
+ export default function positionDropdown(element, { anchor, align }) {
2
+ let positionSide = "top"
3
+ let maxHeight = 0
4
+ let dimensions = getDimensions(anchor)
5
+
6
+ function getDimensions() {
7
+ const {
8
+ bottom,
9
+ top: spaceAbove,
10
+ left,
11
+ width,
12
+ } = anchor.getBoundingClientRect()
13
+ const spaceBelow = window.innerHeight - bottom
14
+ const containerRect = element.getBoundingClientRect()
15
+
16
+ let y
17
+
18
+ if (spaceAbove > spaceBelow) {
19
+ positionSide = "bottom"
20
+ maxHeight = spaceAbove - 20
21
+ y = window.innerHeight - spaceAbove + 5
22
+ } else {
23
+ positionSide = "top"
24
+ y = bottom + 5
25
+ maxHeight = spaceBelow - 20
26
+ }
27
+
28
+ return {
29
+ [positionSide]: y,
30
+ left,
31
+ width,
32
+ containerWidth: containerRect.width,
33
+ }
34
+ }
35
+
36
+ function calcLeftPosition() {
37
+ return align === "right"
38
+ ? dimensions.left + dimensions.width - dimensions.containerWidth
39
+ : dimensions.left
40
+ }
41
+
42
+ element.style.position = "absolute"
43
+ element.style.zIndex = "9999"
44
+ element.style.minWidth = `${dimensions.width}px`
45
+ element.style.maxHeight = `${maxHeight.toFixed(0)}px`
46
+ element.style.transformOrigin = `center ${positionSide}`
47
+ element.style[positionSide] = `${dimensions[positionSide]}px`
48
+ element.style.left = `${calcLeftPosition(dimensions).toFixed(0)}px`
49
+
50
+ const resizeObserver = new ResizeObserver(entries => {
51
+ entries.forEach(() => {
52
+ dimensions = getDimensions()
53
+ element.style[positionSide] = `${dimensions[positionSide]}px`
54
+ element.style.left = `${calcLeftPosition(dimensions).toFixed(0)}px`
55
+ })
56
+ })
57
+
58
+ resizeObserver.observe(anchor)
59
+ resizeObserver.observe(element)
60
+
61
+ return {
62
+ destroy() {
63
+ resizeObserver.disconnect()
64
+ },
65
+ }
66
+ }
@@ -0,0 +1,62 @@
1
+ <script>
2
+ import "@spectrum-css/avatar/dist/index-vars.css"
3
+ let sizes = new Map([
4
+ ["XXS", "--spectrum-alias-avatar-size-50"],
5
+ ["XS", "--spectrum-alias-avatar-size-75"],
6
+ ["S", "--spectrum-alias-avatar-size-200"],
7
+ ["M", "--spectrum-alias-avatar-size-400"],
8
+ ["L", "--spectrum-alias-avatar-size-500"],
9
+ ["XL", "--spectrum-alias-avatar-size-600"],
10
+ ["XXL", "--spectrum-alias-avatar-size-700"],
11
+ ])
12
+ export let size = "M"
13
+ export let url = ""
14
+ export let disabled = false
15
+ export let initials = "JD"
16
+
17
+ const DefaultColor = "#3aab87"
18
+
19
+ $: color = getColor(initials)
20
+
21
+ const getColor = initials => {
22
+ if (!initials?.length) {
23
+ return DefaultColor
24
+ }
25
+ const code = initials[0].toLowerCase().charCodeAt(0)
26
+ const hue = ((code % 26) / 26) * 360
27
+ return `hsl(${hue}, 50%, 50%)`
28
+ }
29
+ </script>
30
+
31
+ {#if url}
32
+ <img
33
+ class:is-disabled={disabled}
34
+ class="spectrum-Avatar"
35
+ src={url}
36
+ alt="Avatar"
37
+ style="width: var({sizes.get(size)}); height: var({sizes.get(size)});"
38
+ />
39
+ {:else}
40
+ <div
41
+ class="spectrum-Avatar"
42
+ class:is-disabled={disabled}
43
+ style="width: var({sizes.get(size)}); height: var({sizes.get(
44
+ size
45
+ )}); font-size: calc(var({sizes.get(size)}) / 2); background: {color};"
46
+ >
47
+ {initials || ""}
48
+ </div>
49
+ {/if}
50
+
51
+ <style>
52
+ div {
53
+ color: white;
54
+ display: grid;
55
+ place-items: center;
56
+ font-weight: 600;
57
+ border-radius: 50%;
58
+ overflow: hidden;
59
+ user-select: none;
60
+ text-transform: uppercase;
61
+ }
62
+ </style>
@@ -0,0 +1,29 @@
1
+ <script>
2
+ import "@spectrum-css/label/dist/index-vars.css"
3
+
4
+ export let size = "M"
5
+ export let grey = false
6
+ export let red = false
7
+ export let orange = false
8
+ export let yellow = false
9
+ export let seafoam = false
10
+ export let green = false
11
+ export let active = false
12
+ export let inactive = false
13
+ </script>
14
+
15
+ <span
16
+ class="spectrum-Label"
17
+ class:spectrum-Label--small={size === "S"}
18
+ class:spectrum-Label--large={size === "L"}
19
+ class:spectrum-Label--grey={grey}
20
+ class:spectrum-Label--red={red}
21
+ class:spectrum-Label--green={green}
22
+ class:spectrum-Label--orange={orange}
23
+ class:spectrum-Label--yellow={yellow}
24
+ class:spectrum-Label--seafoam={seafoam}
25
+ class:spectrum-Label--active={active}
26
+ class:spectrum-Label--inactive={inactive}
27
+ >
28
+ <slot />
29
+ </span>
@@ -0,0 +1,72 @@
1
+ <script>
2
+ import { createEventDispatcher } from "svelte"
3
+
4
+ let dispatch = createEventDispatcher()
5
+
6
+ export let type = "info"
7
+ export let icon = "Info"
8
+ export let size = "S"
9
+ export let extraButtonText
10
+ export let extraButtonAction
11
+ export let showCloseButton = true
12
+
13
+ let show = true
14
+
15
+ function clear() {
16
+ show = false
17
+ dispatch("change")
18
+ }
19
+ </script>
20
+
21
+ {#if show}
22
+ <div class="spectrum-Toast spectrum-Toast--{type}">
23
+ <svg
24
+ class="spectrum-Icon spectrum-Icon--size{size} spectrum-Toast-typeIcon"
25
+ focusable="false"
26
+ aria-hidden="true"
27
+ >
28
+ <use xlink:href="#spectrum-icon-18-{icon}" />
29
+ </svg>
30
+ <div class="spectrum-Toast-body">
31
+ <div class="spectrum-Toast-content">
32
+ <slot />
33
+ </div>
34
+ {#if extraButtonText && extraButtonAction}
35
+ <button
36
+ class="spectrum-Button spectrum-Button--sizeM spectrum-Button--overBackground spectrum-Button--quiet"
37
+ on:click={extraButtonAction}
38
+ >
39
+ <span class="spectrum-Button-label">{extraButtonText}</span>
40
+ </button>
41
+ {/if}
42
+ </div>
43
+ {#if showCloseButton}
44
+ <div class="spectrum-Toast-buttons">
45
+ <button
46
+ class="spectrum-ClearButton spectrum-ClearButton--overBackground spectrum-ClearButton--size{size}"
47
+ on:click={clear}
48
+ >
49
+ <div class="spectrum-ClearButton-fill">
50
+ <svg
51
+ class="spectrum-ClearButton-icon spectrum-Icon spectrum-UIIcon-Cross100"
52
+ focusable="false"
53
+ aria-hidden="true"
54
+ >
55
+ <use xlink:href="#spectrum-css-icon-Cross100" />
56
+ </svg>
57
+ </div>
58
+ </button>
59
+ </div>
60
+ {/if}
61
+ </div>
62
+ {/if}
63
+
64
+ <style>
65
+ .spectrum-Toast {
66
+ pointer-events: all;
67
+ width: 100%;
68
+ }
69
+ .spectrum-Button {
70
+ border: 1px solid rgba(255, 255, 255, 0.2);
71
+ }
72
+ </style>