@sveltia/ui 0.12.4 → 0.13.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.
@@ -46,6 +46,7 @@
46
46
  .checkbox-group.horizontal {
47
47
  gap: 8px;
48
48
  align-items: center;
49
+ flex-wrap: wrap;
49
50
  }
50
51
  .checkbox-group.vertical {
51
52
  gap: 4px;
@@ -79,6 +79,7 @@
79
79
  .radio-group.horizontal {
80
80
  gap: 8px;
81
81
  align-items: center;
82
+ flex-wrap: wrap;
82
83
  }
83
84
  .radio-group.vertical {
84
85
  gap: 4px;
@@ -0,0 +1,137 @@
1
+ <script>
2
+ import { createEventDispatcher } from 'svelte';
3
+ import { _ } from 'svelte-i18n';
4
+ import Button from '../button/button.svelte';
5
+ import Icon from '../icon/icon.svelte';
6
+ import Option from '../listbox/option.svelte';
7
+ import Select from './select.svelte';
8
+
9
+ /**
10
+ * The `class` attribute on the wrapper element.
11
+ * @type {string}
12
+ */
13
+ let className = '';
14
+ export { className as class };
15
+ /**
16
+ * Whether to hide the widget. An alias of the `aria-hidden` attribute.
17
+ * @type {boolean | undefined}
18
+ */
19
+ export let hidden = undefined;
20
+ /**
21
+ * Whether to disable the widget. An alias of the `aria-disabled` attribute.
22
+ * @type {boolean}
23
+ */
24
+ export let disabled = false;
25
+ /**
26
+ * Whether to make the widget read-only. An alias of the `aria-readonly` attribute.
27
+ * @type {boolean}
28
+ */
29
+ export let readonly = false;
30
+ /**
31
+ * Whether to mark the widget required. An alias of the `aria-required` attribute.
32
+ * @type {boolean}
33
+ */
34
+ export let required = false;
35
+ /**
36
+ * Whether to mark the widget invalid. An alias of the `aria-invalid` attribute.
37
+ * @type {boolean}
38
+ */
39
+ export let invalid = false;
40
+ /**
41
+ * Available options.
42
+ * @type {{ label: string, value: string, searchValue?: string }[]}
43
+ */
44
+ export let options;
45
+ /**
46
+ * Selected option values.
47
+ * @type {string[]}
48
+ */
49
+ export let values = [];
50
+ /**
51
+ * Maximum number of selectable options.
52
+ * @type {number | undefined}
53
+ */
54
+ export let max = undefined;
55
+
56
+ /**
57
+ * @type {string | undefined}
58
+ */
59
+ let selectedValue = undefined;
60
+
61
+ const dispatch = createEventDispatcher();
62
+ </script>
63
+
64
+ <div
65
+ role="none"
66
+ class="sui select-tags {className}"
67
+ class:disabled={disabled || readonly}
68
+ hidden={hidden || undefined}
69
+ >
70
+ {#each values as value}
71
+ {@const option = options.find((o) => o.value === value)}
72
+ {#if option}
73
+ <span role="none">
74
+ {option.label}
75
+ <Button
76
+ iconic
77
+ size="small"
78
+ disabled={disabled || readonly}
79
+ aria-label={$_('remove_x', { values: { name: option.label } })}
80
+ on:click={() => {
81
+ values = values.filter((v) => v !== value);
82
+ dispatch('RemoveValue', { value });
83
+ }}
84
+ >
85
+ <Icon slot="start-icon" name="close" />
86
+ </Button>
87
+ </span>
88
+ {/if}
89
+ {/each}
90
+ {#if (typeof max !== 'number' || values.length < max) && values.length < options.length}
91
+ <Select
92
+ disabled={disabled || readonly}
93
+ {readonly}
94
+ {required}
95
+ {invalid}
96
+ {...$$restProps}
97
+ bind:value={selectedValue}
98
+ on:change={() => {
99
+ if (selectedValue) {
100
+ values = [...values, selectedValue];
101
+ dispatch('AddValue', { value: selectedValue });
102
+ // Reset the combobox
103
+ selectedValue = undefined;
104
+ }
105
+ }}
106
+ >
107
+ {#each options as { label, value, searchValue } (value)}
108
+ {#if !values.includes(value)}
109
+ <Option {label} {value} {searchValue} />
110
+ {/if}
111
+ {/each}
112
+ </Select>
113
+ {/if}
114
+ </div>
115
+
116
+ <style>.select-tags {
117
+ display: flex;
118
+ flex-wrap: wrap;
119
+ align-items: center;
120
+ }
121
+ .select-tags.disabled {
122
+ pointer-events: none;
123
+ }
124
+ .select-tags.disabled > * {
125
+ opacity: 0.5;
126
+ }
127
+ .select-tags span {
128
+ display: inline-flex;
129
+ align-items: center;
130
+ margin: var(--sui-focus-ring-width);
131
+ padding: 0 0 0 8px;
132
+ border-radius: var(--sui-control-medium-border-radius);
133
+ background-color: var(--sui-secondary-background-color);
134
+ }
135
+ .select-tags span :global(.icon) {
136
+ font-size: var(--sui-font-size-large);
137
+ }</style>
@@ -0,0 +1,55 @@
1
+ /** @typedef {typeof __propDef.props} SelectTagsProps */
2
+ /** @typedef {typeof __propDef.events} SelectTagsEvents */
3
+ /** @typedef {typeof __propDef.slots} SelectTagsSlots */
4
+ export default class SelectTags extends SvelteComponent<{
5
+ [x: string]: any;
6
+ options: {
7
+ label: string;
8
+ value: string;
9
+ searchValue?: string | undefined;
10
+ }[];
11
+ class?: string | undefined;
12
+ invalid?: boolean | undefined;
13
+ disabled?: boolean | undefined;
14
+ hidden?: boolean | undefined;
15
+ readonly?: boolean | undefined;
16
+ values?: string[] | undefined;
17
+ required?: boolean | undefined;
18
+ max?: number | undefined;
19
+ }, {
20
+ RemoveValue: CustomEvent<any>;
21
+ AddValue: CustomEvent<any>;
22
+ } & {
23
+ [evt: string]: CustomEvent<any>;
24
+ }, {}> {
25
+ }
26
+ export type SelectTagsProps = typeof __propDef.props;
27
+ export type SelectTagsEvents = typeof __propDef.events;
28
+ export type SelectTagsSlots = typeof __propDef.slots;
29
+ import { SvelteComponent } from "svelte";
30
+ declare const __propDef: {
31
+ props: {
32
+ [x: string]: any;
33
+ options: {
34
+ label: string;
35
+ value: string;
36
+ searchValue?: string;
37
+ }[];
38
+ class?: string | undefined;
39
+ invalid?: boolean | undefined;
40
+ disabled?: boolean | undefined;
41
+ hidden?: boolean | undefined;
42
+ readonly?: boolean | undefined;
43
+ values?: string[] | undefined;
44
+ required?: boolean | undefined;
45
+ max?: number | undefined;
46
+ };
47
+ events: {
48
+ RemoveValue: CustomEvent<any>;
49
+ AddValue: CustomEvent<any>;
50
+ } & {
51
+ [evt: string]: CustomEvent<any>;
52
+ };
53
+ slots: {};
54
+ };
55
+ export {};
@@ -18,8 +18,8 @@ export default class Slider extends SvelteComponent<{
18
18
  hidden?: boolean | undefined;
19
19
  readonly?: boolean | undefined;
20
20
  values?: [number, number] | undefined;
21
- min?: number | undefined;
22
21
  max?: number | undefined;
22
+ min?: number | undefined;
23
23
  sliderLabel?: string | undefined;
24
24
  sliderLabels?: [string, string] | undefined;
25
25
  step?: number | undefined;
@@ -44,8 +44,8 @@ declare const __propDef: {
44
44
  hidden?: boolean | undefined;
45
45
  readonly?: boolean | undefined;
46
46
  values?: [number, number] | undefined;
47
- min?: number | undefined;
48
47
  max?: number | undefined;
48
+ min?: number | undefined;
49
49
  sliderLabel?: string | undefined;
50
50
  sliderLabels?: [string, string] | undefined;
51
51
  step?: number | undefined;
@@ -16,8 +16,8 @@ export default class NumberInput extends SvelteComponent<{
16
16
  readonly?: boolean | undefined;
17
17
  flex?: boolean | undefined;
18
18
  required?: boolean | undefined;
19
- min?: number | undefined;
20
19
  max?: number | undefined;
20
+ min?: number | undefined;
21
21
  step?: number | undefined;
22
22
  }, {
23
23
  keydown: KeyboardEvent;
@@ -51,8 +51,8 @@ declare const __propDef: {
51
51
  readonly?: boolean | undefined;
52
52
  flex?: boolean | undefined;
53
53
  required?: boolean | undefined;
54
- min?: number | undefined;
55
54
  max?: number | undefined;
55
+ min?: number | undefined;
56
56
  step?: number | undefined;
57
57
  };
58
58
  events: {
@@ -40,6 +40,7 @@ export { default as Menu } from "./components/menu/menu.svelte";
40
40
  export { default as RadioGroup } from "./components/radio/radio-group.svelte";
41
41
  export { default as Radio } from "./components/radio/radio.svelte";
42
42
  export { default as Combobox } from "./components/select/combobox.svelte";
43
+ export { default as SelectTags } from "./components/select/select-tags.svelte";
43
44
  export { default as Select } from "./components/select/select.svelte";
44
45
  export { default as Slider } from "./components/slider/slider.svelte";
45
46
  export { default as Switch } from "./components/switch/switch.svelte";
package/package/index.js CHANGED
@@ -72,6 +72,7 @@ export { default as Menu } from './components/menu/menu.svelte';
72
72
  export { default as RadioGroup } from './components/radio/radio-group.svelte';
73
73
  export { default as Radio } from './components/radio/radio.svelte';
74
74
  export { default as Combobox } from './components/select/combobox.svelte';
75
+ export { default as SelectTags } from './components/select/select-tags.svelte';
75
76
  export { default as Select } from './components/select/select.svelte';
76
77
  export { default as Slider } from './components/slider/slider.svelte';
77
78
  export { default as Switch } from './components/switch/switch.svelte';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltia/ui",
3
- "version": "0.12.4",
3
+ "version": "0.13.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -257,6 +257,11 @@
257
257
  "svelte": "./package/components/select/combobox.svelte",
258
258
  "default": "./package/components/select/combobox.svelte"
259
259
  },
260
+ "./components/select/select-tags.svelte": {
261
+ "types": "./package/components/select/select-tags.svelte.d.ts",
262
+ "svelte": "./package/components/select/select-tags.svelte",
263
+ "default": "./package/components/select/select-tags.svelte"
264
+ },
260
265
  "./components/select/select.svelte": {
261
266
  "types": "./package/components/select/select.svelte.d.ts",
262
267
  "svelte": "./package/components/select/select.svelte",
@@ -554,6 +559,9 @@
554
559
  "components/select/combobox.svelte": [
555
560
  "./package/components/select/combobox.svelte.d.ts"
556
561
  ],
562
+ "components/select/select-tags.svelte": [
563
+ "./package/components/select/select-tags.svelte.d.ts"
564
+ ],
557
565
  "components/select/select.svelte": [
558
566
  "./package/components/select/select.svelte.d.ts"
559
567
  ],