sveltacular 0.0.22 → 0.0.24

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.
@@ -13,24 +13,34 @@ export let disabled = false;
13
13
  export let required = false;
14
14
  export let searchable = false;
15
15
  export let search = void 0;
16
+ const id = uniqueId();
17
+ const dispatch = createEventDispatcher();
16
18
  const getText = () => items.find((item) => item.value == value)?.name || "";
19
+ let text = getText();
20
+ let open = false;
21
+ let highlightIndex = -1;
22
+ let filteredItems = [];
17
23
  const onSelect = (e) => {
18
24
  value = e.detail.value;
19
25
  dispatch("change", value);
20
26
  text = getText();
27
+ applyFilter();
21
28
  open = false;
22
29
  };
30
+ const focusOnInput = () => {
31
+ if (browser)
32
+ document.getElementById(id)?.focus();
33
+ };
23
34
  const toggle = () => {
24
35
  open = !open;
25
- if (open && browser)
26
- document.getElementById(id)?.focus();
36
+ focusOnInput();
27
37
  };
28
38
  const onInputKeyPress = (e) => {
29
39
  if (e.key == "Escape") {
30
40
  open = false;
31
41
  return;
32
42
  }
33
- if (e.key == "Enter") {
43
+ if (e.key == "Enter" || e.key == "Tab") {
34
44
  open = false;
35
45
  if (highlightIndex > -1) {
36
46
  onSelect(new CustomEvent("select", { detail: filteredItems[highlightIndex] }));
@@ -48,20 +58,29 @@ const onInputKeyPress = (e) => {
48
58
  open = false;
49
59
  return;
50
60
  }
51
- if (e.key.length == 1) {
61
+ if (e.key.length == 1 || e.key == "Backspace" || e.key == "Delete") {
52
62
  open = true;
53
63
  highlightIndex = 0;
54
64
  triggerSearch();
55
65
  }
56
66
  };
57
67
  const triggerSearch = debounce(async () => {
58
- dispatch("search", searchText);
59
68
  if (search) {
60
- items = await search(searchText);
61
- text = getText();
69
+ items = await search(text);
62
70
  }
71
+ updateText();
72
+ applyFilter();
63
73
  }, 300);
64
- const dispatch = createEventDispatcher();
74
+ const applyFilter = () => {
75
+ const searchText = text.trim().toLowerCase();
76
+ filteredItems = searchText ? items.map((item, index) => ({ ...item, index })).filter((item) => item.name.toLowerCase().includes(searchText)) : items.map((item, index) => ({ ...item, index }));
77
+ };
78
+ const clear = () => {
79
+ text = "";
80
+ value = "";
81
+ triggerSearch();
82
+ focusOnInput();
83
+ };
65
84
  const updateText = async () => {
66
85
  if (browser) {
67
86
  const textBox = document.getElementById(id);
@@ -69,16 +88,6 @@ const updateText = async () => {
69
88
  text = getText();
70
89
  }
71
90
  };
72
- const id = uniqueId();
73
- let text = getText();
74
- let open = false;
75
- let highlightIndex = -1;
76
- $:
77
- searchText = searchable ? text : "";
78
- $:
79
- filteredItems = searchText ? items.map((item, index) => ({ ...item, index })).filter((item) => item.name.toLowerCase().includes(searchText.toLowerCase())) : items.map((item, index) => ({ ...item, index }));
80
- $:
81
- items && updateText();
82
91
  triggerSearch();
83
92
  </script>
84
93
 
@@ -102,12 +111,13 @@ triggerSearch();
102
111
  <button type="button" class="icon" on:click={toggle} on:keydown={toggle}>
103
112
  <AngleUpIcon />
104
113
  </button>
114
+ <button type="button" class="clear" on:click={clear} on:keydown={clear}> X </button>
105
115
  <div class="dropdown">
106
116
  <Menu
107
117
  items={filteredItems}
108
118
  {open}
109
119
  closeAfterSelect={false}
110
- {searchText}
120
+ searchText={text}
111
121
  on:select={onSelect}
112
122
  size="full"
113
123
  bind:highlightIndex
@@ -134,7 +144,7 @@ div input {
134
144
  user-select: none;
135
145
  white-space: nowrap;
136
146
  }
137
- div button.icon {
147
+ div button {
138
148
  border: 0;
139
149
  appearance: none;
140
150
  background: transparent;
@@ -142,14 +152,19 @@ div button.icon {
142
152
  margin: 0;
143
153
  position: absolute;
144
154
  top: 0.65rem;
145
- right: 1rem;
146
155
  width: 1rem;
147
156
  height: 1rem;
148
- transition: transform 0.3s linear;
149
157
  z-index: 2;
150
158
  color: var(--form-input-fg, black);
159
+ }
160
+ div button.icon {
161
+ right: 1rem;
162
+ transition: transform 0.3s linear;
151
163
  transform: rotate(180deg);
152
164
  }
165
+ div button.clear {
166
+ right: 3rem;
167
+ }
153
168
  div.open .icon {
154
169
  transform: rotate(0deg);
155
170
  }
@@ -12,7 +12,6 @@ declare const __propDef: {
12
12
  };
13
13
  events: {
14
14
  change: CustomEvent<string>;
15
- search: CustomEvent<string>;
16
15
  } & {
17
16
  [evt: string]: CustomEvent<any>;
18
17
  };
@@ -20,7 +20,6 @@ export let required = false;
20
20
  let value = "";
21
21
  const dispatch = createEventDispatcher();
22
22
  const no = () => {
23
- console.log("no");
24
23
  open = false;
25
24
  dispatch("cancel");
26
25
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sveltacular",
3
- "version": "0.0.22",
3
+ "version": "0.0.24",
4
4
  "scripts": {
5
5
  "watch": "npm run dev -- --open",
6
6
  "dev": "vite dev",