@budibase/bbui 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +375 -0
- package/README.md +19 -17
- package/dist/bbui.es.js +210 -0
- package/dist/bbui.es.js.map +1 -0
- package/package.json +71 -26
- package/src/ActionButton/ActionButton.svelte +102 -0
- package/src/ActionGroup/ActionGroup.svelte +26 -0
- package/src/ActionMenu/ActionMenu.svelte +44 -0
- package/src/Actions/ClickOutside.svench.svx +30 -0
- package/src/Actions/PositionDropdown.svench.svx +81 -0
- package/src/Actions/autoresize_textarea.js +14 -0
- package/src/Actions/click_outside.js +18 -0
- package/src/Actions/position_dropdown.js +66 -0
- package/src/Avatar/Avatar.svelte +62 -0
- package/src/Badge/Badge.svelte +29 -0
- package/src/Banner/Banner.svelte +72 -0
- package/src/Banner/BannerDisplay.svelte +31 -0
- package/src/Button/Button.svelte +114 -0
- package/src/Button/Button.svench +138 -0
- package/src/ButtonGroup/ButtonGroup.svelte +30 -0
- package/src/ClearButton/ClearButton.svelte +19 -0
- package/src/ColorPicker/ColorPicker.svelte +297 -0
- package/src/DetailSummary/DetailSummary.svelte +83 -0
- package/src/Divider/Divider.svelte +28 -0
- package/src/Drawer/Drawer.svelte +113 -0
- package/src/Drawer/Drawer.svench +42 -0
- package/src/Drawer/DrawerContent.svelte +46 -0
- package/src/Form/Checkbox.svelte +23 -0
- package/src/Form/Combobox.svelte +45 -0
- package/src/Form/Core/Checkbox.svelte +69 -0
- package/src/Form/Core/CheckboxGroup.svelte +68 -0
- package/src/Form/Core/Combobox.svelte +142 -0
- package/src/Form/Core/DatePicker.svelte +257 -0
- package/src/Form/Core/Dropzone.svelte +450 -0
- package/src/Form/Core/InputDropdown.svelte +228 -0
- package/src/Form/Core/Multiselect.svelte +90 -0
- package/src/Form/Core/Picker.svelte +259 -0
- package/src/Form/Core/PickerDropdown.svelte +436 -0
- package/src/Form/Core/RadioGroup.svelte +48 -0
- package/src/Form/Core/RichTextField.svelte +42 -0
- package/src/Form/Core/Search.svelte +105 -0
- package/src/Form/Core/Select.svelte +75 -0
- package/src/Form/Core/Slider.svelte +86 -0
- package/src/Form/Core/Stepper.svelte +172 -0
- package/src/Form/Core/Switch.svelte +37 -0
- package/src/Form/Core/TextArea.svelte +78 -0
- package/src/Form/Core/TextField.svelte +119 -0
- package/src/Form/Core/index.js +15 -0
- package/src/Form/DatePicker.svelte +39 -0
- package/src/Form/Dropzone.svelte +42 -0
- package/src/Form/Field.svelte +42 -0
- package/src/Form/FieldLabel.svelte +32 -0
- package/src/Form/Input.svelte +40 -45
- package/src/Form/InputDropdown.svelte +55 -0
- package/src/Form/Multiselect.svelte +40 -0
- package/src/Form/PickerDropdown.svelte +134 -0
- package/src/Form/RadioGroup.svelte +42 -0
- package/src/Form/RichTextField.svelte +36 -0
- package/src/Form/Search.svelte +36 -0
- package/src/Form/Select.svelte +48 -43
- package/src/Form/Slider.svelte +24 -0
- package/src/Form/Stepper.svelte +45 -0
- package/src/Form/TextArea.svelte +29 -44
- package/src/Form/Toggle.svelte +23 -0
- package/src/Icon/Icon.svelte +91 -0
- package/src/IconPicker/IconPicker.svelte +177 -0
- package/src/IconSideNav/IconSideNav.svelte +14 -0
- package/src/IconSideNav/IconSideNavItem.svelte +56 -0
- package/src/InlineAlert/InlineAlert.svelte +56 -0
- package/src/Label/Label.svelte +20 -0
- package/src/Layout/Layout.svelte +94 -0
- package/src/Layout/Page.svelte +32 -0
- package/src/Link/Link.svelte +24 -0
- package/src/List/List.svelte +28 -0
- package/src/List/ListItem.svelte +98 -0
- package/src/Markdown/MarkdownEditor.svelte +60 -0
- package/src/Markdown/MarkdownViewer.svelte +70 -0
- package/src/Markdown/SpectrumMDE.svelte +184 -0
- package/src/Menu/Item.svelte +96 -0
- package/src/Menu/Menu.svelte +7 -0
- package/src/Menu/Menu.svench +19 -0
- package/src/Menu/Section.svelte +10 -0
- package/src/Menu/Separator.svelte +1 -0
- package/src/Modal/Content.svelte +6 -0
- package/src/Modal/CustomContent.svelte +38 -0
- package/src/Modal/Modal.svelte +165 -0
- package/src/Modal/Modal.svench +117 -0
- package/src/Modal/ModalContent.svelte +192 -0
- package/src/Modal/QuizModal.svelte +54 -0
- package/src/Notification/Notification.svelte +70 -0
- package/src/Notification/NotificationDisplay.svelte +43 -0
- package/src/Pagination/Pagination.svelte +57 -0
- package/src/Popover/Popover.svelte +77 -0
- package/src/Popover/Popover.svench +121 -0
- package/src/ProgressBar/ProgressBar.svelte +54 -0
- package/src/ProgressCircle/ProgressCircle.svelte +62 -0
- package/src/SideNavigation/Item.svelte +47 -0
- package/src/SideNavigation/Navigation.svelte +12 -0
- package/src/StatusLight/StatusLight.svelte +80 -0
- package/src/Stores/Notifications.svench.svx +78 -0
- package/src/Stores/banner.js +37 -0
- package/src/Stores/notifications.js +84 -0
- package/src/Table/ArrayRenderer.svelte +17 -0
- package/src/Table/AttachmentRenderer.svelte +67 -0
- package/src/Table/BoldRenderer.svelte +15 -0
- package/src/Table/BooleanRenderer.svelte +42 -0
- package/src/Table/CellRenderer.svelte +69 -0
- package/src/Table/CodeRenderer.svelte +14 -0
- package/src/Table/DateTimeRenderer.svelte +29 -0
- package/src/Table/InternalRenderer.svelte +24 -0
- package/src/Table/RelationshipRenderer.svelte +40 -0
- package/src/Table/SelectEditRenderer.svelte +28 -0
- package/src/Table/StringRenderer.svelte +14 -0
- package/src/Table/Table.svelte +635 -0
- package/src/Table/index.js +1 -0
- package/src/Tabs/Tab.svelte +88 -0
- package/src/Tabs/Tabs.svelte +125 -0
- package/src/Tags/Tag.svelte +43 -0
- package/src/Tags/Tags.svelte +7 -0
- package/src/Tooltip/Tooltip.svelte +34 -0
- package/src/Tooltip/TooltipWrapper.svelte +60 -0
- package/src/TreeView/Item.svelte +41 -0
- package/src/TreeView/Tree.svelte +16 -0
- package/src/Typography/Body.svelte +21 -0
- package/src/Typography/Code.svelte +10 -0
- package/src/Typography/Detail.svelte +19 -0
- package/src/Typography/Heading.svelte +17 -0
- package/src/bbui.css +96 -0
- package/src/context.js +3 -0
- package/src/helpers.js +134 -0
- package/src/index.js +97 -11
- package/src/spectrum-icons-rollup.js +31 -0
- package/src/spectrum-icons-vite.js +31 -0
- package/dist/bundle.css +0 -7
- package/dist/bundle.css.map +0 -20
- package/dist/index.js +0 -1100
- package/dist/index.mjs +0 -1086
- package/src/Branding/Budibase-logo.svelte +0 -68
- package/src/Branding/Logo.svelte +0 -16
- package/src/Branding/Logo.svench +0 -8
- package/src/Form/Button.svelte +0 -131
- package/src/Form/Button.svench +0 -49
- package/src/Form/Input.svench +0 -8
- package/src/Form/Select.svench +0 -8
- package/src/Form/TextArea.svench +0 -8
- package/src/Links/Home.svelte +0 -49
- package/src/Links/Home.svench +0 -19
- package/src/List/Items/DetailSummary.svelte +0 -66
- package/src/List/Items/DetailSummary.svench +0 -15
- package/src/actions/autoresize_textarea.js +0 -14
- package/src/icons/Contribution.svelte +0 -14
- 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.
|
|
4
|
+
"version": "1.3.1",
|
|
5
|
+
"license": "MPL-2.0",
|
|
5
6
|
"svelte": "src/index.js",
|
|
6
|
-
"module": "dist/
|
|
7
|
-
"
|
|
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
|
-
"
|
|
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": "
|
|
21
|
-
"@rollup/plugin-
|
|
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": "
|
|
24
|
-
"
|
|
25
|
-
"rollup": "^2.
|
|
26
|
-
"rollup-plugin-
|
|
27
|
-
"rollup-plugin-
|
|
28
|
-
"rollup-plugin-
|
|
29
|
-
"
|
|
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
|
-
"
|
|
43
|
-
|
|
40
|
+
"@adobe/spectrum-css-workflow-icons": "^1.2.1",
|
|
41
|
+
"@budibase/string-templates": "^1.3.1",
|
|
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": "68d741c482a7a9c2ca2f4de6fedd809d06bd242b"
|
|
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>
|