@budibase/bbui 1.58.12 → 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
package/package.json CHANGED
@@ -1,39 +1,33 @@
1
1
  {
2
2
  "name": "@budibase/bbui",
3
3
  "description": "A UI solution used in the different Budibase projects.",
4
- "version": "1.58.12",
4
+ "version": "2.0.0",
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:rollup": "cross-env SVENCH=1 rollup -cw",
14
- "svench:nollup": "cross-env SVENCH=1 nollup",
15
- "svench:nollup:dev:help": "echo 'this script is used to dev Svench itself'",
16
- "svench:nollup:dev": "yarn svench:nollup --watch ../svench/src --watch ../svench/themes --watch ../svench/*.js",
17
- "svench": "npm run --silent svench:nollup",
18
- "build:svench": "cross-env SVENCH=1 rollup -c",
19
- "test": "echo TODO"
17
+ "build": "rollup -c"
20
18
  },
21
19
  "devDependencies": {
22
20
  "@rollup/plugin-commonjs": "^16.0.0",
23
21
  "@rollup/plugin-json": "^4.1.0",
24
- "@rollup/plugin-node-resolve": "^11.0.0",
22
+ "@rollup/plugin-node-resolve": "^11.2.1",
25
23
  "cross-env": "^7.0.2",
26
24
  "nollup": "^0.14.1",
27
- "rollup": "^2.34.0",
28
- "rollup-plugin-copy": "^3.3.0",
29
- "rollup-plugin-delete": "^1.2.0",
30
- "rollup-plugin-hot": "^0.1.1",
31
- "rollup-plugin-node-builtins": "^2.1.2",
32
- "rollup-plugin-postcss-hot": "^0.0.5",
33
- "rollup-plugin-svelte-hot": "^0.11.0",
34
- "semantic-release": "^17.0.8",
35
- "svelte": "^3.29.0",
36
- "svench": "^0.0.10-7"
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"
37
31
  },
38
32
  "keywords": [
39
33
  "svelte"
@@ -43,11 +37,53 @@
43
37
  "dist"
44
38
  ],
45
39
  "dependencies": {
46
- "markdown-it": "^12.0.2",
47
- "quill": "^1.3.7",
48
- "sirv-cli": "^0.4.6",
49
- "svelte-flatpickr": "^2.4.0",
50
- "svelte-portal": "^1.0.0",
51
- "turndown": "^7.0.0"
52
- }
40
+ "@adobe/spectrum-css-workflow-icons": "^1.2.1",
41
+ "@budibase/string-templates": "^2.0.0",
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": "d332e035d8e3416e82db5f1153a15fcf69b05f94"
53
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>
@@ -1,14 +1,14 @@
1
1
  function resize({ target }) {
2
- target.style.height = "1px";
3
- target.style.height = (+target.scrollHeight) + "px";
2
+ target.style.height = "1px"
3
+ target.style.height = +target.scrollHeight + "px"
4
4
  }
5
5
 
6
6
  export default function text_area_resize(el) {
7
- resize({ target: el });
8
- el.style.overflow = 'hidden';
9
- el.addEventListener('input', resize);
7
+ resize({ target: el })
8
+ el.style.overflow = "hidden"
9
+ el.addEventListener("input", resize)
10
10
 
11
- return {
12
- destroy: () => el.removeEventListener('input', resize)
13
- }
14
- }
11
+ return {
12
+ destroy: () => el.removeEventListener("input", resize),
13
+ }
14
+ }
@@ -1,18 +1,18 @@
1
1
  export default function clickOutside(element, callbackFunction) {
2
2
  function onClick(event) {
3
3
  if (!element.contains(event.target)) {
4
- callbackFunction();
4
+ callbackFunction()
5
5
  }
6
6
  }
7
7
 
8
- document.body.addEventListener("click", onClick, true);
8
+ document.body.addEventListener("mousedown", onClick, true)
9
9
 
10
10
  return {
11
11
  update(newCallbackFunction) {
12
- callbackFunction = newCallbackFunction;
12
+ callbackFunction = newCallbackFunction
13
13
  },
14
14
  destroy() {
15
- document.body.removeEventListener("click", onClick, true);
15
+ document.body.removeEventListener("mousedown", onClick, true)
16
16
  },
17
- };
17
+ }
18
18
  }
@@ -1,7 +1,7 @@
1
- export default function positionDropdown(element, { anchor, align }) {
2
- let positionSide = "top";
3
- let maxHeight = 0;
4
- let dimensions = getDimensions(anchor);
1
+ export default function positionDropdown(element, { anchor, align, maxWidth }) {
2
+ let positionSide = "top"
3
+ let maxHeight = 0
4
+ let dimensions = getDimensions(anchor)
5
5
 
6
6
  function getDimensions() {
7
7
  const {
@@ -9,20 +9,20 @@ export default function positionDropdown(element, { anchor, align }) {
9
9
  top: spaceAbove,
10
10
  left,
11
11
  width,
12
- } = anchor.getBoundingClientRect();
13
- const spaceBelow = window.innerHeight - bottom;
14
- const containerRect = element.getBoundingClientRect();
12
+ } = anchor.getBoundingClientRect()
13
+ const spaceBelow = window.innerHeight - bottom
14
+ const containerRect = element.getBoundingClientRect()
15
15
 
16
- let y;
16
+ let y
17
17
 
18
18
  if (spaceAbove > spaceBelow) {
19
- positionSide = "bottom";
20
- maxHeight = spaceAbove - 20;
21
- y = window.innerHeight - spaceAbove;
19
+ positionSide = "bottom"
20
+ maxHeight = spaceAbove - 20
21
+ y = window.innerHeight - spaceAbove + 5
22
22
  } else {
23
- positionSide = "top";
24
- y = bottom;
25
- maxHeight = spaceBelow - 20;
23
+ positionSide = "top"
24
+ y = bottom + 5
25
+ maxHeight = spaceBelow - 20
26
26
  }
27
27
 
28
28
  return {
@@ -30,37 +30,46 @@ export default function positionDropdown(element, { anchor, align }) {
30
30
  left,
31
31
  width,
32
32
  containerWidth: containerRect.width,
33
- };
33
+ }
34
34
  }
35
35
 
36
36
  function calcLeftPosition() {
37
- return align === "right"
38
- ? dimensions.left + dimensions.width - dimensions.containerWidth
39
- : dimensions.left;
40
- }
37
+ let left
41
38
 
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
- for (let entry of entries) {
52
- dimensions = getDimensions();
53
- element.style[positionSide] = `${dimensions[positionSide]}px`;
54
- element.style.left = `${calcLeftPosition(dimensions).toFixed(0)}px`;
39
+ if (align == "right") {
40
+ left = dimensions.left + dimensions.width - dimensions.containerWidth
41
+ } else if (align == "right-side") {
42
+ left = dimensions.left + dimensions.width
43
+ } else {
44
+ left = dimensions.left
55
45
  }
56
- });
57
46
 
58
- resizeObserver.observe(anchor);
59
- resizeObserver.observe(element);
47
+ return left
48
+ }
60
49
 
50
+ element.style.position = "absolute"
51
+ element.style.zIndex = "9999"
52
+ if (maxWidth) {
53
+ element.style.maxWidth = `${maxWidth}px`
54
+ }
55
+ element.style.minWidth = `${dimensions.width}px`
56
+ element.style.maxHeight = `${maxHeight.toFixed(0)}px`
57
+ element.style.transformOrigin = `center ${positionSide}`
58
+ element.style[positionSide] = `${dimensions[positionSide]}px`
59
+ element.style.left = `${calcLeftPosition(dimensions).toFixed(0)}px`
60
+
61
+ const resizeObserver = new ResizeObserver(entries => {
62
+ entries.forEach(() => {
63
+ dimensions = getDimensions()
64
+ element.style[positionSide] = `${dimensions[positionSide]}px`
65
+ element.style.left = `${calcLeftPosition(dimensions).toFixed(0)}px`
66
+ })
67
+ })
68
+ resizeObserver.observe(anchor)
69
+ resizeObserver.observe(element)
61
70
  return {
62
71
  destroy() {
63
- resizeObserver.disconnect();
72
+ resizeObserver.disconnect()
64
73
  },
65
- };
74
+ }
66
75
  }
@@ -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>
@@ -0,0 +1,41 @@
1
+ <script>
2
+ import "@spectrum-css/toast/dist/index-vars.css"
3
+ import Portal from "svelte-portal"
4
+ import { banner } from "../Stores/banner"
5
+ import Banner from "./Banner.svelte"
6
+ import { fly } from "svelte/transition"
7
+ import TooltipWrapper from "../Tooltip/TooltipWrapper.svelte"
8
+ </script>
9
+
10
+ <Portal target=".banner-container">
11
+ <div class="banner">
12
+ {#each $banner.messages as message}
13
+ <div transition:fly={{ y: -30 }}>
14
+ <Banner
15
+ type={message.type}
16
+ extraButtonText={message.extraButtonText}
17
+ extraButtonAction={message.extraButtonAction}
18
+ on:change={() => {
19
+ if (message.onChange) {
20
+ message.onChange()
21
+ }
22
+ }}
23
+ showCloseButton={typeof message.showCloseButton === "boolean"
24
+ ? message.showCloseButton
25
+ : true}
26
+ >
27
+ <TooltipWrapper tooltip={message.tooltip} disabled={false}>
28
+ {message.message}
29
+ </TooltipWrapper>
30
+ </Banner>
31
+ </div>
32
+ {/each}
33
+ </div>
34
+ </Portal>
35
+
36
+ <style>
37
+ .banner {
38
+ pointer-events: none;
39
+ width: 100%;
40
+ }
41
+ </style>