@budibase/bbui 1.4.1 → 1.4.2
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 +14 -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 +75 -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 +41 -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 +60 -0
- package/src/Label/Label.svelte +29 -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 +190 -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 +78 -0
- package/src/Popover/Popover.svench +121 -0
- package/src/ProgressBar/ProgressBar.svelte +67 -0
- package/src/ProgressCircle/ProgressCircle.svelte +62 -0
- package/src/SideNavigation/Item.svelte +61 -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 +65 -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 +130 -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 +98 -12
- package/src/spectrum-icons-rollup.js +31 -0
- package/src/spectrum-icons-vite.js +31 -0
- package/dist/bundle.css +0 -8
- package/dist/bundle.css.map +0 -22
- package/dist/index.js +0 -1275
- package/dist/index.mjs +0 -1260
- 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/Switcher/Switcher.svelte +0 -39
- package/src/Switcher/Switcher.svench +0 -25
- package/src/actions/autoresize_textarea.js +0 -14
- package/src/icons/Contribution.svelte +0 -14
- package/src/index.svench.svx +0 -35
|
@@ -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>
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import "@spectrum-css/button/dist/index-vars.css"
|
|
3
|
+
import Tooltip from "../Tooltip/Tooltip.svelte"
|
|
4
|
+
|
|
5
|
+
export let disabled = false
|
|
6
|
+
export let size = "M"
|
|
7
|
+
export let cta = false
|
|
8
|
+
export let primary = false
|
|
9
|
+
export let secondary = false
|
|
10
|
+
export let warning = false
|
|
11
|
+
export let overBackground = false
|
|
12
|
+
export let quiet = false
|
|
13
|
+
export let icon = undefined
|
|
14
|
+
export let active = false
|
|
15
|
+
export let tooltip = undefined
|
|
16
|
+
export let dataCy
|
|
17
|
+
export let newStyles = false
|
|
18
|
+
|
|
19
|
+
let showTooltip = false
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<button
|
|
23
|
+
class:spectrum-Button--cta={cta}
|
|
24
|
+
class:spectrum-Button--primary={primary}
|
|
25
|
+
class:spectrum-Button--secondary={secondary}
|
|
26
|
+
class:spectrum-Button--warning={warning}
|
|
27
|
+
class:spectrum-Button--overBackground={overBackground}
|
|
28
|
+
class:spectrum-Button--quiet={quiet}
|
|
29
|
+
class:new-styles={newStyles}
|
|
30
|
+
class:active
|
|
31
|
+
class="spectrum-Button spectrum-Button--size{size.toUpperCase()}"
|
|
32
|
+
{disabled}
|
|
33
|
+
data-cy={dataCy}
|
|
34
|
+
on:click|preventDefault
|
|
35
|
+
on:mouseover={() => (showTooltip = true)}
|
|
36
|
+
on:focus={() => (showTooltip = true)}
|
|
37
|
+
on:mouseleave={() => (showTooltip = false)}
|
|
38
|
+
>
|
|
39
|
+
{#if icon}
|
|
40
|
+
<svg
|
|
41
|
+
class="spectrum-Icon spectrum-Icon--size{size.toUpperCase()}"
|
|
42
|
+
focusable="false"
|
|
43
|
+
aria-hidden="true"
|
|
44
|
+
aria-label={icon}
|
|
45
|
+
>
|
|
46
|
+
<use xlink:href="#spectrum-icon-18-{icon}" />
|
|
47
|
+
</svg>
|
|
48
|
+
{/if}
|
|
49
|
+
{#if $$slots}
|
|
50
|
+
<span class="spectrum-Button-label"><slot /></span>
|
|
51
|
+
{/if}
|
|
52
|
+
{#if !disabled && tooltip}
|
|
53
|
+
<div class="tooltip-icon">
|
|
54
|
+
<svg
|
|
55
|
+
class="spectrum-Icon spectrum-Icon--size{size.toUpperCase()}"
|
|
56
|
+
focusable="false"
|
|
57
|
+
aria-hidden="true"
|
|
58
|
+
aria-label="Info"
|
|
59
|
+
>
|
|
60
|
+
<use xlink:href="#spectrum-icon-18-InfoOutline" />
|
|
61
|
+
</svg>
|
|
62
|
+
</div>
|
|
63
|
+
{/if}
|
|
64
|
+
{#if showTooltip && tooltip}
|
|
65
|
+
<div class="tooltip">
|
|
66
|
+
<Tooltip textWrapping={true} direction={"bottom"} text={tooltip} />
|
|
67
|
+
</div>
|
|
68
|
+
{/if}
|
|
69
|
+
</button>
|
|
70
|
+
|
|
71
|
+
<style>
|
|
72
|
+
button {
|
|
73
|
+
position: relative;
|
|
74
|
+
}
|
|
75
|
+
.spectrum-Button-label {
|
|
76
|
+
white-space: nowrap;
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
text-overflow: ellipsis;
|
|
79
|
+
}
|
|
80
|
+
.active {
|
|
81
|
+
color: var(--spectrum-global-color-blue-600) !important;
|
|
82
|
+
}
|
|
83
|
+
.tooltip {
|
|
84
|
+
position: absolute;
|
|
85
|
+
display: flex;
|
|
86
|
+
justify-content: center;
|
|
87
|
+
z-index: 100;
|
|
88
|
+
width: 160px;
|
|
89
|
+
text-align: center;
|
|
90
|
+
transform: translateX(-50%);
|
|
91
|
+
left: 50%;
|
|
92
|
+
top: calc(100% - 3px);
|
|
93
|
+
}
|
|
94
|
+
.tooltip-icon {
|
|
95
|
+
padding-left: var(--spacing-m);
|
|
96
|
+
line-height: 0;
|
|
97
|
+
}
|
|
98
|
+
.spectrum-Button--primary.new-styles {
|
|
99
|
+
background: var(--spectrum-global-color-gray-800);
|
|
100
|
+
border-color: transparent;
|
|
101
|
+
color: var(--spectrum-global-color-gray-50);
|
|
102
|
+
}
|
|
103
|
+
.spectrum-Button--primary.new-styles:hover {
|
|
104
|
+
background: var(--spectrum-global-color-gray-900);
|
|
105
|
+
}
|
|
106
|
+
.spectrum-Button--secondary.new-styles {
|
|
107
|
+
background: var(--spectrum-global-color-gray-200);
|
|
108
|
+
border-color: transparent;
|
|
109
|
+
color: var(--spectrum-global-color-gray-900);
|
|
110
|
+
}
|
|
111
|
+
.spectrum-Button--secondary.new-styles:hover {
|
|
112
|
+
background: var(--spectrum-global-color-gray-300);
|
|
113
|
+
}
|
|
114
|
+
</style>
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { View } from "svench";
|
|
3
|
+
import Button from "./Button.svelte";
|
|
4
|
+
import Icon from "../Icons/Icon.svelte";
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<View name="Primary">
|
|
8
|
+
<Button primary small on:click={() => alert('Clicked!')}>Small</Button>
|
|
9
|
+
<Button primary on:click={() => alert('Clicked!')}>Default</Button>
|
|
10
|
+
<Button primary medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
11
|
+
<Button primary large on:click={() => alert('Clicked!')}>Large</Button>
|
|
12
|
+
<Button primary wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
13
|
+
</View>
|
|
14
|
+
<View name="Secondary">
|
|
15
|
+
<Button secondary small on:click={() => alert('Clicked!')}>Small</Button>
|
|
16
|
+
<Button secondary on:click={() => alert('Clicked!')}>Default</Button>
|
|
17
|
+
<Button secondary medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
18
|
+
<Button secondary large on:click={() => alert('Clicked!')}>Large</Button>
|
|
19
|
+
<Button secondary wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
20
|
+
</View>
|
|
21
|
+
<View name="Translucent">
|
|
22
|
+
<div class="translucent">
|
|
23
|
+
<div class="light">
|
|
24
|
+
<Button translucent small on:click={() => alert('Clicked!')}>Small</Button>
|
|
25
|
+
<Button translucent on:click={() => alert('Clicked!')}>Default</Button>
|
|
26
|
+
<Button translucent medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
27
|
+
<Button translucent large on:click={() => alert('Clicked!')}>Large</Button>
|
|
28
|
+
<Button translucent wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="dark">
|
|
31
|
+
<Button translucent small on:click={() => alert('Clicked!')}>Small</Button>
|
|
32
|
+
<Button translucent on:click={() => alert('Clicked!')}>Default</Button>
|
|
33
|
+
<Button translucent medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
34
|
+
<Button translucent large on:click={() => alert('Clicked!')}>Large</Button>
|
|
35
|
+
<Button translucent wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</View>
|
|
39
|
+
<View name="Blue">
|
|
40
|
+
<Button blue small on:click={() => alert('Clicked!')}>Small</Button>
|
|
41
|
+
<Button blue on:click={() => alert('Clicked!')}>Default</Button>
|
|
42
|
+
<Button blue medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
43
|
+
<Button blue large on:click={() => alert('Clicked!')}>Large</Button>
|
|
44
|
+
<Button blue wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
45
|
+
</View>
|
|
46
|
+
<View name="Red">
|
|
47
|
+
<Button red small on:click={() => alert('Clicked!')}>Small</Button>
|
|
48
|
+
<Button red on:click={() => alert('Clicked!')}>Default</Button>
|
|
49
|
+
<Button red medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
50
|
+
<Button red large on:click={() => alert('Clicked!')}>Large</Button>
|
|
51
|
+
<Button red wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
52
|
+
</View>
|
|
53
|
+
<View name="Yellow">
|
|
54
|
+
<Button yellow small on:click={() => alert('Clicked!')}>Small</Button>
|
|
55
|
+
<Button yellow on:click={() => alert('Clicked!')}>Default</Button>
|
|
56
|
+
<Button yellow medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
57
|
+
<Button yellow large on:click={() => alert('Clicked!')}>Large</Button>
|
|
58
|
+
<Button yellow wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
59
|
+
</View>
|
|
60
|
+
<View name="Orange">
|
|
61
|
+
<Button orange small on:click={() => alert('Clicked!')}>Small</Button>
|
|
62
|
+
<Button orange on:click={() => alert('Clicked!')}>Default</Button>
|
|
63
|
+
<Button orange medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
64
|
+
<Button orange large on:click={() => alert('Clicked!')}>Large</Button>
|
|
65
|
+
<Button orange wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
66
|
+
</View>
|
|
67
|
+
<View name="Green">
|
|
68
|
+
<Button green small on:click={() => alert('Clicked!')}>Small</Button>
|
|
69
|
+
<Button green on:click={() => alert('Clicked!')}>Default</Button>
|
|
70
|
+
<Button green medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
71
|
+
<Button green large on:click={() => alert('Clicked!')}>Large</Button>
|
|
72
|
+
<Button green wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
73
|
+
</View>
|
|
74
|
+
<View name="Purple">
|
|
75
|
+
<Button purple small on:click={() => alert('Clicked!')}>Small</Button>
|
|
76
|
+
<Button purple on:click={() => alert('Clicked!')}>Default</Button>
|
|
77
|
+
<Button purple medium on:click={() => alert('Clicked!')}>Medium</Button>
|
|
78
|
+
<Button purple large on:click={() => alert('Clicked!')}>Large</Button>
|
|
79
|
+
<Button purple wide on:click={() => alert('Clicked!')}>Wide</Button>
|
|
80
|
+
</View>
|
|
81
|
+
<View name="Disabled">
|
|
82
|
+
<Button primary disabled on:click={() => alert('Clicked!')}>Disabled</Button>
|
|
83
|
+
</View>
|
|
84
|
+
<View name="Button With Icon">
|
|
85
|
+
<Button primary small on:click={() => alert('Clicked!')}>
|
|
86
|
+
<Icon name="addrow" direction="n" />
|
|
87
|
+
Small
|
|
88
|
+
</Button>
|
|
89
|
+
<Button primary on:click={() => alert('Clicked!')}>
|
|
90
|
+
<Icon name="add" direction="n" />
|
|
91
|
+
Default
|
|
92
|
+
</Button>
|
|
93
|
+
<Button primary medium on:click={() => alert('Clicked!')}>
|
|
94
|
+
<Icon name="addcolumn" direction="n" />
|
|
95
|
+
Medium
|
|
96
|
+
</Button>
|
|
97
|
+
<Button primary large on:click={() => alert('Clicked!')}>
|
|
98
|
+
<Icon name="copy" direction="n" />
|
|
99
|
+
Large
|
|
100
|
+
</Button>
|
|
101
|
+
<Button primary wide on:click={() => alert('Clicked!')}>
|
|
102
|
+
<Icon name="view" direction="n" />
|
|
103
|
+
Wide
|
|
104
|
+
</Button>
|
|
105
|
+
</View>
|
|
106
|
+
<View name="Button with symbols">
|
|
107
|
+
<Button primary small on:click={() => alert('Clicked!')}>⊗ Small</Button>
|
|
108
|
+
<Button primary on:click={() => alert('Clicked!')}>↓ Default</Button>
|
|
109
|
+
<Button primary medium on:click={() => alert('Clicked!')}>+ Medium</Button>
|
|
110
|
+
<Button primary large on:click={() => alert('Clicked!')}>⋯ Large</Button>
|
|
111
|
+
<Button primary wide on:click={() => alert('Clicked!')}>⊕ Wide</Button>
|
|
112
|
+
</View>
|
|
113
|
+
<View
|
|
114
|
+
name="use Knobs"
|
|
115
|
+
knobs={{ primary: true, secondary: false, blue: false, red: false, yellow: false, orange: false, green: false, purple: false, disabled: false, small: false, medium: false, large: false, wide: false, text: false }}
|
|
116
|
+
let:knobs>
|
|
117
|
+
<Button {...knobs} on:click={() => alert('Clicked!')}>Knooby</Button>
|
|
118
|
+
</View>
|
|
119
|
+
<View name="a link that looks like a button">
|
|
120
|
+
<Button primary href="https://google.com">Linkbutton</Button>
|
|
121
|
+
</View>
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
<style>
|
|
125
|
+
.translucent {
|
|
126
|
+
display: flex;
|
|
127
|
+
gap: 20px;
|
|
128
|
+
}
|
|
129
|
+
.translucent > div {
|
|
130
|
+
padding: 10px;
|
|
131
|
+
}
|
|
132
|
+
.light {
|
|
133
|
+
background-color: white;
|
|
134
|
+
}
|
|
135
|
+
.dark {
|
|
136
|
+
background-color: #2a2a2a;
|
|
137
|
+
}
|
|
138
|
+
</style>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import "@spectrum-css/buttongroup/dist/index-vars.css"
|
|
3
|
+
export let vertical = false
|
|
4
|
+
export let gap = ""
|
|
5
|
+
|
|
6
|
+
$: gapStyle =
|
|
7
|
+
gap === "L"
|
|
8
|
+
? "var(--spacing-l)"
|
|
9
|
+
: gap === "M"
|
|
10
|
+
? "var(--spacing-m)"
|
|
11
|
+
: gap === "S"
|
|
12
|
+
? "var(--spacing-s)"
|
|
13
|
+
: null
|
|
14
|
+
|
|
15
|
+
function group(element) {
|
|
16
|
+
const buttons = Array.from(element.getElementsByTagName("button"))
|
|
17
|
+
buttons.forEach(button => {
|
|
18
|
+
button.classList.add("spectrum-ButtonGroup-item")
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<div
|
|
24
|
+
use:group
|
|
25
|
+
class="spectrum-ButtonGroup"
|
|
26
|
+
class:spectrum-ButtonGroup--vertical={vertical}
|
|
27
|
+
style={gapStyle ? `gap: ${gapStyle};` : null}
|
|
28
|
+
>
|
|
29
|
+
<slot />
|
|
30
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export let small = false
|
|
3
|
+
export let disabled
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<button
|
|
7
|
+
on:click
|
|
8
|
+
class="spectrum-ClearButton"
|
|
9
|
+
class:spectrum-ClearButton--small={small}
|
|
10
|
+
{disabled}
|
|
11
|
+
>
|
|
12
|
+
<svg
|
|
13
|
+
class="spectrum-Icon spectrum-UIIcon-Cross75"
|
|
14
|
+
focusable="false"
|
|
15
|
+
aria-hidden="true"
|
|
16
|
+
>
|
|
17
|
+
<use xlink:href="#spectrum-css-icon-Cross75" />
|
|
18
|
+
</svg>
|
|
19
|
+
</button>
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { createEventDispatcher } from "svelte"
|
|
3
|
+
import "@spectrum-css/popover/dist/index-vars.css"
|
|
4
|
+
import clickOutside from "../Actions/click_outside"
|
|
5
|
+
import { fly } from "svelte/transition"
|
|
6
|
+
import Icon from "../Icon/Icon.svelte"
|
|
7
|
+
import Input from "../Form/Input.svelte"
|
|
8
|
+
import { capitalise } from "../helpers"
|
|
9
|
+
|
|
10
|
+
export let value
|
|
11
|
+
export let size = "M"
|
|
12
|
+
export let spectrumTheme
|
|
13
|
+
export let alignRight = false
|
|
14
|
+
|
|
15
|
+
let open = false
|
|
16
|
+
|
|
17
|
+
$: customValue = getCustomValue(value)
|
|
18
|
+
$: checkColor = getCheckColor(value)
|
|
19
|
+
|
|
20
|
+
const dispatch = createEventDispatcher()
|
|
21
|
+
const categories = [
|
|
22
|
+
{
|
|
23
|
+
label: "Theme",
|
|
24
|
+
colors: [
|
|
25
|
+
"gray-50",
|
|
26
|
+
"gray-75",
|
|
27
|
+
"gray-100",
|
|
28
|
+
"gray-200",
|
|
29
|
+
"gray-300",
|
|
30
|
+
"gray-400",
|
|
31
|
+
"gray-500",
|
|
32
|
+
"gray-600",
|
|
33
|
+
"gray-700",
|
|
34
|
+
"gray-800",
|
|
35
|
+
"gray-900",
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
label: "Colors",
|
|
40
|
+
colors: [
|
|
41
|
+
"red-400",
|
|
42
|
+
"orange-400",
|
|
43
|
+
"yellow-400",
|
|
44
|
+
"green-400",
|
|
45
|
+
"seafoam-400",
|
|
46
|
+
"blue-400",
|
|
47
|
+
"indigo-400",
|
|
48
|
+
"magenta-400",
|
|
49
|
+
|
|
50
|
+
"red-500",
|
|
51
|
+
"orange-500",
|
|
52
|
+
"yellow-500",
|
|
53
|
+
"green-500",
|
|
54
|
+
"seafoam-500",
|
|
55
|
+
"blue-500",
|
|
56
|
+
"indigo-500",
|
|
57
|
+
"magenta-500",
|
|
58
|
+
|
|
59
|
+
"red-600",
|
|
60
|
+
"orange-600",
|
|
61
|
+
"yellow-600",
|
|
62
|
+
"green-600",
|
|
63
|
+
"seafoam-600",
|
|
64
|
+
"blue-600",
|
|
65
|
+
"indigo-600",
|
|
66
|
+
"magenta-600",
|
|
67
|
+
|
|
68
|
+
"red-700",
|
|
69
|
+
"orange-700",
|
|
70
|
+
"yellow-700",
|
|
71
|
+
"green-700",
|
|
72
|
+
"seafoam-700",
|
|
73
|
+
"blue-700",
|
|
74
|
+
"indigo-700",
|
|
75
|
+
"magenta-700",
|
|
76
|
+
|
|
77
|
+
"static-white",
|
|
78
|
+
"static-black",
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
const onChange = value => {
|
|
84
|
+
dispatch("change", value)
|
|
85
|
+
open = false
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const getCustomValue = value => {
|
|
89
|
+
if (!value) {
|
|
90
|
+
return value
|
|
91
|
+
}
|
|
92
|
+
let found = false
|
|
93
|
+
const comparisonValue = value.substring(28, value.length - 1)
|
|
94
|
+
for (let category of categories) {
|
|
95
|
+
found = category.colors.includes(comparisonValue)
|
|
96
|
+
if (found) {
|
|
97
|
+
break
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return found ? null : value
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const prettyPrint = color => {
|
|
104
|
+
return capitalise(color.split("-").join(" "))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const getCheckColor = value => {
|
|
108
|
+
// Use dynamic color for theme grays
|
|
109
|
+
if (value?.includes("gray")) {
|
|
110
|
+
return /^.*(gray-(50|75|100|200|300|400|500))\)$/.test(value)
|
|
111
|
+
? "var(--spectrum-global-color-gray-900)"
|
|
112
|
+
: "var(--spectrum-global-color-gray-50)"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Use black check for static white
|
|
116
|
+
if (value?.includes("static-black")) {
|
|
117
|
+
return "var(--spectrum-global-color-static-gray-50)"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return "var(--spectrum-global-color-static-gray-900)"
|
|
121
|
+
}
|
|
122
|
+
</script>
|
|
123
|
+
|
|
124
|
+
<div class="container">
|
|
125
|
+
<div class="preview size--{size || 'M'}" on:click={() => (open = true)}>
|
|
126
|
+
<div
|
|
127
|
+
class="fill {spectrumTheme || ''}"
|
|
128
|
+
style={value ? `background: ${value};` : ""}
|
|
129
|
+
class:placeholder={!value}
|
|
130
|
+
/>
|
|
131
|
+
</div>
|
|
132
|
+
{#if open}
|
|
133
|
+
<div
|
|
134
|
+
use:clickOutside={() => (open = false)}
|
|
135
|
+
transition:fly={{ y: -20, duration: 200 }}
|
|
136
|
+
class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
|
|
137
|
+
class:spectrum-Popover--align-right={alignRight}
|
|
138
|
+
>
|
|
139
|
+
{#each categories as category}
|
|
140
|
+
<div class="category">
|
|
141
|
+
<div class="heading">{category.label}</div>
|
|
142
|
+
<div class="colors">
|
|
143
|
+
{#each category.colors as color}
|
|
144
|
+
<div
|
|
145
|
+
on:click={() => {
|
|
146
|
+
onChange(`var(--spectrum-global-color-${color})`)
|
|
147
|
+
}}
|
|
148
|
+
class="color"
|
|
149
|
+
title={prettyPrint(color)}
|
|
150
|
+
>
|
|
151
|
+
<div
|
|
152
|
+
class="fill {spectrumTheme || ''}"
|
|
153
|
+
style="background: var(--spectrum-global-color-{color}); color: {checkColor};"
|
|
154
|
+
>
|
|
155
|
+
{#if value === `var(--spectrum-global-color-${color})`}
|
|
156
|
+
<Icon name="Checkmark" size="S" />
|
|
157
|
+
{/if}
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
{/each}
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
{/each}
|
|
164
|
+
<div class="category category--custom">
|
|
165
|
+
<div class="heading">Custom</div>
|
|
166
|
+
<div class="custom">
|
|
167
|
+
<Input
|
|
168
|
+
updateOnChange={false}
|
|
169
|
+
quiet
|
|
170
|
+
placeholder="Hex, RGB, HSL..."
|
|
171
|
+
value={customValue}
|
|
172
|
+
on:change
|
|
173
|
+
/>
|
|
174
|
+
<Icon
|
|
175
|
+
size="S"
|
|
176
|
+
name="Close"
|
|
177
|
+
hoverable
|
|
178
|
+
on:click={() => onChange(null)}
|
|
179
|
+
/>
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
{/if}
|
|
184
|
+
</div>
|
|
185
|
+
|
|
186
|
+
<style>
|
|
187
|
+
.container {
|
|
188
|
+
position: relative;
|
|
189
|
+
}
|
|
190
|
+
.preview {
|
|
191
|
+
width: 32px;
|
|
192
|
+
height: 32px;
|
|
193
|
+
border-radius: 100%;
|
|
194
|
+
position: relative;
|
|
195
|
+
transition: border-color 130ms ease-in-out;
|
|
196
|
+
box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-400);
|
|
197
|
+
}
|
|
198
|
+
.preview:hover {
|
|
199
|
+
cursor: pointer;
|
|
200
|
+
box-shadow: 0 0 2px 2px var(--spectrum-global-color-gray-400);
|
|
201
|
+
}
|
|
202
|
+
.fill {
|
|
203
|
+
width: 100%;
|
|
204
|
+
height: 100%;
|
|
205
|
+
border-radius: 100%;
|
|
206
|
+
position: absolute;
|
|
207
|
+
top: 0;
|
|
208
|
+
left: 0;
|
|
209
|
+
display: grid;
|
|
210
|
+
place-items: center;
|
|
211
|
+
}
|
|
212
|
+
.fill.placeholder {
|
|
213
|
+
background-position: 0 0, 10px 10px;
|
|
214
|
+
background-size: 20px 20px;
|
|
215
|
+
background-image: linear-gradient(
|
|
216
|
+
45deg,
|
|
217
|
+
#eee 25%,
|
|
218
|
+
transparent 25%,
|
|
219
|
+
transparent 75%,
|
|
220
|
+
#eee 75%,
|
|
221
|
+
#eee 100%
|
|
222
|
+
),
|
|
223
|
+
linear-gradient(
|
|
224
|
+
45deg,
|
|
225
|
+
#eee 25%,
|
|
226
|
+
white 25%,
|
|
227
|
+
white 75%,
|
|
228
|
+
#eee 75%,
|
|
229
|
+
#eee 100%
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
.size--S {
|
|
233
|
+
width: 20px;
|
|
234
|
+
height: 20px;
|
|
235
|
+
}
|
|
236
|
+
.size--M {
|
|
237
|
+
width: 32px;
|
|
238
|
+
height: 32px;
|
|
239
|
+
}
|
|
240
|
+
.size--L {
|
|
241
|
+
width: 48px;
|
|
242
|
+
height: 48px;
|
|
243
|
+
}
|
|
244
|
+
.spectrum-Popover {
|
|
245
|
+
width: 210px;
|
|
246
|
+
z-index: 999;
|
|
247
|
+
top: 100%;
|
|
248
|
+
padding: var(--spacing-l) var(--spacing-xl);
|
|
249
|
+
display: flex;
|
|
250
|
+
flex-direction: column;
|
|
251
|
+
justify-content: flex-start;
|
|
252
|
+
align-items: stretch;
|
|
253
|
+
gap: var(--spacing-xl);
|
|
254
|
+
}
|
|
255
|
+
.spectrum-Popover--align-right {
|
|
256
|
+
right: 0;
|
|
257
|
+
}
|
|
258
|
+
.colors {
|
|
259
|
+
display: grid;
|
|
260
|
+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
|
|
261
|
+
gap: var(--spacing-xs);
|
|
262
|
+
}
|
|
263
|
+
.heading {
|
|
264
|
+
font-size: var(--font-size-s);
|
|
265
|
+
font-weight: 600;
|
|
266
|
+
letter-spacing: 0.14px;
|
|
267
|
+
flex: 1 1 auto;
|
|
268
|
+
text-transform: uppercase;
|
|
269
|
+
grid-column: 1 / 5;
|
|
270
|
+
margin-bottom: var(--spacing-s);
|
|
271
|
+
}
|
|
272
|
+
.color {
|
|
273
|
+
height: 16px;
|
|
274
|
+
width: 16px;
|
|
275
|
+
border-radius: 100%;
|
|
276
|
+
box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-300);
|
|
277
|
+
position: relative;
|
|
278
|
+
}
|
|
279
|
+
.color:hover {
|
|
280
|
+
cursor: pointer;
|
|
281
|
+
box-shadow: 0 0 2px 2px var(--spectrum-global-color-gray-300);
|
|
282
|
+
}
|
|
283
|
+
.custom {
|
|
284
|
+
display: grid;
|
|
285
|
+
grid-template-columns: 1fr auto;
|
|
286
|
+
align-items: center;
|
|
287
|
+
gap: var(--spacing-m);
|
|
288
|
+
margin-right: var(--spacing-xs);
|
|
289
|
+
}
|
|
290
|
+
.category--custom .heading {
|
|
291
|
+
margin-bottom: var(--spacing-xs);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.spectrum-wrapper {
|
|
295
|
+
background-color: transparent;
|
|
296
|
+
}
|
|
297
|
+
</style>
|