@budibase/bbui 1.58.13 → 2.0.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.
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
@@ -1,212 +1,114 @@
1
1
  <script>
2
- export let primary = false,
3
- secondary = false,
4
- blue = false,
5
- disabled = false,
6
- translucent = false,
7
- text = false,
8
- red = false,
9
- yellow = false,
10
- orange = false,
11
- green = false,
12
- purple = false,
13
- small = false,
14
- medium = false,
15
- wide = false,
16
- large = false,
17
- href = false;
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
18
20
  </script>
19
21
 
20
- <style>
21
- button,
22
- a {
23
- font-family: var(--font-sans);
24
- cursor: pointer;
25
- font-weight: 600;
26
- box-sizing: border-box;
27
- overflow: hidden;
28
- border-radius: var(--border-radius-s);
29
- color: white;
30
- padding: var(--spacing-s) var(--spacing-l);
31
- transition: all 0.2s ease 0s;
32
- display: inline-flex;
33
- text-rendering: optimizeLegibility;
34
- text-decoration: none;
35
- min-width: auto;
36
- outline: none;
37
- font-feature-settings: "case" 1, "rlig" 1, "calt" 0;
38
- -webkit-box-align: center;
39
- user-select: none;
40
- flex-shrink: 0;
41
- align-items: center;
42
- justify-content: center;
43
- margin: 0;
44
- border-width: 2px;
45
- border-style: solid;
46
- border-color: transparent;
47
- }
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>
48
70
 
49
- .primary {
50
- color: var(--background);
51
- border-color: var(--ink);
52
- background-color: var(--ink);
53
- }
54
- button.primary:hover:not([disabled]) {
55
- background-color: var(--background);
56
- color: var(--ink);
57
- }
58
- .secondary {
59
- border-color: var(--grey-4);
60
- background-color: var(--background);
61
- color: var(--grey-8);
62
- font-weight: 500;
63
- }
64
- button.secondary:hover:not([disabled]) {
65
- background-color: var(--grey-2);
66
- color: var(--ink);
67
- }
68
- .translucent {
69
- border-color: rgba(0, 0, 0, 0.1);
70
- background-color: rgba(255, 255, 255, 0.1);
71
- color: var(--grey-6);
72
- font-weight: 500;
73
- }
74
- button.translucent:hover:not([disabled]) {
75
- background-color: var(--grey-2);
76
- color: var(--ink);
77
- }
78
- .blue {
79
- background-color: var(--blue);
80
- border-color: var(--blue);
81
- }
82
- button.blue:hover:not([disabled]) {
83
- background-color: var(--blue-light);
84
- color: var(--blue);
85
- }
86
- .red {
87
- border-color: var(--red);
88
- background-color: var(--red);
89
- color: white;
90
- }
91
- button.red:hover:not([disabled]) {
92
- background-color: var(--red-light);
93
- color: var(--red);
94
- }
95
- .yellow {
96
- border-color: var(--yellow);
97
- background-color: var(--yellow);
98
- color: white;
99
- }
100
- button.yellow:hover:not([disabled]) {
101
- background-color: var(--yellow-light);
102
- color: var(--yellow);
103
- }
104
- .orange {
105
- border-color: var(--orange);
106
- background-color: var(--orange);
107
- color: white;
108
- }
109
- button.orange:hover:not([disabled]) {
110
- background-color: var(--orange-light);
111
- color: var(--orange);
112
- }
113
- .green {
114
- border-color: var(--green);
115
- background-color: var(--green);
116
- color: white;
117
- }
118
- button.green:hover:not([disabled]) {
119
- background-color: var(--green-light);
120
- color: var(--green);
121
- }
122
- .purple {
123
- border-color: var(--purple);
124
- background-color: var(--purple);
125
- color: white;
126
- }
127
- button.purple:hover:not([disabled]) {
128
- background-color: var(--purple-light);
129
- color: var(--purple);
130
- }
131
- .text {
132
- background-color: transparent;
133
- color: var(--grey-7);
134
- border: none;
135
- padding: 0;
136
- font-weight: 500;
137
- }
138
- button.text:hover:not([disabled]) {
139
- color: var(--ink);
71
+ <style>
72
+ button {
73
+ position: relative;
140
74
  }
141
- button.text:active:not([disabled]) {
142
- color: var(--blue);
75
+ .spectrum-Button-label {
76
+ white-space: nowrap;
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
143
79
  }
144
-
145
- .small {
146
- font-size: var(--font-size-xs);
147
- padding: var(--spacing-xs) var(--spacing-m);
80
+ .active {
81
+ color: var(--spectrum-global-color-blue-600) !important;
148
82
  }
149
-
150
- .medium {
151
- font-size: var(--font-size-m);
152
- padding: var(--spacing-s) var(--spacing-l);
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);
153
102
  }
154
-
155
- .large {
156
- font-size: var(--font-size-l);
157
- padding: var(--spacing-m) var(--layout-l);
103
+ .spectrum-Button--primary.new-styles:hover {
104
+ background: var(--spectrum-global-color-gray-900);
158
105
  }
159
- .wide {
160
- width: 100%;
161
- display: flex;
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);
162
110
  }
163
-
164
- button:disabled {
165
- background-color: var(--grey-4);
166
- cursor: not-allowed;
167
- border-color: var(--grey-4);
168
- color: var(--grey-5);
111
+ .spectrum-Button--secondary.new-styles:hover {
112
+ background: var(--spectrum-global-color-gray-300);
169
113
  }
170
114
  </style>
171
-
172
- {#if href}
173
- <a
174
- {href}
175
- class:primary
176
- class:secondary
177
- class:translucent
178
- class:blue
179
- class:red
180
- class:yellow
181
- class:orange
182
- class:green
183
- class:purple
184
- class:small
185
- class:medium
186
- class:wide
187
- class:large
188
- class:text
189
- {disabled}>
190
- <slot />
191
- </a>
192
- {:else}
193
- <button
194
- class:primary
195
- class:secondary
196
- class:translucent
197
- class:blue
198
- class:red
199
- class:yellow
200
- class:orange
201
- class:green
202
- class:purple
203
- class:small
204
- class:medium
205
- class:wide
206
- class:large
207
- class:text
208
- {disabled}
209
- on:click|preventDefault>
210
- <slot />
211
- </button>
212
- {/if}
@@ -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>