@budibase/bbui 3.3.6 → 3.4.0

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.
@@ -1,25 +1,25 @@
1
- <script>
1
+ <script lang="ts">
2
2
  import "@spectrum-css/textfield/dist/index-vars.css"
3
3
  import { createEventDispatcher, onMount, tick } from "svelte"
4
4
 
5
5
  export let value = null
6
- export let placeholder = null
6
+ export let placeholder: string | undefined = undefined
7
7
  export let type = "text"
8
8
  export let disabled = false
9
9
  export let id = null
10
10
  export let readonly = false
11
11
  export let updateOnChange = true
12
12
  export let quiet = false
13
- export let align
13
+ export let align: "left" | "right" | "center" | undefined = undefined
14
14
  export let autofocus = false
15
- export let autocomplete = null
15
+ export let autocomplete: boolean | undefined
16
16
 
17
17
  const dispatch = createEventDispatcher()
18
18
 
19
- let field
19
+ let field: any
20
20
  let focus = false
21
21
 
22
- const updateValue = newValue => {
22
+ const updateValue = (newValue: any) => {
23
23
  if (readonly || disabled) {
24
24
  return
25
25
  }
@@ -37,7 +37,7 @@
37
37
  focus = true
38
38
  }
39
39
 
40
- const onBlur = event => {
40
+ const onBlur = (event: any) => {
41
41
  if (readonly || disabled) {
42
42
  return
43
43
  }
@@ -45,14 +45,14 @@
45
45
  updateValue(event.target.value)
46
46
  }
47
47
 
48
- const onInput = event => {
48
+ const onInput = (event: any) => {
49
49
  if (readonly || !updateOnChange || disabled) {
50
50
  return
51
51
  }
52
52
  updateValue(event.target.value)
53
53
  }
54
54
 
55
- const updateValueOnEnter = event => {
55
+ const updateValueOnEnter = (event: any) => {
56
56
  if (readonly || disabled) {
57
57
  return
58
58
  }
@@ -61,13 +61,20 @@
61
61
  }
62
62
  }
63
63
 
64
- const getInputMode = type => {
64
+ const getInputMode = (type: any) => {
65
65
  if (type === "bigint") {
66
66
  return "numeric"
67
67
  }
68
68
  return type === "number" ? "decimal" : "text"
69
69
  }
70
70
 
71
+ $: autocompleteValue =
72
+ typeof autocomplete === "boolean"
73
+ ? autocomplete
74
+ ? "on"
75
+ : "off"
76
+ : undefined
77
+
71
78
  onMount(async () => {
72
79
  if (disabled) return
73
80
  focus = autofocus
@@ -104,7 +111,7 @@
104
111
  class="spectrum-Textfield-input"
105
112
  style={align ? `text-align: ${align};` : ""}
106
113
  inputmode={getInputMode(type)}
107
- {autocomplete}
114
+ autocomplete={autocompleteValue}
108
115
  />
109
116
  </div>
110
117
 
@@ -1,14 +1,14 @@
1
- <script>
1
+ <script lang="ts">
2
2
  import "@spectrum-css/fieldlabel/dist/index-vars.css"
3
3
  import FieldLabel from "./FieldLabel.svelte"
4
4
  import Icon from "../Icon/Icon.svelte"
5
5
 
6
- export let id = null
7
- export let label = null
8
- export let labelPosition = "above"
9
- export let error = null
10
- export let helpText = null
11
- export let tooltip = ""
6
+ export let id: string | undefined = undefined
7
+ export let label: string | undefined = undefined
8
+ export let labelPosition: string = "above"
9
+ export let error: string | undefined = undefined
10
+ export let helpText: string | undefined = undefined
11
+ export let tooltip: string | undefined = undefined
12
12
  </script>
13
13
 
14
14
  <div class="spectrum-Form-item" class:above={labelPosition === "above"}>
@@ -1,24 +1,24 @@
1
- <script>
1
+ <script lang="ts">
2
2
  import Field from "./Field.svelte"
3
3
  import TextField from "./Core/TextField.svelte"
4
4
  import { createEventDispatcher } from "svelte"
5
5
 
6
- export let value = null
7
- export let label = null
6
+ export let value: any = undefined
7
+ export let label: string | undefined = undefined
8
8
  export let labelPosition = "above"
9
- export let placeholder = null
9
+ export let placeholder: string | undefined = undefined
10
10
  export let type = "text"
11
11
  export let disabled = false
12
12
  export let readonly = false
13
- export let error = null
13
+ export let error: string | undefined = undefined
14
14
  export let updateOnChange = true
15
15
  export let quiet = false
16
- export let autofocus
17
- export let autocomplete
18
- export let helpText = null
16
+ export let autofocus: boolean | undefined = undefined
17
+ export let autocomplete: boolean | undefined = undefined
18
+ export let helpText: string | undefined = undefined
19
19
 
20
20
  const dispatch = createEventDispatcher()
21
- const onChange = e => {
21
+ const onChange = (e: any) => {
22
22
  value = e.detail
23
23
  dispatch("change", e.detail)
24
24
  }
@@ -27,7 +27,6 @@
27
27
  <Field {helpText} {label} {labelPosition} {error}>
28
28
  <TextField
29
29
  {updateOnChange}
30
- {error}
31
30
  {disabled}
32
31
  {readonly}
33
32
  {value}
@@ -1,44 +1,54 @@
1
- <script>
1
+ <script lang="ts" context="module">
2
+ type O = any
3
+ type V = any
4
+ </script>
5
+
6
+ <script lang="ts">
2
7
  import Field from "./Field.svelte"
3
8
  import Select from "./Core/Select.svelte"
4
9
  import { createEventDispatcher } from "svelte"
10
+ import { PopoverAlignment } from "../constants"
5
11
 
6
- export let value = null
7
- export let label = undefined
8
- export let disabled = false
9
- export let readonly = false
10
- export let labelPosition = "above"
11
- export let error = null
12
- export let placeholder = "Choose an option"
13
- export let options = []
14
- export let getOptionLabel = option => extractProperty(option, "label")
15
- export let getOptionValue = option => extractProperty(option, "value")
16
- export let getOptionSubtitle = option => option?.subtitle
17
- export let getOptionIcon = option => option?.icon
18
- export let getOptionColour = option => option?.colour
12
+ export let value: V | undefined = undefined
13
+ export let label: string | undefined = undefined
14
+ export let disabled: boolean = false
15
+ export let readonly: boolean = false
16
+ export let labelPosition: string = "above"
17
+ export let error: string | undefined = undefined
18
+ export let placeholder: string | boolean = "Choose an option"
19
+ export let options: O[] = []
20
+ export let getOptionLabel = (option: O, _index?: number) =>
21
+ extractProperty(option, "label")
22
+ export let getOptionValue = (option: O, _index?: number) =>
23
+ extractProperty(option, "value")
24
+ export let getOptionSubtitle = (option: O, _index?: number) =>
25
+ option?.subtitle
26
+ export let getOptionIcon = (option: O, _index?: number) => option?.icon
27
+ export let getOptionColour = (option: O, _index?: number) => option?.colour
19
28
  export let useOptionIconImage = false
20
- export let isOptionEnabled = undefined
21
- export let quiet = false
22
- export let autoWidth = false
23
- export let sort = false
24
- export let tooltip = ""
25
- export let autocomplete = false
26
- export let customPopoverHeight = undefined
27
- export let align = undefined
28
- export let footer = null
29
- export let tag = null
30
- export let helpText = null
31
- export let compare = undefined
29
+ export let isOptionEnabled:
30
+ | ((_option: O, _index?: number) => boolean)
31
+ | undefined = undefined
32
+ export let quiet: boolean = false
33
+ export let autoWidth: boolean = false
34
+ export let sort: boolean = false
35
+ export let tooltip: string | undefined = undefined
36
+ export let autocomplete: boolean = false
37
+ export let customPopoverHeight: string | undefined = undefined
38
+ export let align: PopoverAlignment | undefined = PopoverAlignment.Left
39
+ export let footer: string | undefined = undefined
40
+ export let helpText: string | undefined = undefined
41
+ export let compare: any = undefined
32
42
  export let onOptionMouseenter = () => {}
33
43
  export let onOptionMouseleave = () => {}
34
44
 
35
45
  const dispatch = createEventDispatcher()
36
- const onChange = e => {
46
+ const onChange = (e: CustomEvent<any>) => {
37
47
  value = e.detail
38
48
  dispatch("change", e.detail)
39
49
  }
40
50
 
41
- const extractProperty = (value, property) => {
51
+ const extractProperty = (value: any, property: any) => {
42
52
  if (value && typeof value === "object") {
43
53
  return value[property]
44
54
  }
@@ -49,7 +59,6 @@
49
59
  <Field {helpText} {label} {labelPosition} {error} {tooltip}>
50
60
  <Select
51
61
  {quiet}
52
- {error}
53
62
  {disabled}
54
63
  {readonly}
55
64
  {value}
@@ -68,7 +77,6 @@
68
77
  {isOptionEnabled}
69
78
  {autocomplete}
70
79
  {customPopoverHeight}
71
- {tag}
72
80
  {compare}
73
81
  {onOptionMouseenter}
74
82
  {onOptionMouseleave}
@@ -1,13 +1,10 @@
1
1
  <script lang="ts">
2
- import {
3
- default as AbsTooltip,
4
- TooltipPosition,
5
- TooltipType,
6
- } from "../Tooltip/AbsTooltip.svelte"
2
+ import AbsTooltip from "../Tooltip/AbsTooltip.svelte"
3
+ import { TooltipPosition, TooltipType } from "../constants"
7
4
 
8
5
  export let name: string = "Add"
6
+ export let size: "XS" | "S" | "M" | "L" | "XL" = "M"
9
7
  export let hidden: boolean = false
10
- export let size = "M"
11
8
  export let hoverable: boolean = false
12
9
  export let disabled: boolean = false
13
10
  export let color: string | undefined = undefined
@@ -81,17 +78,6 @@
81
78
  color: var(--spectrum-global-color-gray-500) !important;
82
79
  pointer-events: none !important;
83
80
  }
84
-
85
- .tooltip {
86
- position: absolute;
87
- pointer-events: none;
88
- left: 50%;
89
- bottom: calc(100% + 4px);
90
- transform: translateX(-50%);
91
- text-align: center;
92
- z-index: 1;
93
- }
94
-
95
81
  .spectrum-Icon--sizeXS {
96
82
  width: var(--spectrum-global-dimension-size-150);
97
83
  height: var(--spectrum-global-dimension-size-150);
@@ -9,8 +9,8 @@
9
9
  export let primary = false
10
10
  export let secondary = false
11
11
  export let overBackground = false
12
- export let target
13
- export let download
12
+ export let target = undefined
13
+ export let download = undefined
14
14
  export let disabled = false
15
15
  export let tooltip = null
16
16
 
@@ -1,6 +1,12 @@
1
+ <script context="module" lang="ts">
2
+ export interface PopoverAPI {
3
+ show: () => void
4
+ hide: () => void
5
+ }
6
+ </script>
7
+
1
8
  <script lang="ts">
2
9
  import "@spectrum-css/popover/dist/index-vars.css"
3
- // @ts-expect-error no types for the version of svelte-portal we're on.
4
10
  import Portal from "svelte-portal"
5
11
  import { createEventDispatcher, getContext, onDestroy } from "svelte"
6
12
  import positionDropdown, {
@@ -10,12 +16,10 @@
10
16
  import { fly } from "svelte/transition"
11
17
  import Context from "../context"
12
18
  import type { KeyboardEventHandler } from "svelte/elements"
13
-
14
- const dispatch = createEventDispatcher<{ open: void; close: void }>()
19
+ import { PopoverAlignment } from "../constants"
15
20
 
16
21
  export let anchor: HTMLElement
17
- export let align: "left" | "right" | "left-outside" | "right-outside" =
18
- "right"
22
+ export let align: PopoverAlignment = PopoverAlignment.Right
19
23
  export let portalTarget: string | undefined = undefined
20
24
  export let minWidth: number | undefined = undefined
21
25
  export let maxWidth: number | undefined = undefined
@@ -26,19 +30,24 @@
26
30
  export let offset = 4
27
31
  export let customHeight: string | undefined = undefined
28
32
  export let animate = true
29
- export let customZindex: string | undefined = undefined
30
- export let handlePostionUpdate: UpdateHandler | undefined = undefined
33
+ export let customZIndex: number | undefined = undefined
34
+ export let handlePositionUpdate: UpdateHandler | undefined = undefined
31
35
  export let showPopover = true
32
36
  export let clickOutsideOverride = false
33
37
  export let resizable = true
34
38
  export let wrap = false
35
39
 
40
+ const dispatch = createEventDispatcher<{ open: void; close: void }>()
36
41
  const animationDuration = 260
37
42
 
38
43
  let timeout: ReturnType<typeof setTimeout>
39
44
  let blockPointerEvents = false
40
45
 
41
- $: target = portalTarget || getContext(Context.PopoverRoot) || ".spectrum"
46
+ // Portal library lacks types, so we have to type this as any even though it's
47
+ // actually a string
48
+ $: target = (portalTarget ||
49
+ getContext(Context.PopoverRoot) ||
50
+ ".spectrum") as any
42
51
  $: {
43
52
  // Disable pointer events for the initial part of the animation, because we
44
53
  // fly from top to bottom and initially can be positioned under the cursor,
@@ -118,7 +127,7 @@
118
127
  minWidth,
119
128
  useAnchorWidth,
120
129
  offset,
121
- customUpdate: handlePostionUpdate,
130
+ customUpdate: handlePositionUpdate,
122
131
  resizable,
123
132
  wrap,
124
133
  }}
@@ -128,11 +137,11 @@
128
137
  }}
129
138
  on:keydown={handleEscape}
130
139
  class="spectrum-Popover is-open"
131
- class:customZindex
140
+ class:customZIndex
132
141
  class:hidden={!showPopover}
133
142
  class:blockPointerEvents
134
143
  role="presentation"
135
- style="height: {customHeight}; --customZindex: {customZindex};"
144
+ style="height: {customHeight}; --customZIndex: {customZIndex};"
136
145
  transition:fly|local={{
137
146
  y: -20,
138
147
  duration: animate ? animationDuration : 0,
@@ -162,7 +171,7 @@
162
171
  opacity: 0;
163
172
  pointer-events: none;
164
173
  }
165
- .customZindex {
166
- z-index: var(--customZindex) !important;
174
+ .customZIndex {
175
+ z-index: var(--customZIndex) !important;
167
176
  }
168
177
  </style>
@@ -1,25 +1,25 @@
1
- <script>
1
+ <script lang="ts">
2
2
  import "@spectrum-css/statuslight"
3
3
 
4
- export let size = "M"
5
- export let celery = false
6
- export let yellow = false
7
- export let fuchsia = false
8
- export let indigo = false
9
- export let seafoam = false
10
- export let chartreuse = false
11
- export let magenta = false
12
- export let purple = false
13
- export let neutral = false
14
- export let info = false
15
- export let positive = false
16
- export let notice = false
17
- export let negative = false
18
- export let disabled = false
19
- export let active = false
20
- export let color = null
21
- export let square = false
22
- export let hoverable = false
4
+ export let size: string = "M"
5
+ export let celery: boolean = false
6
+ export let yellow: boolean = false
7
+ export let fuchsia: boolean = false
8
+ export let indigo: boolean = false
9
+ export let seafoam: boolean = false
10
+ export let chartreuse: boolean = false
11
+ export let magenta: boolean = false
12
+ export let purple: boolean = false
13
+ export let neutral: boolean = false
14
+ export let info: boolean = false
15
+ export let positive: boolean = false
16
+ export let notice: boolean = false
17
+ export let negative: boolean = false
18
+ export let disabled: boolean = false
19
+ export let active: boolean = false
20
+ export let color: string | undefined = undefined
21
+ export let square: boolean = false
22
+ export let hoverable: boolean = false
23
23
  </script>
24
24
 
25
25
  <!-- svelte-ignore a11y-no-static-element-interactions -->
@@ -1,38 +1,24 @@
1
- <script context="module">
2
- export const TooltipPosition = {
3
- Top: "top",
4
- Right: "right",
5
- Bottom: "bottom",
6
- Left: "left",
7
- }
8
- export const TooltipType = {
9
- Default: "default",
10
- Info: "info",
11
- Positive: "positive",
12
- Negative: "negative",
13
- }
14
- </script>
15
-
16
- <script>
1
+ <script lang="ts">
17
2
  import Portal from "svelte-portal"
18
3
  import { fade } from "svelte/transition"
19
4
  import "@spectrum-css/tooltip/dist/index-vars.css"
20
5
  import { onDestroy } from "svelte"
6
+ import { TooltipPosition, TooltipType } from "../constants"
21
7
 
22
- export let position = TooltipPosition.Top
23
- export let type = TooltipType.Default
24
- export let text = ""
25
- export let fixed = false
26
- export let color = ""
27
- export let noWrap = false
8
+ export let position: TooltipPosition = TooltipPosition.Top
9
+ export let type: TooltipType = TooltipType.Default
10
+ export let text: string = ""
11
+ export let fixed: boolean = false
12
+ export let color: string | undefined = undefined
13
+ export let noWrap: boolean = false
28
14
 
29
- let wrapper
15
+ let wrapper: HTMLElement | undefined
30
16
  let hovered = false
31
- let left
32
- let top
17
+ let left: number | undefined
18
+ let top: number | undefined
33
19
  let visible = false
34
- let timeout
35
- let interval
20
+ let timeout: ReturnType<typeof setTimeout> | undefined
21
+ let interval: ReturnType<typeof setInterval> | undefined
36
22
 
37
23
  $: {
38
24
  if (hovered || fixed) {
@@ -49,8 +35,8 @@
49
35
  const updateTooltipPosition = () => {
50
36
  const node = wrapper?.children?.[0]
51
37
  if (!node) {
52
- left = null
53
- top = null
38
+ left = undefined
39
+ top = undefined
54
40
  return
55
41
  }
56
42
  const bounds = node.getBoundingClientRect()
@@ -0,0 +1,23 @@
1
+ export enum PopoverAlignment {
2
+ Left = "left",
3
+ Right = "right",
4
+ LeftOutside = "left-outside",
5
+ RightOutside = "right-outside",
6
+ Center = "center",
7
+ RightContextMenu = "right-context-menu",
8
+ LeftContextMenu = "left-context-menu",
9
+ }
10
+
11
+ export enum TooltipPosition {
12
+ Top = "top",
13
+ Right = "right",
14
+ Bottom = "bottom",
15
+ Left = "left",
16
+ }
17
+
18
+ export enum TooltipType {
19
+ Default = "default",
20
+ Info = "info",
21
+ Positive = "positive",
22
+ Negative = "negative",
23
+ }
package/src/index.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import "./bbui.css"
2
-
3
- // Spectrum icons
4
2
  import "@spectrum-css/icon/dist/index-vars.css"
5
3
 
4
+ // Constants
5
+ export * from "./constants"
6
+
6
7
  // Form components
7
8
  export { default as Input } from "./Form/Input.svelte"
8
9
  export { default as Stepper } from "./Form/Stepper.svelte"
@@ -45,7 +46,7 @@ export { default as ClearButton } from "./ClearButton/ClearButton.svelte"
45
46
  export { default as Icon } from "./Icon/Icon.svelte"
46
47
  export { default as IconAvatar } from "./Icon/IconAvatar.svelte"
47
48
  export { default as DetailSummary } from "./DetailSummary/DetailSummary.svelte"
48
- export { default as Popover } from "./Popover/Popover.svelte"
49
+ export { default as Popover, type PopoverAPI } from "./Popover/Popover.svelte"
49
50
  export { default as ProgressBar } from "./ProgressBar/ProgressBar.svelte"
50
51
  export { default as ProgressCircle } from "./ProgressCircle/ProgressCircle.svelte"
51
52
  export { default as Label } from "./Label/Label.svelte"
@@ -92,7 +93,6 @@ export { default as IconSideNav } from "./IconSideNav/IconSideNav.svelte"
92
93
  export { default as IconSideNavItem } from "./IconSideNav/IconSideNavItem.svelte"
93
94
  export { default as Accordion } from "./Accordion/Accordion.svelte"
94
95
  export { default as AbsTooltip } from "./Tooltip/AbsTooltip.svelte"
95
- export { TooltipPosition, TooltipType } from "./Tooltip/AbsTooltip.svelte"
96
96
 
97
97
  // Renderers
98
98
  export { default as BoldRenderer } from "./Table/BoldRenderer.svelte"
@@ -1,120 +0,0 @@
1
- <script>
2
- import { View } from "svench";
3
- import Popover from "./Popover.svelte";
4
- import Button from "../Button/Button.svelte";
5
- import TextButton from "../Button/TextButton.svelte";
6
- import Icon from "../Icons/Icon.svelte";
7
- import Input from "../Form/Input.svelte";
8
- import Select from "../Form/Select.svelte";
9
-
10
- let anchorRight;
11
- let anchorLeft;
12
- let dropdownRight;
13
- let dropdownLeft;
14
-
15
- const options = ["Column 1", "Column 2", "Super cool column"];
16
- const option1s = ["Is", "Is not", "Contains" , "Does not contain"];
17
-
18
- </script>
19
-
20
- <style>
21
- .button-group {
22
- margin-top: var(--spacing-l);
23
- display: flex;
24
- justify-content: flex-end;
25
- gap: var(--spacing-s);
26
- }
27
-
28
- h6 {
29
- font-size: var(--font-size-m);
30
- margin: 0 0 var(--spacing-l) 0;
31
- font-weight: 600;
32
- }
33
-
34
- .input-group-column {
35
- display: flex;
36
- flex-direction: column;
37
- gap: var(--spacing-s);
38
- }
39
-
40
- .input-group-row {
41
- display: grid;
42
- grid-template-columns: [boolean-start] 60px [boolean-end property-start] 120px [property-end opererator-start] 110px [operator-end value-start] auto [value-end menu-start] 32px [menu-end];
43
- gap: var(--spacing-s);
44
- margin-bottom: var(--spacing-l);
45
- align-items: center;
46
- }
47
-
48
- p {
49
- margin:0;
50
- font-size: var(--font-size-xs);
51
- }
52
- </style>
53
-
54
- <View name="Simple popover">
55
- <div bind:this={anchorLeft}>
56
- <Button text on:click={dropdownLeft.show}>
57
- <Icon name="view" />
58
- Add View
59
- </Button>
60
- </div>
61
- <Popover bind:this={dropdownLeft} anchor={anchorLeft} align="left">
62
- <h6>Add New View</h6>
63
- <Input thin placeholder="Enter your name" />
64
- <div class="button-group">
65
- <Button secondary on:click={() => alert('Clicked!')}>Cancel</Button>
66
- <Button primary on:click={() => alert('Clicked!')}>Add New View</Button>
67
- </div>
68
- </Popover>
69
- </View>
70
-
71
- <View name="Stacked columns">
72
- <div bind:this={anchorRight}>
73
- <Button text on:click={dropdownRight.show}>
74
- <Icon name="addrow" />
75
- Add Row
76
- </Button>
77
- </div>
78
- <Popover bind:this={dropdownRight} anchor={anchorRight}>
79
- <h6>Add New Row</h6>
80
- <div class="input-group-column">
81
- <Input thin placeholder="Enter your string" />
82
- <Input thin placeholder="Enter your string" />
83
- <Input thin placeholder="Enter your string" />
84
- </div>
85
- <div class="button-group">
86
- <Button secondary on:click={() => alert('Clicked!')}>Cancel</Button>
87
- <Button primary on:click={() => alert('Clicked!')}>Add New Row</Button>
88
- </div>
89
- </Popover>
90
- </View>
91
-
92
- <View name="Multiple inputs in a row">
93
- <div bind:this={anchorLeft}>
94
- <Button text on:click={dropdownLeft.show}>
95
- <Icon name="filter" />
96
- Add Filter
97
- </Button>
98
- </div>
99
- <Popover bind:this={dropdownLeft} anchor={anchorLeft} align="left">
100
- <h6>Add New Filter</h6>
101
- <div class="input-group-row">
102
- <p>Where</p>
103
- <Select secondary thin name="Test">
104
- {#each options as option}
105
- <option value={option}>{option}</option>
106
- {/each}
107
- </Select>
108
- <Select secondary thin name="Test">
109
- {#each option1s as option1}
110
- <option value={option1}>{option1}</option>
111
- {/each}
112
- </Select>
113
- <Input thin placeholder="Enter your name" />
114
- <Button text on:click={() => alert('Clicked!')}>
115
- <Icon name="close" />
116
- </Button>
117
- </div>
118
- <Button text on:click={() => alert('Clicked!')}>Add Filter</Button>
119
- </Popover>
120
- </View>