@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,132 +1,34 @@
1
1
  <script>
2
- import { createEventDispatcher } from "svelte";
3
- import Button from "../Button/Button.svelte";
4
- import Label from "../Styleguide/Label.svelte";
5
- import text_area_resize from "../Actions/autoresize_textarea.js";
6
-
7
- const dispatch = createEventDispatcher();
8
-
9
- export let name = false;
10
- export let label = false;
11
- export let thin = false;
12
- export let extraThin = false;
13
- export let edit = false;
14
- export let disabled = false;
15
- export let placeholder;
16
- export let validator = () => {};
17
- export let value = "";
18
- export const getCaretPosition = () => {
19
- return { start: textarea.selectionStart, end: textarea.selectionEnd };
20
- };
21
-
22
- let textarea;
23
-
24
- // This section handles the edit mode and dispatching of things to the parent when saved
25
- let editMode = false;
26
-
27
- const save = () => {
28
- editMode = false;
29
- dispatch("save", value);
30
- };
31
-
32
- const enableEdit = () => {
33
- editMode = true;
34
- };
35
- </script>
36
-
37
- <style>
38
- .container {
39
- min-width: 0;
40
- display: flex;
41
- flex-direction: column;
42
- }
43
-
44
- .label-container {
45
- display: flex;
46
- flex-direction: row;
47
- justify-content: space-between;
48
- align-items: flex-end;
49
- margin-bottom: var(--spacing-s);
50
- }
51
- .label-container :global(label) {
52
- margin-bottom: 0;
53
- }
54
-
55
- .controls {
56
- align-items: center;
57
- display: grid;
58
- grid-template-columns: auto auto;
59
- grid-gap: 12px;
60
- margin-left: auto;
61
- padding-left: 12px;
62
- }
63
- .controls :global(button) {
64
- min-width: 100px;
65
- font-size: var(--font-size-s);
66
- border-radius: var(--rounded-small);
67
- }
68
-
69
- textarea {
70
- min-width: 0;
71
- color: var(--ink);
72
- font-size: var(--font-size-s);
73
- font-family: var(--font-sans);
74
- border: none;
75
- border-radius: var(--border-radius-s);
76
- background-color: var(--grey-2);
77
- padding: var(--spacing-m);
78
- margin: 0;
79
- border: var(--border-transparent);
80
- outline: none;
81
- }
82
- textarea::placeholder {
83
- color: var(--grey-6);
84
- }
85
- textarea.thin {
86
- font-size: var(--font-size-xs);
2
+ import Field from "./Field.svelte"
3
+ import TextArea from "./Core/TextArea.svelte"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let value = null
7
+ export let label = null
8
+ export let labelPosition = "above"
9
+ export let placeholder = null
10
+ export let disabled = false
11
+ export let error = null
12
+ export let getCaretPosition = null
13
+ export let height = null
14
+ export let minHeight = null
15
+
16
+ const dispatch = createEventDispatcher()
17
+ const onChange = e => {
18
+ value = e.detail
19
+ dispatch("change", e.detail)
87
20
  }
88
- textarea.extraThin {
89
- font-size: var(--font-size-xs);
90
- padding: var(--spacing-s) var(--spacing-m);
91
- }
92
- textarea:focus {
93
- border: var(--border-blue);
94
- }
95
- textarea:disabled {
96
- background: var(--grey-4);
97
- }
98
- textarea:disabled {
99
- background: var(--grey-4);
100
- }
101
- textarea:disabled::placeholder {
102
- color: var(--grey-6);
103
- }
104
- </style>
21
+ </script>
105
22
 
106
- <div class="container">
107
- {#if label || edit}
108
- <div class="label-container">
109
- {#if label}
110
- <Label extraSmall grey forAttr={name}>{label}</Label>
111
- {/if}
112
- {#if edit}
113
- <div class="controls">
114
- <Button small secondary disabled={editMode} on:click={enableEdit}>
115
- Edit
116
- </Button>
117
- <Button small blue disabled={!editMode} on:click={save}>Save</Button>
118
- </div>
119
- {/if}
120
- </div>
121
- {/if}
122
- <textarea
123
- class:thin
124
- class:extraThin
125
- bind:value
126
- bind:this={textarea}
127
- on:change
128
- disabled={disabled || (edit && !editMode)}
23
+ <Field {label} {labelPosition} {error}>
24
+ <TextArea
25
+ bind:getCaretPosition
26
+ {error}
27
+ {disabled}
28
+ {value}
129
29
  {placeholder}
130
- {name}
131
- use:text_area_resize />
132
- </div>
30
+ {height}
31
+ {minHeight}
32
+ on:change={onChange}
33
+ />
34
+ </Field>
@@ -1,113 +1,23 @@
1
1
  <script>
2
- export let name = undefined;
3
- export let text = "";
4
- export let checked = false;
5
- export let disabled = false;
6
- export let screenreader = true;
7
- export let thin = false;
8
- </script>
9
-
10
- <style>
11
- .container {
12
- display: flex;
13
- align-items: center;
14
- gap: var(--spacing-s);
15
- }
16
- .container:disabled {
17
- background-color: var(--grey-2);
18
- cursor: not-allowed;
19
- }
20
-
21
- .toggle {
22
- position: relative;
23
- display: inline-block;
24
- align-self: center;
25
- cursor: pointer;
26
- -webkit-user-select: none;
27
- background: transparent;
28
- }
29
-
30
- .track {
31
- width: 32px;
32
- height: 18px;
33
- background-color: var(--grey-4);
34
- border-radius: 9px;
35
- transition-delay: .12s;
36
- transition-duration: .2s;
37
- transition-property: background;
38
- transition-timing-function: cubic-bezier(0,0,.2,1);
39
- position: relative;
40
- }
41
-
42
- .thumb {
43
- cursor: pointer;
44
- position: absolute;
45
- transition-duration: .28s;
46
- transition-property: all;
47
- transition-timing-function: cubic-bezier(0,0,.2,1);
48
- top: 2px;
49
- left: 2px;
50
- width: 14px;
51
- height: 14px;
52
- background-color: white;
53
- border-radius: var(--border-radius-xl);
54
- }
55
-
56
- input[type='checkbox']:checked ~ .track .thumb {
57
- transform: translateX(14px);
58
- }
59
- input[type='checkbox']:checked ~ .track {
60
- background-color: var(--blue);
61
- }
62
- input[type='checkbox']:disabled ~ .track {
63
- background-color: var(--grey-4);
64
- cursor: not-allowed;
65
- }
66
- input[type='checkbox']:disabled ~ .track .thumb {
67
- background-color: var(--grey-2);
68
- cursor: not-allowed;
69
- }
70
-
71
- .screenreader {
72
- position: absolute;
73
- width: 1px;
74
- height: 1px;
75
- padding: 0;
76
- margin: -1px;
77
- overflow: hidden;
78
- clip: rect(0, 0, 0, 0);
79
- white-space: nowrap;
80
- border-width: 0;
81
- }
82
-
83
- .text {
84
- font-size: var(--font-size-s);
85
- font-family: var(--font-sans);
86
- cursor: pointer;
87
- user-select: none;
88
- color: var(--ink);
2
+ import Field from "./Field.svelte"
3
+ import Switch from "./Core/Switch.svelte"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let value = null
7
+ export let label = null
8
+ export let labelPosition = "above"
9
+ export let text = null
10
+ export let disabled = false
11
+ export let error = null
12
+ export let dataCy = null
13
+
14
+ const dispatch = createEventDispatcher()
15
+ const onChange = e => {
16
+ value = e.detail
17
+ dispatch("change", e.detail)
89
18
  }
90
- .text.thin {
91
- font-size: var(--font-size-xs);
92
- }
93
- </style>
19
+ </script>
94
20
 
95
- <label for={name} class="container">
96
- <div class="toggle">
97
- <input
98
- id={name}
99
- {name}
100
- type="checkbox"
101
- class:screenreader
102
- {disabled}
103
- bind:checked
104
- on:change
105
- />
106
- <div class="track">
107
- <div class="thumb"></div>
108
- </div>
109
- </div>
110
- {#if text}
111
- <span class="text" class:thin>{text}</span>
112
- {/if}
113
- </label>
21
+ <Field {label} {labelPosition} {error}>
22
+ <Switch {dataCy} {error} {disabled} {text} {value} on:change={onChange} />
23
+ </Field>
@@ -0,0 +1,91 @@
1
+ <script context="module">
2
+ export const directions = ["n", "ne", "e", "se", "s", "sw", "w", "nw"]
3
+ </script>
4
+
5
+ <script>
6
+ import Tooltip from "../Tooltip/Tooltip.svelte"
7
+ import { fade } from "svelte/transition"
8
+
9
+ export let direction = "n"
10
+ export let name = "Add"
11
+ export let hidden = false
12
+ export let size = "M"
13
+ export let hoverable = false
14
+ export let disabled = false
15
+ export let color
16
+ export let tooltip
17
+
18
+ $: rotation = getRotation(direction)
19
+
20
+ let showTooltip = false
21
+
22
+ const getRotation = direction => {
23
+ return directions.indexOf(direction) * 45
24
+ }
25
+ </script>
26
+
27
+ <div
28
+ class="icon"
29
+ on:mouseover={() => (showTooltip = true)}
30
+ on:focus={() => (showTooltip = true)}
31
+ on:mouseleave={() => (showTooltip = false)}
32
+ on:click={() => (showTooltip = false)}
33
+ >
34
+ <svg
35
+ on:click
36
+ class:hoverable
37
+ class:disabled
38
+ class="spectrum-Icon spectrum-Icon--size{size}"
39
+ focusable="false"
40
+ aria-hidden={hidden}
41
+ aria-label={name}
42
+ style={`transform: rotate(${rotation}deg); ${
43
+ color ? `color: ${color};` : ""
44
+ }`}
45
+ >
46
+ <use style="pointer-events: none;" xlink:href="#spectrum-icon-18-{name}" />
47
+ </svg>
48
+ {#if tooltip && showTooltip}
49
+ <div class="tooltip" in:fade={{ duration: 130, delay: 250 }}>
50
+ <Tooltip textWrapping direction="bottom" text={tooltip} />
51
+ </div>
52
+ {/if}
53
+ </div>
54
+
55
+ <style>
56
+ .icon {
57
+ position: relative;
58
+ display: grid;
59
+ place-items: center;
60
+ }
61
+
62
+ svg.hoverable {
63
+ pointer-events: all;
64
+ transition: color var(--spectrum-global-animation-duration-100, 130ms);
65
+ }
66
+ svg.hoverable:hover {
67
+ color: var(--spectrum-alias-icon-color-selected-hover);
68
+ cursor: pointer;
69
+ }
70
+
71
+ svg.disabled {
72
+ color: var(--spectrum-global-color-gray-500) !important;
73
+ pointer-events: none !important;
74
+ }
75
+
76
+ .tooltip {
77
+ position: absolute;
78
+ pointer-events: none;
79
+ left: 50%;
80
+ top: calc(100% + 4px);
81
+ width: 100vw;
82
+ max-width: 150px;
83
+ transform: translateX(-50%);
84
+ text-align: center;
85
+ }
86
+
87
+ .spectrum-Icon--sizeXS {
88
+ width: 10px;
89
+ height: 10px;
90
+ }
91
+ </style>
@@ -0,0 +1,58 @@
1
+ <script>
2
+ import Icon from "./Icon.svelte"
3
+
4
+ export let icon
5
+ export let background
6
+ export let color
7
+ export let size = "M"
8
+ </script>
9
+
10
+ <div
11
+ class="icon size--{size}"
12
+ style="background: {background || `transparent`};"
13
+ class:filled={!!background}
14
+ >
15
+ <Icon name={icon} color={background ? "white" : color} />
16
+ </div>
17
+
18
+ <style>
19
+ .icon {
20
+ width: 28px;
21
+ height: 28px;
22
+ display: grid;
23
+ place-items: center;
24
+ border-radius: 50%;
25
+ }
26
+ .icon :global(.spectrum-Icon) {
27
+ width: 22px;
28
+ height: 22px;
29
+ }
30
+ .icon.filled :global(.spectrum-Icon) {
31
+ width: 16px;
32
+ height: 16px;
33
+ }
34
+ .icon.size--S {
35
+ width: 22px;
36
+ height: 22px;
37
+ }
38
+ .icon.size--S :global(.spectrum-Icon) {
39
+ width: 16px;
40
+ height: 16px;
41
+ }
42
+ .icon.size--S.filled :global(.spectrum-Icon) {
43
+ width: 12px;
44
+ height: 12px;
45
+ }
46
+ .icon.size--L {
47
+ width: 40px;
48
+ height: 40px;
49
+ }
50
+ .icon.size--L :global(.spectrum-Icon) {
51
+ width: 28px;
52
+ height: 28px;
53
+ }
54
+ .icon.size--L.filled :global(.spectrum-Icon) {
55
+ width: 22px;
56
+ height: 22px;
57
+ }
58
+ </style>
@@ -0,0 +1,177 @@
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 { createEventDispatcher } from "svelte"
8
+
9
+ export let value
10
+ export let size = "M"
11
+ export let alignRight = false
12
+
13
+ let open = false
14
+
15
+ const dispatch = createEventDispatcher()
16
+
17
+ const iconList = [
18
+ {
19
+ label: "Icons",
20
+ icons: [
21
+ "Apps",
22
+ "Actions",
23
+ "ConversionFunnel",
24
+ "App",
25
+ "Briefcase",
26
+ "Money",
27
+ "ShoppingCart",
28
+ "Form",
29
+ "Help",
30
+ "Monitoring",
31
+ "Sandbox",
32
+ "Project",
33
+ "Organisations",
34
+ "Magnify",
35
+ "Launch",
36
+ "Car",
37
+ "Camera",
38
+ "Bug",
39
+ "Channel",
40
+ "Calculator",
41
+ "Calendar",
42
+ "GraphDonut",
43
+ "GraphBarHorizontal",
44
+ "Demographic",
45
+ ],
46
+ },
47
+ ]
48
+
49
+ const onChange = value => {
50
+ dispatch("change", value)
51
+ open = false
52
+ }
53
+ </script>
54
+
55
+ <div class="container">
56
+ <div class="preview size--{size || 'M'}" on:click={() => (open = true)}>
57
+ <div
58
+ class="fill"
59
+ style={value ? `background: ${value};` : ""}
60
+ class:placeholder={!value}
61
+ >
62
+ <Icon name={value || "UserGroup"} />
63
+ </div>
64
+ </div>
65
+ {#if open}
66
+ <div
67
+ use:clickOutside={() => (open = false)}
68
+ transition:fly={{ y: -20, duration: 200 }}
69
+ class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
70
+ class:spectrum-Popover--align-right={alignRight}
71
+ >
72
+ {#each iconList as icon}
73
+ <div class="category">
74
+ <div class="heading">{icon.label}</div>
75
+ <div class="icons">
76
+ {#each icon.icons as icon}
77
+ <div
78
+ on:click={() => {
79
+ onChange(icon)
80
+ }}
81
+ >
82
+ <Icon name={icon} />
83
+ </div>
84
+ {/each}
85
+ </div>
86
+ </div>
87
+ {/each}
88
+ </div>
89
+ {/if}
90
+ </div>
91
+
92
+ <style>
93
+ .container {
94
+ position: relative;
95
+ }
96
+ .preview {
97
+ width: 32px;
98
+ height: 32px;
99
+ position: relative;
100
+ box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-400);
101
+ }
102
+ .preview:hover {
103
+ cursor: pointer;
104
+ }
105
+ .fill {
106
+ width: 100%;
107
+ height: 100%;
108
+ position: absolute;
109
+ top: 0;
110
+ left: 0;
111
+ display: grid;
112
+ place-items: center;
113
+ }
114
+ .size--S {
115
+ width: 20px;
116
+ height: 20px;
117
+ }
118
+ .size--M {
119
+ width: 32px;
120
+ height: 32px;
121
+ }
122
+ .size--L {
123
+ width: 48px;
124
+ height: 48px;
125
+ }
126
+ .spectrum-Popover {
127
+ width: 210px;
128
+ z-index: 999;
129
+ top: 100%;
130
+ padding: var(--spacing-l) var(--spacing-xl);
131
+ display: flex;
132
+ flex-direction: column;
133
+ justify-content: flex-start;
134
+ align-items: stretch;
135
+ gap: var(--spacing-xl);
136
+ }
137
+ .spectrum-Popover--align-right {
138
+ right: 0;
139
+ }
140
+ .icons {
141
+ display: grid;
142
+ grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;
143
+ gap: var(--spacing-m);
144
+ }
145
+ .heading {
146
+ font-size: var(--font-size-s);
147
+ font-weight: 600;
148
+ letter-spacing: 0.14px;
149
+ flex: 1 1 auto;
150
+ text-transform: uppercase;
151
+ grid-column: 1 / 5;
152
+ margin-bottom: var(--spacing-s);
153
+ }
154
+
155
+ .icon {
156
+ height: 16px;
157
+ width: 16px;
158
+ border-radius: 100%;
159
+ box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-300);
160
+ position: relative;
161
+ }
162
+ .icon:hover {
163
+ cursor: pointer;
164
+ box-shadow: 0 0 2px 2px var(--spectrum-global-color-gray-300);
165
+ }
166
+ .custom {
167
+ display: grid;
168
+ grid-template-columns: 1fr auto;
169
+ align-items: center;
170
+ gap: var(--spacing-m);
171
+ margin-right: var(--spacing-xs);
172
+ }
173
+
174
+ .spectrum-wrapper {
175
+ background-color: transparent;
176
+ }
177
+ </style>
@@ -0,0 +1,14 @@
1
+ <div class="icon-side-nav">
2
+ <slot />
3
+ </div>
4
+
5
+ <style>
6
+ .icon-side-nav {
7
+ display: flex;
8
+ flex-direction: column;
9
+ justify-content: flex-start;
10
+ align-items: center;
11
+ padding: var(--spacing-s);
12
+ gap: var(--spacing-xs);
13
+ }
14
+ </style>
@@ -0,0 +1,56 @@
1
+ <script>
2
+ import Icon from "../Icon/Icon.svelte"
3
+ import Tooltip from "../Tooltip/Tooltip.svelte"
4
+ import { fade } from "svelte/transition"
5
+
6
+ export let icon
7
+ export let active = false
8
+ export let tooltip
9
+
10
+ let showTooltip = false
11
+ </script>
12
+
13
+ <div
14
+ class="icon-side-nav-item"
15
+ class:active
16
+ on:mouseover={() => (showTooltip = true)}
17
+ on:focus={() => (showTooltip = true)}
18
+ on:mouseleave={() => (showTooltip = false)}
19
+ on:click
20
+ >
21
+ <Icon name={icon} hoverable />
22
+ {#if tooltip && showTooltip}
23
+ <div class="tooltip" in:fade={{ duration: 130, delay: 250 }}>
24
+ <Tooltip textWrapping direction="right" text={tooltip} />
25
+ </div>
26
+ {/if}
27
+ </div>
28
+
29
+ <style>
30
+ .icon-side-nav-item {
31
+ width: 36px;
32
+ height: 36px;
33
+ display: grid;
34
+ place-items: center;
35
+ border-radius: 4px;
36
+ position: relative;
37
+ cursor: pointer;
38
+ transition: background 130ms ease-out;
39
+ }
40
+ .icon-side-nav-item:hover :global(svg),
41
+ .active :global(svg) {
42
+ color: var(--spectrum-global-color-gray-900);
43
+ }
44
+ .active {
45
+ background: var(--spectrum-global-color-gray-300);
46
+ }
47
+ .tooltip {
48
+ position: absolute;
49
+ pointer-events: none;
50
+ left: calc(100% - 4px);
51
+ top: 50%;
52
+ white-space: nowrap;
53
+ transform: translateY(-50%);
54
+ z-index: 1;
55
+ }
56
+ </style>