@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
@@ -0,0 +1,31 @@
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
+ </script>
8
+
9
+ <Portal target=".banner-container">
10
+ <div class="banner">
11
+ {#if $banner.message}
12
+ <div transition:fly={{ y: -30 }}>
13
+ <Banner
14
+ type={$banner.type}
15
+ extraButtonText={$banner.extraButtonText}
16
+ extraButtonAction={$banner.extraButtonAction}
17
+ on:change={$banner.onChange}
18
+ >
19
+ {$banner.message}
20
+ </Banner>
21
+ </div>
22
+ {/if}
23
+ </div>
24
+ </Portal>
25
+
26
+ <style>
27
+ .banner {
28
+ pointer-events: none;
29
+ width: 100%;
30
+ }
31
+ </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>