@likable-hair/svelte 3.0.19 → 3.0.21

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 (53) hide show
  1. package/dist/components/composed/common/MenuOrDrawer.svelte +3 -2
  2. package/dist/components/composed/common/MenuOrDrawer.svelte.d.ts +2 -1
  3. package/dist/components/composed/common/MenuOrDrawerOptions.svelte +2 -2
  4. package/dist/components/composed/common/MenuOrDrawerOptions.svelte.d.ts +1 -1
  5. package/dist/components/composed/forms/Dropdown.svelte +19 -8
  6. package/dist/components/composed/forms/Dropdown.svelte.d.ts +7 -0
  7. package/dist/components/composed/list/PaginatedTable.svelte +179 -129
  8. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +71 -2
  9. package/dist/components/composed/list/Paginator.svelte +12 -6
  10. package/dist/components/composed/search/FilterEditor.svelte +260 -0
  11. package/dist/components/composed/search/FilterEditor.svelte.d.ts +29 -0
  12. package/dist/components/composed/search/Filters.css +0 -0
  13. package/dist/components/composed/search/Filters.svelte +500 -0
  14. package/dist/components/composed/search/Filters.svelte.d.ts +46 -0
  15. package/dist/components/composed/search/MobileFilterEditor.svelte +342 -0
  16. package/dist/components/composed/search/MobileFilterEditor.svelte.d.ts +34 -0
  17. package/dist/components/composed/search/SearchBar.svelte +12 -11
  18. package/dist/components/composed/search/SearchBar.svelte.d.ts +1 -0
  19. package/dist/components/simple/buttons/Button.css +1 -0
  20. package/dist/components/simple/buttons/Button.svelte +8 -0
  21. package/dist/components/simple/common/Menu.svelte +29 -10
  22. package/dist/components/simple/common/Menu.svelte.d.ts +2 -0
  23. package/dist/components/simple/dates/DatePickerTextField.svelte +91 -61
  24. package/dist/components/simple/dates/DatePickerTextField.svelte.d.ts +2 -0
  25. package/dist/components/simple/dialogs/Dialog.svelte.d.ts +1 -1
  26. package/dist/components/simple/forms/Autocomplete.css +1 -0
  27. package/dist/components/simple/forms/Autocomplete.svelte +100 -46
  28. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +4 -0
  29. package/dist/components/simple/lists/SelectableVerticalList.svelte +52 -9
  30. package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +9 -0
  31. package/dist/components/simple/lists/SimpleTable.svelte +25 -23
  32. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +3 -1
  33. package/dist/components/simple/lists/columnTypes.d.ts +35 -0
  34. package/dist/components/simple/lists/columnTypes.js +1 -0
  35. package/dist/components/simple/media/DescriptiveAvatar.svelte.d.ts +1 -1
  36. package/dist/components/simple/navigation/Chip.css +2 -1
  37. package/dist/components/simple/navigation/Chip.svelte +16 -5
  38. package/dist/components/simple/navigation/Chip.svelte.d.ts +1 -0
  39. package/dist/components/simple/navigation/Drawer.svelte +10 -0
  40. package/dist/components/simple/navigation/Drawer.svelte.d.ts +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +1 -0
  43. package/dist/utils/filters/builder.d.ts +43 -0
  44. package/dist/utils/filters/builder.js +137 -0
  45. package/dist/utils/filters/filters.d.ts +89 -0
  46. package/dist/utils/filters/filters.js +102 -0
  47. package/dist/utils/filters/modifiers/join.d.ts +26 -0
  48. package/dist/utils/filters/modifiers/join.js +1 -0
  49. package/dist/utils/filters/modifiers/where.d.ts +29 -0
  50. package/dist/utils/filters/modifiers/where.js +1 -0
  51. package/dist/utils/filters/validator.d.ts +4 -0
  52. package/dist/utils/filters/validator.js +30 -0
  53. package/package.json +2 -1
@@ -6,8 +6,10 @@ import Icon from "../media/Icon.svelte";
6
6
  import { onMount } from "svelte";
7
7
  import { DateTime } from "luxon";
8
8
  import { createEventDispatcher } from "svelte";
9
+ import MediaQuery from "../common/MediaQuery.svelte";
10
+ import Dialog from "../dialogs/Dialog.svelte";
9
11
  let dispatch = createEventDispatcher();
10
- export let menuOpened = false, openingId = "date-picker-text-field", pattern = "dd/MM/yyyy", selectedMonth = void 0, selectedYear = void 0, visibleMonth = void 0, visibleYear = void 0, selectedDate = void 0;
12
+ export let menuOpened = false, openingId = "date-picker-text-field", pattern = "dd/MM/yyyy", selectedMonth = void 0, selectedYear = void 0, visibleMonth = void 0, visibleYear = void 0, selectedDate = void 0, placeholder = void 0, mobileDialog = true;
11
13
  let activator, refreshPosition = false, menuElement, inputElement, mask = {
12
14
  value: void 0
13
15
  }, maskFactoryArgs = {
@@ -47,8 +49,10 @@ let activator, refreshPosition = false, menuElement, inputElement, mask = {
47
49
  }
48
50
  }
49
51
  };
50
- function handleTextFieldFocus() {
51
- menuOpened = true;
52
+ function handleTextFieldFocus(mobile) {
53
+ if (!mobile || !mobileDialog) {
54
+ menuOpened = true;
55
+ }
52
56
  }
53
57
  onMount(() => {
54
58
  mask = IMask(
@@ -100,64 +104,90 @@ function handleMonthSelect() {
100
104
  }
101
105
  </script>
102
106
 
103
- <div
104
- bind:this={activator}
105
- style:width="fit-content"
106
- >
107
- <SimpleTextField
108
- bind:value={mask.value}
109
- on:focus={handleTextFieldFocus}
110
- on:keypress={handleInputChange}
111
- bind:input={inputElement}
112
- >
113
- <svelte:fragment slot="prepend-inner" let:prependInnerIcon let:iconSize>
114
- <slot name="prepend-inner" {prependInnerIcon} {iconSize}>
115
- <Icon
116
- name="mdi-calendar"
117
- click
118
- on:click={() => menuOpened = !menuOpened}
119
- ></Icon>
120
- </slot>
121
- </svelte:fragment>
122
- <svelte:fragment slot="append-inner" let:appendInnerIcon let:iconSize>
123
- <slot name="append-inner" {appendInnerIcon} {iconSize}>
124
- </slot>
125
- </svelte:fragment>
126
- <svelte:fragment slot="prepend" let:prependIcon let:iconSize>
127
- <slot name="append-inner" {prependIcon} {iconSize}>
128
- </slot>
129
- </svelte:fragment>
130
- <svelte:fragment slot="append" let:appendIcon let:iconSize>
131
- <slot name="append-inner" {appendIcon} {iconSize}>
132
- </slot>
133
- </svelte:fragment>
134
- </SimpleTextField>
135
- </div>
136
-
137
- <Menu
138
- {activator}
139
- _width={"300px"}
140
- _boxShadow={"rgb(var(--global-color-background-300), .5) 0px 2px 4px"}
141
- _borderRadius={"5px"}
142
- bind:open={menuOpened}
143
- anchor="bottom-center"
144
- closeOnClickOutside
145
- bind:refreshPosition
146
- bind:menuElement
147
- bind:openingId={openingId}
148
- >
107
+ <MediaQuery let:mAndDown>
149
108
  <div
150
- style:background-color="rgb(var(--global-color-background-100))"
109
+ bind:this={activator}
151
110
  >
152
- <DatePicker
153
- bind:selectedDate={selectedDate}
154
- bind:selectedMonth={selectedMonth}
155
- bind:selectedYear={selectedYear}
156
- bind:visibleMonth
157
- bind:visibleYear
158
- on:day-click={handleDateSelect}
159
- on:year-click={handleYearSelect}
160
- on:month-click={handleMonthSelect}
161
- ></DatePicker>
111
+ <SimpleTextField
112
+ bind:value={mask.value}
113
+ on:focus={() => handleTextFieldFocus(mAndDown)}
114
+ on:keypress={handleInputChange}
115
+ bind:input={inputElement}
116
+ bind:placeholder
117
+ >
118
+ <svelte:fragment slot="prepend-inner" let:prependInnerIcon let:iconSize>
119
+ <slot name="prepend-inner" {prependInnerIcon} {iconSize}>
120
+ <Icon
121
+ name="mdi-calendar"
122
+ click
123
+ on:click={() => menuOpened = !menuOpened}
124
+ ></Icon>
125
+ </slot>
126
+ </svelte:fragment>
127
+ <svelte:fragment slot="append-inner" let:appendInnerIcon let:iconSize>
128
+ <slot name="append-inner" {appendInnerIcon} {iconSize}>
129
+ </slot>
130
+ </svelte:fragment>
131
+ <svelte:fragment slot="prepend" let:prependIcon let:iconSize>
132
+ <slot name="append-inner" {prependIcon} {iconSize}>
133
+ </slot>
134
+ </svelte:fragment>
135
+ <svelte:fragment slot="append" let:appendIcon let:iconSize>
136
+ <slot name="append-inner" {appendIcon} {iconSize}>
137
+ </slot>
138
+ </svelte:fragment>
139
+ </SimpleTextField>
162
140
  </div>
163
- </Menu>
141
+
142
+ {#if mAndDown && mobileDialog}
143
+ <Dialog
144
+ bind:open={menuOpened}
145
+ >
146
+ <div
147
+ style:background-color="rgb(var(--global-color-background-100))"
148
+ style:width="300px"
149
+ style:border-radius="10px"
150
+ >
151
+ <DatePicker
152
+ bind:selectedDate={selectedDate}
153
+ bind:selectedMonth={selectedMonth}
154
+ bind:selectedYear={selectedYear}
155
+ bind:visibleMonth
156
+ bind:visibleYear
157
+ on:day-click={handleDateSelect}
158
+ on:year-click={handleYearSelect}
159
+ on:month-click={handleMonthSelect}
160
+ ></DatePicker>
161
+ </div>
162
+ </Dialog>
163
+ {:else}
164
+ <Menu
165
+ {activator}
166
+ _width={"300px"}
167
+ _boxShadow={"rgb(var(--global-color-background-300), .5) 0px 2px 4px"}
168
+ _borderRadius={"5px"}
169
+ bind:open={menuOpened}
170
+ anchor="bottom-center"
171
+ closeOnClickOutside
172
+ bind:refreshPosition
173
+ bind:menuElement
174
+ bind:openingId={openingId}
175
+ >
176
+ <div
177
+ style:background-color="rgb(var(--global-color-background-100))"
178
+ >
179
+ <DatePicker
180
+ bind:selectedDate={selectedDate}
181
+ bind:selectedMonth={selectedMonth}
182
+ bind:selectedYear={selectedYear}
183
+ bind:visibleMonth
184
+ bind:visibleYear
185
+ on:day-click={handleDateSelect}
186
+ on:year-click={handleYearSelect}
187
+ on:month-click={handleMonthSelect}
188
+ ></DatePicker>
189
+ </div>
190
+ </Menu>
191
+ {/if}
192
+ </MediaQuery>
193
+
@@ -10,6 +10,8 @@ declare const __propDef: {
10
10
  visibleMonth?: number | undefined;
11
11
  visibleYear?: number | undefined;
12
12
  selectedDate?: Date | undefined;
13
+ placeholder?: string | undefined;
14
+ mobileDialog?: boolean | undefined;
13
15
  };
14
16
  events: {
15
17
  'day-click': CustomEvent<{
@@ -2,7 +2,7 @@ import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  open?: boolean | undefined;
5
- transition?: "scale" | "fly-down" | "fly-up" | "fly-horizontal" | "fade" | undefined;
5
+ transition?: "fly-down" | "fly-up" | "fly-horizontal" | "scale" | "fade" | undefined;
6
6
  _overlayOpacity?: string | undefined;
7
7
  _overlayColor?: string | undefined;
8
8
  _overlayBackdropFilter?: string | undefined;
@@ -9,4 +9,5 @@
9
9
  --autocomplete-default-min-height: 2rem;
10
10
  --autocomplete-default-padding: 0.5rem .5rem .5rem .5rem;
11
11
  --autocomplete-default-border-radius: 1.5rem;
12
+ --autocomplete-default-options-max-width: 100%;
12
13
  }
@@ -5,7 +5,7 @@ import "./Autocomplete.css";
5
5
  import { scrollInMenu } from "../common/scroller";
6
6
  let clazz = {};
7
7
  export { clazz as class };
8
- export let values = [], items, searchFunction = void 0, multiple = false, disabled = false, placeholder = "", width = "auto", height = "auto", maxWidth = void 0, openingId = "autocomplete-menu", searchText = void 0, maxVisibleChips = void 0, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px";
8
+ export let values = [], items, searchFunction = void 0, multiple = false, disabled = false, mandatory = false, placeholder = "", width = "auto", height = "auto", maxWidth = void 0, openingId = "autocomplete-menu", searchText = void 0, maxVisibleChips = void 0, menuOpened = false, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px", mobileDrawer = false;
9
9
  let dispatch = createEventDispatcher();
10
10
  function select(item) {
11
11
  const alreadyPresent = values.findIndex((i) => i.value === item.value) != -1;
@@ -23,6 +23,8 @@ function select(item) {
23
23
  }
24
24
  }
25
25
  function unselect(item) {
26
+ if (values.length == 1 && mandatory)
27
+ return;
26
28
  values = values.filter((i) => i.value != item.value);
27
29
  refreshMenuWidth();
28
30
  dispatch("change", {
@@ -32,6 +34,8 @@ function unselect(item) {
32
34
  });
33
35
  }
34
36
  function pop() {
37
+ if (values.length == 1 && mandatory)
38
+ return;
35
39
  let poppedElement = values.pop();
36
40
  values = [...values];
37
41
  refreshMenuWidth();
@@ -48,7 +52,7 @@ function toggle(item) {
48
52
  else
49
53
  select(item);
50
54
  }
51
- let menuWidth = void 0, menuHeight = "auto", menuOpened = false, refreshPosition = false;
55
+ let menuWidth = void 0, menuHeight = "auto", refreshPosition = false;
52
56
  function openMenu() {
53
57
  refreshMenuWidth();
54
58
  menuOpened = true;
@@ -120,11 +124,12 @@ $:
120
124
  filteredItems = items;
121
125
  }
122
126
  $:
123
- notVisibleChipNumber = Math.max(values.length - (maxVisibleChips || 0), 0);
127
+ notVisibleChipNumber = Math.max((values?.length || 0) - (maxVisibleChips || 0), 0);
124
128
  import Chip from "../navigation/Chip.svelte";
125
129
  import Menu from "../common/Menu.svelte";
126
130
  import { createEventDispatcher } from "svelte";
127
131
  import SimpleTextField from "./SimpleTextField.svelte";
132
+ import MenuOrDrawer from "../../composed/common/MenuOrDrawer.svelte";
128
133
  </script>
129
134
 
130
135
  <svelte:window />
@@ -143,7 +148,7 @@ import SimpleTextField from "./SimpleTextField.svelte";
143
148
  <div
144
149
  class="selection-container"
145
150
  >
146
- {#each values.slice(0, maxVisibleChips) as selection}
151
+ {#each (values || []).slice(0, maxVisibleChips) as selection}
147
152
  <slot name="selection" {selection}>
148
153
  <div tabindex="-1">
149
154
  <Chip
@@ -151,7 +156,10 @@ import SimpleTextField from "./SimpleTextField.svelte";
151
156
  on:close={() => unselect(selection)}
152
157
  --chip-default-border-radius="var(--autocomplete-border-radius, var(--autocomplete-default-border-radius))"
153
158
  buttonTabIndex={-1}
154
- >{selection.label}</Chip>
159
+ truncateText
160
+ >
161
+ {selection.label}
162
+ </Chip>
155
163
  </div>
156
164
  </slot>
157
165
  {/each}
@@ -184,51 +192,93 @@ import SimpleTextField from "./SimpleTextField.svelte";
184
192
  </div>
185
193
 
186
194
  <slot name="menu">
187
- <Menu
188
- {activator}
189
- _width={menuWidth || ""}
190
- _height={menuHeight}
191
- _maxHeight="300px"
192
- _boxShadow={menuBoxShadow}
193
- _borderRadius={menuBorderRadius}
194
- bind:open={menuOpened}
195
- anchor="bottom-center"
196
- closeOnClickOutside
197
- bind:refreshPosition
198
- bind:menuElement
199
- bind:openingId={openingId}
200
- flipOnOverflow
201
- >
202
- <ul
203
- class={clazz.menu || ''}
204
- style:background-color="rgb(var(--global-color-background-100))"
195
+ {#if !mobileDrawer}
196
+ <Menu
197
+ {activator}
198
+ _width={menuWidth || ""}
199
+ _height={menuHeight}
200
+ _maxHeight="300px"
201
+ _boxShadow={menuBoxShadow}
202
+ _borderRadius={menuBorderRadius}
203
+ bind:open={menuOpened}
204
+ anchor="bottom-center"
205
+ closeOnClickOutside
206
+ bind:refreshPosition
207
+ bind:menuElement
208
+ bind:openingId={openingId}
209
+ flipOnOverflow
205
210
  >
206
- {#each filteredItems as item, index}
207
- <li class="item-{index}">
208
- <slot
209
- name="item"
210
- {item}
211
- {index}
212
- selected={values.findIndex((i) => {
213
- return i.value == item.value;
214
- }) != -1}
215
- >
216
- <div
217
- class:selection-item={true}
218
- class:focused={index == focusedIndex}
219
- class:selected={values.findIndex((i) => {
211
+ <ul
212
+ class={clazz.menu || ''}
213
+ style:background-color="rgb(var(--global-color-background-100))"
214
+ >
215
+ {#each filteredItems as item, index}
216
+ <li class="item-{index}">
217
+ <slot
218
+ name="item"
219
+ {item}
220
+ {index}
221
+ selected={(values || []).findIndex((i) => {
220
222
  return i.value == item.value;
221
223
  }) != -1}
222
- on:click={() => toggle(item)}
223
- on:keypress={() => toggle(item)}
224
224
  >
225
- {item.label}
226
- </div>
227
- </slot>
228
- </li>
229
- {/each}
230
- </ul>
231
- </Menu>
225
+ <div
226
+ class:selection-item={true}
227
+ class:focused={index == focusedIndex}
228
+ class:selected={(values || []).findIndex((i) => {
229
+ return i.value == item.value;
230
+ }) != -1}
231
+ on:click={() => toggle(item)}
232
+ on:keypress={() => toggle(item)}
233
+ >
234
+ {item.label}
235
+ </div>
236
+ </slot>
237
+ </li>
238
+ {/each}
239
+ </ul>
240
+ </Menu>
241
+ {:else}
242
+ <MenuOrDrawer
243
+ {activator}
244
+ _height={menuHeight}
245
+ _maxHeight="300px"
246
+ _boxShadow={menuBoxShadow}
247
+ _borderRadius={menuBorderRadius}
248
+ bind:open={menuOpened}
249
+ on:close
250
+ >
251
+ <ul
252
+ class={clazz.menu || ''}
253
+ style:background-color="rgb(var(--global-color-background-100))"
254
+ >
255
+ {#each filteredItems as item, index}
256
+ <li class="item-{index}">
257
+ <slot
258
+ name="item"
259
+ {item}
260
+ {index}
261
+ selected={(values || []).findIndex((i) => {
262
+ return i.value == item.value;
263
+ }) != -1}
264
+ >
265
+ <div
266
+ class:selection-item={true}
267
+ class:focused={index == focusedIndex}
268
+ class:selected={(values || []).findIndex((i) => {
269
+ return i.value == item.value;
270
+ }) != -1}
271
+ on:click={() => toggle(item)}
272
+ on:keypress={() => toggle(item)}
273
+ >
274
+ {item.label}
275
+ </div>
276
+ </slot>
277
+ </li>
278
+ {/each}
279
+ </ul>
280
+ </MenuOrDrawer>
281
+ {/if}
232
282
  </slot>
233
283
 
234
284
  <style>
@@ -267,6 +317,10 @@ import SimpleTextField from "./SimpleTextField.svelte";
267
317
 
268
318
  .selection-item {
269
319
  padding: 10px;
320
+ max-width: var(--autocomplete-options-max-width, var(--autocomplete-default-options-max-width));
321
+ text-overflow: ellipsis;
322
+ white-space: nowrap;
323
+ overflow: hidden;
270
324
  }
271
325
 
272
326
  .selection-item.selected {
@@ -17,6 +17,7 @@ declare const __propDef: {
17
17
  searchFunction?: ((item: Item, searchText: string | undefined) => boolean) | undefined;
18
18
  multiple?: boolean | undefined;
19
19
  disabled?: boolean | undefined;
20
+ mandatory?: boolean | undefined;
20
21
  placeholder?: string | undefined;
21
22
  width?: string | undefined;
22
23
  height?: string | undefined;
@@ -24,13 +25,16 @@ declare const __propDef: {
24
25
  openingId?: string | undefined;
25
26
  searchText?: string | undefined;
26
27
  maxVisibleChips?: number | undefined;
28
+ menuOpened?: boolean | undefined;
27
29
  menuBoxShadow?: string | undefined;
28
30
  menuBorderRadius?: string | undefined;
31
+ mobileDrawer?: boolean | undefined;
29
32
  };
30
33
  events: {
31
34
  focus: FocusEvent;
32
35
  blur: FocusEvent;
33
36
  keydown: KeyboardEvent;
37
+ close: CustomEvent<{}>;
34
38
  } & {
35
39
  [evt: string]: CustomEvent<any>;
36
40
  };
@@ -5,7 +5,7 @@ import "./SelectableVerticalList.css";
5
5
  import keyboarder from "../../../utils/keyboarder";
6
6
  import { createEventDispatcher, onMount } from "svelte";
7
7
  import Icon from "../media/Icon.svelte";
8
- export let activeKeyboard = false, loopSelection = true, focused = void 0, selected = void 0, elements = [];
8
+ export let activeKeyboard = false, loopSelection = true, focused = void 0, selected = void 0, elements = [], centered = false, bicolor = false, appendIconSize = "20pt";
9
9
  let dispatch = createEventDispatcher();
10
10
  $:
11
11
  focusedIndex = elements.findIndex((el) => el.name == focused);
@@ -53,6 +53,12 @@ onMount(() => {
53
53
  keyboarder.off(handleKeypress);
54
54
  };
55
55
  });
56
+ function handleIconClick(index, element) {
57
+ dispatch("iconClick", {
58
+ index,
59
+ element
60
+ });
61
+ }
56
62
  </script>
57
63
 
58
64
  <ul
@@ -62,6 +68,7 @@ onMount(() => {
62
68
  {#each elements as element, index (element.name)}
63
69
  <li
64
70
  class="element"
71
+ class:bicolor
65
72
  class:focused={focused == element.name}
66
73
  aria-selected={selected == element.name}
67
74
  on:mouseover={() => handleElementMouseover(element)}
@@ -71,20 +78,19 @@ onMount(() => {
71
78
  style:color={element.style?.color}
72
79
  style:background-color={element.style?.backgroundColor}
73
80
  >
74
- <slot
81
+ <slot
75
82
  name="element"
76
83
  focused={focused == element.name}
77
84
  selected={selected == element.name}
78
85
  >
79
86
  {#if !!element.icon}
80
- <Icon
81
- name={element.icon}
82
- --icon-default-size="20px"
87
+ <Icon
88
+ name={element.icon}
83
89
  ></Icon>
84
90
  {/if}
85
- <div class="title-description-container">
91
+ <div class="title-description-container" class:centered>
86
92
  <div class="title">
87
- <slot
93
+ <slot
88
94
  name="title"
89
95
  focused={focused == element.name}
90
96
  selected={selected == element.name}
@@ -93,9 +99,9 @@ onMount(() => {
93
99
  {element.title}
94
100
  </slot>
95
101
  </div>
96
- {#if !!element.description}
102
+ {#if !!element.description}
97
103
  <div class="description">
98
- <slot
104
+ <slot
99
105
  name="description"
100
106
  focused={focused == element.name}
101
107
  selected={selected == element.name}
@@ -106,6 +112,18 @@ onMount(() => {
106
112
  </div>
107
113
  {/if}
108
114
  </div>
115
+ {#if !!element.appendIcon}
116
+ <div
117
+ class="append"
118
+ on:click|stopPropagation={() => {handleIconClick(index, element)}}
119
+ on:keypress
120
+ >
121
+ <Icon
122
+ name={element.appendIcon}
123
+ --icon-size={appendIconSize}
124
+ ></Icon>
125
+ </div>
126
+ {/if}
109
127
  </slot>
110
128
  </li>
111
129
  {/each}
@@ -162,6 +180,17 @@ onMount(() => {
162
180
  margin-top: 0.2rem;
163
181
  }
164
182
 
183
+ .bicolor:nth-child(even) {
184
+ background-color: var(
185
+ --selectable-vertical-list-focus-background-color,
186
+ var(--selectable-vertical-list-default-focus-background-color)
187
+ );
188
+ color: var(
189
+ --selectable-vertical-list-focus-color,
190
+ var(--selectable-vertical-list-default-focus-color)
191
+ )
192
+ }
193
+
165
194
  .element {
166
195
  padding: var(
167
196
  --selectable-vertical-list-element-padding,
@@ -183,6 +212,7 @@ onMount(() => {
183
212
  display: flex;
184
213
  align-items: center;
185
214
  gap: 10px;
215
+ -webkit-tap-highlight-color: transparent;
186
216
  }
187
217
 
188
218
  .title-description-container {
@@ -214,4 +244,17 @@ onMount(() => {
214
244
  var(--selectable-vertical-list-default-selection-color)
215
245
  )
216
246
  }
247
+
248
+
249
+ .centered {
250
+ width: 100%;
251
+ text-align: center;
252
+ }
253
+
254
+ .append {
255
+ padding: 10px 20px 10px 20px;
256
+ position: absolute;
257
+ right: 0;
258
+ }
259
+
217
260
  </style>
@@ -9,6 +9,7 @@ export type Element = {
9
9
  color?: string;
10
10
  backgroundColor?: string;
11
11
  };
12
+ appendIcon?: string;
12
13
  };
13
14
  import '../../../css/main.css';
14
15
  import './SelectableVerticalList.css';
@@ -19,14 +20,22 @@ declare const __propDef: {
19
20
  focused?: string | number | undefined;
20
21
  selected?: string | number | undefined;
21
22
  elements?: Element[] | undefined;
23
+ centered?: boolean | undefined;
24
+ bicolor?: boolean | undefined;
25
+ appendIconSize?: string | undefined;
22
26
  };
23
27
  events: {
28
+ keypress: KeyboardEvent;
24
29
  select: CustomEvent<{
25
30
  element: Element;
26
31
  }>;
27
32
  focus: CustomEvent<{
28
33
  element: Element;
29
34
  }>;
35
+ iconClick: CustomEvent<{
36
+ index: number;
37
+ element: Element;
38
+ }>;
30
39
  } & {
31
40
  [evt: string]: CustomEvent<any>;
32
41
  };